当前位置:首页  <  产品评测  <  【产品测评】基于ADXL345三轴加速度计的角度测试仪...
【产品测评】基于 ADXL345 三轴加速度计的角度测试仪
编辑:neil 2016-09-27 浏览次数:1303

三轴加速度传感器采用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   //调用arduino自带的I2C

#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(讨论,解惑)

微博:@奥松机器人基地

----------------------------------------------------------------------------------------------------------------

温馨提示:予人玫瑰,手留余香;如果你喜欢这篇文章,不妨转发推荐给你身边的朋友!