Page 1
GR-PEACH を mruby で動かせるようになったので試します
ルネサスエレクトロニクス製のマイコンボード GR-PEACH で動作する mruby 実行
環境である momo-mruby が 2017 年 9 月 1 日に発表され、GR-PEACH でも mrubyアプリケーションが動くようになりました。 これにより、mruby のリファレンスボードとして使えるマイコンボードが増えま
した。 簡単に mruby を動作させる環境を整えることができるようになったので、実際に
mruby アプリケーションを作成していきます。 GR-PEACH には、RGB LED と赤色 LED、User Switch 等が搭載されています。 今回は RGB LED を使用して LED を点灯させるアプリケーションと User Switch で
RGB LED の点灯する色の切り替えを行うアプリケーションを作成します。 RGB LED と User Switch の位置は下の画像を参考にしてください。
mruby とは
mruby は開発言語の Ruby を軽量化し、組込みシステムや様々なソフトウェアに
組み込むことができるようにしたプログラミング言語です。 Ruby と同様に C 言語より少ないコード量でアプリケーションを動かすことができ
ます。 C 言語との親和性が高く、C 言語プログラムから mruby プログラムを、mruby プ
ログラムから C 言語プログラムを呼び出すことができます。 mruby アプリケーションは VM 上で動作するため環境依存することなく使用する
ことができます。 mruby はオープンソースとして公開されているので、誰でも無料で入手・使用す
ることができます。 詳しくは、こちらを参照してください。
Page 2
動作環境 • PC(OS:Windows7 Professional 64bit) • GR-PEACH Full • USB ケーブル(A-microB) • microSD カード
GR-PEACH で mruby を動作させるには以下のものをセットアップしておく必要が
あります。
• momo-mruby-bin(Windows 用)
セットアップ手順はこちら(https://github.com/mimaki/momo-mruby-bin/blob/master/README_ja.md)を参考にしてください。
付属サンプル説明
RGB LED は赤緑青の LED が一つずつついており、各色の LED の組み合わせにより
色を変化させることができます。 セットアップ手順には、付属のサンプルコード led.rb を使用してアプリケーショ
ンを実行する手順が載っていますが、ここでも led.rb で使っているクラスの説明
とアプリケーションの実行方法を説明します。
Page 3
コードの説明
サンプルコード led.rb を以下に示します。
1 include Plato
2
3 leds = [
4 [LED.new(GPIO::LED1), 3], # red
5 [LED.new(GPIO::LED2), 5], # green
6 [LED.new(GPIO::LED3), 7] # blue
7 ]
8
9 i = 0
10 loop {
11 leds.each {|led|
12 led[0].toggle if i % led[1] == 0
13 }
14 i += 1
15 Machine.delay(100)
16 }
ソースコードの詳しい説明を行います。
1 include Plato
1 行目の Plato モジュール内のクラスを使用できるように Plato の名前空間を取り
込みます。名前空間を取り込んでいるのでクラスを宣言する際に Plato を書く必要
がなくなります。
Page 4
3 leds = [
4 [LED.new(GPIO::LED1), 3], # red
5 [LED.new(GPIO::LED2), 5], # green
6 [LED.new(GPIO::LED3), 7] # blue
7 ]
3~7 行目で引数として操作するピン番号を渡した LED オブジェクトと LED を操作
するタイミングのための数値をもつ配列 leds を定義しています。数値がどのよう
に使われるかは後ほど説明します。 LED クラスで定義されているメソッドを用いることで、LED の点灯・消灯を制御
することができます。詳しくはこちら(http://plato.click/doc/ja/reference/led/)を参照してください。 GPIO::LED1、GPIO::LED2、GPIO::LED3 はそれぞれ RGB LED の赤、緑、青の LEDにつながるピン番号が定義されています。
10 loop {
11 leds.each {|led|
12 led[0].toggle if i % led[1] == 0
13 }
14 i += 1
15 Machine.delay(100)
16 }
10~16 行目は 0.1 秒間隔で処理を繰り返します。繰り返しの 3 回に 1 回毎に赤色
LED、5 回に 1 回毎に緑色 LED、7 回に 1 回毎に青色 LED の点灯状態を切り替え
ます。
アプリケーションの実行
アプリケーションを実行するには rb ファイルを mruby コンパイラ(mrbc)を用い
てコンパイルしておく必要があります。 momo-mruby を C ドライブ直下にセットアップした場合、mrbc があるディレク
トリは
C:\momo-mruby-bin-1.0.0-win\bin
Page 5
コマンドプロンプトを用いてコンパイルを行う場合、led.rb のおかれたディレクト
リに移動し、コンパイルのコマンドを実行するとコンパイル結果として
autorun.mrb が作成されます。
>c: >cd \momo-mruby-bin-1.0.0-win\sample >..\bin\mrbc -o autorun.mrb led.rb
コンパイル結果(autorun.mrb)を microSD カードのルートディレクトリにコピーし、
GR-PEACH の microSD スロットに装着します。 GR-PEACH を以下の画像のように USB を接続して電源投入すると、mruby アプリ
ケーション(autorun.mrb)が実行されます。 アプリケーションが正しく実行される
と、RGB LED が色を変えながら発光します。
leds の数値 3,5,7 を変えると色が変わるタイミングが変わるので、変えてみてく
ださい。
ここまでは、サンプルコードについて説明しましたが、次は実際にコードを書い
てみます。
ボタンを押して LED を点ける
led.rb では、LED は一定周期で発光していましたが、次は GR-PEACH に搭載され
ている User Switch を使って任意のタイミングで LED を発光させるアプリケーシ
ョンを作成します。
コードの説明
コードの switchled_3.rb を以下に示します。
Page 6
1 include Plato
2
3 leds = [
4 LED.new(GPIO::LED1), # red
5 LED.new(GPIO::LED2), # green
6 LED.new(GPIO::LED3) # blue
7 ]
8 button=ButtonSwitch.new(GPIO::BUTTON1)
9
10 def switch_push?(button)
11 count = 0
12 while button.on? do
13 count += 1
14 end
15 count > 1000 ? true : false
16 end
17
18 push_count = 0
19 loop{
20 if switch_push?(button) then
21 leds.each_with_index{|pin , index|
22 if push_count % 3 == index then
23 pin.off
24 else
25 pin.on
26 end
27 }
28 push_count += 1
29 end
30 }
Page 7
ソースコードの詳しい説明を行います。 1 行目の Plato の名前空間を取り込みは(付属サンプル説明)のコード説明を参考に
してください。
3 leds = [
4 LED.new(GPIO::LED1), # red
5 LED.new(GPIO::LED2), # green
6 LED.new(GPIO::LED3) # blue
7 ]
3~7 行目で引数として操作するピン番号を渡した LED オブジェクトを要素にもつ
配列 leds を定義しています。 LED クラスについては付属サンプル説明を参考にしてください。
8 button=ButtonSwitch.new(GPIO::BUTTON1)
8 行目で ButtonSwitch.new で button オブジェクトを生成し、引数として操作する
ピン番号を渡します。 ButtonSwitch クラスは User Switch を制御するためのメソッドを定義しています。 詳しくはこちら(http://plato.click/doc/ja/reference/buttonswitch/)を参照してくだ
さい。 GPIO::BUTTON1 は User Switch につながるピン番号が定義されています。
10 def switch_push?(button)
11 count = 0
12 while button.on? do
13 count += 1
14 end
15 count > 1000 ? true : false
16 end
10~16 行目で User Switch が押されたかどうか判断する switch_push?メソッドを定
義しています。 User Switch を押して離すと、アプリケーション側で User Switch が押されたと判
断します。
Page 8
20 if switch_push?(button) then
21 leds.each_with_index{|pin , index|
22 if push_count % 3 == index then
23 pin.off
24 else
25 pin.on
26 end
27 }
28 push_count += 1
29 end
ボタンが押された時、RGB LED を発光する色を切り替えます。
アプリケーションの実行 ソースコードがどこにあってもコンパイルができるようにシステム環境変数の
Path に mrbc までのパスを追加し、どこからでも mrbc を使うことができるよう
にします。 momo-mruby を C ドライブ直下にセットアップした場合の、mrbc までのパスを
以下に示します。
C:\momo-mruby-bin-1.0.0-win\bin
Windows7 の場合、パスの追加は以下の手順で行ないます。
コントロールパネルを開き、システムとセキュリティ⇒システム⇒システム詳
細設定を開きます
詳細設定タブの環境変数をクリックします
システム環境変数の Path を選択し編集で mrbc までのパスを追加します
switchled_3.rb が保存されているディレクトリでコマンドを実行する autorun.mrbが作成されます。
>mrbc -o autorun.mrb switchled_3.rb
コンパイルに失敗した場合、パスが通っていない可能性があります。 パスを確認する方法はコマンドプロンプトで以下のコマンドを実行することで確
認することができます。
Page 9
>Path
autorun.mrb が作成されたら、付属サンプルの時と同様の手順でアプリケーション
を実行します。
アプリケーションが正しく実行されると User Switch を押された時、RGB LED の発
光する色が赤、緑、青の順番で変わります。
次に、赤緑青以外の色に RGB LED を発光させます。
発光する色の変更
RGB LED は同時に点灯させる LED の組み合わせにより色が変化します。 赤と緑で黄色、緑と青で水色、赤と青で紫、三色全部を組み合わせると白に発光
します。ボタンを押すと RGB LED の色が変わるソースコード switchled_8.rb を以
下に示します。
Page 10
1 include Plato
2
3 leds = [
4 LED.new(GPIO::LED1), # red
5 LED.new(GPIO::LED2), # green
6 LED.new(GPIO::LED3) # blue
7 ]
8
9 button=ButtonSwitch.new(GPIO::BUTTON1)
10
11 def switch_push?(button)
12 count = 0
13 while button.on? do
14 count += 1
15 end
16 count > 1000 ? true : false
17 end
18
19 push_count=0
20
21 loop{
22 if button.switch_push?(button) then
23 push_count += 1
24 push_count & 0b001 != 0 ? leds[0].high : leds[0].low
25 push_count & 0b010 != 0 ? leds[1].high : leds[1].low
26 push_count & 0b100 != 0 ? leds[2].high : leds[2].low
27 end
28 }
Page 11
「ボタンを押して LED を点ける」のコードの loop 内が変わったコードです。
1 if button.switch_push?(button) then
2 push_count += 1
3 push_count & 0b001 != 0 ? leds[0].high : leds[0].low
4 push_count & 0b010 != 0 ? leds[1].high : leds[1].low
5 push_count & 0b100 != 0 ? leds[2].high : leds[2].low
6 end
ボタンが押された時、発光する色が切り替わります。
アプリケーションの実行
switchled_8.rb が保存されているディレクトリでコンパイルのコマンドを実行する
と autorun.mrb が作成されます。
>mrbc -o autorun.mrb switchled_8.rb
autorun.mrb が作成できたら付属サンプルの時と同様の手順でアプリケーションを
実行します。 アプリケーションが正しく実行されると User Switch を押された時、RGB LED の発
光する色が変わります。色は赤、緑、黄色、青、紫、水色、白、黒(全て消灯)の順
番で変わります。
Page 12
AQM0802A クラス
AQM0802A クラスは LCD ディスプレイの出力を制御するメソッドが定義されてい
ます。 Plato モジュールの名前空間を呼び出しています。
定数
定数として I2CADDR、WIDTH、HEIGHT を持ちます。
定数 説明 I2CADDR LCD ディスプレイ AQM0802A の I2C アドレス(0x3e) WIDTH LCD ディスプレイの列の数(8) HEIGHT LCD ディスプレイの行の数(2)
特異メソッド
new(addr=I2CADDR) ->PlatoDevice::AQM0802A
AQM0802A デバイスのオブジェクトを作成し、setup メソッドと clear メソッドを
実行後、作成したオブジェクトを返します。
引数 説明 addr AQM0802A の I2C アドレス(デフォルト:I2CADDR)を指定
します 戻り値 説明 PlatoDevice::AQM0802A 生成した AQM0802A オブジェクトを返します
Page 13
インスタンスメソッド
clear -> PlatoDevice::AQM0802A
LCD の表示を全て消し、オブジェクト自身を返す。
引数 説明 なし 戻り値 説明 PlatoDevice::AQM0802A AQM0802A オブジェクトの自身を返します
locate(x,y)
次に文字を出力する場所を(x,y)に設定します。
引数 説明 x 列の位置を指定します y 行の位置を指定します 戻り値 説明 PlatoDevice::AQM0802A AQM0802A オブジェクトの自身を返します
putc(c)
引数で渡した文字列の先頭一文字を LCD に表示し、次に文字列を出力する列を一
つずらします。列の最後になったら改行します。
引数 説明 c ディスプレイに表示する文字列を指定します。複数の文字がある場合は最
初の文字が表示されます 戻り値 説明 なし
Page 14
print(s)
引数で渡した文字列または整数を LCD に表示します。
引数 説明 c ディスプレイに表示する文字列を指定します 戻り値 説明 なし
puts(s)
引数で渡した文字列を LCD に表示し、改行します。
引数 説明 c ディスプレイに表示する文字列を指定します 戻り値 説明 なし
Page 15
ADT7410 クラス
ADT7410 クラスは温度センサーADT7410 を制御するメソッドが定義されています。 Plato::Sensor クラスを継承しています。
定数
定数として I2CADDR を持ちます。
定数 説明 I2CADDR LCD ディスプレイ AQM0802A の I2C アドレス(0x48)
特異メソッド
new(addr=I2CADDR, ndigits=3, unit=:C) ->PlatoDevice::ADT7410
ADT7410 センサデバイスのオブジェクトを生成して返します。
引数 説明 addr HDC1080 の I2C アドレス(デフォルト:I2CADDR)を指定し
ます ndigits 読み取り値を丸める小数点以下の桁数を指定します。デフ
ォルトでは小数点以下 3 桁に丸められます unit 温度の単位を指定します。:C が指定された場合は摂氏温
度、:F が指定された場合は華氏温度で取得されます 戻り値 説明 PlatoDevice::ADT7410 生成した ADT7410 オブジェクトを返します
Page 16
インスタンスメソッド
temperature(unit=nil) -> Float
温度センサーの測定結果を返します。
引数 説明 unit ・温度の単位を指定します。:C が指定された場合は摂氏温度、:F が指定され
た場合は華氏温度で取得されます。デフォルトは new メソッドで設定した
単位になります 戻り値 説明 Float 温度センサーの測定結果を、new メソッドで設定した小数点以下の桁
数で返します
read -> Float
temprature メソッドを実行します。
引数 説明 なし 戻り
値 説明 Float 温度センサーの測定結果を、new メソッドで設定した小数点以下の桁数
で返します