Entries

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
この記事に対してトラックバックを送信する(FC2ブログユーザー)
http://kovayashi.blog120.fc2.com/tb.php/326-696826b0

-件のトラックバック

-件のコメント

コメントの投稿

投稿フォーム
投稿した内容は管理者にだけ閲覧出来ます

パララックス ジャイロセンサーモジュール L3G4200D

パララックス ジャイロセンサーモジュール L3G4200D(秋月で¥3,000)を試してみる。
IMG_9956.jpg
繋ぎ方と基本的なスケッチはこちにある。
IMG_9960.jpg
モジュールとArduino間の通信はI2Cって方式で、SCLとSDAという名の2本のPINを繋ぐ。Arduinoの基盤に「SCL」、「SDA」との明記は無いがアナログ入力ピンのA5がSCLでA4がSDAになる。多分スケッチでWire.begin();が実行されると、そのように割り当てられるのだろう。

で、こんだけでPCのシリアルポートにX,Y,Z軸それぞれの角速度が取り込める。
角速度を見ても面白くないので、以下ページを参考に、角度への変換を試みる。
http://morimori2008.web.fc2.com/contents/Arduino/IMU3000_Arduino.html

で、角度に変換された値は、Quartz Composerで読み込む。この方式は加速度の時と同じ。MacUserである限りは、もうProcessingとか使わないと思う。

スケッチは以下。

// based on http://learn.parallax.com/KickStart/27911
//thanks http://morimori2008.web.fc2.com/contents/Arduino/IMU3000_Arduino.html

#include <Wire.h>
#include <MsTimer2.h> //download from http://playground.arduino.cc/Main/MsTimer2 and add. see https://sites.google.com/site/mathrax2011sound/page-00-1

#define CTRL_REG1 0x20
#define CTRL_REG2 0x21
#define CTRL_REG3 0x22
#define CTRL_REG4 0x23

//add following defines
#define INT_MAX 32767
#define INTERVAL 10
#define BUFF_SIZE 128
#define ANGLE_RATE_MAX 250

int Addr = 105; // I2C address of gyro
int x, y, z;

//add start
int gyroBuff[BUFF_SIZE];
int wp = 0;
int backup_gyro_z = 0;
double gyro_bias = 0.0;
double angle = 0.0;
boolean gyroGo = false;
//add end

//add function clock
void clock(void){
gyroGo = true;
return;
}

void setup(){
Wire.begin();
Serial.begin(57600);
writeI2C(CTRL_REG1, 0x1F); // Turn on all axes, disable power down
writeI2C(CTRL_REG3, 0x08); // Enable control ready signal
writeI2C(CTRL_REG4, 0x80); // Set scale (500 deg/sec) see http://dorhoutrd.com/yahoo_site_admin/assets/docs/CD00265057-_3_axis_gyro.337135547.pdf is 0x80 correct?

MsTimer2::set(INTERVAL, clock); //add
MsTimer2::start(); //add
//delay(100); // Wait to synchronize
}

void loop(){
getGyroValues(); // Get new values
// In following Dividing by 114 reduces noise
//Serial.print("Raw X:"); Serial.print(x / 114);
//Serial.print(" Raw Y:"); Serial.print(y / 114);
//Serial.print(" Raw Z:"); Serial.println(z / 114);

// add following code
if(gyroGo){
gyroGo = false;
wp = (wp + 1) % BUFF_SIZE;
angle += (double)((long)ANGLE_RATE_MAX * (long)INTERVAL) * ((double)backup_gyro_z + (double)z - 2.0 * gyro_bias) / (double)INT_MAX / (double)1000 / 2.0;
backup_gyro_z = z;
Serial.println(angle);
}

//delay(500); // Short delay between reads
}

void getGyroValues () {
byte MSB, LSB;

MSB = readI2C(0x29);
LSB = readI2C(0x28);
x = ((MSB << 8) | LSB);

MSB = readI2C(0x2B);
LSB = readI2C(0x2A);
y = ((MSB << 8) | LSB);

MSB = readI2C(0x2D);
LSB = readI2C(0x2C);
z = ((MSB << 8) | LSB);
}

int readI2C (byte regAddr) {
Wire.beginTransmission(Addr);
Wire.write(regAddr); // Register address to read
Wire.endTransmission(); // Terminate request
Wire.requestFrom(Addr, 1); // Read a byte
while(!Wire.available()) { }; // Wait for receipt
return(Wire.read()); // Get result
}

void writeI2C (byte regAddr, byte val) {
Wire.beginTransmission(Addr);
Wire.write(regAddr);
Wire.write(val);
Wire.endTransmission();
}

Quartz Composerの設定はこんなかんじ。
Test02_ss_03.jpg
Test02_ss_01.jpg
Test02_ss_02.jpg
で、前回と同様に、CamTwistを利用してオーバーレイして動画に落とした結果が以下。
http://www.youtube.com/watch?v=6NJTlYl4qVI

一応、それっぽく動いてるが、どんどん角度は狂って行く。

角度は角速度からの計算上の類推値で、実際に計ってる訳ではないので狂うのだ。

StrawberryLinuxの製品の方が、送料+代引き手数料込みでも安かったかな。
スイッチングサイエンスさんのIMUフュージョンボードの方が加速度も一緒にI2Cで取れるみたいだから、良かったかな。
この記事に対してトラックバックを送信する(FC2ブログユーザー)
http://kovayashi.blog120.fc2.com/tb.php/326-696826b0

0件のトラックバック

0件のコメント

コメントの投稿

投稿フォーム
投稿した内容は管理者にだけ閲覧出来ます

Appendix

プロフィール

kovayashi

Author:kovayashi
・嫌いなもの
 →好きなもの

・インストール
 →バンドル
・バックアップ
 →アップロード
・努力
 →チート

最近のトラックバック

ブログ内検索

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。