16164浏览
楼主: 驴友花雕

[项目] 【Arduino】168种传感器模块系列实验(48)---三轴ADXL345模块

[复制链接]

驴友花雕  中级技神
 楼主|

发表于 2022-5-25 14:43:58

2Arduino参考开源代码

  1. /*
  2.   【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
  3.   程序十一:ADXL345 传感器控制红蓝绿三色LED灯
  4. */
  5. #include <Wire.h>
  6. #include <Adafruit_Sensor.h>
  7. #include <Adafruit_ADXL345_U.h>//导入ADXL345驱动库
  8. Adafruit_ADXL345_Unified accel = Adafruit_ADXL345_Unified();
  9. void setup(void) {
  10.   Serial.begin(9600);//串口初始化
  11.   Serial.println("ADXL345 传感器控制红蓝绿三色LED灯");
  12.   if (!accel.begin())
  13.   {
  14.     Serial.println("未检测到 ADXL345 传感器。");
  15.     while (1);
  16.   }
  17.   pinMode(7, OUTPUT); // 激活 LED 的输出模式
  18.   pinMode(6, OUTPUT);
  19.   pinMode(5, OUTPUT);
  20. }
  21. void loop(void) {
  22.   sensors_event_t event;
  23.   accel.getEvent(&event);
  24.   float  x = event.acceleration.x;
  25.   float  y = event.acceleration.y;
  26.   float  z = event.acceleration.z;
  27.   
  28.   //串口打印X\Y\Z数值
  29.   Serial.print("X: "); Serial.print(x); Serial.print("  ");
  30.   Serial.print("Y: "); Serial.print(y); Serial.print("  ");
  31.   Serial.print("Z: "); Serial.print(z); Serial.print("  ");
  32.   Serial.println("m/s^2 ");
  33.   
  34.   if (x < 5) { //它识别的条件
  35.     //轴的移动。
  36.     digitalWrite(7, HIGH);
  37.   }
  38.   else {
  39.     digitalWrite(7, LOW);
  40.   }
  41.   if (y < 5) {
  42.     digitalWrite(6, HIGH);
  43.   }
  44.   else {
  45.     digitalWrite(6, LOW);
  46.   }
  47.   if (z != -1) { //传感器倒置时标记 -1G
  48.     digitalWrite(5, HIGH);
  49.   }
  50.   else {
  51.     digitalWrite(5, LOW);
  52.   }
  53.   delay(1000);
  54. }
复制代码


回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2022-5-25 14:45:29

3)实验串口返回情况

【Arduino】168种传感器模块系列实验(48)---三轴ADXL345模块图1

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2022-5-25 14:47:32

4)实验场景图

【Arduino】168种传感器模块系列实验(48)---三轴ADXL345模块图1

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2022-5-30 21:12:40

【Arduino】168种传感器模块系列实验(48)---三轴ADXL345模块图1
回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2022-6-6 10:37:53

程序十二:校准ADXL345的指南
1)实验接线示意图

【Arduino】168种传感器模块系列实验(48)---三轴ADXL345模块图1

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2022-6-6 10:40:00

