ADXL345三轴加速 arduino

来源:互联网 发布:平面图设计软件下载 编辑:程序博客网 时间:2024/04/30 05:39

很早就听说Arduino,早就想玩了。最近搞了快Arduino板子,就是前面介绍的Arduino Leonardo,最近需要用到传感器,从三轴加速度ADXL345开始。

开发环境:
系统:XP
单板:Arduino Leonardo
平台:Arduino-1.5.2

目标:读三轴加速度ADXL345的原始数据,并通过串口显示

一、硬件介绍

ADXL345是一款小而薄的超低功耗3 轴加速度计,分辨率高(13位),测量范围达±  16g 。数字输出数据为16 位二进制补码格式,可通过SPI(3线或4线)或I2C数字接口访问。ADXL345非常适合移动设备应用。它可以在倾斜检测应用中测量静态重力加速度,还可以测量运动或冲击导致的动态加速度。其高分辨率(3.9mg/LSB),能够测量不到1.0° 的
倾斜角度变化。ADXL345模块原理图如下:

这里只用到SCL、SDA、VCC_3.3V、GND分别连接到Arduino的对应接口上。Arduino Leonardo上直接标有SDA、SCL连上即可,其它Arduino根据自己的板子连接。

二、编写测试代码

其实在Arduino上写代码非常简单,很多库都帮你做好了,直接调用即可,十分方便。但Arduino的版本很多,特别是Arduino-1.0以后,有些库有所改变,需要看对应版本的参考手册arduino-1.5.2-windows\arduino-1.5.2\reference下面有详细说明,我也是结合网上找的程序参考这些修改。代码如下

文件adx1345.ino

[plain] view plaincopy
  1. #include <Wire.h>  
  2.   
  3. #define Register_ID 0  
  4. #define Register_2D 0x2D  
  5. #define Register_X0 0x32  
  6. #define Register_X1 0x33  
  7. #define Register_Y0 0x34  
  8. #define Register_Y1 0x35  
  9. #define Register_Z0 0x36  
  10. #define Register_Z1 0x37  
  11.   
  12. int ADXAddress = 0xA7 >> 1;  // the default 7-bit slave address  
  13. int reading = 0;  
  14. int val=0;  
  15. int X0,X1,X_out;  
  16. int Y0,Y1,Y_out;  
  17. int Z1,Z0,Z_out;  
  18. double Xg,Yg,Zg;  
  19.   
  20. void setup()  
  21. {  
  22.   Wire.begin();                  
  23.   Serial.begin(9600);      
  24.   delay(100);  
  25.   // enable to measute g data  
  26.   Wire.beginTransmission(ADXAddress);  
  27.   Wire.write(Register_2D);  
  28.   Wire.write(8);                //measuring enable  
  29.   Wire.endTransmission();     // stop transmitting  
  30.   
  31. }  
  32.   
  33. void loop()  
  34. {  
  35.   //--------------X  
  36.   Wire.beginTransmission(ADXAddress); // transmit to device  
  37.   Wire.write(Register_X0);  
  38.   Wire.write(Register_X1);  
  39.   Wire.endTransmission();  
  40.   Wire.requestFrom(ADXAddress,2);   
  41.   if(Wire.available()<=2)     
  42.   {  
  43.     X0 = Wire.read();  
  44.     X1 = Wire.read();   
  45.     X1=X1<<8;  
  46.     X_out=X0+X1;     
  47.   }  
  48.   
  49.   //------------------Y  
  50.   Wire.beginTransmission(ADXAddress); // transmit to device  
  51.   Wire.write(Register_Y0);  
  52.   Wire.write(Register_Y1);  
  53.   Wire.endTransmission();  
  54.   Wire.requestFrom(ADXAddress,2);   
  55.   if(Wire.available()<=2)     
  56.   {  
  57.     Y0 = Wire.read();  
  58.     Y1 = Wire.read();   
  59.     Y1=Y1<<8;  
  60.     Y_out=Y0+Y1;  
  61.   }  
  62.   //------------------Z  
  63.   Wire.beginTransmission(ADXAddress); // transmit to device  
  64.   Wire.write(Register_Z0);  
  65.   Wire.write(Register_Z1);  
  66.   Wire.endTransmission();  
  67.   Wire.requestFrom(ADXAddress,2);   
  68.   if(Wire.available()<=2)     
  69.   {  
  70.     Z0 = Wire.read();  
  71.     Z1 = Wire.read();   
  72.     Z1=Z1<<8;  
  73.     Z_out=Z0+Z1;  
  74.   }  
  75.   /*  
  76.   //display the real value  
  77.   Xg=X_out/256.0;  
  78.   Yg=Y_out/256.0;  
  79.   Zg=Z_out/256.0;  
  80.   */  
  81.   //display the reading value  
  82.   Xg=X_out;  
  83.   Yg=Y_out;  
  84.   Zg=Z_out;  
  85.   Serial.print("X= ");  
  86.   Serial.print(Xg);  
  87.   Serial.print("       ");  
  88.   Serial.print("Y= ");  
  89.   Serial.print(Yg);  
  90.   Serial.print("       ");  
  91.   Serial.print("Z= ");  
  92.   Serial.print(Zg);  
  93.   Serial.println("  ");  
  94.   delay(200);  
  95. }  

需要对着手册操作,根据手册上介绍的寄存器设置、读写。寄存器FORMAT-OX31使用默认值0x0,设置加速度范围-2g~2g,根据手册

我们设置的采样范围-2g~2g,根据手册知道我们的加速度传感器采样值最大范围 -282~282,其中存在偏差。10位分辨率,采样范围-2g~2g,则1024/(2g-(-2g))=256LSB/g,也就是说理想值是256对应2g的加速度,呆会测试时水平放置时,读到垂直方向的值应该是128,对应重力加速度1g.开始测试,看是不是这样

3.编译、测试

Arduino还是很方便操作的,选择好单板、参考,直接点上面的“对勾”就开始编译,编译没问题,点“->”箭头状的,开始上传程序,直至上传进度条完成。

 

接着打开Tools/Serial Monitor 显示如下:

这是水平放的,Z方向垂直加速度。不是很平

这是X方向,向X方向举起

这是向Y方向,其实模块后面有个坐标轴,朝坐标方向测试。

基本正常,但是这些数据还不能直接拿来用,还要进一步优化,以后会结合卡尔曼滤波等算法优化。