2012年3月4日日曜日

加速度センサーに合わせて3Dオブジェクトを傾ける

前回のエントリー では加速度センサーで3Dオブジェクトを揺らしてみました。
今回はオブジェクトを傾けてみましょう。

前回のスケッチに加速度から 傾斜角を計算する式を加え、rotateX()、rotateZ()で傾けただけです。
スケッチの参考 にしたサイトは前回のエントリーをご覧下さい。


◆Processingのスケッチ
import processing.serial.*;

int NUM = 3;          //アナログ入力の数を指定
float V=5.0;                //電源電圧
float VD=4.890;             //実際にセンサーに供給されている電源電圧
float kando = 1.0;          //出力振幅(感度)Vdd/5(V/g)
float x,y,z;
float rx,ry,rz;

Serial myPort;
int[] val = new int[NUM];  //Serialより読み込んだデータを格納する配列

void setup() {
  size(400,400,P3D);
  String portName = Serial.list()[1];    //ポートの名前を取得
  myPort = new Serial(this, portName, 9600);
}

void draw() {
  background(0);
  translate(width/2, height/2, -200);
  rotateX(radians(-15-ry));
  rotateY(radians(-15));
  rotateZ(radians(0-rx));
  fill(255,75,75);
  box(150,150,150);
  myPort.write(255);   //通信開始の合図
}

//シリアル入力を検出した際に発生するイベント
void serialEvent(Serial p) {
  //もし、バッファーにアナログ入力の数の2倍(上位8bitと下位8bit)あれば
  if(myPort.available() > NUM * 2 - 1) {
    for(int i=0; i<NUM; i++) {
      int val_high = myPort.read();       //上位8bitを取得
      int val_low = myPort.read();        //下位8bitを取得
      val[i] = (val_high<<8)+ val_low;    //2つのbit列を合成
      if(i == NUM-1) {                    //もし全ての入力を処理したら

        x=val[0]*VD/1024;
        y=val[1]*VD/1024;
        z=val[2]*VD/1024;
   
        float xv=x-VD/2.0 -0.07;        //加速度に対応した電圧を求める
        float yv=y-VD/2.0 +0.02;        //3軸、補正してます
        float zv=z-VD/2.0 -0.11;
     
        float xg=xv/(kando*VD/V);        //電圧から加速度を求める
        float yg=yv/(kando*VD/V);
        float zg=zv/(kando*VD/V);
     
        rx=atan2(xg, zg)*360/2.0/PI;   //傾斜角を求める
        ry=atan2(yg, zg)*360/2.0/PI;
        //rz=atan2(xg, yg)*360/2.0/PI;

        myPort.write(255);                //読み込み完了の合図を送る
      }
    }
  }
}



センサーのZ軸を中心とした回転(首をふるような動き)は、3軸加速度センサーのみでは無理で、計測したい場合はジャイロセンサーが必要のようです。


環境:Arduino Uno R3、Arduino 1.0、Processing 1.5.1



0 件のコメント:

コメントを投稿