2Arduino参考开源代码

  1. /*
  2.   【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
  3.   程序十二:校准ADXL345的指南
  4. */
  5. #include<Wire.h>
  6. #include<ADXL345_WE.h>
  7. #define ADXL345_I2CADDR 0x53
  8. /* 有几种方法可以创建ADXL345对象:
  9. * ADXL345_WE myAcc = ADXL345_WE()                -> uses Wire / I2C Address = 0x53
  10. * ADXL345_WE myAcc = ADXL345_WE(ADXL345_I2CADDR) -> uses Wire / ADXL345_I2CADDR
  11. * ADXL345_WE myAcc = ADXL345_WE(&wire2)          -> uses the TwoWire object wire2 / ADXL345_I2CADDR
  12. * ADXL345_WE myAcc = ADXL345_WE(&wire2, ADXL345_I2CADDR) -> all together
  13. */
  14. ADXL345_WE myAcc = ADXL345_WE(ADXL345_I2CADDR);
  15. void setup(){
  16.   Wire.begin();
  17.   Serial.begin(9600);
  18.   Serial.println("ADXL345校准程序准备就绪");
  19.   Serial.println();
  20.   
  21.   if(!myAcc.init()){
  22.     Serial.println("ADXL345 未连接!");
  23.   }
  24.   Serial.println("校准程序:");
  25.   Serial.println(" - 保持全分辨率");
  26.   Serial.println(" - 电源电压有影响(至少对于模块)");
  27.   Serial.println("        ->选择您将在项目中使用的相同电压!");
  28.   Serial.println(" - 慢慢地转动你的 ADXL (!)找到最小和最大原始 x,y 和 z 值");
  29.   Serial.println(" - 一个或两个单位的偏差并不重要");
  30.   Serial.println(" - 校准改变 g 与原始的斜率,并假设零为 (最小值 + 最大值)/2 ");
  31.   Serial.println(" - 记下六个值 ");
  32.   Serial.println(" - 您可以尝试实验中得到的校准值");
  33.   Serial.println(" - 准备好了吗?然后键入任何密钥并发送。 ");
  34.   
  35.   while(!Serial.available());
  36.   Serial.read();
  37.   Serial.println();
  38.   Serial.println();
  39.   Serial.println();  
  40. }
  41. void loop() {
  42.   xyzFloat raw = myAcc.getRawValues();
  43.   Serial.print("Raw-x = ");
  44.   Serial.print(raw.x);
  45.   Serial.print("  |  Raw-y = ");
  46.   Serial.print(raw.y);
  47.   Serial.print("  |  Raw-z = ");
  48.   Serial.println(raw.z);
  49.   
  50.   delay(1000);  
  51. }
复制代码


回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2022-6-6 10:41:22

3)实验串口返回情况

【Arduino】168种传感器模块系列实验(48)---三轴ADXL345模块图1

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2022-6-6 10:43:45

4)实验说明:见上图红点处,这里确定的六个值是:

X(最小值)=-295
X(最大值)=255
Y(最小值)=-283
Y(最大值)=264
Z(最小值)=-262
Z(最大值)=265

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2022-6-8 11:47:59

程序十三:通过输入程序十二中获得的值来应用校准(导入实测的修正值)
1Arduino参考开源代码

  1. /*
  2.   【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
  3.   程序十三:通过输入程序十二中获得的值来应用校准(导入实测的修正值)
  4. */
  5. #include<Wire.h>
  6. #include<ADXL345_WE.h>
  7. #define ADXL345_I2CADDR 0x53
  8. /*有几种方法可以创建ADXL345对象:
  9.    ADXL345_WE myAcc = ADXL345_WE()                -> uses Wire / I2C Address = 0x53
  10.    ADXL345_WE myAcc = ADXL345_WE(ADXL345_I2CADDR) -> uses Wire / ADXL345_I2CADDR
  11.    ADXL345_WE myAcc = ADXL345_WE(&wire2)          -> uses the TwoWire object wire2 / ADXL345_I2CADDR
  12.    ADXL345_WE myAcc = ADXL345_WE(&wire2, ADXL345_I2CADDR) -> all together
  13. */
  14. ADXL345_WE myAcc = ADXL345_WE(ADXL345_I2CADDR);
  15. void setup() {
  16.   Wire.begin();
  17.   Serial.begin(9600);
  18.   Serial.println("ADXL345准备就绪!");
  19.   Serial.println();
  20.   if (!myAcc.init()) {
  21.     Serial.println("ADXL345 未连接!");
  22.   }
  23.   myAcc.setCorrFactors(-295.0, 255.0, -283.0, 264.0, -262.0, 265.0);
  24.   /* 在下一步中,角度偏移被校正,以获得相当精确的校正
  25.     x 和 y 的角度可达 ~60°。附加偏移校正仅用于
  26.     校正角度测量。该过程仅确保从0°开始。
  27.   */
  28.   Serial.println("将ADXL345平放,不要移动它");
  29.   delay(2000);
  30.   myAcc.measureAngleOffsets();
  31.   Serial.println("....完成");
  32.   myAcc.setDataRate(ADXL345_DATA_RATE_25);
  33.   myAcc.setRange(ADXL345_RANGE_2G);
  34. }
  35. void loop() {
  36.   xyzFloat raw = myAcc.getRawValues();
  37.   xyzFloat g = myAcc.getGValues();
  38.   xyzFloat angle = myAcc.getAngles();
  39.   xyzFloat corrAngles = myAcc.getCorrAngles();
  40.   /* 仍然是未更正的原始值!!*/
  41.   Serial.print("Raw-x    = ");
  42.   Serial.print(raw.x);
  43.   Serial.print("  |  Raw-y    = ");
  44.   Serial.print(raw.y);
  45.   Serial.print("  |  Raw-z    = ");
  46.   Serial.println(raw.z);
  47.   /* g 值使用校正后的原始数据 */
  48.   Serial.print("g-x     = ");
  49.   Serial.print(g.x);
  50.   Serial.print("  |  g-y     = ");
  51.   Serial.print(g.y);
  52.   Serial.print("  |  g-z     = ");
  53.   Serial.println(g.z);
  54.   /* 角度使用校正后的 Raw。角度由以下公式简单计算
  55.     角度 = 弧度(g 值) */
  56.   Serial.print("角度 x  = ");
  57.   Serial.print(angle.x);
  58.   Serial.print("  |  角度 y  = ");
  59.   Serial.print(angle.y);
  60.   Serial.print("  |  角度 z  = ");
  61.   Serial.println(angle.z);
  62.   /* 校正后的角度使用校正的原始数据和额外的角度
  63.     偏移以确保它们从 0° 开始
  64.   */
  65.   Serial.print("校正角 x = ");
  66.   Serial.print(corrAngles.x);
  67.   Serial.print("  |  校正角 y   = ");
  68.   Serial.print(corrAngles.y);
  69.   Serial.print("  |  校正角 z   = ");
  70.   Serial.println(corrAngles.z);
  71.   Serial.print("模块的方向: ");
  72.   Serial.println(myAcc.getOrientationAsString());
  73.   Serial.println();
  74.   delay(1000);
  75. }
