极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 16714|回复: 3

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

[复制链接]
发表于 2012-4-26 16:07:09 | 显示全部楼层 |阅读模式
本帖最后由 树·水·风 于 2012-5-6 18:55 编辑

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

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

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

  2. #define AccAddress ( 0x30>>1 )
  3. byte BUF[6];
  4. float xAcc, yAcc, zAcc;

  5. void setup() {
  6.   Serial.begin(9600);
  7.   Wire.begin();
  8.   delay(100);
  9.   Serial.println("Starting up ...");
  10.   
  11.   WriteAccReg(0x20, 0x27);
  12.   delay(1000);
  13. }

  14. void PrintBUF() {
  15.   for (int i = 0; i < 6; i++) {
  16.     Serial.print(BUF[i]);
  17.     Serial.print("\t");
  18.   }
  19. }

  20. void PrintAcc() {
  21.   Serial.print(xAcc);
  22.   Serial.print("\t");
  23.   Serial.print(yAcc);
  24.   Serial.print("\t");
  25.   Serial.print(zAcc);
  26.   Serial.println();
  27. }

  28. void loop() {
  29.   ReadAccValues();
  30.   
  31.   if (xAcc < 0) xAcc = -xAcc;
  32.   if (yAcc < 0) yAcc = -yAcc;
  33.   if (zAcc < 0) zAcc = -zAcc;
  34.    
  35.   PrintBUF();
  36.   PrintAcc();
  37.   delay(300);
  38. }

  39. void ReadAccValues() {
  40.   BUF[0] = ReadAccReg(0x28);
  41.   BUF[1] = ReadAccReg(0x29);
  42.   xAcc = (BUF[1] << 8) + BUF[0];
  43.   
  44.   BUF[2] = ReadAccReg(0x2A);
  45.   BUF[3] = ReadAccReg(0x2B);
  46.   yAcc = (BUF[3] << 8) + BUF[2];
  47.   
  48.   BUF[4] = ReadAccReg(0x2C);
  49.   BUF[5] = ReadAccReg(0x2D);
  50.   zAcc = (BUF[5] << 8) + BUF[4];
  51. }

  52. void WriteAccReg(byte reg, byte value) {
  53.   Wire.beginTransmission(AccAddress);
  54.   Wire.write(reg);
  55.   Wire.write(value);
  56.   Wire.endTransmission();
  57. }

  58. byte ReadAccReg(byte reg) {
  59.   byte value;
  60.   
  61.   Wire.beginTransmission(AccAddress);
  62.   Wire.write(reg);
  63.   Wire.endTransmission();
  64.   Wire.requestFrom(AccAddress, 1);
  65.   value = Wire.read();
  66.   Wire.endTransmission();
  67.   
  68.   return value;
  69. }
复制代码
上面的代码每次设定一个寄存器,然后读取一个字节,最后将六个字节合成三个方向的加速度值,没有问题;

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


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

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

  P.10
  P.27


希望同学们能帮我看看。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

 楼主| 发表于 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库也没有问题,实际上从头到尾都不是代码的原因。

电平转换模块是这个样子

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

发表于 2012-5-8 14:27:52 | 显示全部楼层
囧,原来是电平转换问题,看来3.3V供电跑8M速度的arduino,还是有其作用的。。。结贴。。。
回复 支持 反对

使用道具 举报

发表于 2012-5-8 15:06:46 | 显示全部楼层
弘毅 发表于 2012-5-8 14:27
囧,原来是电平转换问题,看来3.3V供电跑8M速度的arduino,还是有其作用的。。。结贴。。。

上一次就是因为那个3.3V的原因,HMC5883L就不好好的干活了,可见合适的供电电压是多么重要啊!
回复 支持 反对

使用道具 举报

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

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-5-2 09:58 , Processed in 0.041124 second(s), 20 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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