Slide 1

Slide 1 text

2023-03-04(Sat) 岡嵜雄平 mrubyでマイコンの世界に足を踏み入れる 鹿児島Ruby会議02

Slide 2

Slide 2 text

自己紹介

Slide 3

Slide 3 text

岡嵜雄平 @Y_uuu 株式会社Fusic IoTクラウドエンジニア フィヨルドブートキャンプ メンター

Slide 4

Slide 4 text

本日のお話 • マイコンとは • マイコンでmruby • プログラムが実行されるまで • mruby-esp32の敷居を下げる • まとめ 4

Slide 5

Slide 5 text

マイコンとは

Slide 6

Slide 6 text

マイコンとは • マイクロコントローラ (英: 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

Slide 7

Slide 7 text

ESP32 • Espressif Systems社によって開発されたマイクロコントローラ(マイコン) • 低消費電力かつWi-Fi・Bluetoothも内蔵しているためIoTとの親和性が高い • M5Stackに搭載されているマイコンもESP32 7 https://ja.wikipedia.org/wiki/ESP32

Slide 8

Slide 8 text

ESP32-DevKitC • ESP32を搭載した評価基盤 • 1600円で買える(送料・手数料は別) • mrubyを動かすために十分なスペック(RAM: 512KB, ROM: 4MB) 8

Slide 9

Slide 9 text

マイコンでmruby

Slide 10

Slide 10 text

mruby • 組込みシステムをターゲットに開発されたRubyの処理系 • 現在もMatzを中心に開発が続けられている • mrubyをさらに軽量化したmruby/cというOSSも存在する 10

Slide 11

Slide 11 text

mruby-esp32 • ESP32上でmrubyを動かすためのOSSプロジェクト • ESP-IDFというフレームワークを使ってmrubyをコンパイル・リンクしている 11 ESP-IDF Project Component Main Component mruby Toolchain mruby-esp32.bin コンパイル・リンク

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

使い方📝 13

Slide 14

Slide 14 text

使い方1. ESP-IDFをインストール • インストール手順はESP-IDF Programming Guide > Get Startedを参照 14 https://docs.espressif.com/projects/esp-idf/en/latest/esp32/get-started/index.html

Slide 15

Slide 15 text

使い方2. mruby-esp32をgit clone • mrubyがSubmoduleとなっているので注意 15 https://github.com/mruby-esp32/mruby-esp32

Slide 16

Slide 16 text

使い方3. ビルド • Idf.py build コマンドでビルドします(初回は1分ほどかかります) 16

Slide 17

Slide 17 text

使い方4. デバイスとPCを接続 • /dev/tty.usbserial-xxx のようなデバイスファイル(PORT)を確認 17

Slide 18

Slide 18 text

使い方5. 書き込み・起動 • idf.py -p (PORT) flash monitor コマンドで書き込み・起動します 18 LEDと反対側のボタンを押して、 モードを切り替える 実機での出力を シリアル通信で確認

Slide 19

Slide 19 text

参考: 福岡Rubyist会議03の登壇スライド • テーマ: mruby on IoT devices. • ESP-IDF v5.0への対応、mruby-esp32-mqttの開発について話しました • https://speakerdeck.com/yuuu/mruby-on-iot-devices 19

Slide 20

Slide 20 text

mrubyでプログラムが実行されるまで

Slide 21

Slide 21 text

プログラムが実行されるまで • mrubyにおいてプログラムは以下のような流れで実行される 1. Rubyのコードを書く 2. mrubyのコンパイラ(mrbc)で1を中間言語(.mrb)にコンパイルする 3. 2をmrubyのVMに渡す 21 main.rb main.mrb mruby VM mrb_load_irep_cxt() コンパイル 入力

Slide 22

Slide 22 text

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)

Slide 23

Slide 23 text

mrubyはコンパイラを内包している • mrbgemsの1つ • 予めコンパイルせずとも、Rubyのプログラムを直接読み込める 23 mruby mrbgems mruby-bin-mrbc mruby-compiler

Slide 24

Slide 24 text

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)に コンパイル→実行

Slide 25

Slide 25 text

CMakefileLists.txtでのファイルシステム定義 • 公式ドキュメントを参考に記述 • ESP-IDFのビルド時にファイルシステムを含んだバイナリが構築される 25 https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/storage/spiffs.html この行を追加

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

mruby-esp32の敷居を下げる

Slide 28

Slide 28 text

mruby-esp32は敷居が高い? • ESP-IDFをインストールしないと使えない • 必要に応じてmrbgemsを追加・削除しないといけない • 気づいたらC言語を読み書きする羽目に… 28

Slide 29

Slide 29 text

MicroPython(on ESP32)は敷居が低い • イメージをダウンロードして書き込むだけで利用できる • mruby-esp32もここを目指すべき 29 https://micropython.org/download/esp32/

Slide 30

Slide 30 text

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で

Slide 31

Slide 31 text

GitHub Actionsで実行する処理 • ESP-IDFのbuild, merge binのアクションが公開されているので活用 • https://github.com/espressif/esp-idf-ci-action 31

Slide 32

Slide 32 text

使い方📝 32

Slide 33

Slide 33 text

使い方1. esptool.pyをインストール • Macであればhomebrew, もしくはpipコマンドでインストールできる 33 https://docs.espressif.com/projects/esptool/en/latest/esp32/

Slide 34

Slide 34 text

使い方2. mruby-esp32-flash.binをダウンロード • mruby-esp32のReleasesから最新版をダウンロード 34 https://github.com/mruby-esp32/mruby-esp32/releases ダウンロード

Slide 35

Slide 35 text

使い方3. 書き込み・起動 • esptool.py --chip esp32 --port $(YOUR_SERIAL_PORT) write_flash -z 0 mruby-esp32-flash.bin • シリアルモニタを接続するとサンプルプログラムが動作 35

Slide 36

Slide 36 text

簡単 🎉 36

Slide 37

Slide 37 text

Rubyのプログラムを書き換える • main/spiffs/main.rbに任意のプログラムを記述 37

Slide 38

Slide 38 text

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が格納された ファイルシステムのイメージ

Slide 39

Slide 39 text

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

Slide 40

Slide 40 text

今後やりたいこと • mrbgemsの充実(UARTとか) • mruby-esp32-mirbの統合 • ドキュメントの整備 40

Slide 41

Slide 41 text

まとめ

Slide 42

Slide 42 text

今日のテーマをおさらい 42 ここ!

Slide 43

Slide 43 text

まとめ • mrubyでマイコンの世界に足を踏み入れましょう 👍 43

Slide 44

Slide 44 text

ご清聴ありがとうございました