GR-PEACH をmruby で動かせるようになったので試します · GR-PEACH をmruby...

Preview:

Citation preview

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 はオープンソースとして公開されているので、誰でも無料で入手・使用す

ることができます。 詳しくは、こちらを参照してください。

動作環境 • 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 で使っているクラスの説明

とアプリケーションの実行方法を説明します。

コードの説明

サンプルコード 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 を書く必要

がなくなります。

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

コマンドプロンプトを用いてコンパイルを行う場合、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 を以下に示します。

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 }

ソースコードの詳しい説明を行います。 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 が押されたと判

断します。

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

コンパイルに失敗した場合、パスが通っていない可能性があります。 パスを確認する方法はコマンドプロンプトで以下のコマンドを実行することで確

認することができます。

>Path

autorun.mrb が作成されたら、付属サンプルの時と同様の手順でアプリケーション

を実行します。

アプリケーションが正しく実行されると User Switch を押された時、RGB LED の発

光する色が赤、緑、青の順番で変わります。

次に、赤緑青以外の色に RGB LED を発光させます。

発光する色の変更

RGB LED は同時に点灯させる LED の組み合わせにより色が変化します。 赤と緑で黄色、緑と青で水色、赤と青で紫、三色全部を組み合わせると白に発光

します。ボタンを押すと RGB LED の色が変わるソースコード switchled_8.rb を以

下に示します。

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 }

「ボタンを押して 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 の発

光する色が変わります。色は赤、緑、黄色、青、紫、水色、白、黒(全て消灯)の順

番で変わります。

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 オブジェクトを返します

インスタンスメソッド

clear -> PlatoDevice::AQM0802A

LCD の表示を全て消し、オブジェクト自身を返す。

引数 説明 なし 戻り値 説明 PlatoDevice::AQM0802A AQM0802A オブジェクトの自身を返します

locate(x,y)

次に文字を出力する場所を(x,y)に設定します。

引数 説明 x 列の位置を指定します y 行の位置を指定します 戻り値 説明 PlatoDevice::AQM0802A AQM0802A オブジェクトの自身を返します

putc(c)

引数で渡した文字列の先頭一文字を LCD に表示し、次に文字列を出力する列を一

つずらします。列の最後になったら改行します。

引数 説明 c ディスプレイに表示する文字列を指定します。複数の文字がある場合は最

初の文字が表示されます 戻り値 説明 なし

print(s)

引数で渡した文字列または整数を LCD に表示します。

引数 説明 c ディスプレイに表示する文字列を指定します 戻り値 説明 なし

puts(s)

引数で渡した文字列を LCD に表示し、改行します。

引数 説明 c ディスプレイに表示する文字列を指定します 戻り値 説明 なし

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 オブジェクトを返します

インスタンスメソッド

temperature(unit=nil) -> Float

温度センサーの測定結果を返します。

引数 説明 unit ・温度の単位を指定します。:C が指定された場合は摂氏温度、:F が指定され

た場合は華氏温度で取得されます。デフォルトは new メソッドで設定した

単位になります 戻り値 説明 Float 温度センサーの測定結果を、new メソッドで設定した小数点以下の桁

数で返します

read -> Float

temprature メソッドを実行します。

引数 説明 なし 戻り

値 説明 Float 温度センサーの測定結果を、new メソッドで設定した小数点以下の桁数

で返します

Recommended