2013年04月一覧

Arduino UNO & USB HOST SHIELDのキーボードコンバータ運用テスト開始

20130421_03

 USキーボード対応も出来たので、Arduino UNO版もいれ変えました。シールドのdigital5ピンからGNDにジャンパ入れてUSモードです。
 で、問題がないか確かめるために自宅で運用を開始してみます。このブログエントリー自体も、すでにこの変換機を通してます。OS側の変換ドライバは止めてます。この無線キーボードはCAPS,NUMLOCKなどのLEDが無いので、UNOのソフトはLED対応はしてないバージョンです。今のところレスポンスなども特に問題は無さそうです。


Harpy nanoでUSB HID Keyboard変換テスト

 USB HOST SHIELD 2.0のライブラリを修正。最新ソースをgit hubから拾ってきて展開。#define DEBUGがあちこちで生き残ってるのでコメントアウト。 message.cppのUsbDEBUGlvlを0x80から0x00へ変更。あと、ADKも使うのでavrpins.hの#define BOARD_MEGA_ADKをアンコメント。
 これでコンパイルして、HEXをATmega2560に焼いてみたら、OK。昨晩小手先の対応をした不要なReportも流れてこない。
 同じソースをArduinoUNO用に焼いてみても期待通りの動作。

 安定動作しているようなので、以前買っただけで使っていなかった株式会社 鳥人間Harpy nanoを使ってみた。PCとつなげるHID device役はSparkfunのATmega8u2ブレイクアウトを使用。PICでHID deviceを作ったらそっちも試す予定。

20130421_01

Harpy nanoはロジック3.3V動作なのでHID device側の電源選択半田ブリッジを5Vから3.3Vに変更。肝心なときにハンダ吸い取り線が見つからず探しちゃったよ。あとHarpy nanoのMAX3421Eのリセットの接続が旧USB HOST SHIELDの設計なので、起動時にdigital7ピンをlow→highとやってソフトでリセット。

20130421_02

 Harpy側はシリアル書き込みが使えるので、ArduinoIDEからArduino Pro/Pro miniの3.3V Clock8MHzで書き込み。ATmega8u2はHEXをAVRISPmk2で書き込み。両者のtx rx gndを接続して、無事動作を確認。ATmega8u2が3.3VでClock16MHzなんだけど、まぁ動く。5Vに戻して、ATmega8U2のtxに分圧抵抗を入れるのかも。

 次はUS、JP両対応です。ってどこかのデジタル入力にプルアップ抵抗とGNDにつなぐスイッチをつけてチェックして、HighならJP,LowならUSで変換テーブルのポインタを切り替えるだけですけど。PC側が変わるときってUSBケーブルを差し替える状態なので、変換機の電源も入れ直しになるからプログラムの起動時にチェックすりゃええかな。毎度毎度チェックしても良いけど。

 忘れてた、CAPSロックのLED対応もしないと。CAPSLOCKを吐いていないのにLEDはトグルしてしまうのです。気にしなきゃいいのだけど。これってHID HOST側から制御できるはず。現に自宅のDriverでキー置き換えしてるPCだと、CAPSキーを押してもCAPSのコードを出さない限りはLEDに影響ない。キーボード内部でON/OFFしてるわけでなく、PC側からなんかもらってる筈。

 夜、ADKにてJIS/US切り替え実装完了。Harpyでも使えるDigital5ピンを使用。Harpyはピンソケットを外してピンヘッダに置き換えようかな。で、このJIS/US切り替えを固定スイッチでなく、キーボードのキーコンビネーションから切り替えられるようにしても良い。CTRL-SHIFT-ALT-CAPSLOCKとか開いているだろうか?


初心に戻って調査(USBキーボードコンバータAVR編)

20130420_02

 上記のような接続でテスト。PCの代わりにUSB HOST shieldをつなげて、飛んでくるデータをウォッチしてみた。本来の回路であるADKではATmega2560からHIDファームを焼きこんだATmega8U2との間をシリアルでウォッチ。
 ADK側のウォッチポイント1はすごく正しくデータが流れていた。

 が、PCの代わりにおいたウォッチポイント2では、キーを打っている間は正しいデータが受信されているものの、しばらくキー入力がないと妙なデータが流れ込んでいた。HIDのレポートのはずなのだがBinaryで50 6F 6C 6C 3A 46 46 0D 0A。
