mruby/c で動くマイコンボード RBoardにUbuntuから書き込む

こんにちは。
Rubyが好きな人として、mrubyにも少し触れてみなければと思ってRBoardを買いました。
このページではUbuntuでRBoardに書き込みを行う方法を説明します。(Ubuntu以外のLinuxもだいたい同じだと思います）

## RBoardとは

公式サイト：https://www.sjc-inc.co.jp/service/rboard
公式ドキュメント：https://yoshihiroogura.github.io/RBoardDocument/

>「RBoard（アールボード）」はRuby(mruby/c)をマイコンで使ってみたい！という人のための入門ボードです。できる限り低レイヤー的実装をしており様々なセンサーに対応できます。
> GROVEポートを搭載しているためはんだ付け不要で様々なセンサ・アクチュエータを使用できます。

[スイッチサイエンスというサイトで販売しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144608/da77399a-5e69-522b-ca6f-6b52d92358c4.png)
(↑画像はすいっちサイエンスのサイトより）
](https://www.switch-science.com/catalog/6578/)

## mruby と mruby/c

mrubyは、Rubyの開発者であるまつもとゆきひろ氏が開発されている組み込み用のRuby実装です。
mruby/cは、mrubyよりもさらに小さなマイコンや小型端末でも動作するRuby実装です。しまねソフト研究開発センターと九州工業大学が開発しています。

## RBoardにUbuntuから書き込みたい

RBoardの公式ドキュメントは、mruby/c IDEを用いてWindowsとMacからRBoardに書き込む方法が説明されています。
しかしUbuntuから書き込む方法がなくて困っていました。RBoardの開発者の方に`mrbwrite`を紹介されました。これを試したらUbuntuからRBoardに書き込むことができたのでやり方を記録します。

## 準備

### mrubyのインストール

mruby/cでRubyのスクリプトを動作させるためには、`mrbc`コマンドを用いて、Rubyのスクリプトをバイトコードに変換する必要があります。そのためmrubyのインストールが必要になります。ここで注意が必要なのは、mrubyのバージョンです。2021年2月24日現在、mruby/c IDEでは、mruby-2.0.1を利用しています。最新のmrubyの生成するバイトコードはRBoard動作しない場合があります。mrubyのバージョンを2.0.1にします。（RBoardもアップデートされていく可能性がありますので、都度mrubyのバージョンをご確認ください）

```
git clone https://github.com/mruby/mruby
cd mruby
git checkout -b v2.0.1 refs/tags/2.0.1
```

さて、mrubyのコンパイルはrakeを使うのですが、最新のRuby3.0.0のRakeでは実行時にエラーが出るようです。（あまり見ていませんが、たぶんキーワード引数とか、そういう問題だろうと思います。）rbenvなどで切り替えてruby2.7.2を利用するとよさそうです。

```
rake all
```

バージョンを確認しましょう。

```
bin/mruby --version
```

`mruby 2.0.1 (2019-4-4) `と表示されればOKです。
テストを実行することもできます

```
rake test
```

問題なく実行できたでしょうか？
必要に応じて`mrbc`のエイリアスを追加すると、その後の作業が楽になります。新しいmrbcと衝突しないように、`mrbc201`としました。

```sh:~/.bashrc
alias mrbc201='your/path/to/bin/mrbc'
```

シェルを再起動、もしくは`source ~/.bashrc` して、エイリアスの動作を確認します。

```
mrbc201 --version
```

`your/path/to/bin/mrbc: no program file given` と表示されます。

### mrbwriteのインストール

IDEを利用しない場合、RBoardの書き込みはmrbwriteという公式ツールを使います。

Github: https://github.com/mrubyc/mrbwrite

公式READMEによると、POP3プロトコルに準じたプロトコルになっているそうです。

ダウンロードします。

```sh
git clone https://github.com/mrubyc/mrbwrite
```

このままbuildした場合、Rboardではうまく動作しない部分がありましたので2箇所変更します。

まず、こちらの[130行目](https://github.com/mrubyc/mrbwrite/blob/5ba4b63c2e767ada0e769f0df6499762e4a12bd5/mrbwrite.cpp#L130)の`clear_bytocode();`をコメントアウトします。

```cpp:mrbwrite.cpp
 /*
   connect target
 */
  if( connect_target() != 0 ) goto DONE;
  // clear_bytecode(); ← コメントアウトする
```

ここは、コメントアウトしなくても動作自体に支障ないそうです。しかし、消した方が不要なエラーメッセージが表示されなくなり精神衛生上よろしいと思います。

次に、[151行目](https://github.com/mrubyc/mrbwrite/blob/5ba4b63c2e767ada0e769f0df6499762e4a12bd5/mrbwrite.cpp#L151)の`show_prog();`をコメントアウトします。

```cpp:mrbwrite.cpp
  /*
   display program list
  */
  // show_prog(); ← コメントアウトする
```

ここは、コメントアウトしないと動作が詰まりますので、Rboardで利用する場合はコメントアウトが必要だと思います（少なくとも作者が試したバージョンでは）。以上で`mrbwrite.cpp`の修正は終了です。

ビルドします。mrbwriteはQtのライブラリを利用しています。どうしたか忘れてしまいましたが、ビルドに必要なQt関連のパッケージがいくつかあったかもしれません。もしも何かライブラリが足りなそうな感じになったら、`apt search qt hogehoge` あたりのコマンドで探して、都度インストールしてください。

```
qmake
make
```

ビルドはすぐに終わります。必要に応じてmrbwriteのaliasを設定しておきましょう。
mrbrwiteは `sudo` で実行しないと動作しないようです。なのでエイリアスにも `sudo` をつけています。

```sh:~/.bashrc
alias mrbwrite='sudo your/path/to/bin/mrbwrite'
```

シェル再起動、または`source ~/.bashrc` 後に
`mrbwrite` とタイプして、`must specify line (-l option)` と表示されていれば完了です。

## 実際にRBoardに書き込みを行う

さて、それでは実際にmrubyに書き込んでみましょう。
LEDをつけたり消したりする簡単なコード `test.rb` を作成します。

```ruby:test.rb
while true
  leds_write(1)
  sleep(0.1)
  leds_write(0)
  sleep(0.1)
end
```

まずはRubyのコードを mruby でバイトコードに変換します。`test.mrb` がバイトコードです。

```sh
mrbc201 test.rb
```

つぎにRBoardをMicro USBで接続します。

```sh
mrbwrite --showline
```

を打つと、USBの一覧？が表示されます。手元の環境では下のように表示されました。

```
ttyACM0	MCP2221 USB-I2C UART Combo	Microchip Technology Inc.
```

この先頭の `ttyACM0` がDevice nameとして使用できます。`ttyACM0` もしくは `'/dev/ttyACM0'` などとして指定します。

```
mrbwrite -l ttyACM0 -s 19200 test.mrb
```

ハマりやすいのは、このコマンドはroot権限でないと実行できない場合があるという点です。ここでは先程sudoを指定したaliasを利用しているので問題なく実行できると思います。そうでない場合は `sudo mrbwrite` としてみるとうまく書き込めるかも知れません。

`-s 19200` オプションは、公式に合わせました。sはスピード(speed)を意味し、ボーレートというもののようです。

[IT用語辞典 ボーレート](https://www.sophia-it.com/content/baud+rate)
> ボーレートは、デジタルデータをアナログデータに変換し、モデムなどのアナログ回線でシリアル転送する際の単位として用いられる。ボーレートの値が大きければ大きいほど、同じ時間内により多くの情報を転送することが可能なことを意味する。位相変調方式によって一度により多くのデータを変調できる場合には、ボーレートの値も大きくなる。

コマンドを打ち込んでエンターキーを押して実行したあとで、時間切れに鳴る前にRBoardのリセットスイッチを押したり、ケーブルをつなぎ直したりすると、コードが書き込まれます。（大抵の場合リセットスイッチが動作しますが、場合によってコードをつなぎ直さないと認識されない場合があります。）以下のようなメッセージがターミナルに表示されれば完了です。

```
Start connection.
OK.              
Writing mml.mrb
OK.
Start mruby/c program.
OK.
```

のように表示されれば、うまく書き込めています。
うまく書き込めていれば下図のようにLEDが点滅すると思います。

![rboard2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144608/4dccead4-b868-383c-2712-7eda555a2316.gif)


この記事は以上です。