找回密码
 立即注册

QQ登录

只需一步,快速开始

星原力教育科技 首页 创客工坊 查看内容

基于Arduino制作ADXL345三轴加速度检测仪

2020-5-19 10:38| 发布者: lou| 查看: 412| 评论: 0

摘要: 基于Arduino制作ADXL345三轴加速度检测仪http://mk.xyuanli.com/source/plugin/micxp_mp4upload/data/4/73168c3a2357f7585d45b11e247d2f8e_183.mp4(ADXL345三轴倾斜度模块)产品介绍ADXL345是一款小巧纤薄的低功耗 ...

基于Arduino制作ADXL345三轴加速度检测仪





ADXL345三轴倾斜度模块)


产品介绍


ADXL345是一款小巧纤薄的低功耗三轴加速度计,可以对高达±16g的加速度进行高分辨率(13位)测量,数字输出数据为16位二进制补码格式,可通过SPI3线或4线)或I2C数字接口访问。

本模块非常适合移动设备应用,它可以在倾斜检测应用中测量静态重力加速度,还可以测量运动或冲击导致的动态加速度,它具有高分辨率(4mg/LSB),能够测量约0.25°的倾角变化,使用ADXL345等数字输出加速度计时,无需进行模数转换,从而可以节省系统成本和电路板面积。该器件提供多种特殊检测功能,活动和非活动检测功能检测有无运动发生,以及任意轴上的加速度是否超过用户设置的限值,敲击检测功能可以检测单击和双击动作。自由落体检测功能可以检测器件是否正在掉落,这些功能可以映射到两个中断输出引脚中的一个,正在申请专利的32级先进先出(FIFO)缓冲器可用于存储数据,最大程度地减少主机处理器的干预,低功耗模式支持基于运动的智能电源管理,从而以极低的功耗进行阈值感测和运动加速度测量。


产品参数


产品型号:GY-291

使用芯片:ADXL345

供电电源:3-5V

通信方式:IIC/SPI通信协议

测量范围:±2g、±16g

三轴,±2g/±4g/±8g/±16g数字加速度模块


工作原理


ADXL345是一款完整的3轴加速度测量系统,可选择的测量范围有±2 g±4 g±8 g±16 g,既能测量运动或冲击导致的动态加速度,也能测量静止加速度,例如重力加速度,使得器件可作为倾斜传感器使用,该传感器为多晶硅表面微加工结构,置于晶圆顶部,由于应用加速度,多晶硅弹簧悬挂于晶圆表面的结构之上,提供力量阻力,差分电容由独立固定板和活动质量连接板组成,能对结构偏转进行测量,加速度使惯性质量偏转、差分电容失衡,从而传感器输出的幅度与加速度成正比,相敏解调用于确定加速度的幅度和极性。


(电路原理图)


一、ADXL345三轴倾斜度模块基础案例1


结合Arduino uno  ADXL345三轴倾斜度模块,程序测试----串口打印读取X轴加速度的数值。


接线方式


Arduino uno                        ADXL345三轴倾斜度模块

      GND           <------>                  GND

    3V3/5V         <------>                  VCC

    3V3/5V         <------>                   CS

      GND           <------>                  SD0

       A4             <------>                  SDA

       A5             <------>                  SCL


Mixly 图形化编程程序


(图形化程序)


1、将ADXL345三轴倾斜度模块在X轴方向上向左倾斜,串口打印读取数值


(串口数值显示)


2、ADXL345三轴倾斜度模块在X轴方向上向右倾斜,串口打印读取数值


(串口数值显示)


程序实现代码


#include

#include

#include

ADXL345 accel;

void setup(){

  Serial.begin(9600);

  Wire.begin();

  accel.initialize();

}

void loop(){

  Serial.println(accel.getAccelerationX()/256.0);

  delay(1000);

}


二、ADXL345三轴倾斜度模块基础案例2


结合Arduino uno ADXL345三轴倾斜度模块和LCD1602 液晶显示屏,实现改变三轴倾斜度模块的XYZ轴的不同方向,在LCD1602 液晶显示屏进行显示。


LCD1602 液晶显示屏正面


LCD1602 液晶显示屏反面


LCD1602 液晶显示屏引脚说明


GND

地线

VCC

