この記事は、Fujitsu Advent Calenderの 19 日目の記事です。
はじめに
@GORO_Nekoです。ご存知の方ご無沙汰してます。初めての方お初にお目にかかります。
えーっと、先にお断りをば一言。
自分、仕事では一切 mruby や mruby/c を扱っておりません。
以下は、自分が所属する会社の意向を反映したものでもスタンスを示すものでもなく、単なる一個人の趣味の活動から産まれた記述です。
Arduino Uno で動くアプリケーションを Ruby 言語では書けない
… そう思っていた時代が自分にもありました
だってそうでしょう?
Arduino Uno の搭載 SRAM の量は 2 KB しかないんですよ?
CRuby は言うに及ばず、動作するために必要な最低メモリ量が 400 KB の mruby も、40 KB の mruby/c も動くはずないとおもうじゃないですか。
こいつ … 動くぞ!
私は「あきらめたらそこで試合終了だよ」と言う言葉をよくよく思い出すべきでした。
なんと、Arduino Uno の上で、Ruby スクリプトから作ったアプリケーションを動作させる VM( micro mruby for arduino、unomruby/c ベース)を作り上げた方が現れました。
これ、凄いです。
あのプアなメモリしか持たない Arduino Uno の上で、Ruby スクリプトから作ったアプリケーションが本当に動いてしまいました。
[動いたプログラムの例]
puts "hello world"
このアプリケーションを実行すると言うか、Arduino Uno をリセットするたびに、PC 上に立ち上げたターミナルソフトの表示画面上に「hello world」と言う文字列が表示されます。
等価交換と言う代償
こんなプアな環境上で動かすために "micro mruby for arduino" は、本来 Ruby が持つ機能のうちいくつかを代償として切り捨てると言う等価交換を行っています。
ベースとした mruby/c からして、Ruby の機能やクラスをフルに取り込んでいません。
加えて "micro mruby for arduino" は以下の標準クラスを⾮対応としています。
• Array
• Hash
• Range
• Math
こうした等価交換の実施により、"micro mruby for arduino" は Ruby で書かれたアプリケーションを "Arduino Uno" 上で動作させることを成しえているようです。
GPIO の操作もできます
GitHub にコードを公開された方は、こちらで解説も書かれています。
解説ページでは、Arduino Uno 上の GPIO をコントロールしてみせる Ruby スクリプトの紹介も読めます。
解説ページの例に従って、Arduino Uno 上の GPIO をコントロールしてみせる Ruby スクリプトを書いてみましょう。
"Arduino Uno" の "Digital 11 Pin" 側に LED の長い側の足を、"GND" 側に LED の短い側の足を接続した回路を作成して、以下のようなスクリプトから作成したアプリケーションを "Arduino Uno" 上で動作させると、"Arduino Uno" に取り付けた発光ダイオードが 1 秒おきに点滅するはずです。
[ GPIO を利用したプログラム例]
puts "LED Test"
pin = 11
Arduino.pin_mode(pin,:OUTPUT)
st = :LOW
while(true) do
if(:LOW == st)
st = :HIGH
else
st = :LOW
end
Arduino.digital_write(pin,st)
Arduino.delay(1000)
end
センサーから値を読みだした値を、マイコン上で人にとって意味のある形式に変換する等を行おうとした場合、"micro mruby for arduino" は非力と言う評価になるかもしれません。
しかしマイコン上で行うのは、センサ等マイコンに接続された各電子部品を含むハードウェアに対し情報を入出力するだけ、得られた情報はサーバにでも転送してそこで加工すればよいと割り切るなら、"micro mruby for arduino" & Ruby スクリプトは、特に Ruby で何でも書きたい私のような人間には Arduino Uno 用アプリケーションを書くための良い選択肢となる気がします。
では、また。
【 2018/12/26 追記】
続編書きました。
開発環境の構築方法を確認したい方、読んでいただければ幸いだったり …