2021年12月4日土曜日

FM77AVにUSBキーボードを接続する試み(途中経過)

FM77AVにUSBキーボードを接続する試みの途中経過です

以前、「FM77AVにPS/2キーボードを接続する変換器の基板化(2019年7月31日)」と「FM77AV用PS/2キーボード変換器の不具合を修正(2020年1月21日)」で紹介したFM77AV用のキーボード変換器ですが、私は今でもFM77AVやFM77AV40SXで常用しています。

しかし、PS/2キーボードも入手しにくくなっておりますので、いつかはUSBキーボード用変換器を製作しようとは考えていたのですが、私にはUSBは敷居が高くて手が出しにくいのでそのままになっていました。

しかし最近、中華製のCH559の記事を読んでいて、このようなUSBホスト機能を持ったマイコンを使えば何とかなるのではないかと考えました。でも今更新しいマイコンの使い方を覚えるのも大変だなと思っていたのですが、ふと思いついて、以前マイコンとスマホの間のBluetooth通信に関してあれこれやっていた時のPIC24FJ64GB002があったなと思い出して、探してみたら3台も出てきました。


出てきたPIC24FJ64GB002基板


ハードはこれをそのまま用い、ソフトはMicrochipのMLA(Microchip Libraries for Applications  v2018-11-26版)中のusb frameworkを用いることで、USBキーボードからの入力を得てUARTに出力することができました。と言ってもMLAのサンプルはPIC24FJ64GB004用でしたので、すんなりとできたわけではなく、ビルドできるようになるまでが一苦労でした。(YTSのホームページ中のPIC24FJ64GB002(Bluetooth LE)の記事が大変参考になりました。感謝いたします。)



ATtiny85と接続


UARTの出力をTeraTermで表示させてみました。入力したキーがちゃんと表示されています。


キー入力を表示


しかし、このMLAのサンプルコードはUSBキーボードのキースキャンコードをそのまま出力するのではなく、内部でコードの処理をした結果のアスキーコードを出力するようになっているので、FM77AV用の変換器を作るためにはこの部分を取り除かなければなりません。

さらに、USBキーボードのキーコードは 'a'=0x04, 'b'=0x05,..., '1'=0x1e, '2'=0x1f,...

であり、キーボードが送るHID Reportは

Makeコード(8バイト):status,0x00,第一キーコード,第2キーコード,..,第6キーコード

Breakコード(8バイト):all 0x00

のはずだと思うのですが、サンプルコードの中にこのフォーマットのデータらしい箇所をまだ見つけることができていません。

また、このサンプルコードはハブ機能を持ったUSBキーボードには適合しないという記事がありましたが、確認してみますと確かに全く反応しませんでした。


全体の構成(予定)

全体の構成としては下図のようにPIC24FJ64GB002の1個だけでFM77AVのスキャンコードの出力ができれば理想なのですが、あれこれと試してみましたがどうも無理なようです。


構成図

その理由については今のところ分かっていません。

試しにメイン関数中に特定のスキャンコードを送るルーチンを書き込むとFM77AVに表示されますが、USBのスキャンコードを得る関数中にそのルーチンを書き込んだ場合は表示されないのです。FM77AVへの通信ルーチンといっても、単にPORTBの1ビットをオンオフしているだけなのですが...

USBでは1ms毎に通信しているので、その中にFM77AVへの通信ルーチンを入れ込むのはダメということのようなのですが、参考にした「YTSのホームページ」さんはUSBの関数中にUARTの送信ルーチンを入れて正常に動作させています。下の画像のパルス間隔が伸びている箇所がUART通信中の部分です。(もっとも、FM77AVへは4バイトのコードを正確に100us,125us,175usの間隔で送る必要があるので、これが原因かもしれませんが。)


PIC24のRB2出力


ATtiny85を使うことになりそう


ということで、PIC24FJ64GB002でUSBキーボードのスキャンコードを得て、それをATtiny85に転送してコード変換した後にFM77AVに送り込むという形を考えています。

しかしその転送手段ですが、ATtiny85にはUART機能がないため、試しにATtiny85をArduino化してSoftwareSerial機能を使ってみましたが、変数がRAMエリアの容量を超えてしまってビルドできませんでした。あとはUSI機能を使用するか、あるいは直接UART信号を読むルーチンを書くかということになりそうですが、まだどちらも実現できていません。

以上、途中経過でしたが、私が理解していないことが多々あるかと思いますので気づかれたことがありましたらアドバイスいただけると有難いです。

0 件のコメント:

コメントを投稿