lou 发表于 2020-5-15 12:01:54

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

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

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


(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,既能测量运动或冲击导致的动态加速度,也能测量静止加速度,例如重力加速度,使得器件可作为倾斜传感器使用,该传感器为多晶硅表面微加工结构,置于晶圆顶部,由于应用加速度,多晶硅弹簧悬挂于晶圆表面的结构之上,提供力量阻力,差分电容由独立固定板和活动质量连接板组成,能对结构偏转进行测量,加速度使惯性质量偏转、差分电容失衡,从而传感器输出的幅度与加速度成正比,相敏解调用于确定加速度的幅度和极性。
(电路原理图)
一、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 <Wire.h>
#include <I2Cdev.h>
#include <ADXL345.h>
ADXL345 accel;
void setup(){
Serial.begin(9600);
Wire.begin();
accel.initialize();
}
void loop(){
Serial.println(accel.getAccelerationX()/256.0);
delay(1000);
}

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

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


(LCD1602 液晶显示屏反面)


LCD1602 液晶显示屏引脚说明

GND地线
VCC电源(5V or 3.3v 电源不同显示效果有点差别)
SDAI2C 数据线
SCLI2C 时钟线

接线方式
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 <SoftI2CMaster.h>
#include <LiquidCrystal_SoftI2C.h>
#include <Wire.h>
#include <I2Cdev.h>
#include <ADXL345.h>
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三轴倾斜度模块时,X和Z的显示有时会出现两个“g”

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


程序实现代码

#include <SoftI2CMaster.h>
#include <LiquidCrystal_SoftI2C.h>
#include <Wire.h>
#include <I2Cdev.h>
#include <ADXL345.h>
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]
查看完整版本: 基于Arduino使用ADXL345三轴倾斜度模块