mrubyは2012年4月に公開され気がつくと今年で13年経っています。
こんにちわ、軽量Rubyフォーラムの石井です。
最近はTidal,QobuzといったストリーミングをRoon,Direttaといったツールをさらに活用してIPレス、JumboFrameで聞くネットワークオーディオに深くハマっています。
さて軽量Rubyフォーラムはmrubyの幅広い利用を促す目的で様々な活動をしています。その中で今年行った大学、高専生さんを対象に実施した”モノを動かすプログラム体験”をご紹介します。
この体験会は福岡県商工部が主催する未来ITイニシアティブと特定非営利活動法人AIPのご協力で実現しました。
”モノを動かすプログラム体験” Hack-Academiaとは?
組み込み開発、これを実際に体験してみましょうというのがこのHack-Acedemiaです。
対象は大学生、大学院生、高専生、高校生。理系に限らず幅広く募集しました。
組み込みというと取っつきにくい、なにそれ?という印象があるのでモノを動かすというふうにしています。経験ないけど興味あるという学生さんを誘い込むために初級コースと本当に組み込み開発を体験してみたいという学生さんのための本格コースの2つに分けました。
初級コースは楽しく参加できる電子工作的な2日間の体験会です。
会場は福岡県未来ITイニシアティブセンター(旧Rubyセンター)をお借りしました。使用したマイコンはM5Stack Core S3, Displayに絵を書いたりLチカなど体験してもらいます。LチカもRGB LEDを用意し距離センサーと連動して色が変わるなどちょっとモノを動かすっぽくしています。mrubyは最新の3.4.0をポーティングしました。
開発環境の準備やmrubyの基本的使い方も含まれるので本格コースの参加者にも参加してもらいます。
本格コースは用意されたマイコン、センサー類を使って自分で考えたシナリオに沿って開発してもらう3日間+発表会1日のハッカソンです。
お題は自由に各学生さんが日頃あったら良いなと思っているものを作ってもらいます。1日といっても午後1時から4時までなのであまり時間はありませんがmrubyの使いやすさとコーチであるベテランの組み込みエンジニアのサポートでなんとかなるんですよね。
本コース用に用意されたマイコンとセンサー類
| 名称 | 内容 |
|---|---|
| M5Stack CoreS3 IoT開発キット | https://ssci.to/8960 |
| 距離センサ SEN0590 | http://ssci.to/9217 |
| GROVE 温湿度センサ SHT31 | https://ssci.to/2853 |
| GROVE カラーセンサ | 現在製造中止 |
| GROVE 水位センサ | https:// ssci.to/6282 |
| GROVE I2Cハブ | http://ssci.to/796 |
| その他:単色LED, RGB LED, ブレッドボード |
つかうのはもちろんmruby
この体験会のためにM5Stack CoreS3 上で mruby3.4.0 を動作させるためのサンプルプロジェクトM5StackCoreS3-mrubyを用意しました。
Github上のmruby forumで公開しています。ビルドにあたってはESP-IDFが必要です。READMEを参考にしてください。
https://github.com/mruby-Forum/M5StackCoreS3-mruby
M5StackCoreS3-mrubyに搭載している体験会用に用意している拡張ライブラリ(mrbgems)は以下の通り。ドキュメントなど不十分なところもありますが(鋭意更新中)サンプルプログラムなど参考にしてください。
| mrbgem | 概要 |
|---|---|
| mruby-stdio | 標準入出力ライブラリ |
| mruby-m5stack-gpio | GPIO(汎用IO)ライブラリ |
| mruby-m5stack-pwm | PWM制御ライブラリ |
| mruby-stdio-m5stack | M5Stack用標準入出力ライブラリ |
| mruby-sleep-esp32 | sleep, delayメソッド |
| mruby-m5stack-i2c | I2C制御ライブラリ |
| mruby-m5stack-ble-gatt | M5Stack BLE GATTライブラリ |
| mruby-m5stack-lcd | M5Stack CoreS3 LCDライブラリ |
| mruby-i2c-device | I2Cデバイスライブラリ |
| mruby-grove-color-sensor | GROVEカラーセンサライブラリ |
| mruby-grove-temp-humi-sensor | GROVE温湿度センサライブラリ |
| mruby-grove-water-level-sensor | GROVE水位センサライブラリ |
| mruby-laser-ranging-sensor | レーザ距離センサライブラリ |
| mruby-haext-accel | 加速度センサ(M5Stack CoreS3内蔵)ライブラリ |
| mruby-m5stack-savemrb | mrubyファイル転送 |
| mruby-m5stack-mrb | mrubyアプリメニュー |
micro SDカードのルートディレクトリに autorun.mrb のファイル名でmrubyアプリケーションを配置することで、M5StackCore3-mruby起動時にmrubyアプリケーションを自動実行することができるようにしています。
ただその都度アプリを書き込んでM5Stackに差すという行為は開発中にはなかなか面倒なものです。そこでファイル転送機能(savemrb)をつけました。コンパイルしたmrubyバイナリ(mrbファイル)をターミナルソフトCooltermのxmodem機能を使ってM5Stackに転送します。
mrubyアプリメニューを使って保存したアプリを選択し、実行させます。
初級コース ー まずはマイコンに触ってみよう ー
このHack-Academiaは初級コース2日間、本格コース4日間と10月11月の2ヶ月間の土日で行われます。参加者が集まるか心配でしたが初級のみ申し込み5名、実際には1名キャンセルで参加は4名(高校生1,大学生3,)、本格4名(高専1,大学2、企業1)の応募がありました。初級コースのみ参加の大学生2名は興味を持ってくれてその後の本格コースにも参加となり(本格コースの1名、直前キャンセルあり)本格コースは5名参加となりました。
大まかな内容はこんな感じです。
このHack-Academiaは”モノを動かすプログラム体験”の他に”Webアプリ開発”と”モバイルアプリ開発”があり10/13は初日ということで全参加者が集まっています。
まずはまつもとさんの講演で始まります。AIに関する講演でまつもとさんが普段使っているAIの話やどう使うかという話でした。なかなか言うことを聞いてくれないとか意地を張るAIなど面白い話満載でした。まつもとさんから参加者には”AIは辛抱強くサポートしてくれる相棒としてプログラムの勉強に使ってほしいというアドバイスがありました。個人的には”AIはソフトなので間違っても下げる頭がない”というのが受けました。
Matz講演後場所を移して”モノを動かすプログラミング体験”の開始です。
M5StackCoreS3-mrubyは起動するとmirbが立ち上がります。Cooltermなどのターミナルから接続してrubyコマンドを実行できます。
↓ M5Stack初期化して起動 MDカードに書き込まれたmrubyアプリ実行の様子
↓ 初級コース実施中
↓ テキストより CooltermでのmirbでRuby実行の様子
日本の国旗をLCDに書いてみます
コードはこんな感じです。
LCD.clear
LCD.fill_rect(50, 40, 219, 159, LCD::WHITE)
LCD.fill_circle(160, 120, 50, LCD::RED)
gets
国旗を書いたり動かしてみたり徐々に慣れてもらっています。
はじめて触るマイコン、mruby、ターミナルなどなかなか進みません。
単色のLチカまで行きたいところですがここで時間切れ。
ただ次回はオンライン開催、ブレッドボードなど初めての人も多いので一旦配線だけしてもらいます。やはりむずかしそう、それでもなんとか組み上げれました。
2日目はオンラインで行います。対面でないとやはり色々不安です。
早速単色LEDを使ったLチカです。接触不良など数々の障害発生しますが、点きました!という嬉しい声が画面の向こうから上がります。
# L-chika sample
led = GPIO.new(0)
loop {
led.write(1)
delay(500)
led.write(0)
delay(500)
}
その後、mrubyやGPIOなどハードウェア制御の簡単な説明。この後、いよいよセンサーとの連携。
距離センサーを使いRGB LEDを制御します。センサーからの距離によってRGB発光を切り替えるというものです。
これが距離センサーです。まず距離センサーをM5Stackにつないで動作することを確かめます。

