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

mruby-esp32におけるペリフェラルAPIの実装検討

Y_uuu
September 16, 2023

 mruby-esp32におけるペリフェラルAPIの実装検討

2023-09-16(土) 15:00-15:20
松江Ruby会議10 session6
https://matsue.rubyist.net/matrk10/

mruby-esp32は、ESP32というマイコン上でmrubyを実行するためのオープンソースソフトウェアです。このプロジェクトでは、GPIOやWi-Fiなどのマイコンの周辺機能は既に使用可能ですが、一部の周辺機能はRubyプログラムからの利用がまだ困難な状況にあります。そこで、これらの周辺機能を利用するためのAPIを定義し、mrbgemとして実装する試みを行っています。本発表では、周辺機能を利用するためのAPIの実装に関する検討過程を紹介します。

Y_uuu

September 16, 2023
Tweet

More Decks by Y_uuu

Other Decks in Programming

Transcript

  1. 2023-09-16(Sat) 岡嵜雄平
    mruby-esp32におけるペリフェラルAPIの実装検討
    松江Ruby会議10

    View full-size slide

  2. 自己紹介

    View full-size slide

  3. 岡嵜雄平 @Y_uuu


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


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

    View full-size slide

  4. 今年3度目の地域Ruby会議登壇 🎉
    4
    2023-02-18 福岡Rubyist会議03


    mruby on IoT devices.
    2023-03-04 鹿児島Ruby会議02


    mrubyでマイコンの世界に足を踏み入れる
    2023-09-16 松江Ruby会議10


    mruby-esp32における


    ペリフェラルAPIの実装検討
    \ New /

    View full-size slide

  5. 本日のお話
    • mruby-esp32


    • ペリフェラル


    • ペリフェラルクラスの実装


    • 対応したmrbgems


    • デモ


    • おわりに
    5

    View full-size slide

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


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


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

    View full-size slide

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


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


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

    View full-size slide

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


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


    Main
    Component


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

    View full-size slide

  9. mruby-esp32
    • binファイルをROMに書き込むことで起動


    • FreeRTOS(組込み向けのリアルタイムOS)上でmrubyが動作
    10
    ESP-IDF
    Project
    Component


    Main
    Component


    mruby
    Toolchain
    mruby-esp32.bin
    ESP32-DevKitC
    FreeRTOS
    アプリケーション
    mruby
    MrubyTask
    コンパイル・リンク
    アップロード


    (ROMに書き込み)
    Library

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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


    実機での出力を


    シリアル通信で確認

    View full-size slide

  15. 事例: mruby-esp32がキックボクサーのトレーニング装置に!
    • このセッションのデモのアクチュエータの制御にmruby-esp32が使われて
    います
    16
    Ruby vs Kickboxer - the state
    of MRuby, JRuby and CRuby
    https://rubykaigi.org/2023/
    presentations/saramic.html#day3

    View full-size slide

  16. ペリフェラル

    View full-size slide

  17. ペリフェラルとは
    • 直訳すると「周辺機器」


    • マイコンに搭載された「外部機器を制御するブロック」を指す
    18
    マイコン
    サーボモータ
    ジャイロ

    スティック
    LED
    超音波センサー
    距離センサー
    マトリクスLED
    GPIO PWM
    I2C
    SPI
    UART ADC
    ※センサー・接続方法は一例です

    View full-size slide

  18. ペリフェラルとは
    • 直訳すると「周辺機器」


    • マイコンに搭載された「外部機器を制御するブロック」を指す
    19
    マイコン
    サーボモータ
    ジャイロ

    スティック
    LED
    超音波センサー
    距離センサー
    マトリクスLED
    GPIO PWM
    I2C
    SPI
    UART ADC
    ※センサー・接続方式は一例です
    広義のペリフェラル
    マイコンにおける


    ペリフェラル

    View full-size slide

  19. ESP32で使用できるペリフェラル(抜粋)
    • 以下のようなペリフェラルが利用できる
    20
    ペリフェラル 説明 使用例
    GPIO


    General-purpose input/output


    汎用入出力。電気信号を入出力できる Lチカ、スイッチの入力、など
    ADC


    Analog to Digital Converter


    電気信号をアナログ→デジタルに変換する ジャイロスティック、温度センサー、など
    UART


    Universal Asynchronous Receiver Transmitter
    非同期式のシリアル通信 PCや他モジュールとの通信、など
    I2C


    Inter Integrated Circuit
    同期式のシリアル通信(信号線2本) 他モジュールとの通信、など
    SPI


    Serial Peripheral Interface
    同期式のシリアル通信(信号線3本) 他モジュールとの通信、など
    PWM


    Pulse Width Modulation
    指定した幅のパルスを出力する LEDの明るさやサーボモータの制御、など

    View full-size slide

  20. 処理系ごとのペリフェラルクラス
    • ペリフェラルクラスは処理系ごとに実装されていて仕様もまちまち
    21
    ESP32
    FreeRTOS
    mruby
    Plato
    なし(ベアメタル)
    mruby
    Raspberry Pi Pico
    なし(ベアメタル)
    PicoRuby
    Raspberry Pi
    Raspberry Pi OS
    ruby-spi


    pi_piper
    存在しない?
    例: 2023年6月時点のSPI通信対応状況
    SPI
    Ruby
    H/W
    OS
    VM
    ライブラリ mruby-plato-spi

    View full-size slide

  21. 処理系が変わるとアプリも修正しないといけない
    • その処理系のSPIクラスの仕様を確認して、書き換える必要がある
    22
    Raspberry Pi Pico
    なし(ベアメタル)
    PicoRuby
    Raspberry Pi
    Raspberry Pi OS
    ruby-spi


    pi_piper
    SPI
    Ruby
    H/W
    OS
    VM
    ライブラリ
    SPI通信アプリ
    アプリ SPI通信アプリ
    そのまま流用は
    できない

    View full-size slide

  22. 処理系が変わるとアプリも修正しないといけない
    • その処理系のSPIクラスの仕様を確認して、書き換える必要がある
    23
    Raspberry Pi Pico
    なし(ベアメタル)
    PicoRuby
    Raspberry Pi
    Raspberry Pi OS
    ruby-spi


    pi_piper
    SPI
    Ruby
    H/W
    OS
    VM
    ライブラリ
    SPI通信アプリ
    アプリ SPI通信アプリ
    そのまま流用は
    できない
    Rubyでもmrubyでもmruby/cでも


    ArrayやStringは共通なのに…
    ※ArrayやStringもバージョンの違いやメソッド
    ごとの対応状況の違いはあります

    View full-size slide

  23. ペリフェラルAPI仕様が策定
    • 水面下で策定が進んでいる状況。個人的にもこの動きに賛同。
    24
    https://github.com/HirohitoHigashi/mruby_io_class_study

    View full-size slide

  24. mruby-esp32にはまだいくつかの


    ペリフェラルクラスがない





    作ってみよう💪
    ESP32
    FreeRTOS
    mruby
    存在しない?
    H/W
    OS
    VM
    ライブラリ

    View full-size slide

  25. ペリフェラルクラスの実装

    View full-size slide

  26. mrbgemsの作成
    • 右図の構造でディレクトリ・ファイルを作成


    • mruby-mrbgem-templateを使うと簡単
    mruby-esp32-spi
    mrblib
    spi.rb
    test
    spi.rb
    README.md
    src
    spi.c
    mrbgem.rake

    View full-size slide

  27. esp-idf
    RubyとCの役割分担
    • spi.cにてクラス・メソッド・定数等を

    定義する(ペリフェラルAPI)


    • spi.cのメソッドにてマイコンの

    ペリフェラル機能(spi_master.c)を呼び出す


    • main.rbはspi.cで定義されたクラスを利用する

    mruby-esp32-spi
    src
    spi.c
    main.rb
    spi_master.c

    View full-size slide

  28. 参考: Cでmrubyのクラスを定義する
    クラスを定義し、メソッドの

    名前や引数の数を定義

    View full-size slide

  29. 参考: Cでmrubyのクラスを定義する
    Rubyのメソッド呼び出しで


    渡された引数を受け取る
    続く

    View full-size slide

  30. ペリフェラル機能の呼び出し
    • ESP32(ESP-IDFを利用)の場合、

    ドキュメントやサンプルプログラムを参考に実装

    https://github.com/espressif/esp-idf/tree/master/
    examples/peripherals/spi_master/hd_eeprom
    https://docs.espressif.com/projects/esp-idf/en/latest/esp32/
    api-reference/peripherals/spi_master.html#

    View full-size slide

  31. 参考: ペリフェラル機能の呼び出し
    ペリフェラル機能を呼び出し
    続き

    View full-size slide

  32. esp-idf
    引数の柔軟性を確保する
    • Cでいろいろな引数に対応するのは難しい


    • 複数型の対応


    • デフォルト引数


    • キーワード引数
    mruby-esp32-spi
    src
    spi.c
    main.rb
    spi_master.c

    View full-size slide

  33. 参考: SPI#writeの仕様
    Rubyらしく、いろいろな型の

    引数を渡せる

    View full-size slide

  34. esp-idf
    引数の柔軟性を確保する
    • 引数の判定・加工はRubyにまかせる mruby-esp32-spi
    src
    spi.c
    main.rb
    spi_master.c
    mrblib
    spi.rb

    View full-size slide

  35. 対応したmrbgems

    View full-size slide

  36. mruby-esp32-spi
    • SPIクラスを提供するmrbgem


    • 今回新規で実装


    • 現状read, writeメソッドは未対応、transferメソッドで通信する

    View full-size slide

  37. mruby-esp32-ledc
    • PWMクラスを提供するmrbgem


    • 元々存在していたmrbgemにWrapperクラスを追加

    View full-size slide

  38. mruby-esp32-adc
    • ADCクラスを提供するmrbgem


    • 今回新規で実装(mruby-esp32-gpioから実装を切り離す)


    • 現状read, read_voltageは未対応、read_rawのみ使用可能

    View full-size slide

  39. 製作した基板
    • ESP32-DevKitCを中心に据えた基板を作成

    View full-size slide

  40. 製作した基板
    • さまざまなペリフェラルと接続
    8x8マトリクスLED


    (SPI)
    圧電スピーカー


    (PWM)
    ジョイスティック


    (ADC)

    View full-size slide

  41. デモ: Catch The Point.
    • Let’s play !

    View full-size slide

  42. 謝辞とお知らせ
    • 基板は今日のために弊社の後輩 @njl7502l が製作


    • ありがとうございました!


    • 手元に9枚残っているので欲しい人がいたらお渡しします


    • 今のところドキュメント等はないので、ご承知おきください…🙏

    View full-size slide

  43. おわりに

    View full-size slide

  44. 感想
    • ペリフェラルAPI仕様に沿った実装をすること自体は簡単


    • 世の中に存在する処理系に対して実装者が圧倒的に少ない
    46

    View full-size slide

  45. 参考: MicroPythonの処理系ごとの実装
    47

    View full-size slide

  46. • mrubyとmruby/cで開発リソースを分散させている場合じゃない


    • これをきっかけにお互いの開発を行き来できるようになると良いかも
    mruby
    感想
    48
    mruby/c

    View full-size slide

  47. • mrubyとmruby/cで開発リソースを分散させている場合じゃない


    • これをきっかけにお互いの開発を行き来できるようになると良いかも
    mruby
    感想
    49
    mruby/c
    ONE TEAM

    View full-size slide

  48. • 処理系に依る差分を解消するためペリフェラルAPI仕様が検討されている


    • ペリフェラルAPI仕様に沿ったmruby-esp32用のmrbgemを実装した


    • mruby-esp32-spi


    • mruby-esp32-adc


    • mruby-esp32-ledc


    • マイコンで遊びやすい環境が整いつつあるので、ぜひ遊んでみてください
    まとめ
    50

    View full-size slide

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

    View full-size slide