极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 37781|回复: 18

我的第一个程序~九轴传感器初步测试通过

[复制链接]
发表于 2012-3-3 14:28:18 | 显示全部楼层 |阅读模式
本帖最后由 黑马 于 2012-3-3 15:14 编辑
  1. #include <Wire.h>           // IIC运行库

  2. int ADXAddress = 0x3B >> 1; // ADXL345的I2C地址
  3. int L3GAddress = 0x69;      // L3G4200D的I2C地址
  4. int HMCAddress = 0x1E;      // HMC5883L的I2C地址

  5. byte vL, vH;                // 存放低位、高位值
  6. int xAcc,  yAcc,  zAcc;     // 存放加速度值
  7. int xGyro, yGyro, zGyro;    // 存放角速度值
  8. int xMag,  yMag,  zMag;     // 存放地磁场值

  9. void setup()
  10. {
  11.     Serial.begin(9600);         // 定义串口
  12.     Wire.begin();
  13.     delay(100);

  14.     Serial.println("starting up....");
  15.     writeRegister(ADXAddress, 0x2D, 0b00001000);   // 测量模式
  16.                             // 配置ADXL345
  17.     writeRegister(L3GAddress, 0x20, 0b00001111);   // 设置睡眠模式、x, y, z轴使能
  18.     writeRegister(L3GAddress, 0x21, 0b00000000);   // 选择高通滤波模式和高通截止频率
  19.     writeRegister(L3GAddress, 0x22, 0b00000000);   // 设置中断模式
  20.     writeRegister(L3GAddress, 0x23, 0b00110000);   // 设置量程(2000dps)、自检状态、SPI模式
  21.     writeRegister(L3GAddress, 0x24, 0b00000000);   // FIFO & 高通滤波
  22.                             // 配置L3G4200D(2000 deg/sec)
  23.     writeRegister(HMCAddress, 0x02, 0x00);         // 连续测量
  24.                             // 配置HMC5883L
  25.     delay(2000);
  26. }

  27. void loop() {
  28.     getAccValues();
  29.     Serial.print("xAcc=");
  30.     Serial.print(xAcc);
  31.     Serial.print("  yAcc=");
  32.     Serial.print(yAcc);
  33.     Serial.print("  zAcc=");
  34.     Serial.println(zAcc);
  35.     delay(100);

  36.     getGyroValues();
  37.     Serial.print("xGyro=");
  38.     Serial.print(xGyro);
  39.     Serial.print("  yGyro=");
  40.     Serial.print(yGyro);
  41.     Serial.print("  zGyro=");
  42.     Serial.println(zGyro);
  43.     delay(100);

  44.     getMagValues();
  45.     Serial.print("xMag=");
  46.     Serial.print(xMag);
  47.     Serial.print("  yMag=");
  48.     Serial.print(yMag);
  49.     Serial.print("  zMag=");
  50.     Serial.println(zMag);
  51.     Serial.println();
  52.     delay(1000);
  53. }

  54. void getAccValues() {       // 加速度值读取

  55.     vL = readRegister(ADXAddress, 0x32);
  56.     vH = readRegister(ADXAddress, 0x33);
  57.     xAcc = (vH << 8) | vL;

  58.     vL = readRegister(ADXAddress, 0x34);
  59.     vH = readRegister(ADXAddress, 0x35);
  60.     yAcc = (vH << 8) | vL;

  61.     vL = readRegister(ADXAddress, 0x36);
  62.     vH = readRegister(ADXAddress, 0x37);
  63.     zAcc = (vH << 8) | vL;
  64. }

  65. void getGyroValues() {       // 角速度值读取

  66.     vL = readRegister(L3GAddress, 0x28);
  67.     vH = readRegister(L3GAddress, 0x29);
  68.     xGyro = (vH << 8) | vL;

  69.     vL = readRegister(L3GAddress, 0x2A);
  70.     vH = readRegister(L3GAddress, 0x2B);
  71.     yGyro = (vH << 8) | vL;

  72.     vL = readRegister(L3GAddress, 0x2C);
  73.     vH = readRegister(L3GAddress, 0x2D);
  74.     zGyro = (vH << 8) | vL;
  75. }

  76. void getMagValues() {       // 磁场值读取

  77.     vH = readRegister(HMCAddress, 0x03);
  78.     vL = readRegister(HMCAddress, 0x04);
  79.     xMag = (vH << 8) | vL;

  80.     vH = readRegister(HMCAddress, 0x05);
  81.     vL = readRegister(HMCAddress, 0x06);
  82.     yMag = (vH << 8) | vL;

  83.     vH = readRegister(HMCAddress, 0x07);
  84.     vL = readRegister(HMCAddress, 0x08);
  85.     zMag = (vH << 8) | vL;
  86. }

  87. int readRegister(int deviceAddress, byte address) {
  88.             // 读寄存器
  89.     int v;
  90.     Wire.beginTransmission(deviceAddress);
  91.     Wire.send(address);
  92.     Wire.endTransmission();
  93.     Wire.requestFrom(deviceAddress, 1);
  94.     while(!Wire.available()) {}
  95.     v = Wire.receive();
  96.     return v;
  97. }

  98. void writeRegister(int deviceAddress, byte address, byte val) {
  99.             // 写寄存器
  100.     Wire.beginTransmission(deviceAddress);
  101.     Wire.send(address);
  102.     Wire.send(val);
  103.     Wire.endTransmission();
  104. }
