Arduino ESP32 / MSXでBluetooth LE 無線ゲームパッドを使う


次はBluetooth無線ゲームパッドをMSXなどで使ってみることにします。
とは言っても、つい1週間前までESP32をエスパー伊東と呼ぶわ、間違ってESP8266を買うわで、全くESPのことを分かってないですけどね。

とりあえず、Bluetoothについて勉強してみました。
「GAP?ああ、アパレルのブランドだっけ」
「GATT?それは知ってる、随分昔に学校で習った。関税がどうとか、違う?」
とかのレベルですが。

それでも何とかBluetoothについて分かってきました。
ペリフェラルのデバイスはライブラリが充実しているので簡単に作れるようで、スーファミのコントローラーを無線化したように、X68000やFM TOWNSのキーボードやマウスをBluetooth LE(4.0)の無線化するのは楽勝みたいです。

ところが、
♪お~おセントラルぅ~
になると大変。
USBで言えばホストなので、ライブラリはないわ、サンプルはないわ、調べても事例は少ないわ。
BLE Clientをベースにあれやこれやしてみたのですが、もうお手上げ。

降参!

と思ったのですが、ここまで時間を掛けて諦めるのは悔しいので他人様の手を借りることにしました。

Moke Nakamura@copperceleさん

NimBLEでESP32(M5StickC)にBLE HIDデバイスを接続する(複数デバイス対応)

を参考にさせて頂きました(というか、丸パクリ)。

使ったコントローラーはMOCUTEです。
このMOCUTE、Nintendo Switch用に買ってみたのですが、スマホ用だったので使えませんでした。
それもそのはず、Nintendo SwitchはBluetooth Classic(3.0)ですが、MOCUTEはBluetooth LE(4.0)なんですね。

MOCUTEの通信をキャプチャし、UUIDを調べます。

先頭4バイトのうち、後ろの2バイトがショートUUIDのようです。
ServiceのショートUUIDが"1812"がHIDを表し、CharacteristicのショートUUIDが"2a4d"のものがレポートでコントローラーの操作データが入っています。
ちなみに、ServiceのUUIDが"1000"はL2CAPで、ここにもコントローラーの操作データが入っているのですが、NimBLEでは参照できないようです。

コントローラーのボタンを押して、データの変化を確認します。
先頭1バイト目がボタンのプッシュ・リリースを表していました。
ここまで来れば、MSXの各ジョイスティックピンをオープンドレインで接続し、LOWにすればいいだけです。

さてどうでしょうか...。

動いた!
MSXでも無線ゲームパッドが使えた!

が、操作がもっさり。
というか、かなりタイムラグがある。
どうやらレポートからのnotifyCallbackでは遅すぎて使えないようです。
もしかすると、L2CAPの通信データを拾わないといけないのかなぁ...。

やはりセントラルデバイスを作るのは難しいですね。
仕事から帰って勉強やトライ&エラーを1週間程度したぐらいではどうにもならないようです。
他の宿題も山積みですし、ESP32でハイパー化※するつもりはないので、一旦ここまでにします。
















戻る