本帖最后由 零知实验室-roc 于 2019-5-23 14:35 编辑
本篇文章将使用三轴加速度传感器:ADXL345,在零知平台上进行加速度和单双击检测功能演示。通过本文的介绍让大家学会如何使用这款功能强大的三轴加速度传感器。
1、说明
MCU:零知开发板-标准板
2、传感器:ADXL345三轴加速度传感器
ADXL345 是 ADI 公司推出的基于 iMEMS 技术的 3 轴、数字输出加速度传感器。该加速度传感器的特点有: a. 分辨率高。最高 13 位分辨率。 b. 量程可变。具有+/-2g, +/-4g, +/-8g, +/-16g 可变的测量范围。 c. 灵敏度高。最高达 3.9mg/LSB,能测量不到 1.0°的倾斜角度变化。 d. 功耗低。 40~145uA 的超低功耗,待机模式只有 0.1uA。 e. 尺寸小。整个 IC 尺寸只有 3mm*5mm*1mm, LGA 封装。 ADXL 支持标准的 I2C 或 SPI 数字接口,自带 32 级 FIFO 存储,并且内部有多种运动状态检测和灵活的中断方式等特性。 2、电路连接 接线很简单,只需要把模块的SCL、SDA引脚与零知标准板的I2C(A5、A4)引脚相连接即可,供电3.3V,其他引脚采用模块默认的连接。
连接好线路后,就打开使用我们的零知开发工具,找到对应代码上传代码到开发板即可。
3、核心代码: [mw_shl_code=arduino,true]/*
* ADXL345 三轴加速度传感器DEMO
* powered by 零知实验室-www.lingzhilab.com
*/
#include "ADXL345.h"
// 默认的I2C地址为0x53
ADXL345 accel;
int16_t ax, ay, az;//原始值
float nx,ny,nz;//重力加速度
#define LED_PIN LED_BUILTIN
bool blinkState = false;
//检测单击、双击动作参数设置
void checkActivitySetup()
{
accel.setTapAxisXEnabled(false);//设置X轴方向敲击检测
accel.setTapAxisYEnabled(false);//y轴方向检测
accel.setTapAxisZEnabled(true);
accel.setTapThreshold(40);//界限设置:40*0.0625 = 2.5g
accel.setTapDuration(32);//持续时间:32*0.625ms = 20 ms
accel.setDoubleTapLatency(80);//延迟:80*1.25ms = 100ms
accel.setDoubleTapWindow(240);//窗口:240*1.25ms = 300ms
}
void checkActivity()
{
Activites act = accel.readActivites();
if (act.isDoubleTap)
{
Serial.println("Double Tap Detected");
} else if (act.isTap)
{
Serial.println("Tap Detected");
}else
{
Serial.println("no activity");
}
}
void setup() {
Serial.begin(9600);
// 初始化ADXL345
Serial.println("Initializing I2C devices...");
accel.initialize();
// 检测是否连接ADXL345
Serial.println("Testing device connections...");
if(accel.testConnection()){
Serial.println("ADXL345 connection successful");
}else{
Serial.println("ADXL345 connection failed");
}
// Set measurement range
// +/- 2G: ADXL345_RANGE_2G
// +/- 4G: ADXL345_RANGE_4G
// +/- 8G: ADXL345_RANGE_8G
// +/- 16G: ADXL345_RANGE_16G
accel.setRange(ADXL345_RANGE_16G);
checkActivitySetup();//开启单击、双击动作检测
// 用LED指示数据读取
pinMode(LED_PIN, OUTPUT);
}
void loop() {
#if 0
// 获取原始的X,Y,Z三轴的数据
accel.getAcceleration(&ax, &ay, &az);
// 显示 x/y/z 原始数值
Serial.print("accel:\t");
Serial.print(ax); Serial.print("\t");
Serial.print(ay); Serial.print("\t");
Serial.println(az);
#endif
#if 1
//获取重力转换后的加速度数值
accel.readNormalize(&nx,&ny,&nz);
//使用低通滤波进行处理,以去除尖峰的不准确结果
float fx, fy, fz;
//系数范围 0.1~0.9
// accel.lowPassFilter(nx,ny,nz,&fx,&fy,&fz,0.5);
Serial.print("gravity:\t");
Serial.print(nx); Serial.print("\t");
Serial.print(ny); Serial.print("\t");
Serial.println(nz);
//
// Serial.print("filter:\t");
// Serial.print(fx); Serial.print("\t");
// Serial.print(fy); Serial.print("\t");
// Serial.println(fz);
#endif
#if 1
checkActivity();//单双击动作检测
#endif
// 闪烁LED
blinkState = !blinkState;
digitalWrite(LED_PIN, blinkState);
delay(300);
}[/mw_shl_code] 该应用代码演示了三个轴向的加速度和单击、双击检测的功能。 完整代码工程可到零知实验室官网免费获取。 结果如下:
更多详细资料可到零知实验室官网免费获取。
|