Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

自己紹介

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

今年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 /

Slide 5

Slide 5 text

本日のお話 • mruby-esp32 • ペリフェラル • ペリフェラルクラスの実装 • 対応したmrbgems • デモ • おわりに 5

Slide 6

Slide 6 text

mruby-esp32

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

ペリフェラル

Slide 18

Slide 18 text

ペリフェラルとは • 直訳すると「周辺機器」 • マイコンに搭載された「外部機器を制御するブロック」を指す 18 マイコン サーボモータ ジャイロ 
 スティック LED 超音波センサー 距離センサー マトリクスLED GPIO PWM I2C SPI UART ADC ※センサー・接続方法は一例です

Slide 19

Slide 19 text

ペリフェラルとは • 直訳すると「周辺機器」 • マイコンに搭載された「外部機器を制御するブロック」を指す 19 マイコン サーボモータ ジャイロ 
 スティック LED 超音波センサー 距離センサー マトリクスLED GPIO PWM I2C SPI UART ADC ※センサー・接続方式は一例です 広義のペリフェラル マイコンにおける ペリフェラル

Slide 20

Slide 20 text

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の明るさやサーボモータの制御、など

Slide 21

Slide 21 text

処理系ごとのペリフェラルクラス • ペリフェラルクラスは処理系ごとに実装されていて仕様もまちまち 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

Slide 22

Slide 22 text

処理系が変わるとアプリも修正しないといけない • その処理系のSPIクラスの仕様を確認して、書き換える必要がある 22 Raspberry Pi Pico なし(ベアメタル) PicoRuby Raspberry Pi Raspberry Pi OS ruby-spi pi_piper SPI Ruby H/W OS VM ライブラリ SPI通信アプリ アプリ SPI通信アプリ そのまま流用は できない

Slide 23

Slide 23 text

処理系が変わるとアプリも修正しないといけない • その処理系の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もバージョンの違いやメソッド ごとの対応状況の違いはあります

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

mruby-esp32にはまだいくつかの ペリフェラルクラスがない ↓ 作ってみよう💪 ESP32 FreeRTOS mruby 存在しない? H/W OS VM ライブラリ

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

mrbgemsの作成 • 右図の構造でディレクトリ・ファイルを作成 • mruby-mrbgem-templateを使うと簡単 mruby-esp32-spi mrblib spi.rb test spi.rb README.md src spi.c mrbgem.rake

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

参考: Cでmrubyのクラスを定義する クラスを定義し、メソッドの 
 名前や引数の数を定義

Slide 30

Slide 30 text

参考: Cでmrubyのクラスを定義する Rubyのメソッド呼び出しで 渡された引数を受け取る 続く

Slide 31

Slide 31 text

ペリフェラル機能の呼び出し • 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#

Slide 32

Slide 32 text

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

Slide 33

Slide 33 text

esp-idf 引数の柔軟性を確保する • Cでいろいろな引数に対応するのは難しい • 複数型の対応 • デフォルト引数 • キーワード引数 mruby-esp32-spi src spi.c main.rb spi_master.c

Slide 34

Slide 34 text

参考: SPI#writeの仕様 Rubyらしく、いろいろな型の 
 引数を渡せる

Slide 35

Slide 35 text

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

Slide 36

Slide 36 text

対応したmrbgems

Slide 37

Slide 37 text

mruby-esp32-spi • SPIクラスを提供するmrbgem • 今回新規で実装 • 現状read, writeメソッドは未対応、transferメソッドで通信する

Slide 38

Slide 38 text

mruby-esp32-ledc • PWMクラスを提供するmrbgem • 元々存在していたmrbgemにWrapperクラスを追加

Slide 39

Slide 39 text

mruby-esp32-adc • ADCクラスを提供するmrbgem • 今回新規で実装(mruby-esp32-gpioから実装を切り離す) • 現状read, read_voltageは未対応、read_rawのみ使用可能

Slide 40

Slide 40 text

デモ

Slide 41

Slide 41 text

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

Slide 42

Slide 42 text

製作した基板 • さまざまなペリフェラルと接続 8x8マトリクスLED (SPI) 圧電スピーカー (PWM) ジョイスティック (ADC)

Slide 43

Slide 43 text

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

Slide 44

Slide 44 text

謝辞とお知らせ • 基板は今日のために弊社の後輩 @njl7502l が製作 • ありがとうございました! • 手元に9枚残っているので欲しい人がいたらお渡しします • 今のところドキュメント等はないので、ご承知おきください…🙏

Slide 45

Slide 45 text

おわりに

Slide 46

Slide 46 text

感想 • ペリフェラルAPI仕様に沿った実装をすること自体は簡単 • 世の中に存在する処理系に対して実装者が圧倒的に少ない 46

Slide 47

Slide 47 text

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

Slide 48

Slide 48 text

• mrubyとmruby/cで開発リソースを分散させている場合じゃない • これをきっかけにお互いの開発を行き来できるようになると良いかも mruby 感想 48 mruby/c

Slide 49

Slide 49 text

• mrubyとmruby/cで開発リソースを分散させている場合じゃない • これをきっかけにお互いの開発を行き来できるようになると良いかも mruby 感想 49 mruby/c ONE TEAM

Slide 50

Slide 50 text

• 処理系に依る差分を解消するためペリフェラルAPI仕様が検討されている • ペリフェラルAPI仕様に沿ったmruby-esp32用のmrbgemを実装した • mruby-esp32-spi • mruby-esp32-adc • mruby-esp32-ledc • マイコンで遊びやすい環境が整いつつあるので、ぜひ遊んでみてください まとめ 50

Slide 51

Slide 51 text

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