极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

楼主: 弘毅

arduino学习笔记28 - ITG3200 ADXL345做姿态识别实验

  [复制链接]
发表于 2012-3-25 15:44:57 | 显示全部楼层
还有刚买的mpu6050  六轴  里面程序用Arduino读不了  
回复 支持 反对

使用道具 举报

发表于 2012-4-1 11:30:25 | 显示全部楼层
楼主,加速度传感器和陀螺仪的偏移量是怎么来的?
  1. // 陀螺仪误差修正的偏移量
  2. int g_offx = 67;
  3. int g_offy = 5;
  4. int g_offz = 41;

  5. // 加速度传感器误差修正的偏移量
  6. int a_offx = -30;
  7. int a_offy = -8;
  8. int a_offz = 0;
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-4-1 13:32:03 | 显示全部楼层
Waytry 发表于 2012-4-1 11:30
楼主,加速度传感器和陀螺仪的偏移量是怎么来的?

这个嘛。。。放平后,输出数值。。。这个值只要不为0,就是偏移量。
回复 支持 反对

使用道具 举报

发表于 2012-4-1 19:14:33 | 显示全部楼层
这个就是零飘是吧。温飘怎么抑制呢?
回复 支持 反对

使用道具 举报

发表于 2012-4-5 11:36:00 | 显示全部楼层
本帖最后由 董董soul 于 2018-10-24 14:38 编辑

