
【新・言語進化論】アレで使われている言語って何?
第5回:Wiiリモコン+PCのアプリケーション開発
著者:tokkyo
公開日:2007/11/30(金)
プロトコルの詳細と開発について
では、実際にWindowとWiiリモコンを接続するケースを例として、どのような通信が行われているかについて説明する。
前述の通り、BluetoothでWiiリモコンとPCを接続すると、WiiリモコンがHIDデバイスとして認識される。HIDというのは、キーボードやマウスなど、パソコンの入力装置として使用するデバイスのことである。キーボードやマウスであれば規格が統一されており、通常の場合はPCに接続するだけでOS標準のドライバを読み込んで使用できるようになる。
しかしWiiリモコンは、そもそもPCに接続して利用することを想定していないため、そのようなドライバが存在しない。つまりWiiリモコンとの通信部分は自前で実装する必要があるのだ。
まず、WiiリモコンとPCを接続するには、Bluetoothのアダプタが必要だ。最近のノートパソコンには最初から内蔵されているケースもあるが、もし内蔵されていない場合にはUSB接続タイプのアダプタを用意する必要がある。製品によってBluetoothの管理ソフトが異なるが、筆者の利用している「bluesoleil」では接続されると図2のように表示される。

図2:Bluetoothで接続したWiiリモコンはこうみえる
(画像をクリックすると別ウィンドウに拡大図を表示します)
リスト1:Cで記述したボタン判定の例
if (buttonBytes2 & 0x01) {
//1ボタンが押されている
} else {
//1ボタンが押されていない
}
接続された後は、まずVENDOR_IDとPRODUCT_IDを指定して、WiiリモコンにHIDとしてアクセスする。さらにこの状態でWiiリモコンに特殊なデータを送信し、センサの値を取得できるようポーリング作業を行う。そして最後にWiiリモコンから送られてくる生のデータを加工し、使いたい機能に合わせて利用するといった流れとなる。
実際にWiiリモコンから送られてくるデータは「22 48 86 8a a5 ff ff ff ff ff ff ff ff ff ff ff ff ff」といった値になっている。このデータの先頭2バイト「22 48」がボタンの値、続く3バイト「86 8a a5」が加速度センサから得られた各軸の加速度の値である。
ボタンの状態はビットマスク演算を行うことにより得られ、1ボタンは「0x001」、2ボタンは「0x0002」、Bボタンは「0x0004」といった形になっている。例えば、1ボタンと2ボタンが押されている場合、先頭2バイトは「00 03」となる。
これを利用してCによるボタン判定方法を記述する場合、リスト1のようなものが考えられる。
HIDとしてアクセスする際、筆者はDelphi6で利用できる「TJvHidDeviceController」というコンポーネントを利用している。なお有志によって、VC++や.netの各言語からも利用できるようにするライブラリがWiiLi.orgの「Wiimote/Drivers(http://www.wiili.org/index.php/Wiimote_driver)」ページにて多数製作・公開されている。
これらのライブラリはWiiリモコンから得られた生データを、ボタンの情報に変換するといった機能を備えている。自作のソフトをWiiリモコンに対応させたい場合、このようなライブラリを利用すると便利であろう。
次のページ