Arduino UNOの8U2のHIDでキーコード変換機

 昨夜の続きです。

 Arduino Leonardoで動作確認したプログラムをArduino UNO with HID用に書き換え。
 基本的に、Leonardo専用のKeyboardオブジェクトのKeyboard.sendReportのところをSerial.writeに書きかえるだけ。引数はどちらもuint8_tの8byteのHIDキーコード配列なので。あと、デバッグ出力がSerialなので、SoftwareSerialへ書き換え。

20130403_01 debug console
 SerialをHID役のATmega8U2との通信に使ってますから、SoftwareSerialを使ってモニタリングしています。
で、なんか動作が変。別電源も与えているから電源ではないと思いたいけど。SoftwareSerialのモニターではUSBホストからのキーコードも、変換後のキーコードも正しく出力されている。しかし、出力先のPCでは変な状態のコードが届いてるようでエディタを開いてカーソルを置いておいてもコントロールコードが行くとヘモヘモになります。
 ATmega8U2との接続を9600bpsから57600bpsとかにあげたらうんともすんとも。Arduino-keyboard-0.3.hexのサイトにソースも公開されていたのみてみると、9600bps固定。でもキーボードならそれくらいの速度でも大丈夫なはず。
 対処療法的に、USB HIDの8byteのデータを一気に送るのではなく、1byteづつ送るようにしたら、とりあえず安定した模様。変な動作をしてたのは、どっかのタイミングでATmega328Pから送ったデータとATmega8U2が受け取ったデータがずれて、ずれたまま動作していたからと思う。シリアル無手順だし一度ずれたらなおしようもない。
 今回いろいろすったもんだやってたので、LUFAというAVRでUSBをやってるプロジェクトも見つけられた。サンプルにHIDホストもあったので、AVRを2つ使って受けと送りを担当させて、両者をi2cなりSPIでつなぐのもありかなぁと思ったりしてます。USBホスト倶楽部というちょっと記事は古いけど参考になるサイトも見つけました。 USBホストってもつなぐのはUSB HIDキーボードに限定してしまえば結構いけるのかも。キーボードだと速度も遅めですからね。

シェアする

フォローする