
M5StampS3でUSBキーボードを動かしてみる
以前Qiitaの方でM5StampS3に3.2インチのLCD(ILI9341)を繋ぎ、自作のMSXエミュレータを動かして音を鳴らすところまで記事化しました。
Part 1: まずは機材調達や配線など
Part 2: 描画速度を実用的にする
Part 3: 自作MSXエミュレータ(micro MSX2+)を動かす
Part 4: DAC(UDA1334A)を繋いで音を鳴らす
本書は上記の続きで、USBキーボードを繋いでキー入力できるようにする方法を記します。
部品調達
かんたんUSBホストという同人ハードが必要です。
これは、USBキーボードの入力をUART通信(シリアル通信)でマイクロコンピュータへ簡単に送ることができるスゴイ機械です。
M5StampS3の非力なCPU(ESP32S3)では、本体でUSBホスト機能(かなり複雑でオーバーヘッドが大きい処理が必要)を実装することが難しく、Arduinoなどの外部マイクロコンピュータでUSBホスト処理をしつつ、I2CかUARTでM5StampS3と通信する必要があります。
やろうと思えばESP32でもUSBホスト処理が出来なくはなさそうだったのですが、MSXエミュレータのエミュレーション処理でESP32のCPU(2コア)をほぼ専有しきっているので、このユースケースではUSBホスト処理は別マイコンに分離するしかないという認識です。
それを開発するのがものすごく面倒くさく腰が重かったのですが、この「かんたんUSBホスト」があればやりたかった事がピンポイント&簡単に実現できました。
実装
「かんたんUSBホスト」には、押したキーコードをUART通信(デフォルトはボーレート9600bps)で送信する簡単モードと、キーイベントをUART通信で送信するイベントモードがあり、今回はイベントモードを利用しました。
以下の記事に掲載されている取り扱い説明書(PDF)に必要な技術情報が日本語で書かれています。(商業流通しているハードのデータシートはだいたい英語なので、日本語でデータシートが読めるのが新鮮)
具体的な実装方法については書かれていませんが、私の自作MSXエミュレータを「かんたんUSBホスト」に対応した時のPull Requestを見ていただければだいたい分かると思います。
上記のPull Requestではざっくりと、
Serial.beginでUART通信を9600bpsで初期化
ループ処理でSerial.availableを発行して電文があればSerial.readで読む
Serial.readで呼んだプロトコル電文を解析
解析結果に応じてMSXキーマップを更新
という感じの実装をしています。
テスト

エンジニアさんの言う「簡単ですよ」という言葉で実際に簡単だった試しが殆どないので、「かんたん」と銘打たれている以上、それなりの覚悟をして利用を試みたのですが、実際に簡単で驚きました。
ちなみに、画面右下の「11k28」という表示は、シリアル通信ポートから最後に受信したイベントです。

上図の「28」の部分が16進数のキーコード(押したキーによって異なる)、「k」がイベント種別、先頭の「11」が16進数のキーアドレスです。
キーアドレスというのは、USBハブで複数キーボードを接続した時の機器特定用だと思われます。(今回USBハブは使っていないのでアドレス情報は読み飛ばしました)