【雕爷学编程】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”)波动接近于零。

 

 

posted @ 2023-07-20 13:11  行者花雕  阅读(82)  评论(0编辑  收藏  举报