0D 0A がある時点で改行コードかってことはASCIIか?ってことでその前は「Poll:FF」。そもそもHID reportはASCIIコードじゃないし、1レポートは1キーだ(実際は同時押し6キーまではありですが)。図のATmeaga8U2以降でこのデータが追加されている。しかもこのデータの通信は不安定で、場合によってビットがずれたりしている。これをそのままPCに繋ぐとモディファイヤが絡むと非常に厄介な誤動作になる。(実際体験して、速攻でUSBケーブル抜きましたし。)
 とりあえず、おかしなHID Reportになっているから安定しなかったわけで。
 なぜ、時間をおいた時に上流から流れてきていないものが出力されて来ているのかを考えたい。ADK→ArduinoUNOのUSB部分の通信を、ドライバが復活したプロトコル・アナライザLAP-Cで見てみようと思う。あとUSB HOST Shieldのライブラリと読んでるとやたらとSerial.Printが入ってるのが気になる。ATmeaga8U2のHID化ファームは多分白だと思っている。

 なんとなくですが、USB付きのPICを使わなくても片付きそうな気がしてる。でも、USB HOST shieldだけに問題があった場合はハマるかな。

[ちょっと置いて]
 ADKのATmega2560からATmega8U2の間にシリアルを置いてみたら「Poll:FF」やら「Poll:1」をシリアルに流してるのが確認できた。ライブラリを修正すれば治りそうだ。

[さらにあと]
 確かにライブラリ内でデバッグ用にSerial決め打ちでデバッグ文字を出してる部分はあったけども。それだけでなく、純粋にUSBホストとして受け取っているレポートがあった。けど、よくわからん。しばらくキーボードをいじらないと出てくるので接続確認のポーリングなのかしらん。07 00 1dで始まるReport。それ以降の部分は適度に変わるのでなんとも。仮にこの文字列のReportは無視するようにしたら、とりあえず異常動作をすることがなくなっている。一部、CAPS LOCKのランプが逆になる事もあるが、その辺はキーコンビネーションのバリエーション対策で解決できそうだ。もしかしたらこれで行けたのかしらん?
 明日状況を明確にして日本語キーボードのマシンにつなげて安定化できたら、小さい回路で実現する方向を試します。あとは、スイッチでモードを切り替えられるようにして、クロージャーに入れて・・・と。やっと終わりが見えてきたかも。


PICでLチカ

20130420_01

 PICとPICKIT3が届きました。とりあえずLチカしてみました。無駄にLEDアレイを配置。PICのXCのライブラリを把握していないのでまずはこんなもんから。

 ちょっと思ったんですが、PIC18F4550あたりを使って、キーボードマトリックスのデータをHIDにして出してしまうのもありかもと。FILCOのフルキーボードの中に組み込む形で。スイッチつけて出力するReportをUSタイプとJPタイプ切り替え可能にしたりして。


PICに手を出す

 結局PICとPICKIT3を秋月に発注してみました。PIC18F2550とか。ライターは自前で手持ちのAE-UM232Rとかで作っても良かったんですが、時間がないのと1個は純正品があるほうが余計なハマリもなかろうと奮発。さてどうなりますやら?慣れてるmbed2でUSBホスト役とUSBデバイス役で作る方がゴールは近い気はするが、ちょっとオーバースペック杉だしなぁ。最悪この方法を取ります。

 キー入れ替えの問題はちょっと新たな情報がありました。CAPSLOCKをF13にしてF13をMS-IMEの設定(Google日本語入力が使えなくなるのがかえって良かったか?でも変換候補がバカすぎる。)でIMEトグルに設定する感じで、IMEトグルをCAPSLOCKに割り当てるのはnodokaなどのソフトウエアなしでレジストリで出来ました。しかし、SHIFT-CAPSLOCKをCAPSLOCKに設定するすべがない。F1とかに割り当ててしまおうか?
 ま、USキーボードに日本語キーボードのコードを返すようにハード側でさせたほうがどんな場合にも対応できるので、この線の実験も続きます。お陰でマトリックスLEDのニュースボードの作成が進まない。


新しいおとと二匹

20130417_01

 ちび出目金だけになって寂しくなった水槽に、新しいお子を迎えました。桜東錦と丹頂。土曜夜には到着していたのですが、ちょいと薬浴トリートメントしてました。三匹とも元気でいてくれると良いですが。