micro:bit用USBキーボードプロジェクト




↑画像のクリックで動画が見られます
(2022/12/11)

◆micro:bitの弱点?文字入力

micro:bitはセンサー、ディスプレイ、GPIO、無線が完備していて非常にコストパフォーマンスが高いデバイスなのですが、折角文字列の表示機能があるのに、文字入力ができないという弱点?を抱えています。
文字入力ができると、コマンドで動作を変えたり、無線で文字通信ができたり、バーコードが使えたり、応用が拡がりそうな気がします。
既存の製品ではM5Stack用のI2Cのキーボードが使えるのですが、金属製のタクトスイッチを使った簡易的なものなので、文字列を打ち込むのは少々つらいところです。
普通に売られているUSBキーボードが接続できると便利なのですが、ブレッドボードで使えるスイッチサイエンス委託の製品かんたんUSBホスト」があるくらいで、簡単にmicro:bitに接続できるものがありません。ないものは作ってみることにしました。

◆USB HIDーシリアル変換チップCH9350L

USBキーボード、マウス等はUSB HIDクラスのプロトコルでデータを転送します。これを汎用プロセッサだけで実現するにはUSBホスト、HIDプロトコルの実装などかなりのレイヤーの開発が必要になります。
上記の「かんたんUSBホスト」はWCHのCH559というUSBホスト内蔵のチップを使っているのですが、8051という馴染みのないコアでファームウェアを実装するので敷居が高そうです。
格安USBホストマイコン CH559をいじってみた(大盛)

調べたところ、同じWCHからCH9350Lという、HIDプロトコルのデータを非同期シリアルに変換するという、おあつらえ向きのチップが出ているのがわかりました。
USBマウス・キーボード用シリアル通信制御IC CH9350L
本来の用途は2個をペアにして一方をUSBデバイス、一方をホストに接続し、2つの間をシリアル通信で結んでキーボード・マウス等を延長するためのもののようです。そのためシリアルは独自のプロトコルになっていて、USB HID Usage IDで転送されます。
この文字情報をmicro:bitのシリアル入力用にASCIIコードに変換するため、二度手間になりますが変換用に別のチップを挟むことにしました。
大した処理ではないので、当初は手軽なATtiny85で試したのですが、ATtinyはハードウェアシリアルがなく、CH9350Lからの入力、micro:bitへの出力を同時に処理するのが困難で、少々オーバースペックですがATmega328Pを使うことにしました。

◆実装と基板化

回路はCH9350LとATmega328Pをシリアルで繋ぐだけですが、これらが5V系でmicro:bitが3.3V系のため、micro:bitへの電源供給用にレギュレーターを入れています。ATmega328からmicro:bitへ出力するシリアルのラインは抵抗分圧で電圧を合わせてあります。

まずバラック組でテスト。対象がmicro:bitだけだとつまらないので、汎用のUART出力とGroveコネクタもつけました。

基板化でパーツを表面実装にしたので、オンボードでATmega328PUにArduinoブートローダを書き込むためにICSPのピンヘッダをつけてあります。



◆ファームウェア

CH9350Lのデータシートにあるプロトコルに従って、余計なヘッダ情報を無視して、文字情報部分をUsageIDに対応するASCIIコードに変換するだけです。変換は配列usage_idに定義しています。
現状はアルファベット大文字と数字、スペースのみ対応しています。


◆応用例

・キーボード入力した文字列を無線でもう一台のmicro:bitに送信し、受信したmicro:bitでプリンタに印刷するテレタイプ



・バーコードスキャナでバーコードを読み取って印刷します

↑画像をクリックすると動画が見られます



◆イベントでの公開例

2023年4月29,30日 Maker Faire Kyoto 2023