我的第一个程序~九轴传感器初步测试通过
本帖最后由 黑马 于 2012-3-3 15:14 编辑#include <Wire.h> // IIC运行库
int ADXAddress = 0x3B >> 1; // ADXL345的I2C地址
int L3GAddress = 0x69; // L3G4200D的I2C地址
int HMCAddress = 0x1E; // HMC5883L的I2C地址
byte vL, vH; // 存放低位、高位值
int xAcc,yAcc,zAcc; // 存放加速度值
int xGyro, yGyro, zGyro; // 存放角速度值
int xMag,yMag,zMag; // 存放地磁场值
void setup()
{
Serial.begin(9600); // 定义串口
Wire.begin();
delay(100);
Serial.println("starting up....");
writeRegister(ADXAddress, 0x2D, 0b00001000); // 测量模式
// 配置ADXL345
writeRegister(L3GAddress, 0x20, 0b00001111); // 设置睡眠模式、x, y, z轴使能
writeRegister(L3GAddress, 0x21, 0b00000000); // 选择高通滤波模式和高通截止频率
writeRegister(L3GAddress, 0x22, 0b00000000); // 设置中断模式
writeRegister(L3GAddress, 0x23, 0b00110000); // 设置量程(2000dps)、自检状态、SPI模式
writeRegister(L3GAddress, 0x24, 0b00000000); // FIFO & 高通滤波
// 配置L3G4200D(2000 deg/sec)
writeRegister(HMCAddress, 0x02, 0x00); // 连续测量
// 配置HMC5883L
delay(2000);
}
void loop() {
getAccValues();
Serial.print("xAcc=");
Serial.print(xAcc);
Serial.print("yAcc=");
Serial.print(yAcc);
Serial.print("zAcc=");
Serial.println(zAcc);
delay(100);
getGyroValues();
Serial.print("xGyro=");
Serial.print(xGyro);
Serial.print("yGyro=");
Serial.print(yGyro);
Serial.print("zGyro=");
Serial.println(zGyro);
delay(100);
getMagValues();
Serial.print("xMag=");
Serial.print(xMag);
Serial.print("yMag=");
Serial.print(yMag);
Serial.print("zMag=");
Serial.println(zMag);
Serial.println();
delay(1000);
}
void getAccValues() { // 加速度值读取
vL = readRegister(ADXAddress, 0x32);
vH = readRegister(ADXAddress, 0x33);
xAcc = (vH << 8) | vL;
vL = readRegister(ADXAddress, 0x34);
vH = readRegister(ADXAddress, 0x35);
yAcc = (vH << 8) | vL;
vL = readRegister(ADXAddress, 0x36);
vH = readRegister(ADXAddress, 0x37);
zAcc = (vH << 8) | vL;
}
void getGyroValues() { // 角速度值读取
vL = readRegister(L3GAddress, 0x28);
vH = readRegister(L3GAddress, 0x29);
xGyro = (vH << 8) | vL;
vL = readRegister(L3GAddress, 0x2A);
vH = readRegister(L3GAddress, 0x2B);
yGyro = (vH << 8) | vL;
vL = readRegister(L3GAddress, 0x2C);
vH = readRegister(L3GAddress, 0x2D);
zGyro = (vH << 8) | vL;
}
void getMagValues() { // 磁场值读取
vH = readRegister(HMCAddress, 0x03);
vL = readRegister(HMCAddress, 0x04);
xMag = (vH << 8) | vL;
vH = readRegister(HMCAddress, 0x05);
vL = readRegister(HMCAddress, 0x06);
yMag = (vH << 8) | vL;
vH = readRegister(HMCAddress, 0x07);
vL = readRegister(HMCAddress, 0x08);
zMag = (vH << 8) | vL;
}
int readRegister(int deviceAddress, byte address) {
// 读寄存器
int v;
Wire.beginTransmission(deviceAddress);
Wire.send(address);
Wire.endTransmission();
Wire.requestFrom(deviceAddress, 1);
while(!Wire.available()) {}
v = Wire.receive();
return v;
}
void writeRegister(int deviceAddress, byte address, byte val) {
// 写寄存器
Wire.beginTransmission(deviceAddress);
Wire.send(address);
Wire.send(val);
Wire.endTransmission();
}今天终于拿到传感器了,写了一段代码测试了一下,暂时没发现问题。
三个传感器分别是ADXL345、L3G4200D、HMC5883L。
读写操作上大同小异,不过对照之下还是收获不少。
第一次比较完整的写代码,比较没底,各位大大帮忙指点一下啊{:soso__3559783965608296814_3:} 。
接线很简单就不放上来了,只有Vdd、GND、SDA、SCL四根线 真巧啊!今天我的adxl和l3g4也到手了
那我就复制粘贴你的代码了~ Malc 发表于 2012-3-3 20:54 static/image/common/back.gif
真巧啊!今天我的adxl和l3g4也到手了
那我就复制粘贴你的代码了~
欢迎,有bug告诉我下:lol 对了,我是在0023版编译通过的,1.0的要把send改成write,receive改成read:lol czad 发表于 2012-3-5 18:35 static/image/common/back.gif
第一个程序?我也有改了一个,对比一下。---好像你的数据处理部分很弱。
haha数据没做处理啊,只是读取原始数据:lol 问下这个程序能串口显示能正常不啊~~~ 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轴地址是0708Z轴地址是 0506········? starting up....
大家看看,我的ADXL345一直停留在上面的状态,是怎么回事呀:Q 请问黑马,把你的9轴串口输出的原始数据贴出来我看一下,我的好像有个问题! 海神 发表于 2012-3-7 09:21 static/image/common/back.gif
92.void getMagValues() { // 磁场值读取
93.
94. vH = readRegister(HMCAddress, 0x03);
Er……是的,我没留意,Thank u Randy 发表于 2012-4-14 09:08 static/image/common/back.gif
请问黑马,把你的9轴串口输出的原始数据贴出来我看一下,我的好像有个问题!
传感器没在手上,原始数据就是一堆数字啊,比如加速度13,8,265什么的,陀螺仪变化比较灵敏,罗盘的数值比较大 黑马 发表于 2012-4-14 10:14 static/image/common/back.gif
传感器没在手上,原始数据就是一堆数字啊,比如加速度13,8,265什么的,陀螺仪变化比较灵敏,罗盘的数值 ...
:curse: 我知道原始数据啊,我主要是想看一下有啥区别! 暮夕/mg 发表于 2012-4-13 23:15 static/image/common/back.gif
starting up....
大家看看,我的ADXL345一直停留在上面的状态,是怎么回事呀
int ADXAddress = 0xA7 >> 1; // ADXL345的I2C地址这句改成这样 我也用了这个代码做测试,木有问题,但是编译后有17k,我增加了BMP085。弱弱的问一下,这个磁场数据有什么用,怎样才能变成指南针 刚接触这个时间还不长啊,不知道你这个接线怎么接的啊,sda,scl都接哪里啊,给讲讲吧,谢谢
页:
[1]
2