******************************************************************************
セッションS4d・S5d ワーク
テーマ:mruby/c事例紹介&ハンズオンワークショップ
講師:田中 和明(九州工業大学) 、羽角 均(株式会社モンスター・ラボ)
日時:2019/9/6(金) 12:40〜14:10、14:10〜15:20
参加人数:約10名
******************************************************************************


■ アジェンダ
・自己紹介
・組込みソフト開発
・Ruby、mruby、mruby/c
・mruby/c
・mruby/cの事例紹介「mruby/cを用いた醸造業向け温湿度管理への適応」
・mruby/c教育の事例紹介
・mruby/cのワークショップ教材
・mruby/cのハンズオンワークショップ
・まとめ


■ 自己紹介
○ 田中 和明
所属:九州工業大学情報工学部、軽量Rubyフォーラム
大学ではプログラミングやデータ構造とアルゴリズム、組込みの教育を担当している。
研究活動では、mruby関連の研究やデジタルサイネージ、土木現場での三次元測量の研究
を行っている。
Rubyのコミュニティ活動も行なっている。

○ 羽角 均
所属:株式会社モンスター・ラボ島根開発拠点
島根県松江市に在住している。Web系の開発をメインに行ってきた。


■ 組込みソフト開発
組込みシステム開発には計測と制御が必要になる。
組込みソフト開発ではプログラミング言語を記述しセンサなどのハードウェアを制御する。
組込みソフト開発にはいろいろな困難がある。
・ハードウェアの知識が必要
・タイミングの制御
- センシング周期の設定やモータなどのハードウェア固有の周期
・開発環境の準備
- 新しく開発環境を構築することの難易度は高い。
- 研究室の学生は、最初の開発環境の準備に時間が掛かり研究をすぐ始められない。
→ これらの困難をmrubyによって解決したい。


■ Ruby、mruby、mruby/c
○ Ruby
- 国産のプログラミング言語。
- 開発がしやすいため開発コスト(時間)を小さくできる。
- 可読性が高いため他人が書いたコードでも理解しやすい。
- Web開発がメインターゲット。
- Hulu、楽天、クックパッドなど多くの企業で利用されている。
- Rubyのプログラムは、Ruby処理系(CRuby)のサイズが大きくOS上で動作することを想
定しているため、全体では大きなソフトウェアになっている。

○ おまけデモ:Rubyによるメモ化の紹介
フィボナッチ数を計算するプログラムは再帰を利用するため、数が大きくなると指数的に
計算時間が掛かる。C言語では記述に手間が掛かる高速化手法であるメモ化を、Rubyでは
簡単に記述できることをデモで示した。

○ mruby、mruby/c
従来のRubyは大きなソフトウェアであるため、そのまま組込みソフト開発で利用できない。
制御プログラムは小さいことが要求される。
従来のRubyの機能を制限し小型化したものがmruby、mruby/cである。
Rubyは数MB、mrubyは400KB、mruby/cは64KBのメモリを必要とする。
mrubyは、リアルタイムOS等のOSが載っているハードウェアを想定している。
mrubyの実用事例としては、ネットワークルーター内のマイコン、ETロボコンのオフィシ
ャル言語、ゲームソフトなどがある。
mruby/cは、OSが載らない小さなハードウェアを想定している。
電源の確保が困難、省電力が望まれる環境ではmruby/cを使うと良い。

○ IoT
センサデバイスをネットワークに接続することで新しいサービスを創出する。
ソフト開発が中心、新しいアイデアをすぐに開発したい。書きやすいプログラミング言語
が望まれる。 → mruby/cを使うことで解決できる。


■ mruby/c
小型(ワンチップ)、省電力デバイス向けのmrubyである。
小さい組込みデバイス上での動作を想定している。
○ mruby/cを活用した研究事例
・SenStick
- 複数のセンサとBLEを搭載した小型な組込みデバイス。
- SenStickのプログラム開発にmruby/cを適応し簡単なIoT開発を実現。
- アイデアをすぐプログラムにし、すぐSenStickを動かす。
・LPWA
- LPWA規格のLoRaやSigFoxをmruby/cを使って手軽にアプリケーション開発ができるよ
うにする。
- mruby/c対応のLoRaモジュールを開発。

