バージョン情報
windows 8.1 , Processing 3.0, Samp_Monitor_EndDevice_Input_JN5164_LITE2525A_X_Y_Z, Samp_Monitor_Parent_JN5164_1_5_1, Samp_Monitor_EndDevice_Input_JN5164_CNFMST_1_5_1
前回TWE-Lite-2525Aの設定変更に成功してから暫くたってしまったが、今回はprocessingとの連携にトライ。
2525Aの傾きとprocessing内の3Dオブジェクトの傾きを連動させてみた。
準備
2525Aの設定をOTAで以下の設定にする。(設定方法は前回の記事を参照)
送信間隔:50ms
動いていないときも常時送信(OptionBit)

1軸の傾き
まずはY軸周りの傾きを連動させてみる。
【ソースコード】
import processing.serial.*;
Serial myPort;
String str_get_data = null;
String buf[];
float rx, ry, rz;
PShape box1;
PVector v_origin, v_center, v_camera;
long cnt = 0;
void setup(){
myPort = new Serial(this, "COM6", 115200);
size(800,800,P3D);
v_origin = new PVector(0.0,0.0,0.0);
v_center = new PVector(0.0,0.0,0.0);
v_camera = new PVector(0.0,500.0,150.0);
box1 = createShape(BOX,80,50,100);
box1.translate(0,0,0);
}
void draw(){
background(200);
//地面を描画
strokeWeight(1);
stroke(255);
for (int i = -10; i<=10; i++){
line(-1000,i*100,0,1000,i*100,0);
line(i*100,-1000,0,i*100,1000,0);
}
//XYZ軸・原点
strokeWeight(3);
stroke(255,0,0);
line(v_origin.x,v_origin.y,v_origin.z,v_origin.x+100,v_origin.y,v_origin.z);
stroke(0,255,0);
line(v_origin.x,v_origin.y,v_origin.z,v_origin.x,v_origin.y+100,v_origin.z);
stroke(0,0,255);
line(v_origin.x,v_origin.y,v_origin.z,v_origin.x,v_origin.y,v_origin.z+100);
noStroke();
fill(0,255,255);
sphere(10);
//BOX回転
box1.rotateY(ry);
println(ry);
//BOX配置
shape(box1);
//カメラ配置
camera(v_camera.x, v_camera.y, v_camera.z, v_center.x,v_center.y,v_center.z, 0.0, 0.0, -1.0);
//姿勢をリセット
box1.rotateY(-ry);
cnt++;
}
//シリアル受信イベント
void serialEvent(Serial myPort){
int ax = 0,ay = 0,az = 0;
str_get_data = myPort.readStringUntil(10); //改行コード(10)まで読み込み
try{
if (str_get_data != null){
str_get_data = trim(str_get_data); //改行コード取り除き
if (str_get_data.substring(0,4).equals("::rc")){
buf = split(str_get_data,":");
ax = int(buf[10].substring(2));
ay = int(buf[11].substring(2));
az = int(buf[12].substring(2));
ry = atan2(ay,az);
//println(ax + "," + ay + "," + az + "," + ry);
}
}
} catch(Exception e) {
e.printStackTrace();
}
}
2軸の傾き
次はX軸周りの傾きにも連動させてみる。
同時にいくつか改良点
・時間経過とともに徐々にづれていくので、drawループの中で毎回Boxを生成するように変更。
・動きが飛ぶことがあるのでスムージング処理を追加。
【ソースコード】
import processing.serial.*;
Serial myPort;
float rx, ry, rz;
float rx_buf[] = {0,0,0,0,0};
float ry_buf[] = {0,0,0,0,0};
int cnt_r = 0;
PShape box1;
PVector v_origin, v_center, v_camera;
long cnt = 0;
void setup(){
myPort = new Serial(this, "COM6", 115200);
size(800,800,P3D);
v_origin = new PVector(0.0,0.0,0.0);
v_center = new PVector(0.0,0.0,0.0);
v_camera = new PVector(0.0,500.0,150.0);
}
void draw(){
background(200);
//地面を描画
strokeWeight(1);
stroke(255);
for (int i = -10; i<=10; i++){
line(-1000,i*100,0,1000,i*100,0);
line(i*100,-1000,0,i*100,1000,0);
}
//XYZ軸・原点
strokeWeight(3);
stroke(255,0,0);
line(v_origin.x,v_origin.y,v_origin.z,v_origin.x+100,v_origin.y,v_origin.z);
stroke(0,255,0);
line(v_origin.x,v_origin.y,v_origin.z,v_origin.x,v_origin.y+100,v_origin.z);
stroke(0,0,255);
line(v_origin.x,v_origin.y,v_origin.z,v_origin.x,v_origin.y,v_origin.z+100);
noStroke();
fill(0,255,255);
sphere(10);
//BOX回転
strokeWeight(1);
stroke(0);
fill(255);
box1 = createShape(BOX,80,50,100);
box1.rotateY(ry);
box1.rotateX(-rx);
println(ry);
//BOX配置
shape(box1);
//カメラ配置
camera(v_camera.x, v_camera.y, v_camera.z, v_center.x,v_center.y,v_center.z, 0.0, 0.0, -1.0);
cnt++;
}
//シリアル受信イベント
void serialEvent(Serial myPort){
String str_get_data = null;
String buf[];
int ax = 0,ay = 0,az = 0;
str_get_data = myPort.readStringUntil(10); //改行コード(10)まで読み込み
try{
if (str_get_data != null){
str_get_data = trim(str_get_data); //改行コード取り除き
if (str_get_data.substring(0,4).equals("::rc")){
buf = split(str_get_data,":");
ax = int(buf[10].substring(2));
ay = int(buf[11].substring(2));
az = int(buf[12].substring(2));
rx_buf[cnt_r] = atan2(ax,az);
ry_buf[cnt_r] = atan2(ay,az);
if(cnt_r == 4){
cnt_r = 0;
}else{
cnt_r++;
}
rx = 0;
ry = 0;
for(int i = 0; i<5; i++){
rx = rx + rx_buf[i];
ry = ry + ry_buf[i];
}
rx = rx/5;
ry = ry/5;
//println(ax + "," + ay + "," + az + "," + ry);
}
}
} catch(Exception e) {
e.printStackTrace();
}
}
けっこういい感じのレスポンスで動いてくれる。
何かのものに仕込んだら面白いものがつくれるかも。
今回は重力しかみてないので、Z軸周りの姿勢はわからないけどね。



