【雕爷学编程】Arduino动手做(48)---GY-291 ADXL345 三轴模块5
37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手试试多做实验,不管成功与否,都会记录下来——小小的进步或是搞不掂的问题,希望能够抛砖引玉。
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验四十八:GY-291 ADXL345 数字三轴重力加速度倾斜度模块 IIC/SPI传输
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验四十八:GY-291 ADXL345 数字三轴重力加速度倾斜度模块 IIC/SPI传输
程序十一:ADXL345 传感器控制红蓝绿三色LED灯
实验接线示意图(实际为IIC接法)
Arduino实验开源代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | /* 【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程) 程序十一:ADXL345 传感器控制红蓝绿三色LED灯 */ #include <Wire.h> #include <Adafruit_Sensor.h> #include <Adafruit_ADXL345_U.h>//导入ADXL345驱动库 Adafruit_ADXL345_Unified accel = Adafruit_ADXL345_Unified(); void setup( void ) { Serial.begin(9600); //串口初始化 Serial.println( "ADXL345 传感器控制红蓝绿三色LED灯" ); if (!accel.begin()) { Serial.println( "未检测到 ADXL345 传感器。" ); while (1); } pinMode(7, OUTPUT); // 激活 LED 的输出模式 pinMode(6, OUTPUT); pinMode(5, OUTPUT); } void loop( void ) { sensors_event_t event ; accel.getEvent(& event ); float x = event .acceleration.x; float y = event .acceleration.y; float z = event .acceleration.z; //串口打印X\Y\Z数值 Serial.print( "X: " ); Serial.print(x); Serial.print( " " ); Serial.print( "Y: " ); Serial.print(y); Serial.print( " " ); Serial.print( "Z: " ); Serial.print(z); Serial.print( " " ); Serial.println( "m/s^2 " ); if (x < 5) { //它识别的条件 //轴的移动。 digitalWrite(7, HIGH); } else { digitalWrite(7, LOW); } if (y < 5) { digitalWrite(6, HIGH); } else { digitalWrite(6, LOW); } if (z != -1) { //传感器倒置时标记 -1G digitalWrite(5, HIGH); } else { digitalWrite(5, LOW); } delay(1000); } |
实验串口返回情况
Arduino实验场景图
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验四十八:GY-291 ADXL345 数字三轴重力加速度倾斜度模块 IIC/SPI传输
程序十二:校准ADXL345的指南
实验接线示意图
Arduino实验开源代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 | /* 【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程) 程序十二:校准ADXL345的指南 */ #include<Wire.h> #include<ADXL345_WE.h> #define ADXL345_I2CADDR 0x53 /* 有几种方法可以创建ADXL345对象: * ADXL345_WE myAcc = ADXL345_WE() -> uses Wire / I2C Address = 0x53 * ADXL345_WE myAcc = ADXL345_WE(ADXL345_I2CADDR) -> uses Wire / ADXL345_I2CADDR * ADXL345_WE myAcc = ADXL345_WE(&wire2) -> uses the TwoWire object wire2 / ADXL345_I2CADDR * ADXL345_WE myAcc = ADXL345_WE(&wire2, ADXL345_I2CADDR) -> all together */ ADXL345_WE myAcc = ADXL345_WE(ADXL345_I2CADDR); void setup(){ Wire.begin(); Serial.begin(9600); Serial.println( "ADXL345校准程序准备就绪" ); Serial.println(); if (!myAcc.init()){ Serial.println( "ADXL345 未连接!" ); } Serial.println( "校准程序:" ); Serial.println( " - 保持全分辨率" ); Serial.println( " - 电源电压有影响(至少对于模块)" ); Serial.println( " ->选择您将在项目中使用的相同电压!" ); Serial.println( " - 慢慢地转动你的 ADXL (!)找到最小和最大原始 x,y 和 z 值" ); Serial.println( " - 一个或两个单位的偏差并不重要" ); Serial.println( " - 校准改变 g 与原始的斜率,并假设零为 (最小值 + 最大值)/2 " ); Serial.println( " - 记下六个值 " ); Serial.println( " - 您可以尝试实验中得到的校准值" ); Serial.println( " - 准备好了吗?然后键入任何密钥并发送。 " ); while (!Serial.available()); Serial.read(); Serial.println(); Serial.println(); Serial.println(); } void loop() { xyzFloat raw = myAcc.getRawValues(); Serial.print( "Raw-x = " ); Serial.print(raw.x); Serial.print( " | Raw-y = " ); Serial.print(raw.y); Serial.print( " | Raw-z = " ); Serial.println(raw.z); delay(1000); } |
实验串口返回情况
实验说明:见上图红点处,这里确定的六个值是:
X(最小值)=-295
X(最大值)=255
Y(最小值)=-283
Y(最大值)=264
Z(最小值)=-262
Z(最大值)=265
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验四十八:GY-291 ADXL345 数字三轴重力加速度倾斜度模块 IIC/SPI传输
程序十三:通过输入程序十二中获得的值来应用校准(导入实测的修正值)
Arduino实验开源代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 | /* 【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程) 程序十三:通过输入程序十二中获得的值来应用校准(导入实测的修正值) */ #include<Wire.h> #include<ADXL345_WE.h> #define ADXL345_I2CADDR 0x53 /*有几种方法可以创建ADXL345对象: ADXL345_WE myAcc = ADXL345_WE() -> uses Wire / I2C Address = 0x53 ADXL345_WE myAcc = ADXL345_WE(ADXL345_I2CADDR) -> uses Wire / ADXL345_I2CADDR ADXL345_WE myAcc = ADXL345_WE(&wire2) -> uses the TwoWire object wire2 / ADXL345_I2CADDR ADXL345_WE myAcc = ADXL345_WE(&wire2, ADXL345_I2CADDR) -> all together */ ADXL345_WE myAcc = ADXL345_WE(ADXL345_I2CADDR); void setup() { Wire.begin(); Serial.begin(9600); Serial.println( "ADXL345准备就绪!" ); Serial.println(); if (!myAcc.init()) { Serial.println( "ADXL345 未连接!" ); } myAcc.setCorrFactors(-295.0, 255.0, -283.0, 264.0, -262.0, 265.0); /* 在下一步中,角度偏移被校正,以获得相当精确的校正 x 和 y 的角度可达 ~60°。附加偏移校正仅用于 校正角度测量。该过程仅确保从0°开始。 */ Serial.println( "将ADXL345平放,不要移动它" ); delay(2000); myAcc.measureAngleOffsets(); Serial.println( "....完成" ); myAcc.setDataRate(ADXL345_DATA_RATE_25); myAcc.setRange(ADXL345_RANGE_2G); } void loop() { xyzFloat raw = myAcc.getRawValues(); xyzFloat g = myAcc.getGValues(); xyzFloat angle = myAcc.getAngles(); xyzFloat corrAngles = myAcc.getCorrAngles(); /* 仍然是未更正的原始值!!*/ Serial.print( "Raw-x = " ); Serial.print(raw.x); Serial.print( " | Raw-y = " ); Serial.print(raw.y); Serial.print( " | Raw-z = " ); Serial.println(raw.z); /* g 值使用校正后的原始数据 */ Serial.print( "g-x = " ); Serial.print(g.x); Serial.print( " | g-y = " ); Serial.print(g.y); Serial.print( " | g-z = " ); Serial.println(g.z); /* 角度使用校正后的 Raw。角度由以下公式简单计算 角度 = 弧度(g 值) */ Serial.print( "角度 x = " ); Serial.print(angle.x); Serial.print( " | 角度 y = " ); Serial.print(angle.y); Serial.print( " | 角度 z = " ); Serial.println(angle.z); /* 校正后的角度使用校正的原始数据和额外的角度 偏移以确保它们从 0° 开始 */ Serial.print( "校正角 x = " ); Serial.print(corrAngles.x); Serial.print( " | 校正角 y = " ); Serial.print(corrAngles.y); Serial.print( " | 校正角 z = " ); Serial.println(corrAngles.z); Serial.print( "模块的方向: " ); Serial.println(myAcc.getOrientationAsString()); Serial.println(); delay(1000); } |
实验串口返回情况
实验说明
可以看到,z 轴的校正 g 值现在看起来要好得多。由于剩余的偏移,角度具有一定的偏差。另一方面,校正的角度(“校正角cAngles”)波动接近于零。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
2021-07-20 【雕爷学编程】Arduino动手做(88)---水流量传感器模块