1時間でできるEV3RTでmruby

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

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

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

# なぜ開発環境不要なの？

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

### 上級者向け補足

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



# 準備するもの
特に何か新しく用意する必要はありません。これまで使ってきたPCとEV3があればOK。
EV3は走行体の形をしていなくてもかまいません。できればセンサーかモーターを１つ以上用意してください。[^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のコードも入れます。
<img width="411" alt="sdcard.png" src="https://qiita-image-store.s3.amazonaws.com/0/34097/508736ee-bce4-c48e-94b0-8492bde8de00.png">

## 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ケーブルによるアプリケーションのロード方法](https://dev.toppers.jp/trac_user/ev3pf/wiki/SampleProgram#SD%E3%82%AB%E3%83%BC%E3%83%89USB%E3%82%B1%E3%83%BC%E3%83%96%E3%83%AB%E3%81%AB%E3%82%88%E3%82%8B%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E3%83%AD%E3%83%BC%E3%83%89%E6%96%B9%E6%B3%95)を参考にしてください。

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

## 超音波センサーのポートを確認
超音波センサーがポート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リファレンス](https://qiita.com/yamanekko/items/b5c8f6fcbd61daa40307)を参照してください。

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

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

```ruby: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]: 本体だけでもできないことはないです 
[^2]: 後で時間ができたらこっそり増えているかもしれませんが、とりあえずはβ7で試してください
[^3]: エラーがうまく表示されない場合はコメント欄で教えてください。