单片机/MCU论坛
直播中

roc

9年用户 27经验值
擅长:控制/MCU
私信 关注
[文章]

零知开源分享-ADXL345三轴加速度传感器的使用

本篇文章将使用三轴加速度传感器和零知开发板在零知平台上进行加速度和单双击检测功能演示。通过本文的介绍让大家学会如何使用这款功能强大的三轴加速度传感器。
1、说明
MCU:零知开发板-标准板


传感器:ADXL345三轴加速度传感器

                  

ADXL345 是 ADI 公司推出的基于 iMEMS 技术的 3 轴、数字输出加速度传感器
2、电路连接
接线很简单,只需要把模块的SCL、SDA引脚与零知标准板的I2C(A5、A4)引脚相连接即可,供电3.3V,其他引脚采用模块默认的连接。



连接好线路后,就打开使用我们的零知开发工具,找到对应代码上传代码到开发板即可。



3、核心代码如下:

  1. /*
  2. *        ADXL345 三轴加速度传感器DEMO
  3. *        powered by 零知实验室
  4. */
  5. #include "ADXL345.h"

  6. // 默认的I2C地址为0x53

  7. ADXL345 accel;

  8. int16_t ax, ay, az;//原始值
  9. float nx,ny,nz;//重力加速度

  10. #define LED_PIN LED_BUILtiN
  11. bool blinkState = false;

  12. //检测单击、双击动作参数设置
  13. void checkActivitySetup()
  14. {
  15.         accel.setTapAxisXEnabled(false);//设置X轴方向敲击检测
  16.         accel.setTapAxisYEnabled(false);//y轴方向检测
  17.         accel.setTapAxisZEnabled(true);
  18.          
  19.         accel.setTapThreshold(40);//界限设置:40*0.0625 = 2.5g
  20.         accel.setTapDuration(32);//持续时间:32*0.625ms = 20 ms
  21.         accel.setDoubleTapLatency(80);//延迟:80*1.25ms = 100ms
  22.         accel.setDoubleTapWindow(240);//窗口:240*1.25ms = 300ms
  23.       
  24. }

  25. void checkActivity()
  26. {
  27.         Activites act = accel.readActivites();

  28.   if (act.isDoubleTap)
  29.   {
  30.     Serial.println("Double Tap Detected");
  31.   } else if (act.isTap)
  32.   {
  33.     Serial.println("Tap Detected");
  34.   }else
  35.   {
  36.          Serial.println("no activity");
  37.   }
  38. }

  39. void setup() {
  40.      
  41.     Serial.begin(9600);

  42.     // 初始化ADXL345
  43.     Serial.println("Initializing I2C devices...");
  44.     accel.initialize();

  45.     // 检测是否连接ADXL345
  46.     Serial.println("Testing device connections...");
  47.         if(accel.testConnection()){
  48.                 Serial.println("ADXL345 connection successful");
  49.         }else{
  50.                 Serial.println("ADXL345 connection failed");
  51.         }
  52.          
  53.          // Set measurement range
  54.   // +/-  2G: ADXL345_RANGE_2G
  55.   // +/-  4G: ADXL345_RANGE_4G
  56.   // +/-  8G: ADXL345_RANGE_8G
  57.   // +/- 16G: ADXL345_RANGE_16G
  58.   accel.setRange(ADXL345_RANGE_16G);
  59.          
  60.         checkActivitySetup();//开启单击、双击动作检测
  61.      
  62.     // 用LED指示数据读取
  63.     pinMode(LED_PIN, OUTPUT);
  64. }

  65. void loop() {
  66. #if 0        
  67.         // 获取原始的X,Y,Z三轴的数据
  68.     accel.getAcceleration(&ax, &ay, &az);

  69.     // 显示 x/y/z 原始数值
  70.     Serial.print("accel:t");
  71.     Serial.print(ax); Serial.print("t");
  72.     Serial.print(ay); Serial.print("t");
  73.     Serial.println(az);
  74.          
  75. #endif
  76. #if 1
  77.         //获取重力转换后的加速度数值
  78.         accel.readNormalize(&nx,&ny,&nz);
  79.          
  80.         //使用低通滤波进行处理,以去除尖峰的不准确结果
  81.         float fx, fy, fz;
  82.         //系数范围 0.1~0.9
  83. //        accel.lowPassFilter(nx,ny,nz,&fx,&fy,&fz,0.5);
  84.          
  85.         Serial.print("gravity:t");
  86.     Serial.print(nx); Serial.print("t");
  87.     Serial.print(ny); Serial.print("t");
  88.     Serial.println(nz);
  89. //        
  90. //        Serial.print("filter:t");
  91. //    Serial.print(fx); Serial.print("t");
  92. //    Serial.print(fy); Serial.print("t");
  93. //    Serial.println(fz);
  94. #endif
  95. #if 1
  96.         checkActivity();//单双击动作检测
  97. #endif

  98.     // 闪烁LED
  99.     blinkState = !blinkState;
  100.     digitalWrite(LED_PIN, blinkState);
  101.          
  102.         delay(300);
  103. }
该应用代码包含了传感器三个轴向的加速度和单击、双击的检测功能。
完整代码工程可到零知实验室官网免费获取。
3、测试结果

更多详细资料可到零知实验室官网免费获取。

更多回帖

发帖
×
20
完善资料,
赚取积分