Upgrade to Pro — share decks privately, control downloads, hide ads and more …

mrubyでマイコンの世界に足を踏み入れる

Y_uuu
March 04, 2023

 mrubyでマイコンの世界に足を踏み入れる

鹿児島Ruby会議02
2023.03.04 Sat. 15:40-16:00
https://k-ruby.com/kagoshima-rubykaigi02/

Y_uuu

March 04, 2023
Tweet

More Decks by Y_uuu

Other Decks in Programming

Transcript

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

    View full-size slide

  2. 自己紹介

    View full-size slide

  3. 岡嵜雄平 @Y_uuu


    株式会社Fusic IoTクラウドエンジニア


    フィヨルドブートキャンプ メンター

    View full-size slide

  4. 本日のお話
    • マイコンとは


    • マイコンでmruby


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


    • mruby-esp32の敷居を下げる


    • まとめ
    4

    View full-size slide

  5. マイコンとは

    View full-size slide

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

    View full-size slide

  7. ESP32
    • Espressif Systems社によって開発されたマイクロコントローラ(マイコン)


    • 低消費電力かつWi-Fi・Bluetoothも内蔵しているためIoTとの親和性が高い


    • M5Stackに搭載されているマイコンもESP32
    7
    https://ja.wikipedia.org/wiki/ESP32

    View full-size slide

  8. ESP32-DevKitC
    • ESP32を搭載した評価基盤


    • 1600円で買える(送料・手数料は別)


    • mrubyを動かすために十分なスペック(RAM: 512KB, ROM: 4MB)
    8

    View full-size slide

  9. マイコンでmruby

    View full-size slide

  10. mruby
    • 組込みシステムをターゲットに開発されたRubyの処理系


    • 現在もMatzを中心に開発が続けられている


    • mrubyをさらに軽量化したmruby/cというOSSも存在する
    10

    View full-size slide

  11. mruby-esp32
    • ESP32上でmrubyを動かすためのOSSプロジェクト


    • ESP-IDFというフレームワークを使ってmrubyをコンパイル・リンクしている
    11
    ESP-IDF
    Project
    Component


    Main
    Component


    mruby
    Toolchain
    mruby-esp32.bin
    コンパイル・リンク

    View full-size slide

  12. 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

    View full-size slide

  13. 使い方📝
    13

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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


    実機での出力を


    シリアル通信で確認

    View full-size slide

  19. 参考: 福岡Rubyist会議03の登壇スライド
    • テーマ: mruby on IoT devices.


    • ESP-IDF v5.0への対応、mruby-esp32-mqttの開発について話しました


    • https://speakerdeck.com/yuuu/mruby-on-iot-devices
    19

    View full-size slide

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

    View full-size slide

  21. プログラムが実行されるまで
    • mrubyにおいてプログラムは以下のような流れで実行される


    1. Rubyのコードを書く


    2. mrubyのコンパイラ(mrbc)で1を中間言語(.mrb)にコンパイルする


    3. 2をmrubyのVMに渡す
    21
    main.rb main.mrb
    mruby VM
    mrb_load_irep_cxt()
    コンパイル 入力

    View full-size slide

  22. 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)

    View full-size slide

  23. mrubyはコンパイラを内包している
    • mrbgemsの1つ


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

    View full-size slide

  24. 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)に


    コンパイル→実行

    View full-size slide

  25. CMakefileLists.txtでのファイルシステム定義
    • 公式ドキュメントを参考に記述


    • ESP-IDFのビルド時にファイルシステムを含んだバイナリが構築される
    25
    https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/storage/spiffs.html
    この行を追加

    View full-size slide

  26. 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

    View full-size slide

  27. mruby-esp32の敷居を下げる

    View full-size slide

  28. mruby-esp32は敷居が高い?
    • ESP-IDFをインストールしないと使えない


    • 必要に応じてmrbgemsを追加・削除しないといけない


    • 気づいたらC言語を読み書きする羽目に…
    28

    View full-size slide

  29. MicroPython(on ESP32)は敷居が低い
    • イメージをダウンロードして書き込むだけで利用できる


    • mruby-esp32もここを目指すべき
    29
    https://micropython.org/download/esp32/

    View full-size slide

  30. 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で

    View full-size slide

  31. GitHub Actionsで実行する処理
    • ESP-IDFのbuild, merge binのアクションが公開されているので活用


    • https://github.com/espressif/esp-idf-ci-action
    31

    View full-size slide

  32. 使い方📝
    32

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  35. 使い方3. 書き込み・起動
    • esptool.py --chip esp32 --port $(YOUR_SERIAL_PORT) write_flash -z 0
    mruby-esp32-flash.bin


    • シリアルモニタを接続するとサンプルプログラムが動作
    35

    View full-size slide

  36. 簡単 🎉
    36

    View full-size slide

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

    View full-size slide

  38. 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が格納された


    ファイルシステムのイメージ

    View full-size slide

  39. 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

    View full-size slide

  40. 今後やりたいこと
    • mrbgemsの充実(UARTとか)


    • mruby-esp32-mirbの統合


    • ドキュメントの整備
    40

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide