【雕爷学编程】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实验开源代码
/* 【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实验开源代码
/* 【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实验开源代码
/* 【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”)波动接近于零。