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