見出し画像

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ではざっくりと、

  1. Serial.beginでUART通信を9600bpsで初期化

  2. ループ処理でSerial.availableを発行して電文があればSerial.readで読む

  3. Serial.readで呼んだプロトコル電文を解析

  4. 解析結果に応じてMSXキーマップを更新

という感じの実装をしています。

テスト

ちゃんと動きました

エンジニアさんの言う「簡単ですよ」という言葉で実際に簡単だった試しが殆どないので、「かんたん」と銘打たれている以上、それなりの覚悟をして利用を試みたのですが、実際に簡単で驚きました。

ちなみに、画面右下の「11k28」という表示は、シリアル通信ポートから最後に受信したイベントです。

画面右下(イベント)

上図の「28」の部分が16進数のキーコード(押したキーによって異なる)、「k」がイベント種別、先頭の「11」が16進数のキーアドレスです。

キーアドレスというのは、USBハブで複数キーボードを接続した時の機器特定用だと思われます。(今回USBハブは使っていないのでアドレス情報は読み飛ばしました)


この記事が気に入ったらサポートをしてみませんか?