IoT無線タグTWE-Lite-2525A 使ってみた その3

バージョン情報
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)
ota

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軸周りの姿勢はわからないけどね。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です