かんたんUSBホスト(HIDキーボード用)をつくりました

自作のガジェットにキーボード入力を追加したいと思っていろいろ調べてみたのですが、簡単でちょうどいい方法が見つからなかったので、それならば、ということで自分でつくってみました。

TL;DR

  • USB キーボードで打った文字が UART に出てくるモジュールです。
  • キーコードではなくて文字が出ます。コード変換やキーの状態管理を行わなくてよいので、自作ガジェットにキーボードを簡単に接続できます。
  • booth 販売ページ
  • 取扱説明書(PDF)

USB キーボードで打った文字列を UART(シリアルポート)で出してくれる、たとえばキーボードで ABC と打ったら UART で ABC と出力してくれる、という「わりとあたりまえ」な感じのモジュールがあれば便利だよね、というのがメインコンセプトです。

USB キーボードというのは正確には HID キーボードです。この HID キーボードのプロトコルは PC に文字を入力するのには都合が良いので、キーボードに限らず、バーコード・QR コードリーダーとか、RFID リーダーなんかも同じプロトコルで動きます。なのでキーボードに対応するだけで QR コードが読めたり、意外といろんなことができるようになります。

それを踏まえて、いろんな用途に使えるように、便利機能を盛り込みました。

  • 600 mil(15.24 mm)幅の 24 ピン DIP パッケージと同じ寸法のピン配置にしたので、同サイズの IC ソケットやブレッドボードに挿さります。
  • 5V 単一電源で動きます。USB 側はポリスイッチで過電流保護してあります。
  • 矢印キー等の「文字ではない」キーは VT100 や xterm のコントロールシーケンスを出力するようにしました。マイコン側でコントロールシーケンスを処理するのが面倒な場合もあるので、そういうキーを無視するようにもできます。
  • キーリピートやキーロック(CapsLock とか)も実装しましたが、必要な場合も不要な場合もありそうなので、設定でオンオフできるようにしました。
    • よく使われそうな設定はピンを GND に接続するだけ、より詳細な設定は SPI または UART からできるようにしました。
  • USB ハブに対応しました。
    • ハブ内蔵のキーボードも使えます。
    • 複数のキーボードの入力を受け付けられます。
      • 最大 8 台のキーボードを認識します。
  • バーコードリーダー等は US キー配列で出力してくることがあったので、JIS キー配列と US キー配列を切り替えられるようにしました。
  • Shift キーとかを含めて本当に全部のキーを個別に扱いたい場合のために、テキストだけでなくキーダウン・キーアップ等のイベントを出力するモードも用意しました。
    • このモードでは複数のキーボードからの入力をそれぞれ区別することもできます。
  • Ctrl + Alt + Delete で L レベルになるオープンコレクタのピンを実装しました。(キーの組み合わせは変更可能)
    • ネタ臭がしますが、これでマイコンのリセットとか割り込みとか実用的なことができます。

機能追加作業自体が楽しくなってきてしまって、正直ちょっとやりすぎた感じもありますが、これで「ちょっとテンキーが欲しい」ようなシンプルな用途から「Apple II とか MSX みたいな 8 ビットコンピューターがつくりたい」ようなガチな用途までカバーできるんじゃないかなと思います。

ということで自分以外にも需要があるかも?と思ったので、ひとまず booth で販売してみます。

PDF で詳しい説明書も用意しました。A4 で 14 ページあります。(ちょっとした同人誌ですね。)

USB キーボードを自作する、というのは最近よく見る一方で、自作のガジェットはまだタクトスイッチなんかを並べてがんばって入力盤をつくっている例をよく見ます。さくっと USB キーボード(や互換の入力デバイス)がつながるといろいろできることも増えたり、開発初期の時点で面倒な入力盤を用意しなくてよくなったり、いろいろ応用できるように思います。

「1 個あるとなにかと便利」なモジュールだと思ってますので、ぜひご活用ください。

技術的な説明

ここまで説明したことを実現するには、まず USB を喋れるトランシーバー的な IC が必要で、その上のレイヤーで USB HID デバイスを認識して HID プロトコルで喋るドライバーが必要で、さらにその上のレイヤーでキーボードのキーの状態を文字コードに変換するもう 1 つのドライバーが必要、という、けっこうな規模の実装が必要です。

そのためには USB ホストトランシーバー内蔵のマイコンがあると良いのですが、大きかったり高価だったりでちょうどいいのがなかなか無いのです。最近出た RP2040 がようやくよさそうな感じでしょうか。

私の場合は、2 年くらい前にようやく、中国のチップメーカーから安い USB トランシーバー内蔵マイコンが出ている、というのを知って、今回のかんたん USB ホストモジュールはそのメーカーCH559 というマイコンを使っています。いわゆる「中華マイコン」と呼ばれるもののひとつですね。

CH559 は安く、外付け部品が非常に少なく済んで、クロック 48 MHz、RAM も 6KB、というなかなかのスペックで、今回のような手軽な変換モジュールをつくるのは最適に思えました。見てくださいこの部品の少なさ。これでちゃんと USB ホストになって、ちゃんと通信できるんだからたまらないです。

しかし、やはりそこは安いなりで、CPU コアが 8051、というのはちょっと(けっこう?)厄介でした。結果としてはちゃんと当初目標にした USB ハブ対応まで実装できたのでオーライなのですが、少し苦労しました。このあたりのお話はまた別の記事でご紹介できればと思います。

開発の軌跡

以下の Tweet からスレッドでたどれます。