Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
mrubyでマイコンの世界に足を踏み入れる
Search
Y_uuu
March 04, 2023
Programming
2
1.8k
mrubyでマイコンの世界に足を踏み入れる
鹿児島Ruby会議02
2023.03.04 Sat. 15:40-16:00
https://k-ruby.com/kagoshima-rubykaigi02/
Y_uuu
March 04, 2023
Tweet
Share
More Decks by Y_uuu
See All by Y_uuu
あの重機は今どこにある?- 重機管理IoTプロダクトのバックエンドをAWSで構築した話 -
yuuu
0
650
mruby-esp32におけるペリフェラルAPIの実装検討
yuuu
1
550
育成力 - エンジニアの才能を引き出す環境とチューターの立ち回り -
yuuu
4
4.4k
committee-railsとOpenAPI Generatorでスキーマ駆動なAPI開発をする
yuuu
0
740
mruby on IoT devices.
yuuu
4
2.2k
SORACOM ArcでオフィスのIoT化を進行中です⭐
yuuu
1
1k
AWSのIoTサービスをおさらいしよう
yuuu
1
260
mrubyを1300円のボードで動かそう
yuuu
0
570
社内をIoT化していくための施策集📔
yuuu
0
1.5k
Other Decks in Programming
See All in Programming
ゆるやかにgolangci-lintのルールを強くする / Kyoto.go #56
utgwkk
2
400
20年もののレガシープロダクトに 0からPHPStanを入れるまで / phpcon2024
hirobe1999
0
510
短期間での新規プロダクト開発における「コスパの良い」Goのテスト戦略」 / kamakura.go
n3xem
2
170
暇に任せてProxmoxコンソール 作ってみました
karugamo
2
720
Kaigi on Railsに初参加したら、その日にLT登壇が決定した件について
tama50505
0
100
テストケースの名前はどうつけるべきか?
orgachem
PRO
0
140
Webエンジニア主体のモバイルチームの 生産性を高く保つためにやったこと
igreenwood
0
340
Jakarta EE meets AI
ivargrimstad
0
260
ドメインイベント増えすぎ問題
h0r15h0
2
360
SymfonyCon Vienna 2025: Twig, still relevant in 2025?
fabpot
3
1.2k
Итераторы в Go 1.23: зачем они нужны, как использовать, и насколько они быстрые?
lamodatech
0
850
MCP with Cloudflare Workers
yusukebe
2
220
Featured
See All Featured
Speed Design
sergeychernyshev
25
670
Music & Morning Musume
bryan
46
6.2k
Documentation Writing (for coders)
carmenintech
66
4.5k
Writing Fast Ruby
sferik
628
61k
Building Flexible Design Systems
yeseniaperezcruz
327
38k
Statistics for Hackers
jakevdp
796
220k
How To Stay Up To Date on Web Technology
chriscoyier
789
250k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
8
1.2k
The World Runs on Bad Software
bkeepers
PRO
65
11k
Mobile First: as difficult as doing things right
swwweet
222
9k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
2
170
Building Better People: How to give real-time feedback that sticks.
wjessup
365
19k
Transcript
2023-03-04(Sat) 岡嵜雄平 mrubyでマイコンの世界に足を踏み入れる 鹿児島Ruby会議02
自己紹介
岡嵜雄平 @Y_uuu 株式会社Fusic IoTクラウドエンジニア フィヨルドブートキャンプ メンター
本日のお話 • マイコンとは • マイコンでmruby • プログラムが実行されるまで • mruby-esp32の敷居を下げる •
まとめ 4
マイコンとは
マイコンとは • マイクロコントローラ (英: microcontroller) とは、 CPUに加えてRAM、ROM、I/Oポートなどを 1つの集積回路(IC)にまとめた、いわば極小のコンピュータ。
• 主に機器の制御に使われる。 6 https://ja.wikipedia.org/wiki/%E3%83%9E%E3%82%A4%E3%82%AF%E3%83%AD%E3%82%B3%E3%83%B3%E3%83%88%E3%83%AD%E3%83%BC%E3%83%A9
ESP32 • Espressif Systems社によって開発されたマイクロコントローラ(マイコン) • 低消費電力かつWi-Fi・Bluetoothも内蔵しているためIoTとの親和性が高い • M5Stackに搭載されているマイコンもESP32 7 https://ja.wikipedia.org/wiki/ESP32
ESP32-DevKitC • ESP32を搭載した評価基盤 • 1600円で買える(送料・手数料は別) • mrubyを動かすために十分なスペック(RAM: 512KB, ROM: 4MB)
8
マイコンでmruby
mruby • 組込みシステムをターゲットに開発されたRubyの処理系 • 現在もMatzを中心に開発が続けられている • mrubyをさらに軽量化したmruby/cというOSSも存在する 10
mruby-esp32 • ESP32上でmrubyを動かすためのOSSプロジェクト • ESP-IDFというフレームワークを使ってmrubyをコンパイル・リンクしている 11 ESP-IDF Project Component Main
Component mruby Toolchain mruby-esp32.bin コンパイル・リンク
mruby-esp32 • binファイルをROMに書き込むことで起動 • FreeRTOS(組込み向けのリアルタイムOS)上でmrubyが動作 12 ESP-IDF Project Component Main
Component mruby Toolchain mruby-esp32.bin ESP32-DevKitC FreeRTOS アプリケーション mruby MrubyTask コンパイル・リンク アップロード (ROMに書き込み) Library
使い方📝 13
使い方1. ESP-IDFをインストール • インストール手順はESP-IDF Programming Guide > Get Startedを参照 14
https://docs.espressif.com/projects/esp-idf/en/latest/esp32/get-started/index.html
使い方2. mruby-esp32をgit clone • mrubyがSubmoduleとなっているので注意 15 https://github.com/mruby-esp32/mruby-esp32
使い方3. ビルド • Idf.py build コマンドでビルドします(初回は1分ほどかかります) 16
使い方4. デバイスとPCを接続 • /dev/tty.usbserial-xxx のようなデバイスファイル(PORT)を確認 17
使い方5. 書き込み・起動 • idf.py -p (PORT) flash monitor コマンドで書き込み・起動します 18
LEDと反対側のボタンを押して、 モードを切り替える 実機での出力を シリアル通信で確認
参考: 福岡Rubyist会議03の登壇スライド • テーマ: mruby on IoT devices. • ESP-IDF
v5.0への対応、mruby-esp32-mqttの開発について話しました • https://speakerdeck.com/yuuu/mruby-on-iot-devices 19
mrubyでプログラムが実行されるまで
プログラムが実行されるまで • mrubyにおいてプログラムは以下のような流れで実行される 1. Rubyのコードを書く 2. mrubyのコンパイラ(mrbc)で1を中間言語(.mrb)にコンパイルする 3. 2をmrubyのVMに渡す 21
main.rb main.mrb mruby VM mrb_load_irep_cxt() コンパイル 入力
mruby-esp32におけるプログラム実行方法(過去) • ちょっと前までこんな手順で実行してました 1. ESP-IDFのコンパイル時にプログラムファイル(.rb)→中間言語(.h) 2. 中間言語(.h)をC言語としてincludeしてバイナリ生成 3. ESP32起動後、mrubyのVMに中間ファイルの内容を入力 22
main.rb main.h mruby_main.c コンパイル include mruby VM mrb_load_irep_cxt() 中間言語を 入力 バイナリ(.bin)
mrubyはコンパイラを内包している • mrbgemsの1つ • 予めコンパイルせずとも、Rubyのプログラムを直接読み込める 23 mruby mrbgems mruby-bin-mrbc mruby-compiler
mruby-esp32におけるプログラム実行方法(現在) • 今はこういった手順に変わっています 1. main/spiffs/main.rbにプログラムを記述 2. main/spiffs配下をファイルシステムとしてイメージ化→ROMに書き込む 3. main.cにてファイルをfopenし、mruby VMに渡す
24 main.rb mruby_main.c mruby VM mrb_load_irep_cxt() fopen .rbを入力 バイナリ(.bin) ROM プログラム(.rb)を 中間言語(.mrb)に コンパイル→実行
CMakefileLists.txtでのファイルシステム定義 • 公式ドキュメントを参考に記述 • ESP-IDFのビルド時にファイルシステムを含んだバイナリが構築される 25 https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/storage/spiffs.html この行を追加
ROMのパーティション定義 • ROM上にstorage領域を設け、ファイルシステムとして利用する 26 ブートローダー パーティションテーブル nvs: 24KB phy_init: 4KB
factory: 1.5MB 空き 0x00000000 0x00001000 0x00009000 0x0000f000 0x00010000 0x00180000 ここをファイルシステムとして使用 main.rbを保存する storage: 200KB 0x001B2000 main.rb ROM
mruby-esp32の敷居を下げる
mruby-esp32は敷居が高い? • ESP-IDFをインストールしないと使えない • 必要に応じてmrbgemsを追加・削除しないといけない • 気づいたらC言語を読み書きする羽目に… 28
MicroPython(on ESP32)は敷居が低い • イメージをダウンロードして書き込むだけで利用できる • mruby-esp32もここを目指すべき 29 https://micropython.org/download/esp32/
GitHub Actionsでmruby-esp32のROMイメージを生成 • ソースコードをビルドして、mruby-esp32.binをリリースする 30 ESP-IDF Project Component Main Component
mruby Toolchain mruby-esp32.bin ESP32-DevKitC FreeRTOS アプリケーション mruby MrubyTask コンパイル・リンク アップロード (ROMに書き込み) Library ここをGitHub Actionsで
GitHub Actionsで実行する処理 • ESP-IDFのbuild, merge binのアクションが公開されているので活用 • https://github.com/espressif/esp-idf-ci-action 31
使い方📝 32
使い方1. esptool.pyをインストール • Macであればhomebrew, もしくはpipコマンドでインストールできる 33 https://docs.espressif.com/projects/esptool/en/latest/esp32/
使い方2. mruby-esp32-flash.binをダウンロード • mruby-esp32のReleasesから最新版をダウンロード 34 https://github.com/mruby-esp32/mruby-esp32/releases ダウンロード
使い方3. 書き込み・起動 • esptool.py --chip esp32 --port $(YOUR_SERIAL_PORT) write_flash -z
0 mruby-esp32-flash.bin • シリアルモニタを接続するとサンプルプログラムが動作 35
簡単 🎉 36
Rubyのプログラムを書き換える • main/spiffs/main.rbに任意のプログラムを記述 37
Rubyのプログラムを書き換える • spiffsgen.py を取得してイメージを生成 • https://github.com/espressif/esp-idf/blob/master/components/spiffs/ spiffsgen.py • python ./spiffsgen.py
204800 ./main/spiffs spiffs.bin 38 spiffs.bin main.rb main.rbが格納された ファイルシステムのイメージ
Rubyのプログラムを書き換える • spiffs.binをROMに書き込み • esptool.py --chip esp32 --port $(YOUR_SERIAL_PORT) write_flash
-z 0x190000 spiffs.bin 39 spiffs.bin main.rb ROM上のstorageの部分だけ 新しいイメージで上書き 39
今後やりたいこと • mrbgemsの充実(UARTとか) • mruby-esp32-mirbの統合 • ドキュメントの整備 40
まとめ
今日のテーマをおさらい 42 ここ!
まとめ • mrubyでマイコンの世界に足を踏み入れましょう 👍 43
ご清聴ありがとうございました