arduino学习笔记14 - ITG 3200/3205陀螺仪传感器实验
陀螺仪是一种用来感测与维持方向的装置,基於角动量不灭的理论设计出来的。陀螺仪主要是由一个位於轴心可以旋转的轮子构成。 陀螺仪一旦开始旋转,由於轮子的角动量,陀螺仪有抗拒方向改变的趋向。陀螺仪多用於导航、定位等系统。 1850年法国的物理学家福柯(J.Foucault)为了研究地球自转,首先发现高速转动中的转子(rotor),由于惯性作用它的旋转轴永远指向一固定方向,他用希腊字gyro(旋转)和skopein(看)两字合为gyro scopei一字来命名这种仪表。
先来看一下陀螺仪的结构图
本次使用的芯片为ITG 3205,使用方法和ITG 3200一致。通过IIC接口连接,测量的结果为角速度,单位为“度/秒”。
下面是硬件连接图
#include <Wire.h>//调用arduino自带的I2C库
#include <LiquidCrystal.h> //调用arduino自带的LiquidCrystal库
// 定义ITG3200陀螺仪常量
#define GYRO 0x68 // 设置IIC地址,AD0与GND相接,二进制数值为11101000.
#define G_SMPLRT_DIV 0x15
#define G_DLPF_FS 0x16
#define G_INT_CFG 0x17
#define G_PWR_MGM 0x3E
#define G_TO_READ 8 // x, y, z 每个轴输出为2个字节
LiquidCrystal lcd(12, 11, 10, 9, 8, 7);//设置LCD接口
//XYZ三轴偏移量修正
int g_offx = 28;// 修正X轴误差
int g_offy = 53; // 修正Y轴误差
int g_offz = -15; // 修正Z轴误差
int hx, hy, hz, turetemp;
// 初始化陀螺仪
void initGyro()
{
/*****************************************
* ITG 3200
* 电源管理设置:
* 时钟选择为内部振荡器
* 无复位、无睡眠模式
* 无待机模式
* 采样率 = 1KHz
* 参数为+ / - 2000度/秒
* 低通滤波 = 5Hz
* 没有中断
******************************************/
writeTo(GYRO, G_PWR_MGM, 0x00);
writeTo(GYRO, G_SMPLRT_DIV, 0x07); // EB, 50, 80, 7F, DE, 23, 20, FF
writeTo(GYRO, G_DLPF_FS, 0x1E); // +/- 2000 dgrs/sec, 1KHz, 1E, 19
writeTo(GYRO, G_INT_CFG, 0x00);
}
void getGyroscopeData(int * result)
{
/**************************************
Gyro ITG-3200 I2C
注册:
temp MSB = 1B, temp LSB = 1C
x axis MSB = 1D, x axis LSB = 1E
y axis MSB = 1F, y axis LSB = 20
z axis MSB = 21, z axis LSB = 22
*************************************/
int regAddress = 0x1B;
int temp, x, y, z;
byte buff;
readFrom(GYRO, regAddress, G_TO_READ, buff); // 从ITG3200读取数据
result = ((buff << 8) | buff) + g_offx;
result = ((buff << 8) | buff) + g_offy;
result = ((buff << 8) | buff) + g_offz;
result = (buff << 8) | buff; // 温度
}
void setup()
{
lcd.begin(16, 2);//初始化LCD
delay(100);
Wire.begin();//初始化I2C
delay(100);
initGyro();
}
void loop()
{
int gyro;
getGyroscopeData(gyro);
hx = gyro / 14.375; // 输出值转换为角速度,单位是度/秒
hy = gyro / 14.375;
hz = gyro / 14.375;
turetemp = 35+ ((double) (gyro + 13200)) / 280; // 输出值转换为摄氏度
lcd.clear(); //清屏
lcd.print("X="); //使屏幕显示文字X=
lcd.print(hx);
lcd.setCursor(8, 0);
lcd.print("Y=");
lcd.print(hy);
lcd.setCursor(0, 1);
lcd.print("Z=");
lcd.print(hz);
lcd.setCursor(8, 1);
lcd.print("F=");
lcd.print(turetemp);
lcd.print((char)223);
lcd.print("C");
delay(100);//延时0.1秒,刷新频率这里进行调整
}
//---------------- 函数
// 将值写入累加器中的地址寄存器
void writeTo(int DEVICE, byte address, byte val) {
Wire.beginTransmission(DEVICE); // 开始传输数据到累加器
Wire.send(address); //发送寄存器地址
Wire.send(val); //发送要写入的值
Wire.endTransmission(); // 结束传输
}
// 从累加器的地址寄存器中读取buff数组数据
void readFrom(int DEVICE, byte address, int num, byte buff[]) {
Wire.beginTransmission(DEVICE); // 开始传输数据到累加器
Wire.send(address); // 发送读取的地址
Wire.endTransmission(); // 结束传输
Wire.beginTransmission(DEVICE); // 开始传输数据到累加器
Wire.requestFrom(DEVICE, num); //从累加器请求6个字节数据
int i = 0;
while(Wire.available())
{
buff = Wire.receive(); // 接收一个字节
i++;
}
Wire.endTransmission(); // 结束传输
}实验效果如下
http://player.youku.com/player.php/sid/XMjk1MjY1MzY0/v.swf
附件为ITG 3200产品手册:
很漂亮的动画 好东西,下来,研究研究 刚买了几个ITG-3205,装到板上不正常,好像默认的角度不对,是不是要初始化一下,需用到什么设备,请指教。
QQ:87976665 andyfeng 发表于 2011-8-23 21:54 static/image/common/back.gif
刚买了几个ITG-3205,装到板上不正常,好像默认的角度不对,是不是要初始化一下,需用到什么设备,请指教。
...
陀螺仪初始输出数值是有偏差的,所以需要校准。先读出输出的数据,然后±使其输出数据接近0即可。
我的代码中有这么一段//XYZ三轴偏移量修正
int g_offx = 28;// 修正X轴误差
int g_offy = 53; // 修正Y轴误差
int g_offz = -15; // 修正Z轴误差
int hx, hy, hz, turetemp;其作用就是修正初始化偏差,不过这个是传统办法,可以通过更高级复杂的数学算法来进行自动校正,有待大家研究。 多谢指导,请问本贴中用到的硬件设备都要到哪里去购买,设备型号都是什么? 可否发送联系方式到我QQ,以后可能有更深入的合作机会。 andyfeng 发表于 2011-8-24 12:01 static/image/common/back.gif
可否发送联系方式到我QQ,以后可能有更深入的合作机会。
:lol加你Q了 本帖最后由 百家汇电脑 于 2011-10-16 22:08 编辑
我买单片机是:Arduino328+L3G4200D+ADXL345+L298N对于你这个测试我应变哪些?是不是应同时初始化这三种想做一个平衡车.希望你回答[email protected] 弘老师请加我的QQ好吗?好想好想学习.请支持 百家汇电脑 发表于 2011-10-16 22:10 static/image/common/back.gif
弘老师请加我的QQ好吗?好想好想学习.请支持
:lol加你Q了 弘毅老师。那个ITG3200模块是你自己做的吗?还是买现成板子?我看淘宝上价格差异都好大。怕买错 弘老师,您好,我有一些ITG3200陀螺仪的问题想向您请教,能否加我的QQ:676381730 缘来饰你
谢谢! 弘老师 你这套arduino教程用到的器件 是在淘宝上买的么?可以分享一个信誉好的淘宝电子产品店么? ゞR.L.〝 发表于 2012-3-28 21:13 static/image/common/back.gif
弘老师 你这套arduino教程用到的器件 是在淘宝上买的么?可以分享一个信誉好的淘宝电子产品店么?
我的是自己焊的,零件也是N家不同时期弄回来的。优信服务态度挺好。。。。我比较喜欢