ジャイロセンサで傾き検出

Sparkfunのジャイロセンサを使ってちょっと実験。
http://www.switch-science.com/products/detail.php?product_id=160

スイッチサイエンスさんがちょっと前にTwitter上でプレゼント企画をやっていて*1、「交通費がないのでMTM04 *2に行けない。悲しい。」といった旨のつぶやきを添えて応募したら有り難くも同情していただけたようで、このセンサモジュールをもらいうけることができました。*3

ジャイロセンサというのは傾きの変化の速度を検出するためのセンサで、歩行するロボットなどの平衡をとるために使われることが多いようです。
とりあえずどのように動作するものなのか実験をしてみました。

まず、モジュールに手持ちのヘッダピンをはんだ付け。
5本の端子が見えます。上からXOUT,VREF,YOUT,GND,3.3Vと書いてあります。
次にスイッチサイエンスさんの商品ページなどから推測して、以下のようにArduinoに接続してみました。

モジュールの端子 Arduinoの端子
XOUT   Analog1
VREF   AREF
YOUT   Analog0
GND    GND
3.3V   3v3


Sparkfunのプロトシールドミニブレッドボードを使ってみました。*4
プロトシールドには最初からLEDが付いているので配線は楽ちん。上記のモジュールとArduinoとの接続に加えて、ArduinoのDigital2ピンとDigital3ピンをそれぞれプロトシールドのJC2ピンとJC3ピンにつなぎます。これでプロトシールドに付いているLEDに通電させることができるようになります。
配線が終わったらスケッチを書きます。

/*
  Sparkfun IDG300 Gyro module sample code
  http://www.switch-science.com/products/detail.php?product_id=160
 */

int sensorX = 1;
int sensorY = 0;
int ledX = 2;
int ledY = 3;
int X = 0;
int Y = 0;
int prevX = 0;  
int prevY = 0;  

void setup() {
  //analogReference(EXTERNAL); //勘違い。外部参照電圧は不要。
  pinMode(ledX, OUTPUT);  
  pinMode(ledY, OUTPUT);
  Serial.begin(9600);
}

int tiltDetect(int sensorPin, int ledPin, int *prevValue){
  int value = analogRead(sensorPin);
  if (abs(value - *prevValue) > 10){
    digitalWrite(ledPin, HIGH);
  } 
  else {
    digitalWrite(ledPin, LOW);
  }
  *prevValue = value;
  return value;
}

void loop() {
  X = tiltDetect(sensorX, ledX, &prevX);
  Y = tiltDetect(sensorY, ledY, &prevY);
  Serial.print(" X:");
  Serial.print( X, DEC);
  Serial.print(" Y:");
  Serial.println( Y, DEC);
}

Gyro_module_blinks_LED.pde · GitHub
今日はこんな感じで。analog0とAnalog1の値を読み取って値が変化したらLEDを点灯。どんな値が出てくるか観察もしたいのでシリアルポートへの出力もしています。

スケッチをArduinoにアップロードしてテスト。
以下の動画のようにArduinoを手に持って振ってみると振った方向に応じて、X軸方向が黄色、Y軸方向が赤、というようにLEDが点灯します。

ジャイロセンサがどのように傾きを検出しているのかが感覚的につかめたような気がします。<追記2009/11/21>この部分、勘違いでした。モジュールのVREFを外部参照電圧に設定すると回転の向きが片方向しかとれなくなります。
また、ArduinoのAREFピンの使い道を理解できました。
ジャイロモジュールの商品ページにあるように、VREFからは1.23Vの電圧が出ていて、ArduinoのAREFピンとつないでスケッチ側でanalogReference(EXTERNAL);としてやるとセンサから得られる値が0〜1023の安定した値になります。

最初、それをしないで動かしていたときはセンサの最大値は370くらいで、かつ非常に不安定で傾きの変化がうまく検出できませんでした。
ちょっとづつですが電子工作関連の理解が深まっていくのが楽しいです。これの応用で何か面白いものを作りたいなー。
今回は単に傾きの変化を検出しているだけですが、このセンサは変化の速度も取れるのでもっと精密な用途にも使えそうです。*5

*1:スイッチサイエンスさんののTwitterはこちら。→http://twitter.com/ssci

*2:そういえば明後日からですね

*3:自宅に届いた現物を開封して、値札を見てちょっとびっくり

*4:これはMTM03のときにやはりスイッチサイエンスさんのブースで買ったような記憶が。

*5:っていうかもっと精密な用途に使うべき