Wii リモコン から RAPIRO を動かす


YouTube Preview Image

Nintendo Wii Remote, Python and The Raspberry Pi にて、
Wii リモコン から Raspberry Pi を制御する方法が紹介されています。
少し変更すると、Rapiro を動かすことが出来ます。

(1) RAPIRO に Raspberry Pi を搭載する

(2) Raspberry Pi に Bluetooth ドングルを差します。

(3) Raspberry Pi に Cwiid をインストールします。
Cwiid は C言語で記述された Wii リモコンのドライバーで、Python 用のラッパーがあります。

(4) Python スクリプト を変更します。
上記のサイトにあるサンプルスクリプトに、3行追加します。

# シリアル通信の初期化
com = serial.Serial('/dev/ttyAMA0', 57600, timeout = 10)

while True:
  if (buttons - cwiid.BTN_PLUS - cwiid.BTN_MINUS == 0):
    print '\nClosing connection ...'

    # M0 (停止) コマンドの送信
    com.write("#M0")
 
    wii.rumble = 1
    time.sleep(1)
    wii.rumble = 0
    exit(wii)
    
  if (buttons & cwiid.BTN_UP):
    print 'Up pressed'

    # M1 (前進) コマンドの送信
    com.write("#M1")
    
    time.sleep(button_delay)

(5) Python スクリプトを実行します。

$ python wii_remote_1.py

(6) Wii リモコンの 1 と 2 のボタンを同時に押します。
この動作で Wii リモコンと Raspberry Pi が接続されます。

(7) Wii リモコンのUPボタンを押すと、Rapiro が前進します。

(8) Wii リモコンのプラスとマイナスのボタンを同時に押すと、スクリプトが終了します。


Android と Wii リモコンを接続する


20140303wii

Android と Wii リモコンを接続する方法を調べてみた。

概要

Android は、フレームワークとして Bluetooth HID をサポートしており、Bluetooth キーボードやマウスが使用できる。
Bluetooth API では、HID はサポートされていないので、InputManager を経由してキー入力を検出する。
なお、Bluetooth API では、RFCOMM をサポートしており、シリアル通信が可能である。

Wii リモコンは、Bluetooth HID を使っている。
HID といっても、一般的なキーボードやマウスとは異なる、独自の仕様である。

Linux レイヤの変更

CWiid という Linux 用のドライバーがある。
CWiid とは、C言語で記述された Wii の Driver の意味らしい。
BeagleBoard Android に移植した例

ルート化

ルート化して、HID をサポートする。
androhid がソースコードを公開している。

リフレクション

公式の API では、L2CAP をサポートしていないが、内部的には用意されている。

BluetoothSocket.java

static final int TYPE_L2CAP = 3;
BluetoothSocket(int type, int fd, boolean auth, boolean encrypt,
	BluetoothDevice device, int port, ParcelUuid uuid) throws IOException {

これをリフレクションで利用して、Wii リモコンと接続する。

Constructor<BluetoothSocket> construct = BluetoothSocket.class.getDeclaredConstructor( int.class, int.class, boolean.class, boolean.class, BluetoothDevice.class, int.class, ParcelUuid.class );
construct.setAccessible(true);
construct.newInstance( TYPE_L2CAP, -1, false, false, dev, port, null );

BluezIMEFitScales がソースコードを公開している。

Android 4.2

Android 4.2 からリフレクションが使えなくなった。
btif_sock.c で UNSUPPORTED になった。

btif_sock.c

case BTSOCK_L2CAP:
	BTIF_TRACE_ERROR1("bt l2cap socket type not supported, type:%d", type);
	status = BT_STATUS_UNSUPPORTED;
	break;

Connecting to a bluetooth HID device (mouse) using L2CAP