CH55xduinoのサンプルプログラムを改造して、CH552を使ったゲームパッドができました。
HiDKeyboardを改変してみる
CH55xduinoのサンプルプログラムにキーボードのプログラムがあります。手始めに、このプログラムを改造してゲームパッドにしてみたいと思います。
USB機器はパソコンに接続した際に、私はこういう機器でこんなフォーマットでデータを送信しますよという情報(Descriptor)を送信します。
サンプルのキーボードのプログラムはキーボードとしての情報を送信するので、これをゲームパッドの情報に変更してみます。
デスクリプターは書いたことがないので、HID Descriptor Toolに付属のジョイスティックのサンプルを開いて見てみます。
右側の数字の羅列がデスクリプターです。このサンプルには、十字キーやボタンの他に、スロットルやハットスイッチといった今回は不要な設定もあるので、それらを削除してDescriptorを生成してみました。
0x05, 0x01, // USAGE_PAGE (Generic Desktop) 0x15, 0x00, // LOGICAL_MINIMUM (0) 0x09, 0x04, // USAGE (Joystick) 0xa1, 0x01, // COLLECTION (Application) 0x05, 0x01, // USAGE_PAGE (Generic Desktop) 0x15, 0x81, // LOGICAL_MINIMUM (-127) 0x25, 0x7f, // LOGICAL_MAXIMUM (127) 0x09, 0x01, // USAGE (Pointer) 0xa1, 0x00, // COLLECTION (Physical) 0x09, 0x30, // USAGE (X) 0x09, 0x31, // USAGE (Y) 0x75, 0x08, // REPORT_SIZE (8) 0x95, 0x02, // REPORT_COUNT (2) 0x81, 0x02, // INPUT (Data,Var,Abs) 0xc0, // END_COLLECTION 0x05, 0x09, // USAGE_PAGE (Button) 0x19, 0x01, // USAGE_MINIMUM (Button 1) 0x29, 0x04, // USAGE_MAXIMUM (Button 4) 0x15, 0x00, // LOGICAL_MINIMUM (0) 0x25, 0x01, // LOGICAL_MAXIMUM (1) 0x75, 0x01, // REPORT_SIZE (1) 0x95, 0x04, // REPORT_COUNT (4) 0x55, 0x00, // UNIT_EXPONENT (0) 0x65, 0x00, // UNIT (None) 0x81, 0x02, // INPUT (Data,Var,Abs) 0xc0 // END_COLLECTION
これを、CH55xduinoのサンプルプログラムにあるUSBconstant.c内のデスクリプタと置き換えてコンパイルしてみます。
マイコンがパソコンに正しく認識されません。この後、デスクリプタを色々変更して、プログラムも変更したのですが、データが送信されないなど全くうまくいきませんでした。
HidKeyBoardMouseを改変
CH55xduinoのUSBサンプルには、キーボードとマウス2つのデバイスとして振る舞うプログラムも入っています。
気を取り直して、このプログラムを改造します。このプログラムのキーボードはそのままに、マウスの部分をゲームパッドに変更します。それがうまくいったら、キーボードを削除してゲームパッドだけにする、という方法で改造したいと思います。
いろいろ改造した結果、以下の十字キーとボタン8個のデスクリプターで、ようやく正しくゲームパッドとして認識されるようになりました。
0x05, 0x01, // USAGE_PAGE (Generic Desktop) 0x09, 0x04, // USAGE (Joystick) 0xa1, 0x01, // COLLECTION (Application) 0x09, 0x01, // USAGE (Pointer) 0xa1, 0x00, // COLLECTION (Physical) 0x85, 0x01, // REPORT_ID (1) 0x15, 0x81, // LOGICAL_MINIMUM (-127) 0x25, 0x7f, // LOGICAL_MAXIMUM (127) 0x35, 0x81, // PHYSICAL_MINIMUM (-127) 0x45, 0x7f, // PHYSICAL_MAXIMUM (127) 0x09, 0x30, // USAGE (X) 0x09, 0x31, // USAGE (Y) 0x75, 0x08, // REPORT_SIZE (8) 0x95, 0x02, // REPORT_COUNT (2) 0x81, 0x02, // INPUT (Data,Var,Abs) 0xc0, // END_COLLECTION 0x05, 0x09, // USAGE_PAGE (Button) 0x19, 0x01, // USAGE_MINIMUM (Button 1) 0x29, 0x08, // USAGE_MAXIMUM (Button 8) 0x15, 0x00, // LOGICAL_MINIMUM (0) 0x25, 0x01, // LOGICAL_MAXIMUM (1) 0x75, 0x01, // REPORT_SIZE (1) 0x95, 0x08, // REPORT_COUNT (8) 0x55, 0x00, // UNIT_EXPONENT (0) 0x65, 0x00, // UNIT (None) 0x81, 0x02, // INPUT (Data,Var,Abs) 0xc0 // END_COLLECTION
デバイスマネージャで確認してみます。
HIDデバイスの欄に「標準ゲームコントローラ」として認識されました。ゲームパッドのプロパティを開くと十字キーとボタン8個が登場しました。
その後、キーボードの機能を削除し、十字キーとボタンが押されたらその情報を送るプログラムに改造します。
上のスイッチを押すと軸が上を向き(左の図)、ボタンを押すとボタンが赤く光りました(右の図)。
CH552がようやくゲームパッドになりました。
参考までに、作ったプログラムを貼っておきます。
ファミコンのコントローラにしたいので、デスクリプタとしては8ボタンですが、物理的には4つボタンだけ反応するように実装してあります。ご自由に変更してください。
CH552はプログラムの書き込みの際に、一旦USBを抜き、ダウンロードのボタンを押しながらUSBを再接続する必要があります。何度も書き込むととても面倒な作業です。しかし、先日作った書き込みツールのおかげで、ボタンを1つ押すだけで書き込めるため、とても快適に開発ができました。
CH552の書き込みツールはkohacraftのshopで販売しています👇👇
ファミコンエミュレータで遊んでみる
エミュレータソフトでも、ゲームパッドが認識されました。
このように、CH552マイコンのゲームパッドでファミコンのゲームがプレイできます。
かなり時間がかかりましたが、ようやくCH552でゲームパッドが動作しました。
これまでは、AVRマイコンのATMEGA32U4を使ってファミコンのUSBコントローラを作っていましたが、CH552にすることで安価にUSBコントローラが作れそうです。
実験で使っているCH552のマイコンボードもkohacraftのshopで販売しています。
CH552にちなんだ価格になっています。
コメント