2012年3月2日金曜日

3軸加速度センサーを使ってみる

随分前に買って放置していた人差し指に乗るサイズのKXM52-1050(秋月電子で1,000円、2012/3/2現在)という3軸加速度センサーを使ってみようと思います。
◆測定レンジ ±2G
◆感度 660mV/g(電源3.3V時)
◆0G出力 1.65V(電源3.3V時)
◆電源電圧 2.7V~5.5V(標準3.3V)
アナログセンサーで読んだ数値を傾斜度に変換する方法を調べていたら頭が痛くなってきたので下記サイトのスケッチを少しいじります。
連載34縫って作るコンピュータLilyPad Arduino オプション・パーツ(5)
連載43縫って作るコンピュータLilyPad Arduinoオプション・パーツ(13)


今回は加速度センサーを5Vで使ってみます。
ので感度は1,000mV/g、0G時の出力電圧は2.5Vでスケッチが以下のようになりました。

◆Arduinoのスケッチ
float V=5.0;                //電源電圧
float VD=4.890;             //実際にセンサーに供給されている電圧
float kando = 1.0;          //1,000mv 出力振幅(感度)Vdd/5(V/g)

void setup(){
  Serial.begin(9600);
  //Serial.begin(115200);
}
void loop() {
  float x=analogRead(0)*VD/1024;
  float y=analogRead(1)*VD/1024;
  float z=analogRead(2)*VD/1024;
  Serial.print("X=");
  Serial.print(x);
  Serial.print(" Y=");
  Serial.print(y);
  Serial.print(" Z=");
  Serial.print(z);
  float xv=x-VD/2.0 -0.08;        //加速度に対応した電圧を求める
  float yv=y-VD/2.0 +0.01;        //静止時XY軸が0.0になるように補正
  float zv=z-VD/2.0 -0.110;        //Z軸は1.00になるように補正
  Serial.print(" Xv=");
  Serial.print(xv);
  Serial.print(" Yv=");
  Serial.print(yv);
  Serial.print(" Zv=");
  Serial.print(zv);
  float xg=xv/(kando*VD/V);        //電圧から加速度を求める
  float yg=yv/(kando*VD/V);
  float zg=zv/(kando*VD/V)-0.02;   //更に補正
  Serial.print(" Xg=");
  Serial.print(xg);
  Serial.print(" Yg=");
  Serial.print(yg);
  Serial.print(" Zg=");
  Serial.print(zg);
  float atzxg=atan2(xg, zg)*360/2.0/PI;   //傾斜角を求める
  float atzyg=atan2(yg, zg)*360/2.0/PI;
  float atxyg=atan2(xg, yg)*360/2.0/PI;
  Serial.print(" atzxg=");
  Serial.print(atzxg);
  Serial.print(" atzyg=");
  Serial.print(atzyg);
  Serial.print(" atxyg=");
  Serial.println(atxyg);
  //delay(300);
}


シリアルモニターでモニターした結果(USBケーブルで電源供給しています)


センサーが完全に水平状態で誤差が全く無ければ、
X,Y軸 電圧2.5V、加速度0G、傾斜度0度
Z軸  電圧3.5V、加速度1G
になるはず?なのでこの数値に近くなるように、スケッチ中で補正しています。

移動平均で平滑化したり、自動キャリブレーション機能付けたいですね。
Processingで描画した3Dオブジェクトをセンサーで動かせたらいいな。


環境:Arduino Uno R3、Arduino 1.0



0 件のコメント:

コメントを投稿