Bluetoothドングルを使った無線通信実験

WiiリモコンやPS3、Xbox360のコントローラはゲーム機本体とBluetooth[1]を使って無線通信している。また、携帯電話やPDAもBluetoothでパソコンなどとデータ交換ができるようになっている。Bluetoothをマイコンから使用しようとすると、一般的にはシリアルプロファイル(SPP)などの上位レイヤまで実装されたBluetoothモジュールと呼ばれる基板を使用してUARTやI2Cなどを介してマイコンから制御することが多いだろう。今回は、千円前後で安価に手に入るBluetoothドングルを使って、マイコンとPC間の通信の実現性を探った。

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

BT-MicroEDR1X非ブランド品
BT-MicroEDR1X 非ブランド品

本実験で使用したマイコン基板はPIC24F Starter Kitである。PICマイコンのファームウェアはC言語で作成し、開発環境はMPLABである。Windows上のソフトウェアはC++言語で作成し、開発環境はVisual Studio 2008を使用した。

今回の実験にあたっては、プログラム作成のためにひたすらBluetooth仕様書を読んだ。

https://www.bluetooth.org/Technical/Specifications/adopted.htm

実験1

この実験では2台のPCを使用する。1台は通常のBluetoothホストPCであり、もう1台はBluetoothマウスデバイスとして動作するクライアントPCだ。クライアントPCに接続されているマウスは、ホストPCのマウスとして操作することができる。つまり、ホストPCから見るとクライアントPCはBluetoothマウスと等価なデバイスとして振る舞う。

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

一方、クライアントPC側にはFreeBTのデバイスドライバーをインストールする。FreeBTのデバイスドライバーは、Bluetoothの低位デバイスインターフェースHCI[2]をユーザ空間のアプリケーションに提供する。本実験では、ユーザ空間のアプリケーションにおいて、HCIより上位の通信レイヤである、2つのプロトコルL2CAP[3]、SDP[5]とHID[6]プロファイルを作成し、クライアントPC上のマウスメッセージをグローバルフックして得られたマウスの座標、ボタン情報、つまりHID入力レポートをホストPCへ送信する。

L2CAPは、接続直後に行われる相互間ののConfigurationによって合意されたMTU[7]値を元に、HCIパケットのアセンブリ・ディスアセンブリを行う。また、L2CAPは単一HCI接続の下で複数のチャネルと呼ばれる論理的な通信経路を設けることを可能にする。さらに、L2CAPはPSM[4]という情報を接続時に取り交わすことによって、以降の通信における上位層のペイロードの種別(例えばSDP)を取り決める。SDPは、デバイスが提供できるサービスやプロトコルの情報をホストの求めに応じて返す。SDPではデバイスがサーバーとして振舞う。HIDプロファイルのデバイスはSDPの情報の中にUSB HID Reportディスクリプタを内包する。(実験1のソフトウェア構成図

(下図)実験1で作成したクライアントPC上のプログラム。L2CAP、SDP、HIDプロファイル、マウスメッセージのグローバルフック処理を実装している。

実験2

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

ホストPCにはFreeBTのデバイスドライバーをインストールする。FreeBTのデバイスドライバーは、Bluetoothの低位デバイスインターフェースHCIをユーザ空間のアプリケーションに提供する。本実験では、ユーザ空間のアプリケーションにおいて、PICマイコン基板からマウス座標データを受信し、マウスポインタにこの座標の軌跡を描かせる。また、ユーザ空間のアプリケーションのGUIから入力したRGB値を送信し、それに応じてPICマイコン基板上にある3色LEDの発光色を変化させる。

PICマイコン基板のファームウェアにはBluetoothのHCIレイヤとその上位アプリケーションを作成した。作成したHCIレイヤは、USBインターフェースを介してBluetooth USB ドングルを制御し、ホストPCと通信する。(実験2のソフトウェア構成図

(下図)実験2で作成したホストPC上のプログラム。HCIを使ってマイコンと通信する。

結果

実験1の結果

問題なく動作した。Windowsの場合、ペアリング(Bluetoothデバイスの登録)の時に次のような手順が使われている。今回の実験ではこの手順のみ実装した。

 ホスト→デバイス  SERVICE_SEARCH_ATTRIBUTE_REQUEST
 デバイス→ホスト  SERVICE_SEARCH_ATTRIBUTE_RESPONSE

しかし、SDPではこの他に次のシークエンスも定義されている。

 ホスト→デバイス  SERVICE_SEARCH_REQUEST
 デバイス→ホスト  SERVICE_SEARCH_RESPONSE
 ホスト→デバイス  SERVICE_ATTRIBUTE_REQUEST
 デバイス→ホスト  SERVICE_ATTRIBUTE_RESPONSE

従って、もしホストPCのOSがLinux(BlueZ)の場合は動作するかどうかはわからない。

実験2の結果

問題なく動作した。最大転送速度は200Kbps程度だった。通信できる範囲は木造2階建て家屋の1階と2階(見通しなし)で約15mぐらいまで。手やアルミフォイルによってさえぎると通信は低速化または停止するが、再び元に戻すと通信は問題なく再開した。電子レンジ、無線LANなどからの干渉もなかった。

[1] Bluetooth(ブルートゥース)は、デジタル機器用の近距離無線通信規格の1つである。数mから数十m程度の距離の情報機器間で、電波を使い簡易な情報のやりとりを行うのに使用される。東芝、エリクソン、インテル、レノボ(当初IBM)、ノキア、モトローラなどが中心になって策定され、IEEEでの規格名は、IEEE 802.15.1である。免許申請や使用登録の不要な2.4GHz帯の電波を使用してPC等のマウス、キーボードをはじめ、携帯電話、PHS、スマートフォン、PDAでの文字情報や音声情報といった比較的低速度のデジタル情報の無線通信を行う用途に採用されている。http://www.bluetooth.com/

[2] HCI : Host Controller Interface

[3] L2CAP : Logical Link Control and Adaptation Protocol

[4] PSM : Plotocol/Service Multiplexer

[5] SDP : Service Discovery Protocol

[6] HID : Human Interface Device

[7] MTU : Maximum Transmission Unit

2009年09月02日