复制代码
今天终于拿到传感器了,写了一段代码测试了一下,暂时没发现问题。
三个传感器分别是ADXL345、L3G4200D、HMC5883L。
读写操作上大同小异,不过对照之下还是收获不少。
第一次比较完整的写代码,比较没底,各位大大帮忙指点一下啊{:soso__3559783965608296814_3:} 。

接线很简单就不放上来了,只有Vdd、GND、SDA、SCL四根线
回复

使用道具 举报

发表于 2012-3-3 20:54:05 | 显示全部楼层
真巧啊!今天我的adxl和l3g4也到手了
那我就复制粘贴你的代码了~
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-3-4 10:55:45 | 显示全部楼层
Malc 发表于 2012-3-3 20:54
真巧啊!今天我的adxl和l3g4也到手了
那我就复制粘贴你的代码了~

欢迎,有bug告诉我下
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-3-5 11:17:50 | 显示全部楼层
对了,我是在0023版编译通过的,1.0的要把send改成write,receive改成read
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-3-5 19:08:02 | 显示全部楼层
czad 发表于 2012-3-5 18:35
第一个程序?我也有改了一个,对比一下。---好像你的数据处理部分很弱。

haha数据没做处理啊,只是读取原始数据
回复 支持 反对

使用道具 举报

发表于 2012-3-7 09:19:07 | 显示全部楼层
问下这个程序能串口显示能正常不啊~~~
回复 支持 反对

使用道具 举报

发表于 2012-3-7 09:21:41 | 显示全部楼层
92.void getMagValues() {       // 磁场值读取
93.
94.    vH = readRegister(HMCAddress, 0x03);
95.    vL = readRegister(HMCAddress, 0x04);
96.    xMag = (vH << 8) | vL;
97.
98.    vH = readRegister(HMCAddress, 0x05);
99.    vL = readRegister(HMCAddress, 0x06);
100.    yMag = (vH << 8) | vL;
101.
102.    vH = readRegister(HMCAddress, 0x07);
103.    vL = readRegister(HMCAddress, 0x08);
104.    zMag = (vH << 8) | vL;
105.}


在我印象中Y轴地址是07  08  Z轴地址是 05  06········?
回复 支持 反对

使用道具 举报

发表于 2012-4-13 23:15:16 | 显示全部楼层
starting up....
大家看看,我的ADXL345一直停留在上面的状态,是怎么回事呀
回复 支持 反对

使用道具 举报

发表于 2012-4-14 09:08:37 | 显示全部楼层
请问黑马,把你的9轴串口输出的原始数据贴出来我看一下,我的好像有个问题!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-4-14 10:12:29 | 显示全部楼层
海神 发表于 2012-3-7 09:21
92.void getMagValues() {       // 磁场值读取
93.
94.    vH = readRegister(HMCAddress, 0x03);

Er……是的,我没留意,Thank u
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-4-14 10:14:46 | 显示全部楼层
Randy 发表于 2012-4-14 09:08
请问黑马,把你的9轴串口输出的原始数据贴出来我看一下,我的好像有个问题!

传感器没在手上,原始数据就是一堆数字啊,比如加速度13,8,265什么的,陀螺仪变化比较灵敏,罗盘的数值比较大
回复 支持 反对

使用道具 举报

发表于 2012-4-14 11:55:22 | 显示全部楼层
黑马 发表于 2012-4-14 10:14
传感器没在手上,原始数据就是一堆数字啊,比如加速度13,8,265什么的,陀螺仪变化比较灵敏,罗盘的数值 ...

我知道原始数据啊,我主要是想看一下有啥区别!
回复 支持 反对

使用道具 举报

发表于 2012-8-7 17:15:12 | 显示全部楼层
暮夕/mg 发表于 2012-4-13 23:15
starting up....
大家看看,我的ADXL345一直停留在上面的状态,是怎么回事呀

int ADXAddress = 0xA7 >> 1; // ADXL345的I2C地址  这句改成这样
回复 支持 反对

使用道具 举报

发表于 2012-9-15 22:02:02 | 显示全部楼层
我也用了这个代码做测试,木有问题,但是编译后有17k,我增加了BMP085。弱弱的问一下,这个磁场数据有什么用,怎样才能变成指南针
回复 支持 反对

使用道具 举报

发表于 2012-12-30 14:40:41 | 显示全部楼层
刚接触这个时间还不长啊,不知道你这个接线怎么接的啊,sda,scl都接哪里啊,给讲讲吧,谢谢
回复 支持 反对

使用道具 举报

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

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-18 17:23 , Processed in 0.040782 second(s), 25 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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