ArduinoからWHILL Model CRを動かす

この記事は[WHILL Advent Calendar](https://adventar.org/calendars/3238)の３日目の記事です.
３日目は中の人でソフトウェアエンジニアの私、杉浦がお送りします。

## WHILL Model CRとは
<img src="https://qiita-image-store.s3.amazonaws.com/0/93722/d1745508-1e9a-cbd2-1956-6880edf7ddd8.png" width=200px>
[WHILL Model CR](https://whill.jp/model-cr)とは、WHILL社が販売しているパーソナルモビリティ[WHILL Model C](https://whill.jp/model-c)にRS232C経由で操作できるコマンドを追加した研究開発モデルです。

## ハックしよう
[WHILLのgithub](https://github.com/WHILL)で公式ライブラリが配布されています。
今のところ、

- [ROS](https://github.com/WHILL/ros_whill) 
- [Python](https://github.com/WHILL/pywhill)
- [Arduino](https://github.com/WHILL/whill-sdk-arduino)

が公開されています。
今回はArduinoライブラリを使ってModel CRをArduinoから制御してみたいと思います。

## 用意するもの
Arduino SDKは予め[こちら](https://www.arduino.cc/en/Main/Software)からインストールしておいてください。

- Arduino Uno
- RS232Cシールド  http://amzn.asia/d/h3Y525W
- RS232C NULLモデム http://amzn.asia/d/8zhkRWj
- Model CR to RS232Cケーブル

Arduinoは、RS232Cシールドが対応している互換機やMegaでも大丈夫だと思います。
内部的にSoftSerialを使っているので、SoftSerialが実装されていない機種(ESP32 Arduono Core)などはおそらくそのままでは動きません。
RS232Cシールドの代わりにUART-RS232C変換基板も使えますが、TXとRXを間違えないように注意が必要です。
サンプルではRS232Cシールドの設定は、**TXを７番ピン、RXを6番ピン** になっています。


Model CR to RS232Cケーブル　→ Model CRから生えているケーブルとRS232を変換するケーブルです。自作が必要です。　


## Arduinoライブラリをインストール
[ここ](https://www.mgo-tec.com/arduino-ide-lib-zip-install)を参考に、WHILLの公式リポジトリ[whill-arduino-sdk](https://github.com/WHILL/whill-sdk-arduino)かライブラリをZipファイルをダウンロードし、インストールします。

正常にインストールされた場合、一旦終了して再起動すると、`File`→`Examples`の中に"WHILL Model CR"という項目が増えていると思います。

## サンプルを動かしてみよう
Arduino IDEの `File` → `Examples` → `WHILL Model CR` とたどると、以下の４つのサンプルスケッチを見つけることができます。

- `blink_power`
- `callback`
- `mirror_joystick`
- `shake`

`blink_power`は５秒毎にWHILLの電源をON/OFFします
`calllback`はWHILLから状態を受け取るたびにジョイスティックの値をPCにprintで表示します
`mirror_joystick`は、WHILLから受け取ったジョイスティックの信号を上下左右反転して、WHILLに入力します。
`shake`は1秒ごとに左右にゆらゆらと揺れます

それぞれスケッチを開いた状態でArduinoに書き込むとサンプルスケッチが動作します。

## whill-arduino-sdkで出来ること

- 電源のON/OFF
- WHILLからの電源供給(WHILLのバッテリー電圧)のON/OFF
- ジョイスティックを仮想的に操作
- 加速度センサ・ジャイロセンサの値の取得
- バッテリー情報の取得
- モーターの角度とスピードの取得
- 現在の速度設定の取得

## 自由にスケッチを書いてみよう

さあ、ここまで来たらあとは自由にスケッチを変更したり、センサを追加して思い通りにWHILLを動かしてみましょう。
例えば....

- 後進するときだけ音がなる
- 距離センサを追加して人についてくる

などなど、様々なアプリケーションが考えられますね！

### `WHILL::register_callback()`を使う場合の注意
`WHILL::register_callback()`でコールバックを登録した場合、ループの中で定期的に`WHILL::refresh()`を呼んであげてください。
この関数でソフトウェアシリアルのQueueからシリアルコマンドをパースして該当するデータがあったら場合はコールバック関数を実行するようになっています。
`refresh()`されない場合、永遠にコールバック関数が呼ばれません。


### Arduinoをつなげるのに便利なUSBポート
PCからArduinoを切り離してスタンドアローンで動作させたいときは、WHILLのシート後ろにあるUSBポートからArduinoの電源を供給すると別途モバイルバッテリーなどをのせる手間が省けて便利です。


### Pull Request募集中
`whill-arduino-sdk`はまだまだベータ版です。改善点がございましたらドシドシPull Request送ってください。


## 採用、してます！
現在WHILLでは電気エンジニア、ファームウェアエンジニアなど様々な職種を募集しています！
興味のある方はぜひWantedlyでエントリー・話を聞きに来てみてください！
<img src="https://qiita-image-store.s3.amazonaws.com/0/93722/0a4489ef-98ef-ad09-072b-d06a67bc39fc.png" width=300px> <img src="https://qiita-image-store.s3.amazonaws.com/0/93722/a3a0a720-0179-b983-4327-e3c982e0062d.png" width=300px>
電気エンジニア募集！一緒にモビリティの回路設計しませんか！
<a href="https://www.wantedly.com/projects/198522">https://www.wantedly.com/projects/198522</a>

ファームウェアエンジニアを募集！自社開発のモーター制御も担当できます
<a href="https://www.wantedly.com/projects/164079">https://www.wantedly.com/projects/164079
</a>

他にも、アプリエンジニアやQAなども募集してます！