ADXL345三轴加速 arduino
2013-11-25 20:24
246 查看
很早就听说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
#include <Wire.h>
#define Register_ID 0
#define Register_2D 0x2D
#define Register_X0 0x32
#define Register_X1 0x33
#define Register_Y0 0x34
#define Register_Y1 0x35
#define Register_Z0 0x36
#define Register_Z1 0x37
int ADXAddress = 0xA7 >> 1; // the default 7-bit slave address
int reading = 0;
int val=0;
int X0,X1,X_out;
int Y0,Y1,Y_out;
int Z1,Z0,Z_out;
double Xg,Yg,Zg;
void setup()
{
Wire.begin();
Serial.begin(9600);
delay(100);
// enable to measute g data
Wire.beginTransmission(ADXAddress);
Wire.write(Register_2D);
Wire.write(8); //measuring enable
Wire.endTransmission(); // stop transmitting
}
void loop()
{
//--------------X
Wire.beginTransmission(ADXAddress); // transmit to device
Wire.write(Register_X0);
Wire.write(Register_X1);
Wire.endTransmission();
Wire.requestFrom(ADXAddress,2);
if(Wire.available()<=2)
{
X0 = Wire.read();
X1 = Wire.read();
X1=X1<<8;
X_out=X0+X1;
}
//------------------Y
Wire.beginTransmission(ADXAddress); // transmit to device
Wire.write(Register_Y0);
Wire.write(Register_Y1);
Wire.endTransmission();
Wire.requestFrom(ADXAddress,2);
if(Wire.available()<=2)
{
Y0 = Wire.read();
Y1 = Wire.read();
Y1=Y1<<8;
Y_out=Y0+Y1;
}
//------------------Z
Wire.beginTransmission(ADXAddress); // transmit to device
Wire.write(Register_Z0);
Wire.write(Register_Z1);
Wire.endTransmission();
Wire.requestFrom(ADXAddress,2);
if(Wire.available()<=2)
{
Z0 = Wire.read();
Z1 = Wire.read();
Z1=Z1<<8;
Z_out=Z0+Z1;
}
/*
//display the real value
Xg=X_out/256.0;
Yg=Y_out/256.0;
Zg=Z_out/256.0;
*/
//display the reading value
Xg=X_out;
Yg=Y_out;
Zg=Z_out;
Serial.print("X= ");
Serial.print(Xg);
Serial.print(" ");
Serial.print("Y= ");
Serial.print(Yg);
Serial.print(" ");
Serial.print("Z= ");
Serial.print(Zg);
Serial.println(" ");
delay(200);
}
需要对着手册操作,根据手册上介绍的寄存器设置、读写。寄存器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方向,其实模块后面有个坐标轴,朝坐标方向测试。
基本正常,但是这些数据还不能直接拿来用,还要进一步优化,以后会结合卡尔曼滤波等算法优化。
开发环境:
系统: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
#include <Wire.h>
#define Register_ID 0
#define Register_2D 0x2D
#define Register_X0 0x32
#define Register_X1 0x33
#define Register_Y0 0x34
#define Register_Y1 0x35
#define Register_Z0 0x36
#define Register_Z1 0x37
int ADXAddress = 0xA7 >> 1; // the default 7-bit slave address
int reading = 0;
int val=0;
int X0,X1,X_out;
int Y0,Y1,Y_out;
int Z1,Z0,Z_out;
double Xg,Yg,Zg;
void setup()
{
Wire.begin();
Serial.begin(9600);
delay(100);
// enable to measute g data
Wire.beginTransmission(ADXAddress);
Wire.write(Register_2D);
Wire.write(8); //measuring enable
Wire.endTransmission(); // stop transmitting
}
void loop()
{
//--------------X
Wire.beginTransmission(ADXAddress); // transmit to device
Wire.write(Register_X0);
Wire.write(Register_X1);
Wire.endTransmission();
Wire.requestFrom(ADXAddress,2);
if(Wire.available()<=2)
{
X0 = Wire.read();
X1 = Wire.read();
X1=X1<<8;
X_out=X0+X1;
}
//------------------Y
Wire.beginTransmission(ADXAddress); // transmit to device
Wire.write(Register_Y0);
Wire.write(Register_Y1);
Wire.endTransmission();
Wire.requestFrom(ADXAddress,2);
if(Wire.available()<=2)
{
Y0 = Wire.read();
Y1 = Wire.read();
Y1=Y1<<8;
Y_out=Y0+Y1;
}
//------------------Z
Wire.beginTransmission(ADXAddress); // transmit to device
Wire.write(Register_Z0);
Wire.write(Register_Z1);
Wire.endTransmission();
Wire.requestFrom(ADXAddress,2);
if(Wire.available()<=2)
{
Z0 = Wire.read();
Z1 = Wire.read();
Z1=Z1<<8;
Z_out=Z0+Z1;
}
/*
//display the real value
Xg=X_out/256.0;
Yg=Y_out/256.0;
Zg=Z_out/256.0;
*/
//display the reading value
Xg=X_out;
Yg=Y_out;
Zg=Z_out;
Serial.print("X= ");
Serial.print(Xg);
Serial.print(" ");
Serial.print("Y= ");
Serial.print(Yg);
Serial.print(" ");
Serial.print("Z= ");
Serial.print(Zg);
Serial.println(" ");
delay(200);
}
需要对着手册操作,根据手册上介绍的寄存器设置、读写。寄存器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方向,其实模块后面有个坐标轴,朝坐标方向测试。
基本正常,但是这些数据还不能直接拿来用,还要进一步优化,以后会结合卡尔曼滤波等算法优化。
相关文章推荐
- string和stringbuilder的区别
- UIP UDP的补丁
- cvCaptureFromCam is working but cvQueryFrame returns NULL
- ios学习笔记之UI篇(一):隐藏键盘的方法
- iphone在使用tabbar时如何使用转换动画
- LogMananger.repositorySelector was null likely due to error in class reloading, using N
- Writing Code Suitable for Implementation with Conditional Moves
- Android中使用proguardgui混淆jar包
- Android中使用proguardgui混淆jar包
- 如何有效锻炼腹肌
- 遇到问题-------perl无法使用多线程This Perl not built to support threads
- 遇到问题-------perl无法使用多线程This Perl not built to support threads
- 游泳,再好不过的健身,养生利器
- hdu 1711 Number Sequence
- Inside TSQL Querying - Chapter 1. Logical Query Processing
- ligeruiGrid简单实例
- 最大子序列和问题
- STL源码剖析之heap,priority_queue【2013.11.25】
- 错误:is quoted with " which must be escaped when used within the value (转载)
- UIActivityIndicatorView--小菊花停止旋转