树·水·风 发表于 2012-4-26 16:07:09

已解决,详见沙发。使用加速度计和电子罗盘模块LSM303DLH遇到问题

本帖最后由 树·水·风 于 2012-5-6 18:55 编辑

   两天前买了一个LSM303DLH模块,该模块集成了加速度计和电子罗盘。不过卖家给的代码只有51单片机的,Arduino代码只能自己写。

       起先我在网上找了一个函数库,原以为可以变简单,没想到库所提供的示例程序运行后完全没反应,于是只好自己摸索着写。

      下面是获取x,y,z三个方向加速度计值的代码。#include <Wire.h>

#define AccAddress ( 0x30>>1 )
byte BUF;
float xAcc, yAcc, zAcc;

void setup() {
Serial.begin(9600);
Wire.begin();
delay(100);
Serial.println("Starting up ...");

WriteAccReg(0x20, 0x27);
delay(1000);
}

void PrintBUF() {
for (int i = 0; i < 6; i++) {
    Serial.print(BUF);
    Serial.print("\t");
}
}

void PrintAcc() {
Serial.print(xAcc);
Serial.print("\t");
Serial.print(yAcc);
Serial.print("\t");
Serial.print(zAcc);
Serial.println();
}

void loop() {
ReadAccValues();

if (xAcc < 0) xAcc = -xAcc;
if (yAcc < 0) yAcc = -yAcc;
if (zAcc < 0) zAcc = -zAcc;
   
PrintBUF();
PrintAcc();
delay(300);
}

void ReadAccValues() {
BUF = ReadAccReg(0x28);
BUF = ReadAccReg(0x29);
xAcc = (BUF << 8) + BUF;

BUF = ReadAccReg(0x2A);
BUF = ReadAccReg(0x2B);
yAcc = (BUF << 8) + BUF;

BUF = ReadAccReg(0x2C);
BUF = ReadAccReg(0x2D);
zAcc = (BUF << 8) + BUF;
}

void WriteAccReg(byte reg, byte value) {
Wire.beginTransmission(AccAddress);
Wire.write(reg);
Wire.write(value);
Wire.endTransmission();
}

byte ReadAccReg(byte reg) {
byte value;

Wire.beginTransmission(AccAddress);
Wire.write(reg);
Wire.endTransmission();
Wire.requestFrom(AccAddress, 1);
value = Wire.read();
Wire.endTransmission();

return value;
}
上面的代码每次设定一个寄存器,然后读取一个字节,最后将六个字节合成三个方向的加速度值,没有问题;

       然而当我连续读取6个字节时,6个字节的值都一样,即BUF=BUF=...=BUF。连续读取6个字节的代码如下:Wire.beginTransmission(AccAddress);
Wire.write(0x28);
Wire.endTransmission();
Wire.requestFrom(AccAddress, 6);
while (Wire.available() < 6);
BUF = Wire.read();
BUF = Wire.read();
BUF = Wire.read();
BUF = Wire.read();
BUF = Wire.read();
BUF = Wire.read();
Wire.endTransmission();我又试了一下,连续读3个字节,3个字节都一样,连续读n个字节,n个字节都一样。不明白是什么原因造成的。


       另外,我又修改了一下设备地址、寄存器地址等,用每次读取一个字节的方法读Magnetic即磁感器的值,却发现读出的全都是255,无论模块怎么运动都不改变。真的很奇怪。

下面是我下载的库、模块说明书、51代码:

P.10
P.27


希望同学们能帮我看看。

树·水·风 发表于 2012-5-5 16:54:11

问题解决了,是因为模块工作电压的原因。
LSM303DLH模块中加速度计输出电压>2.5V,可以被Arduino uno等工作电压为5V的板子监测到高低的电平变化,而电子罗盘模块输出电压最高为2.0V,还是不能被Arduino uno侦测到,所以才始终读取不了值。(我自己的理解)。
有人用Arduino nano(工作电压3.3V)板子试过是可以的。

最后我是通过买了一个3.3V-5V的电平转换模块成功的。
Arduino Uno —— I2C电平转换模块 —— LSM303DLH。
已经可以读取了,上面提到的LSM303库也没有问题,实际上从头到尾都不是代码的原因。

电平转换模块是这个样子

弘毅 发表于 2012-5-8 14:27:52

囧,原来是电平转换问题,看来3.3V供电跑8M速度的arduino,还是有其作用的。。。结贴。。。

Randy 发表于 2012-5-8 15:06:46

弘毅 发表于 2012-5-8 14:27 static/image/common/back.gif
囧,原来是电平转换问题,看来3.3V供电跑8M速度的arduino,还是有其作用的。。。结贴。。。

上一次就是因为那个3.3V的原因,HMC5883L就不好好的干活了,可见合适的供电电压是多么重要啊!
页: [1]
查看完整版本: 已解决,详见沙发。使用加速度计和电子罗盘模块LSM303DLH遇到问题