极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

楼主: 弘毅

arduino学习笔记12 - ADXL345加速度传感器实验

  [复制链接]
 楼主| 发表于 2011-12-5 21:01:44 | 显示全部楼层
lw0616 发表于 2011-12-5 20:58
你好,刚刚学习arduino,请问下面的代码中,向ADXL发送Register_X0、Register_X1,以及下面的if条件是什么意 ...


这个具体意思不明,是按照产品说明手册(datasheet)进行编写的,具体这几行命令对应的寄存器怎样的意义。还是需要翻看datasheet。

帖子附件就是datasheet
回复 支持 反对

使用道具 举报

发表于 2011-12-14 11:24:33 | 显示全部楼层
弘毅 发表于 2011-8-28 17:02
根据产品手册描述,256输出数值代表1g,500多的数值代表加速度为2g左右。

今天刚刚搞清楚这个问题,为什么是256

要把传感器的度数转化为标准的g需要知道当前传感器设置的量程和最小刻度(分辨率),试验中ADXL345应该是采用16g量程(最大测量正负16g加速度)13位分辨率,就是说输出范围是2的13次方(8192),那么单位输出对应的加速度大小应该为32/8192 = 1/256,所以要把传感器度数转换为g需要除以256
回复 支持 反对

使用道具 举报

发表于 2011-12-14 11:28:35 | 显示全部楼层
freeplus 发表于 2011-11-21 02:17
楼主有没有测试过读取一组加速度数值总共需要多少时间啊?
我用的是非Arduino系统,但是传感器用的是ADXL3 ...

我用arduino读取每秒钟可以读取1000组以上
回复 支持 反对

使用道具 举报

发表于 2011-12-16 10:56:02 | 显示全部楼层
弘老师,请教一下,我前两天买的一个ADXL345,板子上面只有三个电容和一个ADXL345。引脚跟你的电路图一模一样。手头只有一个LCD按键(LCD1602 KEYPAD V2.0模块)的板,电路板是买来的时候设置好的了,做不了弘老师的液晶部分,所以自己改了一下程序希望通过串口显示,代码如下:
  1. #include <Wire.h>  //调用arduino自带的I2C库
  2. #define Register_ID 0
  3. #define Register_2D 0x2D
  4. #define Register_X0 0x32
  5. #define Register_X1 0x33
  6. #define Register_Y0 0x34
  7. #define Register_Y1 0x35
  8. #define Register_Z0 0x36
  9. #define Register_Z1 0x37

  10. int ADXAddress = 0xA7>>1;  //转换为7位地址
  11. int reading = 0;
  12. int val = 0;
  13. int X0,X1,X_out;
  14. int Y0,Y1,Y_out;
  15. int Z1,Z0,Z_out;
  16. double Xg,Yg,Zg;

  17. void setup()

  18. {
  19.   Serial.begin(9600);
  20.   Wire.begin();  //初始化I2C
  21.   delay(100);
  22.   Wire.beginTransmission(ADXAddress);
  23.   Wire.send(Register_2D);
  24.   Wire.send(8);
  25.   Wire.endTransmission();
  26. }

  27. void loop()

  28. {
  29.   Wire.beginTransmission(ADXAddress);
  30.   Wire.send(Register_X0);
  31.   Wire.send(Register_X1);
  32.   Wire.endTransmission();
  33.   Wire.requestFrom(ADXAddress,2);
  34.   if(Wire.available()<=2);
  35.   {
  36.     X0 = Wire.receive();
  37.     X1 = Wire.receive();
  38.     X1 = X1<<8;
  39.     X_out = X0+X1;
  40.   }

  41.   Wire.beginTransmission(ADXAddress);
  42.   Wire.send(Register_Y0);
  43.   Wire.send(Register_Y1);
  44.   Wire.endTransmission();
  45.   Wire.requestFrom(ADXAddress,2);
  46.   if(Wire.available()<=2);
  47.   {
  48.     Y0 = Wire.receive();
  49.     Y1 = Wire.receive();
  50.     Y1 = Y1<<8;
  51.     Y_out = Y0+Y1;
  52.   }
  53.   Wire.beginTransmission(ADXAddress);
  54.   Wire.send(Register_Z0);
  55.   Wire.send(Register_Z1);
  56.   Wire.endTransmission();
  57.   Wire.requestFrom(ADXAddress,2);
  58.   if(Wire.available()<=2);
  59.   {
  60.     Z0 = Wire.receive();
  61.     Z1 = Wire.receive();
  62.     Z1 = Z1<<8;
  63.     Z_out = Z0+Z1;
  64.   }
  65.   Xg = X_out/256.00;//把输出结果转换为重力加速度g,精确到小数点后2位。
  66.   Yg = Y_out/256.00;
  67.   Zg = Z_out/256.00;
  68.   /*/////////////////////////////////////////
  69.    显示X轴
  70.    /////////////////////////////////////////*/
  71.   Serial.print("x=");
  72.   Serial.print(Xg,DEC);
  73.   Serial.print("g");
  74.   Serial.println();
  75.   /*///////////////////////////////////////
  76.    显示Y轴
  77.    /////////////////////////////////////////*/
  78.   Serial.print("y=");
  79.   Serial.print(Yg,DEC);
  80.   Serial.print("g");
  81.   Serial.println();
  82.   /*///////////////////////////////////////
  83.    显示Z轴
  84.    /////////////////////////////////////////*/
  85.   Serial.print("z=");
  86.   Serial.print(Zg,DEC);
  87.   Serial.print("g");
  88.   Serial.println();
  89.   delay(300);  //延时0.3秒,刷新频率这里进行调整
  90. }