复制代码


回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2022-6-8 11:50:54

2)实验串口返回情况

【Arduino】168种传感器模块系列实验(48)---三轴ADXL345模块图1

3)实验说明
可以看到,z 轴的校正 g 值现在看起来要好得多。由于剩余的偏移,角度具有一定的偏差。另一方面,校正的角度(“校正角cAngles”)波动接近于零。

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2022-6-9 06:36:02

程序十四:测量 ADXL345 的俯仰角和滚动角与校正角度法的对比
1Arduino参考开源代码

  1. /*
  2.   【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
  3.   程序十四:测量 ADXL345 的俯仰角和滚动角与校正角度法的对比
  4. */
  5. #include<Wire.h>
  6. #include<ADXL345_WE.h>
  7. #define ADXL345_I2CADDR 0x53 // 如果 SDO = HIGH,则为 0x1D
  8. /* 有几种方法可以创建您的 ADXL345 对象:
  9.    ADXL345_WE myAcc = ADXL345_WE()                -> uses Wire / I2C Address = 0x53
  10.    ADXL345_WE myAcc = ADXL345_WE(ADXL345_I2CADDR) -> uses Wire / ADXL345_I2CADDR
  11.    ADXL345_WE myAcc = ADXL345_WE(&wire2)          -> uses the TwoWire object wire2 / ADXL345_I2CADDR
  12.    ADXL345_WE myAcc = ADXL345_WE(&wire2, ADXL345_I2CADDR) -> all together
  13. */
  14. ADXL345_WE myAcc = ADXL345_WE(ADXL345_I2CADDR);
  15. void setup() {
  16.   Wire.begin();
  17.   Serial.begin(9600);
  18.   Serial.println("ADXL345 程序 - 俯仰和横滚与校正角度");
  19.   Serial.println();
  20.   if (!myAcc.init()) {
  21.     Serial.println("ADXL345 未连接!");
  22.   }
  23.   /* 添加您使用 ADXL345_calibration.ino 找到的最小和最大原始值。
  24.       顺序是:setCorrFactors(min x, max x, min y, max y, min z, max z)。
  25.       setCorrFactors 校准斜率并假设零点
  26.       是(最小+最大)/2。您必须将 setCorrFactors 函数添加到所有草图
  27.       您想在其中使用它。
  28.   */
  29.   myAcc.setCorrFactors(-295.0, 255.0, -283.0, 264.0, -262.0, 265.0);
  30.   /* 在下一步中,角度的偏移被校正以获得相当精确的校正
  31.       角度 x 和 y 高达 ~60°。额外的 offsetCorrection 仅用于校正
  32.       角度测量,不适用于俯仰和滚动。该过程只是确保从 0° 开始。
  33.   */
  34.   Serial.println("将您的 ADXL345 平放,不要移动它");
  35.   delay(2000);
  36.   myAcc.measureAngleOffsets();
  37.   Serial.println("....完成");
  38.   /* 选择数据速率                  Hz
  39.       ADXL345_DATA_RATE_3200    3200
  40.       ADXL345_DATA_RATE_1600    1600
  41.       ADXL345_DATA_RATE_800      800
  42.       ADXL345_DATA_RATE_400      400
  43.       ADXL345_DATA_RATE_200      200
  44.       ADXL345_DATA_RATE_100      100
  45.       ADXL345_DATA_RATE_50        50
  46.       ADXL345_DATA_RATE_25        25
  47.       ADXL345_DATA_RATE_12_5      12.5
  48.       ADXL345_DATA_RATE_6_25       6.25
  49.       ADXL345_DATA_RATE_3_13       3.13
  50.       ADXL345_DATA_RATE_1_56       1.56
  51.       ADXL345_DATA_RATE_0_78       0.78
  52.       ADXL345_DATA_RATE_0_39       0.39
  53.       ADXL345_DATA_RATE_0_20       0.20
  54.       ADXL345_DATA_RATE_0_10       0.10
  55.   */
  56.   myAcc.setDataRate(ADXL345_DATA_RATE_50);
  57.   Serial.print("数据速率:");
  58.   Serial.print(myAcc.getDataRateAsString());
  59.   /* 选择测量范围
  60.       ADXL345_RANGE_16G    16g
  61.       ADXL345_RANGE_8G      8g
  62.       ADXL345_RANGE_4G      4g
  63.       ADXL345_RANGE_2G      2g
  64.   */
  65.   myAcc.setRange(ADXL345_RANGE_2G);
  66.   Serial.print("/g 范围:");
  67.   Serial.println(myAcc.getRangeAsString());
  68.   Serial.println();
  69. }
  70. void loop() {
  71.   //xyzFloat g = myAcc.getGValues();
  72.   xyzFloat corrAngles = myAcc.getCorrAngles();
  73.   /* 修正后的角度使用修正后的原始数据和额外的角度
  74.       抵消。该方法为 x/y 提供了相当精确的值
  75.       角度向上 60°。
  76.   */
  77.   Serial.print("角度 x = ");
  78.   Serial.print(corrAngles.x);
  79.   Serial.print("  |  角度 y = ");
  80.   Serial.print(corrAngles.y);
  81.   Serial.print("  |  角度 z = ");
  82.   Serial.println(corrAngles.z);
  83.   /* 俯仰和横滚使用更正的坡度,但没有额外的偏移。
  84.       所有轴都被考虑用于计算。
  85.   */
  86.   float pitch = myAcc.getPitch();
  87.   float roll  = myAcc.getRoll();
  88.   Serial.print("俯仰 ="); //将x轴的倾斜角度称为“俯仰”
  89.   Serial.print(pitch);
  90.   Serial.print("  | 滚动 = ");//将y轴的倾斜角度称为“滚动”
  91.   Serial.println(roll);
  92.   Serial.println();
  93.   delay(1000);
  94. }