小弟,修改了一下arduino 方面的代码 使用的是l3G4200D + ADXL345 来完成楼主的试验。其中读取gyro部分的代码来自版主 黑马的代码,感谢版主黑马。感谢弘毅。感谢xx。



  1. #include <Wire.h>  // 调用I2C库
  2. // 加速度传感器 ADXL345
  3. #define ACC (0x1D)     //定义ADXL345地址 0x3B >> 1 = 0x1D
  4. #define A_TO_READ (6)        //读取每次占用的字节数 (每个坐标轴占两个字节)

  5. //int ADXAddress = 0x3B >> 1; // ADXL345的I2C地址
  6. //int L3GAddress = 0x69;      // L3G4200D的I2C地址
  7. //int HMCAddress = 0x1E;      // HMC5883L的I2C地址


  8. byte vL, vH;                // 存放低位、高位值
  9. int xGyro, yGyro, zGyro,tGyro;    // 存放角速度值
  10. // 陀螺仪 L3G4200D

  11. #define L3GAddress 0x69  // 请注意此处 SDO已接上拉电阻 SDO默认高电平 IIC地址为0x69  若接地则IIC地址为0x68  具体参看 L3G4200D 手册P22
  12. #define G_TO_READ 8 // x,y,z 每个轴2 bytes and temprtures.
  13. // 陀螺仪误差修正的偏移量
  14. /*int g_offx = 67;
  15. int g_offy = 5;
  16. int g_offz = 41; */
  17. int g_offx = 0;
  18. int g_offy = 0;
  19. int g_offz = 0;
  20. // 加速度传感器误差修正的偏移量
  21. int a_offx = -14;
  22. int a_offy = -14;
  23. int a_offz = 0;
  24. char str[512];
  25. void initAcc() {
  26.   //调用 ADXL345
  27.   writeTo(ACC, 0x2D, 0);      
  28.   writeTo(ACC, 0x2D, 16);
  29.   writeTo(ACC, 0x2D, 8);  //设定在 +-2g 时的默认读数
  30. }
  31. void getAccelerometerData(int * result) {
  32.   int regAddress = 0x32;    //加速度传感器ADXL345第一轴的数据的设定
  33.   byte buff[A_TO_READ];
  34.   readFrom(ACC, regAddress, A_TO_READ, buff); //读取加速度传感器ADXL345的数据
  35.   //每个轴的读数有10位分辨率,即2个字节.  
  36.   //我们要转换两个bytes为一个int变量
  37.   result[0] = (((int)buff[1]) << 8) | buff[0] + a_offx;   
  38.   result[1] = (((int)buff[3]) << 8) | buff[2] + a_offy;
  39.   result[2] = (((int)buff[5]) << 8) | buff[4] + a_offz;
  40. }

  41. //初始化陀螺仪
  42. void initGyro()
  43. {
  44.     writeTo(L3GAddress, 0x20, 0b00001111);   // 设置睡眠模式、x, y, z轴使能
  45.     writeTo(L3GAddress, 0x21, 0b00000000);   // 选择高通滤波模式和高通截止频率
  46.     writeTo(L3GAddress, 0x22, 0b00000000);   // 设置中断模式
  47.     writeTo(L3GAddress, 0x23, 0b00110000);   // 设置量程(2000dps)、自检状态、SPI模式
  48.     writeTo(L3GAddress, 0x24, 0b00000000);   // FIFO & 高通滤波  // 配置L3G4200D(2000 deg/sec)

  49. }

  50. /*void getGyroscopeData(int * result)
  51. {
  52.   /**************************************
  53.    * 陀螺仪L3G4200D的I2C
  54.    * 寄存器:
  55.    * temp MSB = 0x26, Status_REG = 0x27
  56.    * x axis MSB = 0x29, x axis LSB = 0x28
  57.    * y axis MSB = 0x2B, y axis LSB = 0x2A
  58.    * z axis MSB = 0x2D, z axis LSB = 0x2C
  59.   
  60.   int regAddress = 0x26;
  61.   //int temp, x, y, z;
  62.   byte buff[G_TO_READ];
  63.   readFrom(L3GAddress, regAddress, G_TO_READ, buff); //读取陀螺仪L3G4200D的数据
  64.   result[0] = ((buff[3] << 8) | buff[2]);// + g_offx;
  65.   result[1] = ((buff[5] << 8) | buff[4]);// + g_offy;
  66.   result[2] = ((buff[7] << 8) | buff[6]);// + g_offz;
  67.   //result[3] = (buff[0] << 8) | buff[1]; // 温度
  68.   result[3] = buff[0]; // 温度
  69. }*/

  70. void setup()
  71. {
  72.   Serial.begin(9600);
  73.   Wire.begin();
  74.   initAcc();
  75.   initGyro();
  76. }

  77. void loop()
  78. {
  79.   int acc[3];
  80.   int gyro[4];
  81.   getAccelerometerData(acc);
  82.   delay(200);
  83.   //getGyroscopeData(gyro);
  84.   getGyroValues();
  85.   
  86.   

  87.   //sprintf(str, "%d,%d,%d,%d,%d,%d,%d", acc[0], acc[1], acc[2], gyro[0], gyro[1], gyro[2], gyro[3]);  
  88.   sprintf(str, "%d,%d,%d,%d,%d,%d,%d", acc[0], acc[1], acc[2], xGyro, yGyro,zGyro,tGyro);  
  89.   Serial.print(str);
  90.   Serial.print(10, BYTE);
  91.   delay(50);  //延时50毫秒
  92. }
  93. void getGyroValues() {       // 角速度值读取
  94.     vL = readRegister(L3GAddress, 0x28);
  95.     vH = readRegister(L3GAddress, 0x29);
  96.     xGyro = (vH << 8) | vL;
  97.     vL = readRegister(L3GAddress, 0x2A);
  98.     vH = readRegister(L3GAddress, 0x2B);
  99.     yGyro = (vH << 8) | vL;
  100.     vL = readRegister(L3GAddress, 0x2C);
  101.     vH = readRegister(L3GAddress, 0x2D);
  102.     zGyro = (vH << 8) | vL;
  103.     tGyro = readRegister(L3GAddress,0x26);
  104.   }
  105. //---------------- 功能
  106. //将val写入到加速度传感器的地址寄存器中
  107. void writeTo(int DEVICE, byte address, byte val) {
  108.   Wire.beginTransmission(DEVICE); //传送到加速度传感器
  109.   Wire.send(address);        // 发送寄存器地址
  110.   Wire.send(val);        // 发送要写入的值
  111.   Wire.endTransmission(); //结束传输
  112. }

  113. //加速度传感器在地址寄存器的缓冲区阵列中读取读数
  114. void readFrom(int DEVICE, byte address, int num, byte buff[]) {
  115.   Wire.beginTransmission(DEVICE); //开始传送至加速度传感器
  116.   Wire.send(address);        //发送读取的地址
  117.   Wire.endTransmission(); //结束传输
  118.   Wire.beginTransmission(DEVICE); //开始传送到ACC
  119.   Wire.requestFrom(DEVICE, num);    // 要求从加速度传感器中发送6个字节的数据
  120.   int i = 0;
  121.   while(Wire.available())    //当加速度传感器返回的数据小于要求值时(异常情况)
  122.   {
  123.     buff[i] = Wire.receive(); // 接收数据
  124.     i++;
  125.   }
  126.   Wire.endTransmission(); //结束传输
  127. }

  128. int readRegister(int deviceAddress, byte address) {
  129.             // 读寄存器
  130.     int v;
  131.     Wire.beginTransmission(deviceAddress);
  132.     Wire.send(address);
  133.     Wire.endTransmission();
  134.     Wire.requestFrom(deviceAddress, 1);
  135.     while(!Wire.available()) {}
  136.     v = Wire.receive();
  137.     return v;
  138. }
