黑马 发表于 2012-3-3 14:28:18

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

本帖最后由 黑马 于 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四根线

Malc 发表于 2012-3-3 20:54:05

真巧啊!今天我的adxl和l3g4也到手了
那我就复制粘贴你的代码了~

黑马 发表于 2012-3-4 10:55:45

Malc 发表于 2012-3-3 20:54 static/image/common/back.gif
真巧啊!今天我的adxl和l3g4也到手了
那我就复制粘贴你的代码了~

欢迎,有bug告诉我下:lol

黑马 发表于 2012-3-5 11:17:50

对了,我是在0023版编译通过的,1.0的要把send改成write,receive改成read:lol

黑马 发表于 2012-3-5 19:08:02

czad 发表于 2012-3-5 18:35 static/image/common/back.gif
第一个程序?我也有改了一个,对比一下。---好像你的数据处理部分很弱。

haha数据没做处理啊,只是读取原始数据:lol

海神 发表于 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轴地址是0708Z轴地址是 0506········?

暮夕/mg 发表于 2012-4-13 23:15:16

starting up....
大家看看,我的ADXL345一直停留在上面的状态,是怎么回事呀:Q

Randy 发表于 2012-4-14 09:08:37

请问黑马,把你的9轴串口输出的原始数据贴出来我看一下,我的好像有个问题!

黑马 发表于 2012-4-14 10:12:29

海神 发表于 2012-3-7 09:21 static/image/common/back.gif
92.void getMagValues() {       // 磁场值读取
93.
94.    vH = readRegister(HMCAddress, 0x03);


Er……是的,我没留意,Thank u

黑马 发表于 2012-4-14 10:14:46

Randy 发表于 2012-4-14 09:08 static/image/common/back.gif
请问黑马,把你的9轴串口输出的原始数据贴出来我看一下,我的好像有个问题!

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

Randy 发表于 2012-4-14 11:55:22

黑马 发表于 2012-4-14 10:14 static/image/common/back.gif
传感器没在手上,原始数据就是一堆数字啊,比如加速度13,8,265什么的,陀螺仪变化比较灵敏,罗盘的数值 ...

:curse: 我知道原始数据啊,我主要是想看一下有啥区别!

davidce 发表于 2012-8-7 17:15:12

暮夕/mg 发表于 2012-4-13 23:15 static/image/common/back.gif
starting up....
大家看看,我的ADXL345一直停留在上面的状态,是怎么回事呀

int ADXAddress = 0xA7 >> 1; // ADXL345的I2C地址这句改成这样

萧芸凤 发表于 2012-9-15 22:02:02

我也用了这个代码做测试,木有问题,但是编译后有17k,我增加了BMP085。弱弱的问一下,这个磁场数据有什么用,怎样才能变成指南针

1qaz2wsx 发表于 2012-12-30 14:40:41

刚接触这个时间还不长啊,不知道你这个接线怎么接的啊,sda,scl都接哪里啊,给讲讲吧,谢谢
页: [1] 2
查看完整版本: 我的第一个程序~九轴传感器初步测试通过