GUST NOTCH? DIARY

PCからプチコンBIGへのデータ転送

簡単に言うと、「Arduino Leonardo をキーボードに見せかけて、PCからシリアル通信でデータを送り打鍵させる」話です。
いろいろ必要だし一般的ではないと思いますので、ここでは同じことをするのに必要な情報だけ提供します。
必要なもの。

  • 物理的な接続

PC - USBシリアル変換アダプタ -> Arduino Leonardo -> プチコンBIG という接続になります。USBシリアル変換アダプタと Arduino の接続は、

USB シリアル (TX) <-> (RX) Arduino
USB シリアル (RX) <-> (TX) Arduino
USB シリアル (GND) <-> (GND) Arduino

だけです。他の結線は必要ありません。

  • Arduino Leonardo を キーボードに見せる

以前も書いたように、標準ライブラリではなくArduino HID Project のライブラリにある BootKeyboard を使うことによって、Wii U でキーボードとして認識して貰えるようになります。
シリアルからの入力を読みこみ、それに対応するキーコードを叩きます。具体的には BootKeyboard.press() と BootKeyboard.release() を実行するということになります。叩きたいキーコードを送信するわけですが、最初に CapsLock してしまうのがいいでしょう。Low Speed のUSBデバイスの場合 1msec 単位で情報のやりとりが行われるので、Waitをいれた方がいいんじゃないかなーと思います。実際、早く送りすぎると取りこぼしが発生するようでした。なので press and release で 2msec かかることになります。
そのため、ボーレートは9600bpsで十分ということになります。
Serial ポートからキャラクタを読み込み、それに対応するキーを叩く、ということを繰り返すことになります。
Arduino Leonardo の場合、USBで接続してる通信は Serial を使うのに対し、ピンからの入力に対しては Serial1 を使うのに注意する必要があります。
また、Shift キー5回たたくとハングしてしまうことが発生しているので、Shiftキーを使わない方が無難です。後述しますが Base32 だと大文字のアルファベットと一部の数字だけでデータを記述できます。

  • PCからの送信

シリアルポートを開いてデータを送りつける、ということでいいのですが、単に流し込むとバッファが溢れる可能性があるので、Wait を入れて送っています。単純にシリアルポートに送り付けるよりは、ポートを開いて自分でタイミングを制御しながら送る方がいいでしょう。私はそのためのプログラムを書きました。

単にキー入力を受け付けるだけであれば何もすることはありません。ただし、Shiftキーを使うとハングするということがありましたので、私は Base32 でエンコードしたデータを送るということにしました。なので、PC側でもエンコーダが必要ですが、プチコンBIG側でもデコードの処理が必要になります。テキストの場合はプチコン文字コードUTF-16であるということを意識していれば特に問題はないのでは。Base32 についてはRFC4648を参照してください。