○ mrubyのバイトコード構成
・mruby 1.x
1命令は、オペランドの数に関わらず必ず4バイト構成になっている。
1バイト目が命令部、2バイト目以降がオペランド。
メモリアクセスの効率は良いが勿体無い部分があった。

・mruby 2.x
バイトコードの構成が新しくなり、可変長命令となった。
仮想マシン内において、命令を取り出すプログラムは複雑になった。
メモリアクセスの回数は増えたがバイトコードのサイズを小さくすることができた。

○ mruby/cが動くマイコン機材
・PSoCマイコン
・mruby/c評価ボード(しまねソフト研究開発センター、島根)
・RBoard(島根情報処理センター、島根)
・SenStick(Rubyビジネス推進協議会、大阪)
・ILC Air Kit(ILC、広島)


■ mruby/cの事例紹介「mruby/cを用いた醸造業向け温湿度管理への適応」
島根県出雲市にある旭日酒造にmruby/cを用いてIoTを実現した。
○ 背景
- 酒造では麹を作る際の品温管理がとてもシビアで、従来は蔵人が夜も眠らずに管理を
行っていた。

○ 酒蔵へのIoT適応の課題点
- 酒蔵は壁が厚く、BLE4.0やWiFiの電波が届かない事が判明した。
- 酒蔵内は湿度が高く、洗浄や蒸すための水やお酒などの液体が多くあるため通信用機
器を設置することが困難。
- 電源の確保用機器を設置することが困難。
→ mruby/cを使いこれらの課題を解決した。

○ 開発したシステム
- 醸造中のお酒の温度、気温、湿度を計測し、計測データはサーバを介して
スマートフォンアプリへ送信する。
- 温度センサ等を取り付けたPSoCデバイスの制御にmruby/cを適応した。
- PSoCデバイスから3Gネットワークを利用してデータ送信を行う。
- デバイスの通信スタックは最小限の構成にし、取得データの処理は主にWeb上で行う
戦略にした。
- 2017年から実験を開始し2018年1月から稼働を開始した。
- 2019年に基板梱包を新しく設計した。

○ mruby/cの利用部分
 - デバイス制御、I2C、7セグLEDなど
 - データはJSON形式の文字列で送信、RubyのStringクラスを利用

○ mruby/cを利用したことによる利点
・短い記述で多くのことができるので作りやすい。
酒蔵内で改造作業を行う際には素早く作業を行う必要がある。C言語でJSONを扱うとた
いへんな作業になるが、mruby/cはRubyのStringクラスを利用することで楽に改造作業が
できた。

・IoT開発に合っており開発効率の向上ができる。
IoT開発は、ネットワーク、クラウド、サーバ、モバイルアプリケーション、セキュリ
ティ、電気回路などの技術スタックが広い中で、mruby/cによってファームウェア開発を
楽に行うことでIoT開発が効率的になる。

○ 2018年当時、mruby/cのテストフレームワークが不十分だったためトラブル原因の特定
が困難だった。そこで新しくmruby/c用のテストツールを開発した。

○ 更に詳しい内容をRuby Kaigiで発表したので、興味のある方はネット上に公開されて
いる発表資料や動画をご覧ください。


■ mruby/cのワークショップ教材
○ ワークショップの目的
・プログラミングに興味を持ってもらい、組込み開発の基礎であるソフトでハードを制御
することを体験する。
・実際にモノを動かして理解する。

○ 教材としての要求
・誰でも安定して簡単に使えるものにする。
・セットアップが容易で扱いやすい。
・機材は容易に入手でき、低コストに準備できるものにする。
・誰が試しても、間違いなく同じように実行できる。

○ mruby/cを使った教材
・組込みソフトウェアの基礎である簡単な計測と制御を体験する。
・センサや通信を用いるものは、高校生、大学生向けの教材と想定している。