ここでM5StackにはGROVEコネクタがいくつかつあるので違うところに繋いでしまいそれが原因で繋がらないなどトラブル発生。なんとか原因究明してついに距離センサーとRGB LEDの連携に行きます。
# RGB L Chika
# RGB LEDクラス
class RGBLED
# コンストラクタ
def initialize
@ledr = GPIO.new(0)
@ledg = GPIO.new(1)
@ledb = GPIO.new(2)
end
# RGB LED点灯
# r:赤, g:緑, b:青 (0:消灯, 1:点灯)
def write(r, g, b)
@ledr.write(r)
@ledg.write(g)
@ledb.write(b)
end
end
# RGB LED/距離センサ初期化
rgbled = RGBLED.new
sensor = LaserRangingSensor.new
LCD.text_size = 2
loop {
# 距離計測
dist = sensor.read
LCD.clear
LCD.setCursor(2, 2)
LCD.puts dist
if dist >= 1000
colors = [1, 1, 1] # 1m以上 白色
elsif dist >= 500
colors = [0, 1, 0] # 50cm以上 緑色
elsif dist >= 200
colors = [1, 1, 0] # 20cm以上 黄色
else
colors = [1, 0, 0] # 20cm未満 赤色
end
rgbled.write(colors[0], colors[1], colors[2])
delay(dist / 2)
rgbled.write(0, 0, 0)
delay(dist / 2)
}
このプログラムは以下のように動作します。
ー 測定距離に応じてLED表示色を変更
• 1m以上: 白
• 50cm以上: 緑
• 20cm以上: ⻩
• 20cm未満: 赤
ー 距離が近づくにつれてLEDの点滅速度を速くする。
実際の動作はこんな感じです。
ということで初級コースの2日間が終わりました。先に書いた通りこれに興味を持ってくれた大学生2名がさらに本格コースに参加してくれることになりました。
モノを動かすプログラミング体験という形で組み込み開発に興味を持ってもらおうと試みはうまくいきそうです。
長くなりました。お付き合いいただきありがとうございます。
本格コースがどうなったかはその2で公開(12/16予定)します。5名参加されていますがそれぞれかなりユニークな発想で挑戦されています。またご覧ください。









