找回密码
 立即注册

QQ登录

只需一步,快速开始

本帖最后由 lou 于 2020-5-15 12:14 编辑

基于Arduino使用ADXL345三轴倾斜度模块



122.jpg
(ADXL345三轴倾斜度模块)

产品介绍

ADXL345是一款小巧纤薄的低功耗三轴加速度计,可以对高达±16g的加速度进行高分辨率(13位)测量,数字输出数据为16位二进制补码格式,可通过SPI(3线或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,既能测量运动或冲击导致的动态加速度,也能测量静止加速度,例如重力加速度,使得器件可作为倾斜传感器使用,该传感器为多晶硅表面微加工结构,置于晶圆顶部,由于应用加速度,多晶硅弹簧悬挂于晶圆表面的结构之上,提供力量阻力,差分电容由独立固定板和活动质量连接板组成,能对结构偏转进行测量,加速度使惯性质量偏转、差分电容失衡,从而传感器输出的幅度与加速度成正比,相敏解调用于确定加速度的幅度和极性。

123.png
(电路原理图)

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

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

接线方式

Arduino uno                         ADXL345三轴倾斜度模块
      GND           <------>                    GND
   3V3/5V          <------>                    VCC
   3V3/5V          <------>                     CS
      GND           <------>                    SD0
       A4              <------>                   SDA
       A5              <------>                   SCL

Mixly 图形化编程程序

124.png
(图形化程序)


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

125.png
(串口数值显示)



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

126.png
(串口数值显示)



程序实现代码

  1. #include <Wire.h>
  2. #include <I2Cdev.h>
  3. #include <ADXL345.h>
  4. ADXL345 accel;
  5. void setup(){
  6.   Serial.begin(9600);
  7.   Wire.begin();
  8.   accel.initialize();
  9. }
  10. void loop(){
  11.   Serial.println(accel.getAccelerationX()/256.0);
  12.   delay(1000);
  13. }
复制代码

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

结合Arduinouno 、ADXL345三轴倾斜度模块和LCD1602 液晶显示屏,实现改变三轴倾斜度模块的X、Y和Z轴的不同方向,在LCD1602 液晶显示屏进行显示。

127.jpg
LCD1602 液晶显示屏正面



128.jpg
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 图形化编程程序

129.png
(图形化程序)

程序实现代码

  1. #include <SoftI2CMaster.h>
  2. #include <LiquidCrystal_SoftI2C.h>
  3. #include <Wire.h>
  4. #include <I2Cdev.h>
  5. #include <ADXL345.h>
  6. volatile float X;
  7. volatile float Y;
  8. volatile float Z;
  9. LiquidCrystal_SoftI2C mylcd(0x27,16,2,A3,A2);
  10. ADXL345 accel;
  11. void setup(){
  12.   X = 0;
  13.   Y = 0;
  14.   Z = 0;
  15.   mylcd.init();
  16.   mylcd.backlight();
  17.   Wire.begin();
  18.   accel.initialize();
  19. }
  20. void loop(){
  21.   X = accel.getAccelerationX()/256.0;
  22.   Y = accel.getAccelerationY()/256.0;
  23.   Z = accel.getAccelerationZ()/256.0;
  24.   mylcd.setCursor(0, 0);
  25.   mylcd.print(String(String("X:") + String(X)) + String("g"));
  26.   mylcd.setCursor(0, 1);
  27.   mylcd.print(String(String(String("Y:") + String(Y)) + String("g")) + String(String(String("Z:") + String(Z)) + String("g")));
  28. }
复制代码

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

130.jpg

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

Mixly 图形化编程程序

131.jpg
(图形化程序)



程序实现代码

  1. #include <SoftI2CMaster.h>
  2. #include <LiquidCrystal_SoftI2C.h>
  3. #include <Wire.h>
  4. #include <I2Cdev.h>
  5. #include <ADXL345.h>
  6. volatile float X;
  7. volatile float Y;
  8. volatile float Z;
  9. LiquidCrystal_SoftI2C mylcd(0x27,16,2,A3,A2);
  10. ADXL345 accel;
  11. void setup(){
  12.   X = 0;
  13.   Y = 0;
  14.   Z = 0;
  15.   mylcd.init();
  16.   mylcd.backlight();
  17.   Wire.begin();
  18.   accel.initialize();
  19. }
  20. void loop(){
  21.   X = accel.getAccelerationX()/256.0;
  22.   Y = accel.getAccelerationY()/256.0;
  23.   Z = accel.getAccelerationZ()/256.0;
  24.   if (X < 0) {
  25.     mylcd.setCursor(0, 0);
  26.     mylcd.print(String(String("X:") + String(X)) + String("g"));
  27.     mylcd.setCursor(0, 1);
  28.     mylcd.print("");
  29.   } else {
  30.     mylcd.setCursor(0, 0);
  31.     mylcd.print(String(String("X: ") + String(X)) + String("g"));
  32.     mylcd.setCursor(0, 1);
  33.     mylcd.print("");
  34.   }
  35.   if (Y < 0 && Z < 0) {
  36.     mylcd.setCursor(0, 0);
  37.     mylcd.print("");
  38.     mylcd.setCursor(0, 1);
  39.     mylcd.print(String(String(String("Y:") + String(Y)) + String("g")) + String(String(String("Z:") + String(Z)) + String("g")));
  40.   } else if (Y > 0 && Z < 0) {
  41.     mylcd.setCursor(0, 0);
  42.     mylcd.print("");
  43.     mylcd.setCursor(0, 1);
  44.     mylcd.print(String(String(String("Y: ") + String(Y)) + String("g")) + String(String(String("Z:") + String(Z)) + String("g")));
  45.   } else if (Y < 0 && Z > 0) {
  46.     mylcd.setCursor(0, 0);
  47.     mylcd.print("");
  48.     mylcd.setCursor(0, 1);
  49.     mylcd.print(String(String(String("Y:") + String(Y)) + String("g")) + String(String(String("Z: ") + String(Z)) + String("g")));
  50.   } else if (Y > 0 && Z > 0) {
  51.     mylcd.setCursor(0, 0);
  52.     mylcd.print("");
  53.     mylcd.setCursor(0, 1);
  54.     mylcd.print(String(String(String("Y: ") + String(Y)) + String("g")) + String(String(String("Z: ") + String(Z)) + String("g")));
  55.   }
  56. }
复制代码

分享至 : QQ空间
收藏
您需要登录后才可以回帖 登录 | 立即注册