鹿児島Ruby会議02 2023.03.04 Sat. 15:40-16:00 https://k-ruby.com/kagoshima-rubykaigi02/
2023-03-04(Sat) 岡嵜雄平mrubyでマイコンの世界に足を踏み入れる鹿児島Ruby会議02
View Slide
自己紹介
岡嵜雄平 @Y_uuu株式会社Fusic IoTクラウドエンジニアフィヨルドブートキャンプ メンター
本日のお話• マイコンとは• マイコンでmruby• プログラムが実行されるまで• mruby-esp32の敷居を下げる• まとめ4
マイコンとは
マイコンとは• マイクロコントローラ (英: microcontroller) とは、 CPUに加えてRAM、ROM、I/Oポートなどを 1つの集積回路(IC)にまとめた、いわば極小のコンピュータ。• 主に機器の制御に使われる。6https://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に搭載されているマイコンもESP327https://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をコンパイル・リンクしている11ESP-IDFProjectComponentMainComponentmrubyToolchainmruby-esp32.binコンパイル・リンク
mruby-esp32• binファイルをROMに書き込むことで起動• FreeRTOS(組込み向けのリアルタイムOS)上でmrubyが動作12ESP-IDFProjectComponentMainComponentmrubyToolchainmruby-esp32.binESP32-DevKitCFreeRTOSアプリケーションmrubyMrubyTaskコンパイル・リンクアップロード(ROMに書き込み)Library
使い方📝13
使い方1. ESP-IDFをインストール• インストール手順はESP-IDF Programming Guide > Get Startedを参照14https://docs.espressif.com/projects/esp-idf/en/latest/esp32/get-started/index.html
使い方2. mruby-esp32をgit clone• mrubyがSubmoduleとなっているので注意15https://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 コマンドで書き込み・起動します18LEDと反対側のボタンを押して、モードを切り替える実機での出力をシリアル通信で確認
参考: 福岡Rubyist会議03の登壇スライド• テーマ: mruby on IoT devices.• ESP-IDF v5.0への対応、mruby-esp32-mqttの開発について話しました• https://speakerdeck.com/yuuu/mruby-on-iot-devices19
mrubyでプログラムが実行されるまで
プログラムが実行されるまで• mrubyにおいてプログラムは以下のような流れで実行される1. Rubyのコードを書く2. mrubyのコンパイラ(mrbc)で1を中間言語(.mrb)にコンパイルする3. 2をmrubyのVMに渡す21main.rb main.mrbmruby VMmrb_load_irep_cxt()コンパイル 入力
mruby-esp32におけるプログラム実行方法(過去)• ちょっと前までこんな手順で実行してました1. ESP-IDFのコンパイル時にプログラムファイル(.rb)→中間言語(.h)2. 中間言語(.h)をC言語としてincludeしてバイナリ生成3. ESP32起動後、mrubyのVMに中間ファイルの内容を入力22main.rb main.h mruby_main.cコンパイル include mruby VMmrb_load_irep_cxt()中間言語を入力バイナリ(.bin)
mrubyはコンパイラを内包している• mrbgemsの1つ• 予めコンパイルせずとも、Rubyのプログラムを直接読み込める23mrubymrbgemsmruby-bin-mrbc mruby-compiler
mruby-esp32におけるプログラム実行方法(現在)• 今はこういった手順に変わっています1. main/spiffs/main.rbにプログラムを記述2. main/spiffs配下をファイルシステムとしてイメージ化→ROMに書き込む3. main.cにてファイルをfopenし、mruby VMに渡す24main.rb mruby_main.cmruby VMmrb_load_irep_cxt()fopen .rbを入力バイナリ(.bin)ROMプログラム(.rb)を中間言語(.mrb)にコンパイル→実行
CMakefileLists.txtでのファイルシステム定義• 公式ドキュメントを参考に記述• ESP-IDFのビルド時にファイルシステムを含んだバイナリが構築される25https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/storage/spiffs.htmlこの行を追加
ROMのパーティション定義• ROM上にstorage領域を設け、ファイルシステムとして利用する26ブートローダーパーティションテーブルnvs: 24KBphy_init: 4KBfactory: 1.5MB空き0x000000000x000010000x000090000x0000f0000x000100000x00180000ここをファイルシステムとして使用main.rbを保存するstorage: 200KB0x001B2000main.rbROM
mruby-esp32の敷居を下げる
mruby-esp32は敷居が高い?• ESP-IDFをインストールしないと使えない• 必要に応じてmrbgemsを追加・削除しないといけない• 気づいたらC言語を読み書きする羽目に…28
MicroPython(on ESP32)は敷居が低い• イメージをダウンロードして書き込むだけで利用できる• mruby-esp32もここを目指すべき29https://micropython.org/download/esp32/
GitHub Actionsでmruby-esp32のROMイメージを生成• ソースコードをビルドして、mruby-esp32.binをリリースする30ESP-IDFProjectComponentMainComponentmrubyToolchainmruby-esp32.binESP32-DevKitCFreeRTOSアプリケーションmrubyMrubyTaskコンパイル・リンクアップロード(ROMに書き込み)LibraryここをGitHub Actionsで
GitHub Actionsで実行する処理• ESP-IDFのbuild, merge binのアクションが公開されているので活用• https://github.com/espressif/esp-idf-ci-action31
使い方📝32
使い方1. esptool.pyをインストール• Macであればhomebrew, もしくはpipコマンドでインストールできる33https://docs.espressif.com/projects/esptool/en/latest/esp32/
使い方2. mruby-esp32-flash.binをダウンロード• mruby-esp32のReleasesから最新版をダウンロード34https://github.com/mruby-esp32/mruby-esp32/releasesダウンロード
使い方3. 書き込み・起動• esptool.py --chip esp32 --port $(YOUR_SERIAL_PORT) write_flash -z 0mruby-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.bin38spiffs.binmain.rbmain.rbが格納されたファイルシステムのイメージ
Rubyのプログラムを書き換える• spiffs.binをROMに書き込み• esptool.py --chip esp32 --port $(YOUR_SERIAL_PORT) write_flash -z0x190000 spiffs.bin39spiffs.binmain.rbROM上のstorageの部分だけ新しいイメージで上書き39
今後やりたいこと• mrbgemsの充実(UARTとか)• mruby-esp32-mirbの統合• ドキュメントの整備40
まとめ
今日のテーマをおさらい42ここ!
まとめ• mrubyでマイコンの世界に足を踏み入れましょう 👍43
ご清聴ありがとうございました