Bluetoothドングルを使った無線通信実験(その2:HIDプロファイルの実装)

約1年前、Bluetoothドングルを使った無線通信実験を行ってからだいぶ時間が経ってしまったが、この実験の結果をふまえて、今回はマイコンにBluetooth HIDプロファイルのスタックを実装した。(ソフトウェア構成図)この結果、PCから見るとマイコン基板は、Bluetoothマウスと同等のデバイスとして、OS標準のドライバだけで動作することが確認できた。

今回の実験で使用したBluetoothドングルは、前回同様、非ブランド品とプラネクスのBT-MicroEDR1Xだ。いずれも、CSR社製のBluetooth LSIチップ、BlueCoreを搭載している製品である。

BT-MicroEDR1X非ブランド品

今回の実験では、BluetoothホストPCとBluetoothデバイスとして動作する自作のPIC24F基板を使用した。この基板は擬似的に生成した2倍角で位相差0のリサジュー曲線、つまりの形のマウス座標をホストPCへ送信し、ホストPCのマウスポインタはこの曲線の軌跡を描く。

PICマイコンのファームウェアはMicrochip社のコンパイラC30と、同社の開発環境MPLABを使用した。いずれも、同社から無償で提供されているものである。64Kバイトあるプログラムフラッシュ領域は58%、8KバイトあるSRAM領域は83%を使用した。まだ十分に他のアプリケーションを実装できる余裕が残っている。

ホストPC側には新たなドライバやアプリケーションソフトは一切インストールしない。Bluetoothデバイスの登録をするとWindows標準のドライバースタックが自動的にインストールされる。

HIDディスクリプタ

  1. 0x05, 0x01, // USAGE_PAGE (Generic Desktop)
  2. 0x09, 0x02, // USAGE (Mouse)
  3. 0xa1, 0x01, // COLLECTION (Application)
  4. 0x09, 0x01, // USAGE (Pointer)
  5. 0xa1, 0x00, // COLLECTION (Physical)
  6. 0x05, 0x09, // USAGE_PAGE (Button)
  7. 0x19, 0x01, // USAGE_MINIMUM (Button 1)
  8. 0x29, 0x03, // USAGE_MAXIMUM (Button 3)
  9. 0x15, 0x00, // LOGICAL_MINIMUM (0)
  10. 0x25, 0x01, // LOGICAL_MAXIMUM (1)
  11. 0x95, 0x03, // REPORT_COUNT (3)
  12. 0x75, 0x01, // REPORT_SIZE (1)
  13. 0x81, 0x02, // INPUT (Data,Var,Abs)
  14. 0x95, 0x01, // REPORT_COUNT (1)
  15. 0x75, 0x05, // REPORT_SIZE (5)
  16. 0x81, 0x03, // INPUT (Cnst,Var,Abs)
  17. 0x05, 0x01, // USAGE_PAGE (Generic Desktop)
  18. 0x09, 0x30, // USAGE (X)
  19. 0x09, 0x31, // USAGE (Y)
  20. 0x15, 0x00, // LOGICAL_MINIMUM (0)
  21. 0x26, 0xff, 0x04, // LOGICAL_MAXIMUM (1279)
  22. 0x35, 0x00, // PHYSICAL_MINIMUM (0)
  23. 0x46, 0xff, 0x7f, // PHYSICAL_MAXIMUM (32767)
  24. 0x65, 0x00, // UNIT (None)
  25. 0x75, 0x10, // REPORT_SIZE (16)
  26. 0x95, 0x02, // REPORT_COUNT (2)
  27. 0x81, 0x02, // INPUT (Data,Var,Abs)
  28. 0x05, 0x82, // USAGE_PAGE (VESA Virtual Controls)
  29. 0x09, 0x22, // USAGE (Horizontal Size )
  30. 0x09, 0x32, // USAGE (Vertical Size )
  31. 0x15, 0x00, // LOGICAL_MINIMUM (0)
  32. 0x26, 0xff, 0x7f, // LOGICAL_MAXIMUM (32767)
  33. 0x75, 0x10, // REPORT_SIZE (16)
  34. 0x95, 0x02, // REPORT_COUNT (2)
  35. 0xb1, 0x02, // FEATURE (Data,Var,Abs)
  36. 0xc0, // END_COLLECTION
  37. 0xc0, // END_COLLECTION

今回の実験の結果を応用すれば、センサー回路などを加えて、HIDディスクリプタを変えるだけで、Wiiのようなゲーム機のコントローラを作ることもできる。今更そんなもの作ってもしょうがないかもしれないが、、、

2010年08月20日