复制代码


回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2022-6-9 06:38:03

(2)实验串口返回情况

【Arduino】168种传感器模块系列实验(48)---三轴ADXL345模块图1

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2022-6-9 06:39:51

3)打开Arduino IDE——工具——串口绘图器,查看实验波形
实验串口绘图器返回情况

【Arduino】168种传感器模块系列实验(48)---三轴ADXL345模块图1

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2022-6-11 10:06:16

程序十五:将ADXL345置于休眠状态,并唤醒它
1Arduino参考开源代码

  1. /*
  2.   【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
  3.   程序十五:将ADXL345置于休眠状态,并唤醒它
  4. */
  5. #include<Wire.h>
  6. #include<ADXL345_WE.h>
  7. #define ADXL345_I2CADDR 0x53
  8. /* 有几种方法可以创建您的 ADXL345 对象:
  9. * ADXL345_WE myAcc = ADXL345_WE()                -> uses Wire / I2C Address = 0x53
  10. * ADXL345_WE myAcc = ADXL345_WE(ADXL345_I2CADDR) -> uses Wire / ADXL345_I2CADDR
  11. * ADXL345_WE myAcc = ADXL345_WE(&wire2)          -> uses the TwoWire object wire2 / ADXL345_I2CADDR
  12. * ADXL345_WE myAcc = ADXL345_WE(&wire2, ADXL345_I2CADDR) -> all together
  13. */
  14. ADXL345_WE myAcc = ADXL345_WE(ADXL345_I2CADDR);
  15. void setup(){
  16.   Wire.begin();
  17.   Serial.begin(9600);
  18.   Serial.println("ADXL345实验程序 - 睡眠");
  19.   Serial.println();
  20.   if(!myAcc.init()){
  21.     Serial.println("ADXL345 未连接!");
  22.   }
  23.   myAcc.setDataRate(ADXL345_DATA_RATE_50);
  24.   myAcc.setRange(ADXL345_RANGE_2G);
  25. }
  26. void loop(){
  27.   myAcc.setSleep(true, ADXL345_WUP_FQ_1);
  28.   Serial.println("在睡眠模式下测量:");
  29.   doMeasurements();
  30.   
  31.   myAcc.setSleep(false);
  32.   Serial.println("正常模式下测量:");
  33.   doMeasurements();
  34. }
  35.   
  36. void doMeasurements(){
  37.   for(int i=0; i<10; i++){
  38.     xyzFloat g = myAcc.getGValues();
  39.    
  40.     Serial.print("g-x   = ");
  41.     Serial.print(g.x);
  42.     Serial.print("  |  g-y   = ");
  43.     Serial.print(g.y);
  44.     Serial.print("  |  g-z   = ");
  45.     Serial.println(g.z);
  46.    
  47.     delay(60);
  48.   }
  49. }