电源(5V or 3.3v 电源不同显示效果有点差别)

SDA

I2C 数据线

SCL

I2C 时钟线


接线方式


Arduino uno                         ADXL345三轴倾斜度模块

      GND            <------>                   GND

      3V3             <------>                    VCC

    3V3/5V          <------>                     CS

      GND            <------>                    SD0

       A4              <------>                    SDA

       A5              <------>                    SCL


Arduino uno                          LCD1602 液晶显示屏

     GND             <------>                 GND

      5V               <------>                  VCC

      A2               <------>                  SDA

      A3               <------>                   SCL


Mixly 图形化编程程序


(图形化程序)


程序实现代码


#include

#include

#include

#include

#include

volatile float X;

volatile float Y;

volatile float Z;

LiquidCrystal_SoftI2C mylcd(0x27,16,2,A3,A2);

ADXL345 accel;

void setup(){

  X = 0;

  Y = 0;

  Z = 0;

  mylcd.init();

  mylcd.backlight();

  Wire.begin();

  accel.initialize();

}

void loop(){

  X = accel.getAccelerationX()/256.0;

  Y = accel.getAccelerationY()/256.0;

  Z = accel.getAccelerationZ()/256.0;

  mylcd.setCursor(0, 0);

  mylcd.print(String(String("X:") + String(X)) + String("g"));

  mylcd.setCursor(0, 1);

  mylcd.print(String(String(String("Y:") + String(Y)) + String("g")) + String(String(String("Z:") + String(Z)) + String("g")));

}


实验结果显示存在问题:在转动 ADXL345三轴倾斜度模块时,XZ的显示有时会出现两个“g



改进程序解决方案:当XYZ轴的加速度值数值大于0时,对应显示在 LCD1602 液晶显示屏的”X:””Y:””Z:”加空格。

Mixly 图形化编程程序


(图形化程序)


程序实现代码


#include

#include

#include

#include

#include

volatile float X;

volatile float Y;

volatile float Z;

LiquidCrystal_SoftI2C mylcd(0x27,16,2,A3,A2);

ADXL345 accel;

void setup(){

  X = 0;

  Y = 0;

  Z = 0;

  mylcd.init();

  mylcd.backlight();

  Wire.begin();

  accel.initialize();

}

void loop(){

  X = accel.getAccelerationX()/256.0;

  Y = accel.getAccelerationY()/256.0;

  Z = accel.getAccelerationZ()/256.0;

  if (X < 0) {

    mylcd.setCursor(0, 0);

    mylcd.print(String(String("X:") + String(X)) + String("g"));

    mylcd.setCursor(0, 1);

    mylcd.print("");

  } else {

    mylcd.setCursor(0, 0);

    mylcd.print(String(String("X: ") + String(X)) + String("g"));

    mylcd.setCursor(0, 1);

    mylcd.print("");

  }

  if (Y < 0 && Z < 0) {

    mylcd.setCursor(0, 0);

    mylcd.print("");

    mylcd.setCursor(0, 1);

    mylcd.print(String(String(String("Y:") + String(Y)) + String("g")) + String(String(String("Z:") + String(Z)) + String("g")));

  } else if (Y > 0 && Z < 0) {

    mylcd.setCursor(0, 0);

    mylcd.print("");

    mylcd.setCursor(0, 1);

    mylcd.print(String(String(String("Y: ") + String(Y)) + String("g")) + String(String(String("Z:") + String(Z)) + String("g")));

  } else if (Y < 0 && Z > 0) {

    mylcd.setCursor(0, 0);

    mylcd.print("");

    mylcd.setCursor(0, 1);

    mylcd.print(String(String(String("Y:") + String(Y)) + String("g")) + String(String(String("Z: ") + String(Z)) + String("g")));

  } else if (Y > 0 && Z > 0) {

    mylcd.setCursor(0, 0);

    mylcd.print("");

    mylcd.setCursor(0, 1);

    mylcd.print(String(String(String("Y: ") + String(Y)) + String("g")) + String(String(String("Z: ") + String(Z)) + String("g")));

  }

}

鲜花
鲜花 (1)
握手
握手
雷人
雷人
路过
路过
鸡蛋
鸡蛋

刚表态过的朋友 (1 人)