mruby on ev3rt+tecsのBluetoothローダ機能を使う方法

本記事では，mruby on ev3rt+tecsのベータ版で公開されたBluetoothローダ機能を紹介します．

# mruby on ev3rt+tecsとは

mruby (軽量Ruby)を使って，LEGO Mindstorms EV3を動かすためのプラットフォームです．
TECSによってコンポーネントベースで開発されており，mrubyプログラムからRTOS（TOPPERS/HRP2）の機能を呼び出すことができるように設計されています．
ETロボコン2016から公式プラットフォームに認定され，mrubyを使ってETロボコンに参加されたチームもいらっしゃるようです．

# 準備

まず，[mruby-on-ev3rt+tecs_package-beta1.0.1.tar.gz](https://www.toppers.jp/tecs.html#mruby_ev3rt)をダウンロードしましょう．
今回は，Windows環境での紹介になります．
以下のものをインストールしてください．

* Cygwin
    * Ruby
    * GNU Make
    * bison
* クロスコンパイラ
            [arm-none-eabi-gcc.exe (GNU Tools for ARM Embedded Processors)](https://launchpad.net/gcc-arm-embedded/4.8/4.8-2014-q3-update/+download/gcc-arm-none-eabi-4_8-2014q3-20140805-win32.exe)
クロスコンパイラにPATHを通しておいてください．

---ここまではスタンドアローンでの環境構築と同じです---

* __Tera Term__
    Bluetoothを用いてバイナリを転送する際に使用します．
* Bluetooth Stack for Windows by Toshiba (必要であれば)

※Bluetoothの接続方法については[こちら](http://dev.toppers.jp/trac_user/ev3pf/wiki/BluetoothWin)を参考にして下さい．

私の環境では，Bluetoothドングル(planexのBT-Micro4)とToshiba Bluetooth Stackを用いました．


# Bluetoothローダを使ってみる

ここまで準備できたら，Cygwinを起動し，ダウンロードしたパッケージを解凍しましょう．（__パッケージの名前は，ev3rt+tecsに省略しています．__）

## mrubyのビルド
まず，mrubyのビルドを行います．

```shell-session
cd ~/ev3rt+tecs/mruby
make
```

## uImageの作成
mrubyのビルドが完了したら，Bluetoothローダを含むプラットフォームをビルドし，SDカードにコピーします．

```shell-session
cd ../hr-tecs/workspace/bluetooth
```
ここで，Makefile(58行目)を編集し，SDカードのドライブ名を設定します．

```mf:Makefile
# SDのドライブ文字を指定
SD_DIR = /cygdrive/e/
```

設定できたら，ビルドします．

```shell-session
make tecs
make
```
このような画面になれば，ビルド成功です．
![image](https://qiita-image-store.s3.amazonaws.com/0/99815/bd2880a1-0937-61ba-dbb0-d9a7e27f0713.png)

## mrubyバイトコードの作成
次に，作業ディレクトリに移動します．

```shell-session
cd ../mruby_app
```
このディレクトリでmrubyプログラム(.rb)を書いていきます．
Makefile (hr-tecs/workspace/mruby_app/Makefile) を編集し，実行したいアプリケーションを指定してください．

```mf:Makefile

# mrubyのアプリケーションファイル名
#APP_NAME = battery_sample.rb
APP_NAME = button_sample.rb
#APP_NAME = color_sample.rb
#APP_NAME = color_sample2.rb
#APP_NAME = ev3way_sample.rb
#APP_NAME = gyro_sample.rb
#APP_NAME = lcd_sample.rb
#APP_NAME = lcd_sample2.rb
#APP_NAME = lcd_sample3.rb
#APP_NAME = led_sample.rb
#APP_NAME = motor_sample.rb
#APP_NAME = motor_sample2.rb
#APP_NAME = rtos_sample.rb
#APP_NAME = speaker_sample.rb
#APP_NAME = speaker_sample2.rb
#APP_NAME = touch_sample.rb
#APP_NAME = ultrasonic_sample.rb

```
デフォルトでは，button_sample.rbになっています．
指定したら，mrubyプログラムをコンパイルします．

```shell-session
make
( ../../../mruby/bin/mrbc button_sample.rb でもコンパイルできます)
```
button_sample__.mrb__というファイルが作成されたかと思います．
これがバイトコードになります．

## Bluetoothを通して転送する

ここまで出来たら，EV3にSDカードを差し込み，起動します．
下のようにスタート画面が表示されたら，Bluetoothのペアリングを行います．
![image](https://qiita-image-store.s3.amazonaws.com/0/99815/7268ec14-2347-eb67-d603-3da0ade3801a.png)

Toshiba Bluetooth Stackを立ち上げ，EV3とペアリングします．
PINコードは”__0000__”を入力してください．
![image](https://qiita-image-store.s3.amazonaws.com/0/99815/5837ea32-46f3-6eb7-b3bc-6a69f4689f8d.png)

ペアリングが完了し中央ボタンを押すと，受信待ちになります．
![image](https://qiita-image-store.s3.amazonaws.com/0/99815/d396be93-7dd7-498e-271a-297a02d9debf.png)

次にTeraTermを起動し，EV3と接続します．

* __シリアル__を選択し，BluetoothのCOM番号のポートに接続
* 設定タブ-->シリアルポート-->ボーレート：115200
で設定完了です．

そしていよいよ転送です．

* ファイルタブ-->転送-->ZMODEM-->送信
* 転送するバイトコードを選択
転送が終わると，mrubyのプログラムが実行されます．

---

## 面倒なSDカードの抜き差しを省略

Bluetoothローダを使う利点は，SDカードの抜き差しが不要になることです．
EV3の機体によっては，SDカードの抜き差しがとてもやりづらいことがありますが，Bluetoothローダを使えば，そういったイライラもなくなります．

EV3のBackボタンを長押しすると，プログラムはリセットされます．
mrubyのプログラムを修正し，

```shell-session
make
```
し，更新されたバイトコードを同じ手順で転送することができます．

# Cygwin上からコマンドで転送する

実はCygwin上からmakeコマンドを打つだけで転送することもできます．
(とことん楽をしたい方向け)

まずは，TeraTermにPATHを通して，

```shell-session
ttpmacro.exe
```
が実行できる状態にします．

次にMakefile(hr-tecs/workspace/mruby_app)を編集します．

```mf:Makefile
#  コマンドから転送する場合，TRANSFER = true とする 
#  デフォルトでは，TRANSFER = となっている
TRANSFER = true            # 36行目

#  COM番号
COM_PORT = 40             # 39行目 それぞれの環境に合わせてください
#  ボーレート
BAUDRATE = 115200
```
あとは，

```shell-session
make
```
するだけで，転送されます！

# Bluetoothローダを使う利点

* SDカードの抜き差しをしなくて済む
    一番のメリットはこれだと思います．
* printデバッグが可能
    Bluetoothで接続されていれば，mrubyプログラムで
    p, print, puts 関数の出力をTeraTerm上に表示することができます．