复制代码


回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2022-6-11 10:08:03

2)打开Arduino IDE——工具——串口绘图器,查看实验波形
实验串口绘图器返回情况

【Arduino】168种传感器模块系列实验(48)---三轴ADXL345模块图1

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2022-6-11 10:09:33

3)实验串口返回情况

【Arduino】168种传感器模块系列实验(48)---三轴ADXL345模块图1

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2022-6-13 15:00:52

16、程序十六:ADXL345自由落体中断(激活并分配给 INT2)
1)ADXL345的中断特性
有关中断功能的一般信息
ADXL345区分了八个中断:
a)溢出:当未读数据被覆盖时触发,即当数据速率大于数据检索的频率时。
水印:如果FIFO缓冲器中的测量值数量与FIFO控制寄存器中定义的值相对应(稍后会更清晰)。
b)自由落体:当所有轴上的加速度值在一段时间内低于某个值时,就会触发该值。
c)不活动:在指定时间内超过指定轴上的加速度限制时。
d)活动:当指定轴上的加速度超过极限时。
e)单点:超过特定限制的最大持续时间的加速度。
f)双击:两个峰值,两者都满足单点条件,并且它们之间也有一定的时间间隔。
g)数据就绪:存在未读数据。
h)使用函数:激活中断。第一个参数是中断类型,第二个参数是确定中断输出的引脚。setInterrupt(type, pin1/pin2)
请务必注意,“溢出”、“水印”和“数据就绪”的中断始终处于启用状态。因此,您无法禁用它们,只需更改输出引脚即可。默认值为 INT1。您必须先激活所有其他中断。您可以使用 停用它们。deleteInterrupt(type)
在中断寄存器中,在中断的情况下,存储中断类型。读取此寄存器将删除中断,以便可以触发新的中断。其函数为 。它将中断类型作为字节返回。如何“翻译”这可以在库文件ADXL345_WE.h中找到。或者,您可以检查特定类型。readAndClearInterrupts()checkInterrupt(source, type)
还有另一个通用功能,即.这将设置中断引脚是低电平有效还是高电平有效(默认)。setInterruptPolarity(polarity)

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2022-6-13 15:02:06

