SeeedのWioTerminalを使ってみた

# Wio Terminalとは？

[Wio Terminal](https://jp.seeedstudio.com/Wio-Terminal-p-4509.html)は、Seeedから発売されている、プロトタイピングや単体でも使えるデバイスです。主な特徴はこんな感じ。
- 液晶ディスプレイ
- WiFiとBluetooth
- USB（ホスト／デバイス）
- ボタン3個とジョイスティック
- 加速度センサ・ジャイロ、赤外線LED、明るさセンサ
- Groveコネクタ(2個)
- RasPiにつなげる40pコネクタ

イメージとしては、[M5Stack](https://m5stack.com)の上位版、という印象です。（ディスプレイはM5Stackよりやや大きいのですが、画素数は同じ320✕240ドットです）

![wio1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/457605/742a24b2-1534-baa6-a4e8-452e2eb07791.jpeg)

日本だと、[スイッチサイエンス](https://www.switch-science.com/catalog/6360/)や[秋月電子](http://akizukidenshi.com/catalog/g/gM-15275/)でも販売しています（技適取得済みなので、日本でも安心して使えます）。

裏面はこんな感じ。
![wio2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/457605/e7892e64-251e-8e2c-9fed-8b5bfad5969d.jpeg)
RasPiにつなげる40pソケットが見えます。また2cm角くらいが透明になっているのは、中にある赤外線送信機と明るさセンサのためです（RasPiをつないだら使えなくなりそうですが・・・）。なおRasPiを繋ぐ場合は、RasPiのコネクタの高さが足りないので、[RasPi用のスタッキングコネクタ](http://akizukidenshi.com/catalog/g/gC-10702/)などをはさむ必要があります。

あと細かいところですが、microSDカードの差込口が内部のスロットと一体化していて、microSDカードを差し込むときに本体内に入ってしまう心配はなさそうなのは安心です。あと電源スイッチは、中央がON、本体上側がOFF、のスライドスイッチなのですが、反対側がモーメンタリ（手を離すと戻る）でリセットスイッチになっていて、使ってみると結構便利です（このスイッチ、単体で売ってないかな・・・）。ちないにリセット側に素早く2回動かすと、ブートローダーモードに移ります（後述のUSBホスト／デバイス機能を使うとPCからCOMポートとして見えなくなるので、再度書き込みするときに使う）。

# Wio Terminalの使い方

[SeeedのWiKi（日本語）](https://wiki.seeedstudio.com/jp/Wio-Terminal-Getting-Started/)に一通りの使い方が載っていますが、WioTermialのプログラム開発は、いくつかの方法があります。

## ArduinoIDEで

[公式のチュートリアル](https://jp.seeedstudio.com/Wio-Terminal-p-4509.html)の手順で設定します。具体的な手順は他のボードとだいたい同じで、
1. ArduinoIDEの環境設定から、ボードの情報のURLを追加
2. ボードマネージャからWio Terminal（を含む"Seeed SAMD Board"）をインストール
3. スケッチの例から選んだりプログラムを書いたりしてアップロード
です。コンパイルは、けっこう高速で快適でした。

## MicroPython (ArduPy)で

Seeedが推進しているMicroPython環境のArduPyでプログラミングもできるようです。（「ようです」というのは、どうもうまくいかなくて、とりあえず断念してしまったためです・・・（aipを導入するがflashで書き込みできない））

ArduPyは、マイコンでも最近はよく使われるように鳴ってきたMicroPythonでプログラミングできる環境で、ArduinoライブラリもMicroPythonのモジュールとして使用することができます。つまりセンサなどをMicroPythonから使うのにも便利そうです。

## Visual Studio Codeで

最近はプログラムを書くエディタとしてすっかり定着した[MicrosoftのVisual Studio Code (VSCode)](https://azure.microsoft.com/ja-jp/products/visual-studio-code/)からもプログラミンスできます。[VSCode用のArduPyのプラグインがあって、それを使う](https://www.seeedstudio.com/blog/2020/04/17/wio-terminal-update-what-is-ardupy-and-how-to-get-started-with-ardupy-using-visual-studio-code-ide/)ようです。（「ようです」というのは、どうもうまくいかなくて、とりあえず断念してしまったためです・・・（syncで初期ファームウエアの書き込みと接続ができない））

ところでVSCodeでマイコンのプログラミングというと、[PlatformIOというVSCodeのプラグイン](https://platformio.org/)が有名ですが、いまのところWioTerminalは公式では対応していないようです。ただし手動で追加する方法はあるようです（私はまだ試していません）
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">自分で頑張る！ (arduino-cli使用)<a href="https://t.co/f0X4cwFMGU">https://t.co/f0X4cwFMGU</a></p>&mdash; Kenta IDA (@ciniml) <a href="https://twitter.com/ciniml/status/1261885611704610821?ref_src=twsrc%5Etfw">May 17, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

# いくつか試してみた

## サンプルのCellAutomata

ArduinoIDEのサンプルスケッチのLCDにあるCellAutomataをコンパイルして書き込んでみました。あっさり動作。（ライフゲームですね）

![wio3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/457605/f1950774-505c-b073-ccf1-6eeb42f7545a.jpeg)

## Groveコネクタでシリアル通信

普段はWioTerminalのUSB(TypeC)コネクタでPCと接続してプログラムの書き込みや、普通のArduinoと同じようなシリアルモニタが使えます。ただ後述のUSBホスト／デバイス機能を使うと、このUSBコネクタが、書き込みやシリアルモニタに使えなくなってしまうので、別の方法でシリアルモニタを使ってみます。後述のように裏面のRasPi用40pコネクタにUSB-シリアル変換機を繋ぐ方法もあるのですが、せっかくついているGroveコネクタを使ってみます。

[@cinimlさんの情報](https://gist.github.com/ciniml/bd2bb4dea22a55c067ca6790ad0c3eae)を参考に、Groveコネクタに出ているピンを使ってシリアル通信ができます。GroveケーブルとUSB-シリアル変換機の接続部は、Groveコネクタを使って自作しました（左側は[スイッチサイエンスのUSB-シリアル変換器](https://www.switch-science.com/catalog/1032/)。なおWioTerminalのGrove端子は3.3V系なので、USB-シリアル変換器も3.3Vのものを使います）。

![grove-pow.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/457605/f6988cba-c2b6-6f2d-f26f-a05e30957dd9.jpeg)

![grove-serial.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/457605/10bb8b2e-4c8f-e37c-2d01-01af24834903.jpeg)
GroveコネクタとUSB-シリアル変換器を、以下の3本で接続します。
- Groveのp.1<->TXo
- Groveのp.2<->RXi
- Groveのp.4<->GND
ただ後述のように、WioTerminalのシリアル通信は、初期化のところにちょっとクセがあるので要注意です。

## 外部からの電源供給

USBホスト／デバイス機能を使うときにもう1つ困るのがWioTerminalへの電源供給です。普段はPCにつなげているUSBコネクタから電源供給されていますが、それが使えなくなるわけです。

そこで、裏面のRasPi用の40pコネクタに直接電源供給をしてみます。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">USB Host機能使用時の給電は後ろの40ピンコレクタの5Vから<br>リシアルモニタはUSBシリアル変換モジュールをTDX/RDXに接続してTera Termで実施 <a href="https://t.co/xFlsGPUoDX">pic.twitter.com/xFlsGPUoDX</a></p>&mdash; HomeMadeGarbage (@H0meMadeGarbage) <a href="https://twitter.com/H0meMadeGarbage/status/1261529674938609665?ref_src=twsrc%5Etfw">May 16, 2020</a></blockquote> 

WioTerminalの回路図をみると、RasPiの40pコネクタと同じ用に、2/4ピン=+5V、6ピン=GNDを接続すればよいことがわかります。
![wio_pin.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/457605/38046c88-c38a-321d-df02-d2f66da694dd.jpeg)

実際のWioTerminalとの接続はこんな感じです。裏面から見ているので、回路図やよく見るRasPiコネクタピン配置表とは左右が逆になるので注意です。
![powering.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/457605/8f23c83a-a67a-32e2-9c24-5ea5b7e5eb81.jpeg)

+5Vの電源は、ACアダプタでもいいですし、[こんなボード](https://github.com/akita11/USBCpow)などでUSBポート（やモバイルバッテリ、USB ACアダプタ）からでもいいですね。個人的にはUSBポートから給電できるようにしておくと、出先などでも電源に困らないので便利でいいですよ。

## USB Host

ArduinoIDEのサンプルに、USB Host機能を使って、マウスやキーボードの状態を読み取るものがあります。

接続はこんなかんじです。（これに前述の電源供給をして使う）
![usbhost.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/457605/59a57798-9ff7-ba5e-b398-49051b863bff.jpeg)

ただ私が試したときには、マウスやキーボードは認識されていて初期化もされているのですが、マウスのクリックやキーボードのキー押しをしても何も起こりませんでした。何が悪いんだろう・・・

なおマイコンの機能としては、USBデバイスとしても機能できるはずなので、PCにつなぐマウスの代わりとか、プリンタとしてふるまってPCからデータを受け取るとかできるはずなのですが、ArduinoIDEのサンプルには、（まだ）入っていないようでした。

# ちょっとしたテクニック

## シリアルポートの初期化

[@lovyan03さんの（情報を@cinimlさんからいただいた）情報](https://twitter.com/ciniml/status/1263006322586349570)によると、WioTerminalのArduinoIDEのシリアルポートの初期化のタイミングにはちょっとクセがあるようです。具体的には、Serial.begin()で初期化しても、すぐに使えるわけではないようで、while(!Serial);で使えるようになる（オブジェクトがNULLでなくなる）まで待つ必要があるようです。

## WioTerminalBattery

WioTerminalの裏面にとりつける、LiPoバッテリとGroveコネクタが6個ついた"WioTerminalBattery"が開発中のようです。これを使うと、前述のような電源供給の方法を心配しなくていいですし、シリアルポートが出ているGroveコネクタもついているので、使い勝手がだいぶよくなりそうです。（ただ裏面の窓がふさがってしまうので、赤外線LEDや明るさセンサが使えなくなりますが・・・）
[WioTerminalBattery](https://forum.seeedstudio.com/t/new-releasing-of-wio-terminal-battery-chassis-and-look-forward-to-your-ideas/251049)

# まとめ

WioTerminalをひととおり軽く触ってみました。
最初は"M5Stackの上位版"という印象でしたが、しっかりした筐体や、かゆいところに手が届く機能（ジョイスティックや赤外線LED、電源／リセットスイッチ、RasPi互換の40pコネクタなど）が充実していて、ハードウエアとしては完成度が高いと思いました。
その一方で、ArduinoIDEでプログラミングするには十分ではあるものの、その他のソフトウエア面は、まだ発展途上だな、という印象でした。逆に言えば、みんなで「育てていける」余地が多いとも言えるので、みんなで積極的にバグ出しや改善をして、WioTerminalが持っている本領を発揮できるようにしていけるといいですね。