复制代码
但是显示的都是0.0000g,不知道怎么回事?我用了sparkfun上面的程序,用的是ISP通讯。但读到的数据也都是0,0,0.不知道是模块的问题还是程序问题。麻烦帮我看下上面修改后的程序是否可行?请弘老师或者各位高人指点下,谢谢!
回复 支持 2 反对 0

使用道具 举报

发表于 2011-12-20 22:30:56 | 显示全部楼层
在arduino 1.0里 send方法 替换为 wirte ,receive方法 替换为 read
回复 支持 反对

使用道具 举报

发表于 2011-12-26 10:25:55 | 显示全部楼层
lw0616 发表于 2011-12-5 20:58
你好,刚刚学习arduino,请问下面的代码中,向ADXL发送Register_X0、Register_X1,以及下面的if条件是什么意 ...

Wire.send(Register_X0);
Wire.send(Register_X1);
是向ADXL设置起作用的寄存器地址,这里是Register_X0和Register_X1,这两个地址内的数值(每个8bit)合并后(16bit)即为X方向上加速度的值。设置好后,下面receive的就是存储在这两个寄存器内的值了。
if(Wire.available()<=2); Wire.available()<=2是说可读取的值即byte的个数。
我的理解正常情况下应该是两个,即Wire.available()<=2时执行大括号里的内容。但为什么弘老师把分号写在了大括号前面,就不理解了,希望弘老师能作答。

回复 支持 反对

使用道具 举报

 楼主| 发表于 2011-12-26 10:45:15 | 显示全部楼层
树·水·风 发表于 2011-12-26 10:25
Wire.send(Register_X0);
Wire.send(Register_X1);
是向ADXL设置起作用的寄存器地址,这里是Register_X ...


这些代码也不是我写的。。。是东找找。。西找找,找到能用的,然后写了下代码中文注释,就发上来了。@@看到寄存器我就头晕。。。。寄存器相关。。。大家自己研究研究,我是不太懂那东东。
回复 支持 反对

使用道具 举报

发表于 2012-2-24 14:39:22 | 显示全部楼层
Wire.beginTransmission(ADXAddress);

这句没看懂什么意思
回复 支持 反对

使用道具 举报

发表于 2012-2-24 14:59:50 | 显示全部楼层
ALT ADDRESS引脚处于高电平,器件的7位I2C地址是0x1D,随后为R/W位。这转化为0x3A写入,0x3B读取。通过ALT ADDRESS引脚(引脚12)接地,可以选择备用I2C地址0x53(随后为R/W位)。这转化为0xA6写入,0xA7读取。

以上是ADXL345说明书上的,真心没看懂……
回复 支持 反对

使用道具 举报

发表于 2012-2-27 22:39:48 | 显示全部楼层
新手正在试这个例子,刚连通1602,明天加上3.3V电源再试345了,作个记号.
回复 支持 反对

使用道具 举报

发表于 2012-3-7 20:44:27 | 显示全部楼层


今天试验成功,用的MINI PRO,连了一堆线,作实验MINI还是不太方便啊.
这个三轴加速度在静态时能测量角度变化,动态计算估计就复杂了.
这个传感器使用还需要认真读手册了.

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

发表于 2012-3-20 21:13:44 | 显示全部楼层
nomady 发表于 2011-12-14 11:24
今天刚刚搞清楚这个问题,为什么是256

要把传感器的度数转化为标准的g需要知道当前传感器设置的量程和 ...

那如果我把测量范围设置成+-2g。。13位分辨率。。那么仍然256代表1g吗?
回复 支持 反对

使用道具 举报

发表于 2012-4-5 22:15:26 | 显示全部楼层
我没有1602,只有12864,那叫一个麻烦,
回复 支持 反对

使用道具 举报

发表于 2012-4-5 22:18:42 | 显示全部楼层
我是先吧Xg*100,再取余或模,得出三个位上的数字,哦,先还要把Xg弄成  int  有没有先进一点的方法
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-4-5 22:20:14 | 显示全部楼层
diamondliu 发表于 2012-4-5 22:18
我是先吧Xg*100,再取余或模,得出三个位上的数字,哦,先还要把Xg弄成  int  有没有先进一点的方法

用串口输出数据到PC吧。。。
回复 支持 反对

使用道具 举报

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

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

Archiver|联系我们|极客工坊

GMT+8, 2024-4-19 17:54 , Processed in 0.044693 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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