复制代码

回复 支持 反对

使用道具 举报

发表于 2012-4-5 11:39:35 | 显示全部楼层
void getGyroscopeData(int * result) 貌似这个函数在L3G4200D 下不好用。
在取得高低位字节后没有 进行 强制类型转换 (byte-> int). 请教楼主这个需要转换么?不需要么?
为什么在读取adxl345 的时候需要转换呢?

恳请楼主 指教。 多谢。
回复 支持 反对

使用道具 举报

发表于 2012-4-5 15:53:47 | 显示全部楼层
我想问下楼主  这个是什么错误呢   
今天才接触 processing 希望楼主 能介绍几个processing 学习的网站  文档 or 资料啥的
  多谢 多谢哈 ~~~

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-4-5 20:01:31 | 显示全部楼层
Name_006 发表于 2012-4-5 15:53
我想问下楼主  这个是什么错误呢   
今天才接触 processing 希望楼主 能介绍几个processing 学习的网站  文 ...

。。。这个错误还真没见过,有一本中文书还不错,processing互动编程艺术。
回复 支持 反对

使用道具 举报

发表于 2012-4-6 09:05:14 | 显示全部楼层
弘毅 发表于 2012-4-5 20:01
。。。这个错误还真没见过,有一本中文书还不错,processing互动编程艺术。

processing……一直抽出时间仔细看,好像只能封装成applet?

其实我们也可以开一个processing子版块的
回复 支持 反对

使用道具 举报

发表于 2012-4-6 20:43:13 | 显示全部楼层
问一下大家,我只选取了读取加速度传感器数值的程序,读出的截图如下:

这是面包板水平时读出的值,请问这数值是什么意思》好像范围是从-300多到+300多。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

发表于 2012-4-6 22:55:37 | 显示全部楼层
moon 发表于 2012-4-6 20:43
问一下大家,我只选取了读取加速度传感器数值的程序,读出的截图如下:

这是面包板水平时读出的值,请问 ...

除以256,就是三个方向的加速度值,换算成米每二次方秒的话再乘以9.8,一般都会需要稍微校准一下下
回复 支持 反对

使用道具 举报

发表于 2012-4-6 22:55:46 | 显示全部楼层
moon 发表于 2012-4-6 20:43
问一下大家,我只选取了读取加速度传感器数值的程序,读出的截图如下:

这是面包板水平时读出的值,请问 ...

除以256,就是三个方向的加速度值,换算成米每二次方秒的话再乘以9.8,一般都会需要稍微校准一下下
回复 支持 反对

使用道具 举报

发表于 2012-4-6 23:01:41 | 显示全部楼层
黑马 发表于 2012-4-6 22:55
除以256,就是三个方向的加速度值,换算成米每二次方秒的话再乘以9.8,一般都会需要稍微校准一下下

好的,非常感谢
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-4-7 09:30:50 | 显示全部楼层
黑马 发表于 2012-4-6 09:05
processing……一直抽出时间仔细看,好像只能封装成applet?

其实我们也可以开一个processing子版块的

嗯。。。准备开一个processing的子版块~~~最近没那么忙了,就玩玩写点入门帖子
回复 支持 反对

使用道具 举报

发表于 2012-4-7 10:12:44 | 显示全部楼层
弘毅 发表于 2012-4-7 09:30
嗯。。。准备开一个processing的子版块~~~最近没那么忙了,就玩玩写点入门帖子

弘毅威武啊,这个两个模块,我们准备做。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-27 04:40 , Processed in 0.050765 second(s), 23 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表