2010年5月15日土曜日

WiiRemoteの値(加速度)をScratchに送信してみる

動機
1. Scratchに外から値は送れた
2. NXTだとBluetooth通信だなぁ…。JavaでBluetooth通信制御ってどうやるんだろう?あった.これ(JavaでBluetoothデバイスを探索するサンプルプログラムを作ってみた).
3. JavaでWii Remoteと通信する例なんてあるんだ.これ(JavaとWiiリモコンをBluetoothでつなげてみよう).
4. WiiRemoteJってのがあるんだね.これ(WiiリモコンからTwitterにPostしてみた)が参考になりそうだ.
5. やってみよう.
(上記各ページに感謝)


やってみた
1. bluecoveについて
1.1 MacOSX 10.6 ( Snow Leopard )では 2.1.0版 だとうまくないらしい.2.1.1-SNAPSHOT版 を使うことにする

2. WiiRemoteJ
2.1 1.6があったのでこれを使ってみる.
2.2 bluecove-2.1.1-SNAPSHOT.jarとWiiRemoteJ.jarにClass Pathを通してサンプルであるWRLImpl.javaを実行.
2.3 接続はうまくいかない場合は接続解除やプログラムの再実行などやりながら…QCのパッチのときよりは簡単に思えるw.できた.


3. WRLImpl.javaをいじる
WRLImpl.javaにあれこれ追加
とりあえず通信用の出力先と送信タイミングを空けるためのタイムスタンプ用の変数を用意
 private static PrintStream out;
private static long stamp;


送信用のメソッドを追加
 static void sendtoscratch(PrintStream out, String dataOut) {
if (out==null) return;
byte[] sizeBytes = { 0, 0, 0, 0 };
sizeBytes[3] = (byte) (dataOut.length());
for (int i = 0; i < 4; i++) {
out.write(sizeBytes[i]);
}
out.print(dataOut);
}


mainの最初あたりでsocketと出力先の確保, stamp初期化.
  Socket socket = new Socket("127.0.0.1", 42001);
out = new PrintStream(socket.getOutputStream());
stamp = 0;


加速度を描画している場所での値を利用して送信(graphic.drawLine(…)とかしているあたりとか)
     if (stamp < System.currentTimeMillis()) {
StringBuffer message = new StringBuffer("sensor-update");
message.append(" \"AccX\" ");
message.append((x - 300));
message.append(" \"AccY\" ");
message.append((y - 300));
message.append(" \"AccZ\" ");
message.append((z - 300));
sendtoscratch(out, message.toString());
stamp = System.currentTimeMillis() + 500;
}


4:試す
4.1: Scratch側は前回のように遠隔地センサ接続を有効にしておく
4.2: '〜センサーの値'に'AccX', 'AccY', 'AccZ'がでる,

4.3: 左のチェック入れて表示したらこんな感じ.

当然プログラム中でもこの値は使えます.

0 件のコメント: