本帖最后由 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 | | | 电源(5V or 3.3v 电源不同显示效果有点差别) | | | | |
接线方式
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")));
- }
- }
复制代码
|