2017-07

スポンサーサイト - --.--.-- --

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

Arduinoで6DOFを使う - 2014.02.11 Tue

今回の記事は自分ができたことをこの先忘れないようにするための自分のメモ的なものです。

読みやすさとかまったく考えないのでそこんところよろしく。


今回使うのは6DOFというジャイロと加速度センサーが組み合わさったボード。

楽をするためにGoogle先生に頼りましたがめぼしいサイトがでてきませんでした。

あ、でもジャイロの値がおかしいのはあった。


Arduinoとの接続はI2Cです。電源電圧は3.3VなのでArduinoUNOなどと接続するときは分圧抵抗などをいれなければなりません。

自分は3.3V動作のArduino pro miniを使ったのでこの記事では分圧抵抗を使った回路図は書きません。
コメントに書いてくれれば書くよ。

ではプログラムの方へ。






#include <Wire.h>

char WHO_AM_I = 0x00;
char SMPLRT_DIV= 0x15;
char DLPF_FS = 0x16;
char GYRO_XOUT_H = 0x1D;
char GYRO_XOUT_L = 0x1E;
char GYRO_YOUT_H = 0x1F;
char GYRO_YOUT_L = 0x20;
char GYRO_ZOUT_H = 0x21;
char GYRO_ZOUT_L = 0x22;

#define itgAddress (0xd0 >> 1)

char DLPF_CFG_0 = 1<<0;
char DLPF_CFG_1 = 1<<1;
char DLPF_CFG_2 = 1<<2;
char DLPF_FS_SEL_0 = 1<<3;
char DLPF_FS_SEL_1 = 1<<4;


#define ACC_ADDRESS (0xa6 >> 1)
#define ACC_POWER_CTL 0x2D
#define ACC_DATA_X0 0x32
#define ACC_DATA_X1 0x33
#define ACC_DATA_Y0 0x34
#define ACC_DATA_Y1 0x35
#define ACC_DATA_Z0 0x36
#define ACC_DATA_Z1 0x37

// 関数プロトタイプ。
void initAcc(void);
void getAcc(short *x, short *y, short *z);

//
unsigned char buf[8];

void setup()
{
// シリアルポートを9600bpsで開始。
Serial.begin(9600);
// 受信バッファにデータが入るまで待機。
while (Serial.available() == 0);
Serial.println("Initializing...");
// 一旦、受信バッファにデータがあれば、
if (Serial.available() > 0) {
// 読み込んで、廃棄。
char c = Serial.read();
}
Serial.println("Initializing...Please wait...");
delay(500);

// Bus-MasterとしてI2Cを開始。
Wire.begin();
char id=0;
id = itgRead(itgAddress, 0x00);
Serial.print("ID: ");
Serial.println(id, HEX);


itgWrite(itgAddress, DLPF_FS, (DLPF_FS_SEL_0|DLPF_FS_SEL_1|DLPF_CFG_0));
//Set the sample rate to 100 hz
itgWrite(itgAddress, SMPLRT_DIV, 9);

initAcc();
}

void loop()
{
int xRate, yRate, zRate;
short accX, accY, accZ;


getAcc(&accX, &accY, &accZ);

xRate = readX();
yRate = readY();
zRate = readZ();

Serial.print("GYRO X:");
Serial.print(xRate);
Serial.print(" Y:");
Serial.print(yRate);
Serial.print(" Z:");
Serial.print(zRate);
Serial.println();
Serial.print("ACC X:");
Serial.print(accX, DEC);
Serial.print(" Y:");
Serial.print(accY, DEC);
Serial.print(" Z:");
Serial.print(accZ, DEC);
Serial.println();
delay(200);
}

void itgWrite(char address, char registerAddress, char data)
{

Wire.beginTransmission(address);

Wire.write(registerAddress);

Wire.write(data);

Wire.endTransmission();
}


unsigned char itgRead(char address, char registerAddress)
{

unsigned char data=0;


Wire.beginTransmission(address);

Wire.write(registerAddress);

Wire.endTransmission();


Wire.beginTransmission(address);
Wire.requestFrom(address, 1);


if(Wire.available()){
data = Wire.read();
}


Wire.endTransmission();


return data;
}

int readX(void)
{
int data=0;
data = itgRead(itgAddress, GYRO_XOUT_H)<<8;
data |= itgRead(itgAddress, GYRO_XOUT_L);

return data;
}
int readY(void)
{
int data=0;
data = itgRead(itgAddress, GYRO_YOUT_H)<<8;
data |= itgRead(itgAddress, GYRO_YOUT_L);

return data;
}

int readZ(void)
{
int data=0;
data = itgRead(itgAddress, GYRO_ZOUT_H)<<8;
data |= itgRead(itgAddress, GYRO_ZOUT_L);

return data;
}

void initAcc(void)
{
Wire.beginTransmission(ACC_ADDRESS);
Wire.write(ACC_POWER_CTL);
Wire.write(0b00001000);
Wire.endTransmission();
Serial.println("Accelerometer Initialized.");
}

void getAcc(short *x, short *y, short *z)
{
// I2C通信開始。
Wire.beginTransmission(ACC_ADDRESS);
// レジスタアドレスACC_DATA_X0 を指定。
Wire.write(ACC_DATA_X0);
// キューの送信。
Wire.endTransmission();

delay(1);

// I2C通信開始。
Wire.beginTransmission(ACC_ADDRESS);
// データ要求。
Wire.requestFrom(ACC_ADDRESS, 6);
// データ受信。
for (int i = 0; i < 6; i++) {
while (Wire.available() == 0);
buf[i] = Wire.read();
}
Wire.endTransmission();

*x = (((short)buf[1]) << 8) | buf[0];
*y = (((short)buf[3]) << 8) | buf[2];
*z = (((short)buf[5]) << 8) | buf[4];
}




長いね。 
スポンサーサイト

NEW ENTRY «  | BLOG TOP |  » OLD ENTRY

プロフィール

Genkitahara

Author:Genkitahara
ようこそ!

宇宙最前線を目指します!

ロボコンもします。

デジタル1眼レフカメラがほしい。

最新記事

最新コメント

最新トラックバック

月別アーカイブ

カテゴリ

未分類 (2)
紹介 (2)
制作 (1)
福大ロケット (2)
報告 (6)
電子工作 (7)
ロボコン (0)
見なくていいです (0)
モデルロケット (10)
種子島ロケットコンテスト (3)
自分めも (1)
SPIF (0)

ついったー

投稿動画

検索フォーム

RSSリンクの表示

リンク

このブログをリンクに追加する

ブロとも申請フォーム

この人とブロともになる

QRコード

QR

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