2Arduino参考开源代码

  1. /*
  2.   【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
  3.   程序十六:ADXL345自由落体中断(激活并分配给 INT2)
  4. */
  5. #include<Wire.h>
  6. #include<ADXL345_WE.h>
  7. #define ADXL345_I2CADDR 0x53
  8. const int int2Pin = 2;
  9. volatile bool freeFall = false;
  10. /* 有几种方法可以创建您的 ADXL345 对象:
  11.    ADXL345_WE myAcc = ADXL345_WE()                -> uses Wire / I2C Address = 0x53
  12.    ADXL345_WE myAcc = ADXL345_WE(ADXL345_I2CADDR) -> uses Wire / ADXL345_I2CADDR
  13.    ADXL345_WE myAcc = ADXL345_WE(&wire2)          -> uses the TwoWire object wire2 / ADXL345_I2CADDR
  14.    ADXL345_WE myAcc = ADXL345_WE(&wire2, ADXL345_I2CADDR) -> all together
  15. */
  16. ADXL345_WE myAcc = ADXL345_WE(ADXL345_I2CADDR);
  17. void setup() {
  18.   Wire.begin();
  19.   Serial.begin(9600);
  20.   pinMode(int2Pin, INPUT);
  21.   Serial.println("ADXL345_Sketch - ADXL345实验程序 - 自由落体中断");
  22.   Serial.println();
  23.   if (!myAcc.init()) {
  24.     Serial.println("ADXL345 未连接!");
  25.   }
  26.   /* 插入测试的数据并取消注释以获得更精确的结果 */
  27.   myAcc.setCorrFactors(-295.0, 255.0, -283.0, 264.0, -262.0, 265.0);
  28.   myAcc.setDataRate(ADXL345_DATA_RATE_25);
  29.   myAcc.setRange(ADXL345_RANGE_2G);
  30.   /* setFreeFallThresholds函数的参数为​​:
  31.        -g 阈值——不要选择太低的参数。 0.3 - 0.6 克就可以了。
  32.        - 以毫秒为单位的时间阈值,最大值为 1275。推荐为 100 - 350;
  33.       如果时间阈值太低,则可以将振动检测为自由落体。
  34.   */
  35.   myAcc.setFreeFallThresholds(0.4, 100);
  36.   /* 你可以选择以下中断:
  37.        Variable name:             Triggered, if:
  38.       ADXL345_OVERRUN      -   new data replaces unread data
  39.       ADXL345_WATERMARK    -   the number of samples in FIFO equals the number defined in FIFO_CTL
  40.       ADXL345_FREEFALL     -   acceleration values of all axes are below the threshold defined in THRESH_FF
  41.       ADXL345_INACTIVITY   -   acc. value of all included axes are < THRESH_INACT for period > TIME_INACT
  42.       ADXL345_ACTIVITY     -   acc. value of included axes are > THRESH_ACT
  43.       ADXL345_DOUBLE_TAP   -   double tap detected on one incl. axis and various defined conditions are met
  44.       ADXL345_SINGLE_TAP   -   single tap detected on one incl. axis and various defined conditions are met
  45.       ADXL345_DATA_READY   -   new data available
  46.       Assign the interrupts to INT1 (INT_PIN_1) or INT2 (INT_PIN_2). Data ready, watermark and overrun are
  47.       always enabled. You can only change the assignment of these which is INT1 by default.
  48.       You can delete interrupts with deleteInterrupt(type);
  49.   */
  50.   myAcc.setInterrupt(ADXL345_FREEFALL, INT_PIN_2);
  51.   attachInterrupt(digitalPinToInterrupt(int2Pin), freeFallISR, RISING);
  52.   freeFall = false;
  53. }
  54. void loop() {
  55.   xyzFloat raw = myAcc.getRawValues();
  56.   xyzFloat g = myAcc.getGValues();
  57.   Serial.print("Raw-x = ");
  58.   Serial.print(raw.x);
  59.   Serial.print("  |  Raw-y = ");
  60.   Serial.print(raw.y);
  61.   Serial.print("  |  Raw-z = ");
  62.   Serial.println(raw.z);
  63.   Serial.print("g-x   = ");
  64.   Serial.print(g.x);
  65.   Serial.print("  |  g-y   = ");
  66.   Serial.print(g.y);
  67.   Serial.print("  |  g-z   = ");
  68.   Serial.println(g.z);
  69.   Serial.println();
  70.   if (freeFall == true) {
  71.     Serial.println("Aaaaaaaaah!!!!! - 我是 faaaaallllling!");
  72.     delay(1000);
  73.     freeFall = false;
  74.     /* 通过读取中断寄存器清除中断 */
  75.     myAcc.readAndClearInterrupts();
  76.     /* 如果您还期望其他中断,您可以检查类型。对于此评论的上一行,
  77.         并替换为以下四行:*/
  78.     //byte intType = myAcc.readAndClearInterrupts();
  79.     //if(myAcc.checkInterrupt(intType, ADXL345_FREEFALL)){
  80.     //  Serial.println("FREEFALL confirmed");
  81.     //}
  82.   }
  83.   delay(500);
  84. }
  85. void freeFallISR() {
  86.   freeFall = true;
  87. }
