Lazy Diary @ Hatena Blog

PowerShell / Java / miscellaneous things about software development, Tips & Gochas. CC BY-SA 4.0/Apache License 2.0

無線キーボード自作に関して調べたこと (2)

技適つきBluetoothモジュール発見!

個人の方が設計して技適を通したらしいWCA-009*1というモジュールがあるみたい。

  • 載っているチップはBluegiga WT32*2なので、HIDにも対応している。
  • 価格は9300円とのこと。
    • 同じくBluegiga WT32を積んだボードがsparkfunで$89.95*3なので、そういう意味では良心価格。
    • 単にHIDプロファイルだけ必要という場合だと、作例もあるBlueSMiRF HID*4が$44.95なので、ちょっとオーバースペックかな。

で、結局どうするか?

できるだけ安価な実装方法を模索したい!という理由で、ArduinoBluetoothドングルでの実装を模索する方向で検討してみたい。
のちのち、Bluetooth 4.0対応のドングルを使ってBluetooth 4.0の省電力通信にチャレンジというのも面白そうだしね。

Bluetoothについて学ぶ

  • 辻見裕史氏のWebサイトに、PIC24FJ64GB002によるBluetooth-HIDプロファイルの実装に関する情報*5があるが、ここの「解説」以下のページが非常にわかりやすい。
  • 英語が大丈夫なら、palowirelessのBluetooth Tutorial*6でHCI以上の層について学んでおくのも良い。

実装が必要なプロファイル

Bluetooth HIDプロファイルを実装するのに必要なプロトコルは、HCI, L2CAP, SDPだけみたい(HCIより下はドングルに実装されているものとしている)。

Arduino上で使用するBluetoothスタックの選定

ArduinoからBluetoothドングルでHIDプロファイルを実装したいという事であれば、Bluetoothスタックを実装しなければならない。
一から実装できる技術も根性も無いので、既存の実装があればできるだけ乗っかっていきたい。
組み込み向けのBluetoothスタックで、ソースコードが利用できるものとしては以下のものが見つかった。

  • Circuits@Homeの"PS3 and Wiimote Game Controllers on the Arduino Host Shield: Part 3"*9で使用されているArduino向け実装*10
    • HCI、L2CAP、HIDが実装されているようだが、ホスト側の実装なのでデバイス側の実装とは異なるはず。また、ホスト側なのでSDPは実装されていない。
    • HCIはMax3421e経由のHCI-USB。
    • 一部のファイルがLGPL 2.1となっているが、ライセンスが明示されていないファイルもある。
    • 開発は6ヶ月前で止まってる模様。
    • Arduino向けに開発されているので、もちろんArduinoで動く。
  • みならい工作の"Wiiリモコンでラジコンしよう"*11で使用されているArduino向け実装。
    • これも前者と同様で、HCI、L2CAP、HIDが実装されているようだが、ホスト側の実装。
    • HCIはMax3421e経由のHCI-USB。
    • ライセンスはGPL3。
    • 開発は1年前で止まってる模様。
    • これもArduino向けに開発されているので、Arduinoで動く。
  • LUFA*12にもBluetooth対応用のコードが含まれているようだがIncompleteとされている。
    • HCI, L2CAP, SDP, RFCOMMが実装されている模様。
    • HCIはAT90USB1286などのチップに内蔵のものを使っていると思う。
    • 開発は行われているようだが、Bluetoothに関する機能が今後メンテナンスされるか?というと疑問。
    • ライセンスはMIT Licenseをアレンジしたものかな?
  • LUFAの作者が開発したExplorer Bot*13
    • HCI, L2CAP, SDP, RFCOMM, HIDが実装されている模様だが、こちらも"Partial implementation"が完了した段階とのこと。
    • Wiiのコントローラを使用する旨記載されていたため、HIDは受け側かと思ったが、SDPがあるってことはデバイス側にもなれる?
      • ロボットにセンサーを積んでいるそうだから、そのためにSDPがあるのかな。
    • HCIはAT90USB1286などのチップに内蔵のものを使っていると思う。
    • 開発はちょこちょこ行われているみたい。
    • ライセンスはMIT License。
  • フリーの組み込み向けBluetoothスタックlwBT*14
    • HCI, L2CAP, SDP, RFCOMMが実装されている。HCIは何を使用しているのかよく分からない。適切なインタフェースへのコールバックを渡す方式かな?
    • ライセンスは3条項BSD
    • すでにメンテされていない模様。
    • Arduinoへの移植は見つからなかった。
  • フリーの組み込み向けBluetoothスタックbtstack*15
    • HCI, L2CAP, SDP, RFCOMMが実装されている。HCIはH4, H5, USB向けが用意されているみたい。
      • btstackを使用してHIDを実装した例としてWeBe++*16があるが、ソースコードは公開されていない。
    • ライセンスは3条項BSD+個人利用のみ、かつ金銭的利益を得るために使用してはいけないという独自ライセンス。
    • 開発は活発に行われている模様。
    • Arduinoへの移植はまだない。
      • MSP430上で動作するSPPサーバの実装が、Flashを32kB, RAMを4kB消費するとのことで結構ボリュームがある印象。
      • 書き込みがブロッキングだと実装が難しいような記載*17がある。USB Host Shield向けのドライバはどうなんだろう?
  • いしかわきょーすけさんが"できる周波数ホッピング"で実装しているBluetoothスタックbluemelt*18R8C/15向け。
    • HCI, L2CAP, SDP, RFCOMMが実装されている。
    • ROM 4kB, RAM 256byteでも動作する超軽量スタック。
    • 個人開発みたいで、これ以上の実装追加はなさそう。
    • ライセンスは不明。ソース中にもウェブサイト上にもライセンスに関する記載がなかった……
  • 辻見裕史氏のWebサイトにある、Bluetooth-HIDプロファイルの実装*19。PIC24FJ64GB002向け。
    • HCI, L2CAP, SDP, HIDが実装されている。
    • 基本的にはbluemeltのPIC向け移植みたい。消費リソースは不明。
    • 現在も開発が行われているみたい。
    • ライセンスは「Microchip社製品にのみ使用可能」というものみたい(使用しているMicrochip社のライブラリのライセンスかな?)。

さて、どうしようか?
ひとまずは、"Wiiリモコンでラジコンしよう"のコードをベースに、デバイス側部分はbluemeltから移植するか、またはExplorer Botを参考にするかだな〜。
たぶんHCI/L2CAPも見直しが必要で、SDP/HIDは全部実装が必要になるだろう。
実際に動かしながらソースの内部構造を理解できるといいんだけど……。