三轴加速度传感器采用ADXL345芯片,此芯片应用MEMS技术,具有SPI和IIC数字输出功能,芯片小巧轻薄,功耗低,量程可变,分辨率高。外形尺寸仅为3mm×5mm×1mm;在典型电压Vs=2.5V时功耗电流约为25~130μA,最大量程可达±16g,另可选择±2、±4、±8g 量程,可采用固定的4mg/LSB 分辨率模式,该分辨率可测得0.25°的倾角变化。
ADXL345非常适合移动设备应用。它可以在倾斜检测应用中测量静态重力加速度,还可以测量运动或冲击导致的动态加速度。该器件提供多种特殊检测功能,活动和非活动检测功能。通过比较任意轴上的加速度与用户设置的阈值来检测有无运动发生。敲击检测功能可以检测任意方向的单振和双振动作。自由落体检测功能可以检测器件是否正在掉落。这些功能可以独立映射到两个中断输出引脚中的一个。
下面我们就使用ADXL345三轴加速度计制作角度测试仪
在实验前,先对ADXL345三轴加速度计传感器接口做个简单的介绍
本模块使用ADXL345的IIC通信接口
共有四个引脚分别是:+、-、SDA、SCL
其中+、-是模块的供电Vcc和GND,SDA是IIC的时钟引脚、SCL是IIC的数据引脚
接下来开始进行试验
* 准备硬件
1、Carduino UNO R3 控制器 * 1个
2、LCD12864 液晶扩展板 * 1个
3、杜邦线 * 4条
4、USB数据线 * 1条
* 硬件连接
如图所示:本实验接线非常简单,LCD12864液晶扩展板接口是与Carduino UNO R3控制器完全兼容的,将他们对应插接在一起即可,然后连接ADXL345模块,+、- 分别连接到液晶扩展板的 Vcc(红色排针)、GND(黑色排针),SDA 连接 A4,SCL 连接 A5
* 示例代码
#include "U8glib.h"
#include
#define Register_ID 0 //器件ID
#define Register_2D 0x2D //静止、活动、休眠、唤醒
#define Register_X0 0x32 //X轴数据0
#define Register_X1 0x33 //X轴数据1
#define Register_Y0 0x34 //Y轴数据0
#define Register_Y1 0x35 //Y轴数据1
#define Register_Z0 0x36 //Z轴数据0
#define Register_Z1 0x37 //Z轴数据1
int ADXAddress = 0xA7>>1; //转换为7位地址
int X0,X1,X_out;
int Y0,Y1,Y_out;
int Z1,Z0,Z_out;
int valx,valy,valz;
U8GLIB_MINI12864 u8g(5, 6, 2, 4, 3);
void draw()
{
u8g.setFont(u8g_font_unifont);
u8g.drawStr( 0,11,"x_angle:");
u8g.setPrintPos(70,11);
u8g.print(valx);
u8g.drawStr( 0,36,"y_angle:");
u8g.setPrintPos(70,36);
u8g.print(valy);
u8g.drawStr( 0,63,"z_angle:");
u8g.setPrintPos(70,63);
u8g.print(valz);
}
int Readx()
{
Wire.beginTransmission(ADXAddress);
Wire.write(Register_X0);//请求X0数据
Wire.write(Register_X1);//请求X1数据
Wire.endTransmission();
Wire.requestFrom(ADXAddress,2);//发送请求
if(Wire.available()<=2);
{
X0 = Wire.read();//收到X0数据
X1 = Wire.read();//收到X1数据
X1 = X1<<8;
X_out = X0+X1;
}
valx = map(X_out,-256,256,-90,90);
return valx;
}
int Ready()
{
Wire.beginTransmission(ADXAddress);
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;
}
valy = map(Y_out,-256,256,-90,90);
return valy;
}
int Readz()
{
Wire.beginTransmission(ADXAddress);
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;
}
valz = map(Z_out,-256,256,-90,90);
return valz;
}
void setup() {
Serial.begin(9600); //设置通信波特率
Wire.begin(); //初始化I2C
Wire.beginTransmission(ADXAddress);//发送芯片地址
Wire.write(Register_2D);//特性控制
Wire.write(8);//关闭休眠模式
Wire.endTransmission();//结束发送
}
void loop() {
valy = Ready();
valx = Readx();
valz = Readz();
u8g.firstPage();
do {
draw();
}
while( u8g.nextPage() );
delay(200);
}
注意此程序需要使用到库文件,大家可以点击此处,进入奥松机器人官方技术论坛,下载模块的示例程序及技术文档
* 程序效果
如图所示:在LCD12864液晶扩展板上会实时显示当前传感器的X、Y、Z轴角度
----------------------------------------------------------------------------------------------------------------
奥松机器人官网:www.robotbase.cn
微信号:搜索公众号“奥松机器人”
QQ群: 271230889(讨论,解惑)
微博:@奥松机器人基地
----------------------------------------------------------------------------------------------------------------
温馨提示:予人玫瑰,手留余香;如果你喜欢这篇文章,不妨转发推荐给你身边的朋友!
近期新闻
热门新闻
奥松智能微信