○ 教材にmruby/cを使う理由
・モノを動かすことを重視しているのでプログラム言語の習得に時間を掛けたくない。
・使用するプログラミング言語は、理解しやすい、書きやすい、読みやすいを重視
→ mruby/cを使う。
・子ども向けのワークショップでは、詳しい文法の説明はせずにプログラム例を見せると
理解してくれる。その際できるだけ短い行数のプログラムにし、複雑な文法は使わずIoT
プログラミングを体験できるようにする。
・ハードウェア制御は抽象化してハード固有の記述を排除し、簡単なプログラムだけで
ハードウェア制御ができるようにする。

○ mruby/c教育の事例紹介
1.最先端ITキャンプ
島根県で小中学生を対象に1泊2日のワークショップを実施。
2輪駆動のロボットカーをmruby/cを用いて制御する教材。
チームで行うので子どもたちは役割分担して開発を進める。
参加者は、小学2年生〜中学2年生。
まだローマ字を勉強していない小学校低学年の子どもにはキーボードの対応表を配った。

2.SSH事業(Super Science High school事業)
福岡県飯塚市で実施した高校と大学間の連携講義。
高校生を対象にワークショップを実施。
ハードウェア制御や並行処理など小中学生向けよりも少し専門的な内容を体験する。
センサの特性を理解した上でセンシングするプログラムを動かす。

3. IoT Workshop
アメリカのサーベール市やインドやスリランカ、インドネシアで実施。
・サーベール市のワークショップ
小中学生が対象。
2輪駆動のロボットカーをmruby/cを用いて制御する教材。
アメリカのシリコンバレーでは子ども達のプログラミングスキルが非常に高い。子ども達
の親がIT企業に勤めている場合が多いためである。一方で、子ども達は実際にハードウェ
アを動かす経験が少ない。
このワークショップでソフトウェアによって実際にモノを動かすことが貴重な体験になっ
ている。

・インドのチェンナイのワークショップ
大学生を対象。
ソフトウェアの知識はすでにある。
ハードウェアを制御するI/O関係や並行処理を学習する教材。
マルチプログラミングを体験し同期の取り方などを学習してもらう。



■ mruby/cのハンズオンワークショップ
・使用教材:RBoardとmruby/c IDE
・RBoard
- PSoCマイコンがベース。
- GROVEシステムのセンサを接続可能。
・mruby/c IDEの設定
- コンパイラの設定、書き込みの設定、ポートの設定が必要。
- プログラムの書き込みは、mruby/c IDEの書き込みボタンを押した後に、RBoard上の
リセットボタンを押して離した時に書き込まれる。

○ プログラム内容:
1. RBoard上のLEDの点滅
・動かしたプログラム
______________________
while true
leds_write 1
sleep_ms 500
leds_write 0
sleep_ms 500
end
______________________


2. RBoard上の4つのLEDの点灯を切り替える
・動かしたプログラム
______________________
while true
v=1
4.times do
leds_write v
v =v * 2
sleep_ms 500
end
end
______________________


3. RBoardのGPIOに接続したLEDの点滅
・動かしたプログラム
______________________
pin = P2.new
while true
pin.write 0,1
sleep_ms 500
pin.write 0,0
sleep_ms 500
end
______________________


4. mruby/cのコンカレント実行機能を利用して2つのLEDの点灯パターンを切り替える
・動かしたプログラム
1つ目
______________________
$val = 0
while true
$val = $val ^ 0x01
sleep_ms 1000
end
_______________________

2つ目
_______________________
$val = 0
while true
$val = $val ^ 0x02
leds_write $val
sleep_ms 500
end
_______________________

・問題点:2つのプログラムが同時動くためvalの参照を割り込まれる可能性がある。
本来は排他制御が必要。


■ まとめ
○ハンズオンワークショップ
・予定していた4つのプログラムを全て完了することができた。
・1名だけ持参したPCがRBoardを認識できなかった。
→ PSoC5LPマイコンに変えてワークショップに取り組んでもらった。