复制代码


回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2022-6-13 15:03:23

3)实验串口返回情况

【Arduino】168种传感器模块系列实验(48)---三轴ADXL345模块图1

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2022-6-13 15:04:55

4)打开Arduino IDE——工具——串口绘图器,查看实验波形
实验串口绘图器返回情况

【Arduino】168种传感器模块系列实验(48)---三轴ADXL345模块图1

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2022-6-13 15:07:35

程序十七:数据就绪中断在 Arduino 引脚 2 上触发中断(分配给 INT2)
1Arduino参考开源代码

  1. /*
  2.   【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
  3.   程序十七:数据就绪中断在 Arduino 引脚 2 上触发中断(分配给 INT2)
  4. */
  5. #include<Wire.h>
  6. #include<ADXL345_WE.h>
  7. #define ADXL345_I2CADDR 0x53
  8. const int int2Pin = 2;  // 中断引脚
  9. volatile bool dataReady = false;
  10. /* 有几种方法可以创建ADXL345对象:
  11.    ADXL345_WE myAcc = ADXL345_WE()                -> uses Wire / I2C Address = 0x53
  12.    ADXL345_WE myAcc = ADXL345_WE(ADXL345_I2CADDR) -> uses Wire / ADXL345_I2CADDR
  13.    ADXL345_WE myAcc = ADXL345_WE(&wire2)          -> uses the TwoWire object wire2 / ADXL345_I2CADDR
  14.    ADXL345_WE myAcc = ADXL345_WE(&wire2, ADXL345_I2CADDR) -> all together
  15. */
  16. ADXL345_WE myAcc = ADXL345_WE(ADXL345_I2CADDR);
  17. void setup() {
  18.   Wire.begin();
  19.   Serial.begin(9600);
  20.   pinMode(int2Pin, INPUT);
  21.   Serial.println("ADXL345实验程序 - 数据就绪中断");
  22.   Serial.println();
  23.   if (!myAcc.init()) {
  24.     Serial.println("ADXL345 未连接!");
  25.   }
  26.   myAcc.setDataRate(ADXL345_DATA_RATE_0_20);
  27.   myAcc.setRange(ADXL345_RANGE_2G);
  28.   attachInterrupt(digitalPinToInterrupt(int2Pin), dataReadyISR, RISING);
  29.   /* 默认中断引脚极性为高电平有效。如果您愿意,请更改 */
  30.   // myAcc.setInterruptPolarity(ADXL345_ACT_LOW);
  31.   myAcc.setInterrupt(ADXL345_DATA_READY, INT_PIN_2);
  32. }
  33. /* 在以下循环中,INT2 上只能出现一种中断类型。
  34.   如果您期望有更多的候选人,您可以检查如下:
  35.   uint8_t intType = myAcc.readAndClearInterrupts();
  36.   if(myAcc.checkInterrupt(intType, ADXL345_DATA_READY)){
  37.   Serial.println(“DATA READY CONFIRMED”);
  38.         }
  39. */
  40. void loop() {
  41.   // 你看这里是无延迟控制输出速率
  42.   if (dataReady == true) {
  43.     xyzFloat g = myAcc.getGValues();
  44.     Serial.print("g-x   = ");
  45.     Serial.print(g.x);
  46.     Serial.print("  |  g-y   = ");
  47.     Serial.print(g.y);
  48.     Serial.print("  |  g-z   = ");
  49.     Serial.println(g.z);
  50.     dataReady = false;
  51.   }
  52. }
  53. void dataReadyISR() {
  54.   dataReady = true;
  55. }
复制代码


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail