1時間でできるEV3RTでmruby


ちょっと煽り気味なタイトルですが、要するに開発環境を整える必要もなく、EV3でmrubyを試してみませんかというお話です。

GitHubからコードを取ってきて、SDカードに書き込んだらすぐに動作させることができます。Rubyのコードを編集してSDカードに上書きすればプログラムの修正はOK。ほら、簡単でしょ?

この記事の対象はETロボコン参加者に限っていませんが、EV3RTの基本的な操作は知っている方とします。

なぜ開発環境不要なの?

既にmrubyをご存知の方には、「ちょっと待って!バイトコードはどうやって作るの?」と思われたかもしれません。ふふふ、バイトコードにしなくてもRubyのコードを読み込んで実行することもできるのです。
バイトコードにする場合は、Rubyのコードを修正するたびにビルドし直す必要があります。しかし、Rubyのコードをそのまま実行する場合は、Rubyのコードを書き換えるだけでビルドする必要がありません。
この記事で紹介するアプリを使えばRubyのコードを書くだけでよいのです。

上級者向け補足

ビルドしなくてよいのは、あらかじめEV3RTのタスクの数や設定と各タスクで読み込むRubyのファイル名を決めてビルドしたいわゆる「app」を私の方で用意したものを使用してもらうからです。
ご自身でappを作成する場合は、C言語レベルでのタスクの数や設定、Rubyのファイル名を変更した場合はappをビルドし直す必要があります。

準備するもの

特に何か新しく用意する必要はありません。これまで使ってきたPCとEV3があればOK。
EV3は走行体の形をしていなくてもかまいません。できればセンサーかモーターを1つ以上用意してください。1

セットアップ

コードの取得

この記事で使用するものはGitHubにあります。

EV3RT β版用

git clone https://github.com/yamanekko/app_1task

EV3RT 1.0用

git clone https://github.com/yamanekko/app_1task4ev3rt-v1

EV3RTの準備

動的ローディング形式を使用します。

EV3RT 1.0用の場合

先ほどcloneしてきたリポジトリから app_1task4ev3rt-v1/bin/ev3rt-v1/の中身をSDカードにコピーしてください。

EV3RTβ版の場合

この記事は β7 用です。β7-1など違うバージョンには対応していません。2
先ほどcloneしてきたリポジトリの中にあるSDCardディレクトリ以下をSDカードにコピーしてください。
(β7用のSDカードをお持ちの場合はそれを使用してもよいです。中身はev3rt-beta7-release.zipのsdcardディレクトリと同一です)
SDカードの中身はこんな感じになっています。この「apps」フォルダにappもRubyのコードも入れます。

appをSDカードにコピー

SDカードのev3rt/appsフォルダの中にcloneしてきたリポジトリのbinディレクトリに入っている起動用アプリをコピーします。
今回は「app_1task」を使用しましょう。

以降は、β版も1.0も同じです。

Rubyのコードを作成してSDカードにコピーする

今回使用する「app_1task」アプリは、Rubyのファイル名が「main_task.rb」と決められています。他の名前では動きません。
ここではひとまずサンプルコードを動かしてみることにします。
SDカードのev3rt/appsフォルダの中にcloneしてきたリポジトリのmain_task.rbをコピーしてください。
SDカードのev3rt/appsフォルダの中にはapp_taskとmain_task.rbが入っていますね。
EV3RTはUSBで接続したままだとアプリが起動できないので、USBケーブルは外しておきましょう。

参考)SDカードに書き込む際はUSB経由がおすすめ

SDカードを都度抜き挿しして書き直すのは手間だし、EV3本体のSDカードスロットを痛める原因にもなります。そこでSDカードはEV3本体に挿しっぱなしにしておき、USBケーブルを使用してファイルをコピーすることをおすすめします。
USBケーブルを使ってファイルを書く方法はTOPPERSのサイトにあるSDカード+USBケーブルによるアプリケーションのロード方法を参考にしてください。

動かしてみよう

準備ができたので、早速動かしてみましょう。

超音波センサーのポートを確認

超音波センサーがポート2に接続されていることを確認してください。

アプリを起動する

ふつうにEV3RTでアプリを動かす時と同じです。
本体中央にある濃いグレーのボタンを押して起動します。SDCard->app_1taskを選択してください。

このサンプルは、超音波センサーが30cm以内に障害物を検知している間、LEDが緑色に光り、検出しなくなると消灯します。
Rubyを使ったことがなくてもコードを見れば、どんな動きをするプログラムかわかるのではないでしょうか。

サンプルコードを変更してみよう

まずは、

  • 検出する距離 @sonar_sensor.distance <= 30
  • LEDの色 @led.on(EV3RT::LED_GREEN)
  • Sleepの時間 EV3RT::Task.sleep(1000)
  • などを変えてみるとよいでしょう。 エラーになった場合はLCD(EV3本体の液晶)にエラー内容が表示されます。3

LEDの色は

EV3RT::LED_RED
EV3RT::LED_GREEN
EV3RT::LED_ORANGE

の3種類があります。
消す場合は

EV3RT::LED_OFF

です。

他のセンサーやモーターも使ってみよう

使えるRubyのAPIはyamanekko版mruby-ev3rtのAPIリファレンスを参照してください。

モーターを回してみる

参考例としてモーターを動かしてみることにしましょう。

main_task.rbの中身を以下のように変えて、実行してみてください。
モーターはポートBに接続されている必要があります。

main_task.rb
class MotorControler

  def initialize
    @motor = EV3RT::Motor.new(EV3RT::PORT_B, EV3RT::LARGE_MOTOR)
  end

  def drive
    @motor.power = 50
    EV3RT::Task.sleep(1000)
    @motor.power = 0
  end

end

class MainTask
  def self.execute
    self.new.execute
  end

  def initialize
    @motor_controler = MotorControler.new()
  end

  def execute
    @motor_controler.drive
  end
end

MainTask.execute

モーターが1秒回って止まったらOKです。
ずっと回ってたらうるさいので1度きりのサンプルにしました。
モーターの数を増やしたり、回し方を変えたりなど、いろいろ試してみてくださいね。

次は走行体をうごかしてみましょうか(続く)


  1. 本体だけでもできないことはないです  

  2. 後で時間ができたらこっそり増えているかもしれませんが、とりあえずはβ7で試してください 

  3. エラーがうまく表示されない場合はコメント欄で教えてください。