関心分野 >> Serial-Keyboardアダプタ
Serial-Keyboardアダプタを作る
RasPiの開発環境をノートPCのみで作ろうと思至ってみた。HDMI出力は、HDMI-UVC変換器が色々販売されているので、それを使うことにしたのだが、キーボードとマウスに関して使えるものがなかったので、自作することにした。
Arduino Pro Microには、HIDインターフェースになる機能があるそうなので、これとUSB-Serial変換器で簡単に作ることができそうなのがわかった。
取り敢えず、必要な部品を調達した。今回使用したのは、下の2つ。予備を考えて2個パックを購入。
また、もう少し小型にするためにUSB直付けのBeetle BadUSBでも実装可能です。
配線
ProMicroでは、0番(RX)と 1番(TX)にSeiral通信の機能が割り当てられています。この2つのピンを使ったもいいのですが、最終的な配線をどうするかによって他のピンを使いたくなります。今回のProMicroでは、USBポートを相対して使いたかったので、9番(TX)と10番(RX)をSerial通信に割り当てたいと思います。ArduinoのSerial通信では、SoftwareSerialライブラリを使うことでDIOのピンをSerial通信用として使用することができます。
ここでちょっと気を付けなければいけないのは、ProMicroでは、SoftwareSerialでSerial通信できるピンに制限があります。Webサイトでの説明では、
Not all pins on the Leonardo and Micro support change interrupts, so only the following can be used for RX: 8, 9, 10, 11, 14 (MISO), 15 (SCK), 16 (MOSI).
と書いてありました。
そこで、下のような配線にしています。
Arduinoのプログラミング
Arduino ProMicroには、HIDインターフェースとして動作する機能がありますが、通常のKeyboardとMouseを使うと、OSが起動する前(Grub選択画面)では、動作しないという欠点があります。このため、ここでは HID-Projectというライブラリを使用することにしました。
また、このアダプタでは、キーボード入力とマウス入力を同時に扱うために、シリアス通信時に送信されるデータの長さのみで、判別しています。(本来は、CRCなどを付加して、パケット落ちなどにも対応すべきだと思いますが、簡略化しています)また、キーボードに関しても、日本語配列で設定されたPCに対応するために、特殊キーの変換も実装しています。
実装したスケッチは、Githubで公開しています。
シリアル通信時のデータ
このアダプタでは、キーボードとマウスの入力イベントを以下のように簡単なデータ列に変換して、ProMicroにデータ送信するようにしています。
- 1バイトデータ: キーボードの1キー
- 3バイトデータ: 方向キー
- 4バイトデータ、5バイトデータ: ファンクションキー
- 8バイトデータ:マウスイベント