Mindstorms EV3をmrubyで動かす方法（Macで環境構築編）

先に[「Mindstorms EV3をRubyで動かす方法（ev3dev OS）」](http://qiita.com/noanoa07/items/afd7295e9aea108562cd)を投稿しました。

EV3をmrubyで動かすことについては、[TOPPERS](https://www.toppers.jp)から「[mruby on EV3RT + TECS」](https://www.toppers.jp/tecs.html#mruby_ev3rt)が無償で提供されています。
これについては、[ETロボコン2016](http://www.etrobo.jp/2016/)で[公式開発環境に認定](https://github.com/ETrobocon/etroboEV3/wiki)されたり、Afrelから「[教育版EV3 mrubyプログラミングセットA](http://www.afrel.co.jp/lineup/textset)」、「[教育版EV3 mrubyプログラミングガイド](http://www.afrel.co.jp/lineup/text)」が発売されたりして情報が増えてきました。

ただし、いずれもWindowsでの情報なので、ここではまだ情報の少ないMacでmrubyの環境構築をする方法を投稿します。
環境構築にあたっては、まずTOPPERSの[「mruby on EV3RT + TECS」公式サイト](https://www.toppers.jp/tecs.html#mruby_ev3rt)からパッケージをダウンロードして展開した中にある「doc/mruby_on_ev3rt+tecs_build.pdf」が公式情報になります。（ただし、Windowsでの環境構築法）

なお、大まかな手順としては、「[Mac OS X でETロボコンに出よう！(EV3RT 環境構築編） -yamanekko - Qiita ](http://qiita.com/yamanekko/items/3cee3991ea9472a1f6b6)」と同じです。

環境；
・LEGO Mindstorms EV3
・OS X El Capitan (10.11.6)、macOS Sierra (10.12.2)
・mruby-on-ev3rt+tecs beta1.0.1 (2016-05-27)
・microSDカード（ただし、4～32GBの microSDHC規格）

Macでの環境構築については、以下のサイトが参考になりました。
・[Mac OS X でETロボコンに出よう！(EV3RT 環境構築編） -yamanekko - Qiita ](http://qiita.com/yamanekko/items/3cee3991ea9472a1f6b6)
・[​開発プラットフォームEV3RTのダウンロード＆インストール - 開発環境構築のマニュアル - TOPPERS/EV3RT - DevEnv – EV3 Platform](http://dev.toppers.jp/trac_user/ev3pf/wiki/DevEnv)
・[EV3RTのコンフィギュレータ（cfg）のインストール - OS Xでの環境構築方法 - TOPPERS/EV3RT - DevEnv – EV3 Platform](http://dev.toppers.jp/trac_user/ev3pf/wiki/DevEnvMac)
・[mruby on EV3RT + tecsでEV3wayを動かすまでの記録 - hilohiro - Qiita](http://qiita.com/hilohiro/items/ffa8e9a1dc05ea6cfdec)
・[Mac OS X でETロボコンに出よう！（Bluetooth編） - yamanekko - Qiita](http://qiita.com/yamanekko/items/683db7be0a3c93f03fe9)

# 1. 開発プラットフォーム「mruby on EV3RT + TECS」のダウンロード＆インストール

ダウンロードページ
[https://www.toppers.jp/tecs.html#mruby_ev3rt](https://www.toppers.jp/tecs.html#mruby_ev3rt)
から最新版の「mruby on EV3RT + TECS」をダウンロードします。
（2016.9.19現在、最新版はbeta1.0.1 (2016-05-27）です。）

ダウンロードしたmruby-on-ev3rt+tecs_package-beta1.0.1.tar.gzをダブルクリックして解凍します。解凍したフォルダ名「mruby-on-ev3rt+tecs_package-beta1.0.1」が長いので、「ev3rt_mruby」などに変更することにします。（しなくてもいいです）

「mruby」フォルダを好きな場所（ディレクトリ）に移動します。
ここでは、ユーザ名をuser0とした時のホームディレクトリ（/Users/user0/ あるいは ~/で表されるフォルダ）の直下に置くことにします。

# 2. 開発環境（クロスコンパイラ，ツール）のインストール
[OS Xでの環境構築方法 - DevEnvMac – EV3 Platform](http://dev.toppers.jp/trac_user/ev3pf/wiki/DevEnvMac)
を参考に行います。

※ macOS Sierra のターミナルの操作で `Permission denied` とパーミッションのエラーが出る場合は、コマンドの前に `sudo` を付けて実行してみてください。

## 2-1. gccのインストール
Macで動くgccのmakeコマンドが必要なので
ターミナルで

```
make -v
```

と入力し、バージョン番号が表示されれば、すでにインストールされています。

それ以外のメッセージが出た場合、Command Line Tools for Xcodeをインストールする必要があります。
メッセージパネルに出ている「Xcodeを入手」ボタンを押すか、App StoreからXcodeを入手します。
Xcodeはサイズが大きいのでCommand Line Toolsだけをインストールしたい場合は、ターミナルで

```
xcode-select --install
```

と入力します。

## 2-2. mkimageのインストール
### 1) ダウンロード
[http://dev.toppers.jp/trac_user/ev3pf/attachment/wiki/DevEnvMac/mkimage](http://dev.toppers.jp/trac_user/ev3pf/attachment/wiki/DevEnvMac/mkimage)
からダウンロードします。

パスの通ったディレクトリに置きます。
（ここでは　/usr/local/bin/）

```
cd ~/Downloads/
mv  mkimage /usr/local/bin/
（または cp mkimage /usr/local/bin/）
```

### 2) パスが通ったディレクトリかどうか確認
ターミナルで

```
echo $PATH
```

と入力し

```
/Users/user0/.rbenv/shims:/usr/local/sbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin
```

表示された : 区切りのパス名の中に/usr/local/bin/があればバスが通っています。（パスが通ってなかった場合の対処法は後述）

### 3) 実行権限の確認
mkimageに実行権限が付いているか確認します。

```
ls -l /usr/local/bin/mkimage
```

と入力し

```
-rwxr-xr-x@ 1 user0  staff  18108 12 21  2014 /usr/local/bin/mkimage
```

実行権限（x）が付いていなければchmodで変更します。

```
chmod 755 /usr/local/bin/mkimage
```

## 2-3. GNUツールチェーンのインストール
### 1) ダウンロード
Mac用バイナリを [GCC ARMのサイト](https://launchpad.net/gcc-arm-embedded/+download)からダウンロードします。

doc/mruby_on_ev3rt+tecs_build.pdf に載っているバージョン：
gcc-arm-none-eabi-4_8-2014q3-20140805-mac.tar.bz2
を選びます。
（[EV3RTの動作確認済バージョン](http://dev.toppers.jp/trac_user/ev3pf/wiki/DevEnvMac)は、gcc-arm-none-eabi-5_4-2016q2-20160622-mac.tar.bz2 ですが、これだとエラーが出ることがあります。）

ダブルクリックして解凍し、適当なディレクトリに置きます。
（ここでは/usr/local/）
ターミナルで

```
cd ~/Downloads
mv gcc-arm-none-eabi-4_8-2014q3 /usr/local/
```

### 2) パスを通す
bashの場合、ターミナルで以下のコマンドを入力して.bash_profileにパスの追加をします。

```
echo "export PATH=/usr/local/gcc-arm-none-eabi-4_8-2014q3/bin:\$PATH" >> ~/.bash_profile
```

設定を反映させます。（またはターミナルを再起動）

```
source ~/.bash_profile
```

## 2-4. コンフィギュレータ（cfg）のインストール
[http://toppers.jp/cfg-download.html](http://toppers.jp/cfg-download.html)
からMac版バイナリファイル（コンフィギュレータ Release 1.9.5（64bit MacOSX用バイナリ））をダウンロードします。

ダウンロードしたcfg-osx-static-1_9_5.tar.gzをダブルクリックして解凍します。

拡張子のない「cfg」というファイルができます。このコンフィギュレータファイルを ~/ev3rt_mruby/hr-tecs/cfg/cfg/
の中に置きます。（Finderでドラッグアンドドロップ）

※「cfg.exe」とか「cfg.cpp」等々が入っているフォルダ。cfgが繰り返されているので注意！

# 3. mrubyのビルド
ターミナルで

```
cd ~/ev3rt_mruby/mruby 
make
```

と2行入力し

```
================================================
      Config Name: ARM
 Output Directory: build/ARM
    Included Gems:
             mruby-print - standard print/puts/p
             mruby-toplevel-ext - toplevel object (main) methods extension
             mruby-compiler - mruby compiler library
================================================
```

と表示されれば成功です。

# 4. microSDカードの準備
mruby on EV3RT + TECSは、EV3に挿入したmicroSDカードから起動して、LEGO社のEV3標準ファームウェアは一切使わずに（変更も加えずに）動作します。

##  4-1. フォーマット
microSDカードは念のためフォーマットします。

SDアソシエーションから配布されている[SDカードフォーマッター Mac OS用 - SD Association](https://www.sdcard.org/jp/downloads/formatter_4/eula_mac/index.html)をダウンロードし、インストールします。

MacにmicroSDカードを挿入して（SDカードスロットがない場合はアダプタを介して）、SDカードフォーマッターを起動することでフォーマットできます。

## 4-2. ドライブ名の確認
フォーマットが済んだmicroSDカードの名前（ドライブ名）は 後で必要になるので控えておきます。
ここでは、`SD_CARD`とします。

# 5. サンプルアプリケーションプログラムの作成
エディタで hello_sample.rbを作成します。

```ruby:hello_sample.rb
include EV3RT_TECS

begin
  LCD.puts("Hello World!")
rescue => e
  LCD.error_puts e
end
```

~/ev3rt_mruby/hr-tecs/workspace/mruby_appディレクトリ内に保存します。
（battery_sample.rb などのサンプルプログラムがすでに入っています。）

# 6. アプリケーションプログラムのビルドと実行
ビルド・実行方法は2つあります。
A. スタンドアローン形式（SD）
mrubyプラットフォームとアプリケーションプログラムを合わせたブートイメージ（uImage）を作成し、microSDカードにコピーし、EV3に挿して起動します。
アプリケーションプログラム込みで起動するので安定した実行ができます。
ただし、保存・実行できるアプリケーションプログラムは1つだけです。また、アプリケーションプログラムの書き換えには、毎回microSDカードをEV3から抜いてMacに挿し直して書き込む必要があります。

B. 動的ローディング形式（Bluetooth）
mrubyプラットフォームだけのブートイメージ（uImage）を作成し、microSDカードにコピーし、EV3に挿して起動します。
起動後に実行したいアプリケーションプログラムをBluetooth通信で転送し実行します。アプリケーションプログラムの書き換えに、microSDカードを抜く必要はありません。ただし、アプリケーションプログラムは保存されないので、毎回転送して実行する必要があります。

※ 付属の公式ビルド手順（/doc/mruby_on_ev3rt+tecs_build.pdf）では、スタンドアローン形式をSD、動的ローディング形式をBlutoothと呼んでいます。


## 6A. スタンドアローン形式（SD）でのビルドと実行
### 6A-1. Makefileを編集
ev3rt_mruby/hr-tecs/workspace/sdディレクトリにある `Makefile` をエディタで開いて編集します。

※ `“Makefile”は、開発元が未確認のため開けません。` などとセキュリティ警告が出る場合の対処法；
・Makefileを選んで、コンテキストメニュー（control+クリック）を出して、「このアプリケーションで開く」＞「その他」で好きなエディタを選んで、パネル下の「常にこのアプリケーションで開く」にチェックを入れます。「開く」をクリックすると、また `“Makefile”は、開発元が未確認のため開けません。` と表示されますが、もう一度繰り返すと「このアプリケーションで開く」で先ほど指定したエディタが表示されるので選ぶと、`“Makefile”は、開発元が未確認です。開いてよろしいですか？`となって、「開く」ボタンが押せるようになります。
あるいは、
・「システム環境設定」＞「セキュリティとプライバシー」＞「一般」＞「ダウンロードしたアプリケーションの実行許可」で「すべてのアプリケーションを許可」にチェックを入れます。

3カ所（Mac用の設定）＋1カ所（アプリケーションプログラムの指定）を書き換えます。
○書き換え前（Mac用の設定3カ所）；
・57行目:

```
# SDのドライブ文字を指定
SD_DIR = /cygdrive/h/
```

・152行目:

```
#mkimageの設定
#/usr/bin/などパスが通っている場合
#MKIMAGE = mkimage
#WINDOWSの場合
MKIMAGE = $(SRCDIR)/../bin/mkimage.exe
```

・159行目:

```
#
#  TECSインタフェースジェネレータ関係の定義

# Windows用
TECSGEN = $(SRCDIR)/tecsgen/tecsgen/tecsgen.exe -k euc --cpp="$(GCC_TARGET_PREFIX)gcc -E" 

# Mac, Linux用
#tecsgen.rb (ruby + racc)を利用する場合は下記のRUBYLIBとTECSGENの定義を利用する
# RUBYLIB = $(SRCDIR)/tecsgen/tecsgen 
# TECSGEN =$(RUBY) $(SRCDIR)/tecsgen/tecsgen/tecsgen.rb -L $(RUBYLIB) -k euc --cpp="$(GCC_TARGET_PREFIX)gcc -E" 
```

○書き換え後（Mac用の設定3カ所）
・57行目:（microSDHCカードのドライブ名を`SD_CARD`とする）

```
# SDのドライブ文字を指定
SD_DIR = /Volumes/SD_CARD
```

・152行目:

```
#mkimageの設定
#/usr/bin/などパスが通っている場合
MKIMAGE = mkimage
#WINDOWSの場合
#MKIMAGE = $(SRCDIR)/../bin/mkimage.exe
```

・159行目:

```
#
#  TECSインタフェースジェネレータ関係の定義

# Windows用
#TECSGEN = $(SRCDIR)/tecsgen/tecsgen/tecsgen.exe -k euc --cpp="$(GCC_TARGET_PREFIX)gcc -E" 

# Mac, Linux用
#tecsgen.rb (ruby + racc)を利用する場合は下記のRUBYLIBとTECSGENの定義を利用する
RUBYLIB = $(SRCDIR)/tecsgen/tecsgen 
TECSGEN =$(RUBY) $(SRCDIR)/tecsgen/tecsgen/tecsgen.rb -L $(RUBYLIB) -k euc --cpp="$(GCC_TARGET_PREFIX)gcc -E" 
```

○書き換え前（アプリケーションプログラムの指定）
・66行目:

```
#  mrubyのアプリケーションファイル名
#APP_NAME = battery_sample.rb
APP_NAME = button_sample.rb
```

○書き換え後（アプリケーションプログラム `hello_sample.rb`を指定する）
・66行目:

```
#  mrubyのアプリケーションファイル名
APP_NAME = hello_sample.rb
#APP_NAME = battery_sample.rb
#APP_NAME = button_sample.rb
```

### 6A-2. ビルド：make tecs
ターミナルで

```
cd ~/ev3rt_mruby/hr-tecs/workspace/sd
make tecs
```

と入力し

```
===== end check regions HRP2Kernel =====
===== end tKernel plugin =====
touch tecs.timestamp
```

と `tecs.timestamp`が出力されれば成功！

※ `make tecs` は一度だけ実行すれば、2回目以降は実行する必要はありません。

### 6A-3 ビルド：make depend
ファイルの依存関係を抽出します。
※ mrubyのみをプログラミングするなど、C言語を修正しない場合は、`“make depend は実行する必要はない”`そうです。次のバージョンでは、マニュアルの make dependの記述は削除されるようです。

もし、実行する場合は、
/hr-tecs/target/ev3_gcc/drivers/linux/include/linux/compiler-gcc.h 
の47行目をコメントアウトします。

```
//# define inline inline __attribute__((always_inline))
```

ターミナルで

```
cd ~/ev3rt_mruby/hr-tecs/workspace/sd
make depend
```

と入力すると

```
if ! [ -f Makefile.depend ]; then \
		rm -f kernel_cfg.timestamp kernel_cfg.h kernel_cfg.c kernel_mem2.c ; \
		rm -f cfg1_out.c cfg1_out.o cfg1_out cfg1_out.syms cfg1_out.srec; \
		rm -f makeoffset.s offset.h; \
	fi
rm -f Makefile.depend
  CC      cfg1_out.c
  LINK    cfg1_out
  NM      cfg1_out.syms
  OBJCOPY cfg1_out.srec
  CFG[2]  kernel_cfg.timestamp
touch -r kernel_cfg.c kernel_cfg.timestamp
  CFG[3]  offset.h
Generating Makefile.depend.
```

と出力されます。

※ compiler-gcc.h を修正しないと、Macではmake dependでエラーが出ます。
（make depend を実行しなくても、サンプルプログラムの実行には問題ありません。）
→エラーログと対処法の経緯；[mruby-on-ev3rt+tecs beta1.0.1 (2016-05-27) のSDでのコンパイルのエラーログ（Mac） - noanoa07 - Gist](https://gist.github.com/noanoa07/e2adea0edf4380fbec05decb5079bb0b)

### 6A-4 ビルド：make
MacにmicroSDカードを挿入しておきます。
ターミナルで

```
cd ~/ev3rt_mruby/hr-tecs/workspace/sd
make
```

と入力し

```
chmod +x uImage
cp uImage /Volumes/SD_CARD
```

と表示され、microSDカードに`uImage`ファイルが出来ていれば成功です。

### 6A-5. 実行
EV3にmicroSDカードを挿入し、中央のボタンを押して電源を入れます。
EV3の液晶画面下に `Run App >` と表示されたら、中央のボタンを押します。

アプリケーションプログラム hello_sample.rb（のコンパイルされたhello_sample.mrb）が実行されて、液晶画面に「Hello World!」と表示されればOKです！

終了方法は、左上のボタンを長押しします。（起動画面に戻ります。）
EV3の電源を切るには、起動画面で右ボタンを押して液晶画面下が `< Shutdowon` と表示されたら、中央のボタンを押します。

## 6B. 動的ローディング形式（Bluetooth）でのビルドと実行
### 6B-1. ブートイメージ（uImage）の準備
#### 1) Makefileを編集
ev3rt_mruby/hr-tecs/workspace/bluetoothディレクトリにある `Makefile` をエディタで開いて編集します。

※ `“Makefile”は、開発元が未確認のため開けません。` などとセキュリティ警告が出る場合の対処法については上記参照。

3カ所（Mac用の設定）＋1カ所（アプリケーションプログラムの指定）を書き換えます。
○書き換え前（Mac用の設定3カ所）；
・57行目:

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

・131行目:

```
#mkimageの設定
#/usr/bin/などパスが通っている場合
#MKIMAGE = mkimage
#WINDOWSの場合
MKIMAGE = $(SRCDIR)/../bin/mkimage.exe
```

・138行目:

```
#
#  TECSインタフェースジェネレータ関係の定義

# Windows用
TECSGEN = $(SRCDIR)/tecsgen/tecsgen/tecsgen.exe -k euc --cpp="$(GCC_TARGET_PREFIX)gcc -E" 

# Mac, Linux用
#tecsgen.rb (ruby + racc)を利用する場合は下記のRUBYLIBとTECSGENの定義を利用する
# RUBYLIB = $(SRCDIR)/tecsgen/tecsgen 
# TECSGEN =$(RUBY) $(SRCDIR)/tecsgen/tecsgen/tecsgen.rb -L $(RUBYLIB) -k euc --cpp="$(GCC_TARGET_PREFIX)gcc -E" 
```

○書き換え後（Mac用の設定3カ所）
・57行目:（microSDHCカードのドライブ名を`SD_CARD`とする）

```
# SDのドライブ文字を指定
SD_DIR = /Volumes/SD_CARD
```

・131行目:

```
#mkimageの設定
#/usr/bin/などパスが通っている場合
MKIMAGE = mkimage
#WINDOWSの場合
#MKIMAGE = $(SRCDIR)/../bin/mkimage.exe
```

・138行目:

```
#
#  TECSインタフェースジェネレータ関係の定義

# Windows用
#TECSGEN = $(SRCDIR)/tecsgen/tecsgen/tecsgen.exe -k euc --cpp="$(GCC_TARGET_PREFIX)gcc -E" 

# Mac, Linux用
#tecsgen.rb (ruby + racc)を利用する場合は下記のRUBYLIBとTECSGENの定義を利用する
RUBYLIB = $(SRCDIR)/tecsgen/tecsgen 
TECSGEN =$(RUBY) $(SRCDIR)/tecsgen/tecsgen/tecsgen.rb -L $(RUBYLIB) -k euc --cpp="$(GCC_TARGET_PREFIX)gcc -E" 
```

#### 2) ビルド：make tecs
ターミナルで

```
cd ~/ev3rt_mruby/hr-tecs/workspace/bluetooth
make tecs
```

と入力し

```
===== end check regions HRP2Kernel =====
===== end tKernel plugin =====
touch tecs.timestamp
```

と `tecs.timestamp`が出力されれば成功！

※ `make tecs` は一度だけ実行すれば、ブートイメージ（uImage）の2回目以降の作成時には実行する必要はありません。

#### 3) ビルド：make
MacにmicroSDカードを挿入しておきます。
ターミナルで

```
cd ~/ev3rt_mruby/hr-tecs/workspace/bluetooth
make
```

と入力し

```
chmod +x uImage
cp uImage /Volumes/SD_CARD
```

と表示され、microSDカードに`uImage`ファイルが出来ていれば成功です。

### 6B-2. アプリケーションプログラムの準備
#### 1) Makefileを編集
ev3rt_mruby/hr-tecs/workspace/mruby_appディレクトリにある `Makefile` をエディタで開いて編集します。

※ `“Makefile”は、開発元が未確認のため開けません。` などとセキュリティ警告が出る場合の対処法については上記参照。

○書き換え前（アプリケーションプログラムの指定）
・7行目:

```
#  mrubyのアプリケーションファイル名
#APP_NAME = battery_sample.rb
APP_NAME = button_sample.rb
```

○書き換え後（アプリケーションプログラム `hello_sample.rb`を指定）
・7行目:

```
#  mrubyのアプリケーションファイル名
APP_NAME = hello_sample.rb
#APP_NAME = battery_sample.rb
#APP_NAME = button_sample.rb
```

#### 2) ビルド（mrubyバイトコード）：make
ターミナルで

```
cd ~/ev3rt_mruby/hr-tecs/workspace/mruby_app
make
```

と入力し

```
echo ../mruby_app/hello_sample.mrb
../mruby_app/hello_sample.mrb
../../../mruby/bin/mrbc -o../mruby_app/hello_sample.mrb ../mruby_app/hello_sample.rb
```

と表示され、ev3rt_mruby/hr-tecs/workspace/mruby_appディレクトリに、ソースコード（ここでは`hello_sample.rb`）と同名のmrubyバイトコード（ここでは`hello_sample.mrb`）が出来ていれば成功です。

### 6B-3. uImageの起動
EV3にmicroSDカードを挿入し、中央の決定ボタンを押して電源を入れます。
EV3の液晶画面の上に `EV3RT Console`、下に `Run App >` と表示されたら、起動しています。

### 6B-4. アプリケーションプログラムの転送と実行
EV3とMacをBluetooth接続し、アプリケーションプログラムを転送します。
手順は以下のサイトを参照してください。
・[Mac OS X でETロボコンに出よう！（Bluetooth編） - yamanekko - Qiita](http://qiita.com/yamanekko/items/683db7be0a3c93f03fe9)

#### 1) minicomのインストール
Windows用のTeraTermの代わりに、Macではminicomを使います。ZMODEM転送に対応するためのlrzszとともにインストールします。

```
# Homebrewの場合
brew install lrzsz
brew install minicom
```

#### 2) minicomの設定
ターミナルで

```
minicom -s
```

と入力し、設定メニューを出します。
![micom_setting.png](https://qiita-image-store.s3.amazonaws.com/0/26536/1de75f7e-e020-8f58-8b0c-4df96d19eec4.png)

`Serial port setup`
で以下の通りに設定します。

![minicom_setting_port.png](https://qiita-image-store.s3.amazonaws.com/0/26536/3daf6c0a-ed69-0052-4441-cbec1a65c25f.png)

```
A - Serial Device : /dev/tty.MindstormsEV3-SerialPor
E - Bps/Par/Bits 115200 8N1
F - Hardware Flow Control : No
G - Software Flow Control : No
```

※ SerialPort ではなく、SerialPor なのに注意！

次に、`Modem and dialing`で、以下の通りに設定します。

![minicom_setting_modem.png](https://qiita-image-store.s3.amazonaws.com/0/26536/48db5200-9abc-7c84-11be-2925ae8e26b8.png)

`enter`キーで最初の設定メニューに戻ります。
`Save setup as dfl` で変更した設定をデフォルトに保存し、`Exit form Minicom`または`Exit`で終了します。

参考；
→[ネイティブLinuxプログラミング方法 （Ver0.3) - 付属A．minicomの設定 - アフレル](http://www.afrel.co.jp/archives/7301)

#### 3) Bluetooth接続の設定（ペアリング）
EV3が起動した状態で、Macの「システム環境設定」＞「Bluetooth」を開きます。しばらく待って「デバイス」欄に `Mindstorms EV3` が表示されたら、「ペアリング」ボタンを押します。

`⚠️ペアリング失敗` → `⚠️接続済み` →（しばらくすると） `⚠️未接続`
と表示が変わって行きますが、次に進みます。

#### 4) minicomの起動
まずEV3で、液晶画面下に `Run App >` と表示されている状態で、中央のボタンを押します。

```
Receive bytecode
Port: Bluetooth
Protocol: ZMODEM


```

という画面になり、受信待ち状態になります。

Macのターミナルで、minicomを起動します。

```
minicom
```

と入力し、

```
Welcome to minicom 2.7


（中略）

  / __/ | / /_  // _ /_  __/                                                    
 / _/ | |/ //_ </ , _/ / /                                                      
/___/ |___/____/_/|_| /_/                                                       
=============================                                                   
Powered by TOPPERS/HRP2 RTOS                                                    
mruby on ev3rt+tecs alpha1.0                                                    
Initialization is completed..                                                   
Start to receive an application file using ZMODEM protocol.                     
RFCOMM channel 1 requested for 04:0C:CE:D9:FE:2D  
```

と表示されれば接続されています。

※ エラー表示；

```
minicom: cannot open /dev/tty.MindstormsEV3-SerialPor: Resource busy
```

上記のようなエラー表示が出た場合は；
Macの「システム環境設定」＞「Bluetooth」の「デバイス」欄に表示されている  `Mindstorms EV3` をダブルクリックします。
すると、再び `⚠️ペアリング失敗` → `⚠️接続済み` になるので、もう一度ターミナルでminicomを起動してみてください。

#### 5) アプリケーションプログラムの転送
minicomの起動しているターミナルで、`Esc`キーを押しながら `z`キーを押してメニューを出します。（反応しない時は、再度キーを押し直して。）

![minicom_menu.png](https://qiita-image-store.s3.amazonaws.com/0/26536/1369ad77-83f6-5837-92c5-54e5315b793d.png)

`Send files` を選ぶので、`s`キーを押します。

![minicom_zmodem.png](https://qiita-image-store.s3.amazonaws.com/0/26536/34f5fa5c-d70e-548a-32b2-1e8d3c29c7c6.png)
`[upload]`メニューが出るので、`zmodem`を上下キーで選択（白黒反転）して、`enter`キーを押します。

[Select one or more files for upload] というメニューが出ます。

![minicom_file_upload.png](https://qiita-image-store.s3.amazonaws.com/0/26536/edd9d6ab-8a57-130a-31be-d5762210b909.png)

これは、`[フォルダ名]` と `ファイル名` の一覧になっていて、フォルダが多いと全部は表示されませんが、下キーを押し続けるとスクロールします。
操作は、上下キーで移動、フォルダの選択は `スペース`キー2回連打、ファイルの選択は`スペース`キー、下の `[Okey]` などのメニューは左右キーで移動して、`enter`キーで確定します。

アプリケーションプログラムのある /ev3rt_mruby/hr-tecs/workspace/mruby_app ディレクトリ（フォルダ）まで移動して、.mrbファイルの`hello_sample.mrb` （元の`hello_sample.rb`と間違えないように！）を`スペース`キーで選択（白黒反転）し、下の`[Okey]`が選択されている状態で、`enter`キーを押します。

`enter`キーが押されると、ファイルが転送されます。
転送中はダイアログが出ますが、終了すると消えます。

※ minicomの終了方法；
`Esc`キーを押しながら `z`キーを押してメニューを出します。
終了は、`x`キー（eXit and reset）または、`q`キー（Quit with no reset）です。

#### 6) アプリケーションプログラムの実行
EV3にアプリケーションプログラムが転送されると、自動的に実行されます。EV3の液晶画面に「Hello World!」と表示されればOKです！

起動画面に戻るには、左上キーを長押しします。（液晶画面下に `Run App >` と表示されます。）

再びプログラムを実行するには、`Run App >` と表示された状態で中央のボタンを押し、

```
Receive bytecode
Port: Bluetooth
Protocol: ZMODEM


```

再度受信待ち状態にして、5) に戻ってminicomから再びプログラムを転送します。
（現状では、EV3側にアプリケーションプログラムは保存されないようです。）

電源を切るには、右ボタンを押して液晶画面下が `< Shutdowon` と表示されたら、中央のボタンを押します。

# 7. サンプルプログラム
/hr-tecs/workspace/mruby_app ディレクトリには、サンプルプログラムが入っています。

```
motor_sample2.rb
battery_sample.rb		
button_sample.rb			
color_sample.rb				
color_sample2.rb			
ev3way_sample.rb			
gyro_sample.rb		
lcd_sample.rb
lcd_sample2.rb
lcd_sample3.rb
led_sample.rb
motor_sample.rb
rtos_sample.rb
speaker_sample.rb
speaker_sample2.rb
touch_sample.rb
ultrasonic_sample.rb
```

また、/doc/mruby_sample.pdf がそのサンプルプログラムの解説、/doc/EV3RT_mruby_API_Reference.pdf が APIリファレンスマニュアルになっています。
これらサンプルプログラムを使って動作確認すると良いでしょう。

さらに、ev3way_sample.rb はETロボコン用のサンプルプログラムで、2輪で倒立制御しながらライントレースを行うというかなり高度なものです。[ETロボコン EV3開発環境構築ガイド](https://github.com/ETrobocon/etroboEV3/wiki#etロボコンev3開発環境構築ガイド)に、ロボットEV3way-ETの組み立て図も公開されていますので、参加を検討するため等に実際に動かしてみると面白そうです。