mruby on GR-CITRUS


[GR-CITRUS](http://gadget.renesas.com/ja/product/citrus.html) は *Ruby inside* がプリントされたマイコンを搭載したボードです。
[Ruby](http://mruby.org/) で簡単にガジェットを楽しむことができます。

Mac OS X で **GR-CITRUS** の *Lチカ* を実行するまでの手順を紹介します。
(`brew` がインストールされていれば、数分で *チカチカ* します。)

![citrus_led](https://dl.dropboxusercontent.com/u/14690051/images/notes/gadget/citrus/citrus_led.png)

## Learning

* Mac OS X で **GR-CITRUS** の *Lチカ* を実行する。
    * Windows 設定は[こちら](https://github.com/wakayamarb/wrbb-v2lib-firm/tree/master/description)のドキュメントを参照してください。
    * *Lチカ* 以外のサンプルは[こちら](https://github.com/wakayamarb/wrbb-v2lib-firm/tree/master/sample/GR-CITRUS)を参照してください。

## Environment

* OS X : El Capitan
* mruby : 1.2.0
* CoolTerm : 1.4.6

## Install

* `brew` コマンドで **mruby** をインストールします。
* `brew cask` コマンドで **CoolTerm** をインストールします。

```bash
$ brew install mruby
$ brew cask install coolterm
```

## mruby

![mruby_icon](https://dl.dropboxusercontent.com/u/14690051/images/notes/gadget/citrus/mruby_icon.png)

まずは、mruby のバイナリを作成します。

### Sample code

* サンプルのコードを `main.rb` ファイルに保存します。

```ruby
#!mruby

serial = Serial.new(0)
serial.println "Hello, mruby."

10.times do |i|
  serial.println "#{i}: led #{i % 2}"
  led i % 2
  delay 500
end
```

### Compile

* `mrbc` コマンドでコンパイルすると、`main.mrb` ファイルが出力されます。
* `wc` コマンドで `main.mrb` ファイルのバイト数を出力します。
    * バイト数はファイルの送信で参照する値です。

```bash
$ mrbc main.rb
$ wc -c < main.mrb
     335
```

## CoolTerm

![coolterm_icon](https://dl.dropboxusercontent.com/u/14690051/images/notes/gadget/citrus/coolterm_icon.png)

つぎは、mruby のバイナリを送信します。

### Connect

* *マイクロUSBケーブル* で **GR-CITRUS** に接続します。
  * 充電専用のケーブルは使用できません。
* **CoolTerm** を起動して、`Options` をクリックします。
* `Port` に 接続したポートを選択します。
  * これは `usbmodem1_1` を選択しています。
* 該当のポートがない場合は、`Re-Scan Serial Ports` をクリックします。
	* `ls /dev/tty.*` コマンドでもポートがわかります。


![coolterm_port](https://dl.dropboxusercontent.com/u/14690051/images/notes/gadget/citrus/coolterm_port.png)

* `Terminal` の `Enter Key Emulation` に `LF` を選択します。

![coolterm_key](https://dl.dropboxusercontent.com/u/14690051/images/notes/gadget/citrus/coolterm_key.png)

* `Connect` をクリックして、接続が成功すると `WAKAYAMA.RB Board` が表示されます。
* `>>>>>>>>>>` が止まらない場合は、`T` を入力します。

![coolterm_t](https://dl.dropboxusercontent.com/u/14690051/images/notes/gadget/citrus/coolterm_t.png)

### Execution

* ファイルを送信して実行するには、`X main 335` を入力します。
    * `X` はコマンドです。
    * `main` は保存されるファイル名です。
    * `335` は送信するバイト数です。
* 送信は、`Connection` から `Send Textfile` をクリックして、ファイルを選択します。
    * ファイルの *ドラッグ＆ドロップ* も対応しています。

![coolterm_send](https://dl.dropboxusercontent.com/u/14690051/images/notes/gadget/citrus/coolterm_send.png)

* ファイルが保存されると、プログラムが実行されます。

![coolterm_exec](https://dl.dropboxusercontent.com/u/14690051/images/notes/gadget/citrus/coolterm_exec.png)

チカチカしましたね！

**GR-CITRUS** と **WA-MIKAN** を組み合わせると *WiFi通信* がガジェットで実装できます。

## Functions

**GR-CITRUS** は [Arduino](https://www.arduino.cc/) と互換性のあるメソッドが使えます。

### Digital I/O

* サンプルのコードの `led` を `digitalWrite` に変更します。
    * これは `11` のピンを使用します。

```ruby
#!mruby

serial = Serial.new(0)
serial.println "Hello, mruby."

pinMode(11, 1)

10.times do |i|
  serial.println "#{i}: led #{i % 2}"
  digitalWrite(11, i % 2)
  delay 500
end
```

* `LED` と `CRD` を `ブレッドボード` に設置します。
    * `LED` と `CRD` は極性に注意しましょう。
* `11` に `+` を接続します。`GND` に `-` を接続します。
* 再びコンパイルをして、ファイルを送信します。

![digital_write](https://dl.dropboxusercontent.com/u/14690051/images/notes/gadget/citrus/digital_write.png)

チカチカしましたね！

*Congrats!*

# TIPS

## Debug

* 開発でバグが発生したときは *デバック* をします。
* `mrbc` コマンドでデバックする方法を紹介します。

### Bug

* このサンプルのコードには *バグ* があります。

```ruby
#!mruby

serial = Serial.new(0)
serial.println "Hello, mruby."

10.times do |i|
  serial.println "#{i}: led #{i % 2}"
  led i % 2
  delay
end
```

* エラーが発生しました！ でも、どこか分かりませんね。

```
>X main 331

Waiting  60 59 58 57 56 55 54 53 52 51 50
main.mrb(331) Saving...
Hello, mruby.
0: led 0
ArgumentError: wrong number of arguments
```

### Debugging

* `mrbc -g` コマンドでコンパイルすると、コードのサイズが大きくなります。

```bash
$ mrbc -g main.rb && wc -c < main.mrb
     444
```

* エラーが発生しました！ でも、ファイル名と行番号が表示されています。
* `delay` に引数を指定していないことが分かりましたね。

```
>X main 444

Waiting  60 59 58 57 56 55 54 53 52 51 50
main.mrb(444) Saving...
Hello, mruby.
0: led 0
main.rb:9: wrong number of arguments (ArgumentError)
```

デバックの `-g` オプションは **GR-CITRUS** の開発者の [tarosay](http://qiita.com/tarosay) さんから オススメ されました。

*enjoy mruby*