回到首页 返回首页
回到顶部 回到顶部
返回上一页 返回上一页

【雕爷学编程】Arduino动手做(48)---GY-291 ADXL345 三轴模块4 中等

头像 驴友花雕 2023.07.20 14 1

37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手试试多做实验,不管成功与否,都会记录下来——小小的进步或是搞不掂的问题,希望能够抛砖引玉。

 

【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验四十八:GY-291 ADXL345 数字三轴重力加速度倾斜度模块 IIC/SPI传输
 

6.3-01.jpg

【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)

实验四十八:GY-291 ADXL345 数字三轴重力加速度倾斜度模块 IIC/SPI传输

程序八:使用ADXL345_WE 库测量角度、校正角度和方向

Arduino实验开源代码


 

代码
/*
  【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
  程序八:使用ADXL345_WE 库测量角度、校正角度和方向
  Arduino------ADXL345
  5V------------VCC
  GND-----------GND
  A4-----------SDA IIC 数据线
  A5-----------SCL IIC 时钟线
*/

#include<Wire.h>
#include<ADXL345_WE.h>
#define ADXL345_I2CADDR 0x53 // 如果 SDO = HIGH,则为 0x1D

/* 有几种方法可以创建您的 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 未连接!");
  }
  /* 添加您使用 ADXL345_calibration.ino 找到的最小和最大原始值。
      顺序为: setCorrFactors(min x, max x, min y, max y, min z, max z).
      setCorrFactors 校准斜率并假设零点
      is (min+max)/2. 必须将 setCorrFactors 函数添加到全局
  */
  myAcc.setCorrFactors(-266.0, 285.0, -268.0, 278.0, -291.0, 214.0);

  /* 在下一步中,角度的偏移被校正以获得相当精确的校正
     x 和 y 的角度高达 ~60°。附加的 offsetCorrection 仅用于
     校正角度测量。该过程只是确保从 0° 开始。
  */
  Serial.println("将您的 ADXL345 平放,不要移动它");
  delay(2000);
  myAcc.measureAngleOffsets();
  Serial.println("....完成");

  /* 选择数据速率Hz
      ADXL345_DATA_RATE_3200    3200
      ADXL345_DATA_RATE_1600    1600
      ADXL345_DATA_RATE_800      800
      ADXL345_DATA_RATE_400      400
      ADXL345_DATA_RATE_200      200
      ADXL345_DATA_RATE_100      100
      ADXL345_DATA_RATE_50        50
      ADXL345_DATA_RATE_25        25
      ADXL345_DATA_RATE_12_5      12.5
      ADXL345_DATA_RATE_6_25       6.25
      ADXL345_DATA_RATE_3_13       3.13
      ADXL345_DATA_RATE_1_56       1.56
      ADXL345_DATA_RATE_0_78       0.78
      ADXL345_DATA_RATE_0_39       0.39
      ADXL345_DATA_RATE_0_20       0.20
      ADXL345_DATA_RATE_0_10       0.10
  */
  myAcc.setDataRate(ADXL345_DATA_RATE_50);
  Serial.print("数据速率:");
  Serial.print(myAcc.getDataRateAsString());

  /* 选择测量范围
      ADXL345_RANGE_16G    16g
      ADXL345_RANGE_8G      8g
      ADXL345_RANGE_4G      4g
      ADXL345_RANGE_2G      2g
  */
  myAcc.setRange(ADXL345_RANGE_2G);
  Serial.print("  /  g-范围: ");
  Serial.println(myAcc.getRangeAsString());
  Serial.println();
}

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);

  /* 角度使用校正后的原始数据。角度简单地计算为
     角度 = arcsin(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(500);
}

实验串口返回情况
 

6.3-41.jpg

实验串口绘图器返回情况
 

6.3-42.jpg

【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)

实验四十八:GY-291 ADXL345 数字三轴重力加速度倾斜度模块 IIC/SPI传输

程序九:点阵屏加速度仪

Arduino实验接线示意图

 

6.3-43.jpg

【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验四十八:GY-291 ADXL345 数字三轴重力加速度倾斜度模块 IIC/SPI传输
程序九:点阵屏加速度仪
Arduino实验开源代码
 

代码
/*
  【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
  程序九:点阵屏加速度仪
*/

#include <LedControl.h> //导入点阵屏驱动库
#include <Wire.h>

#define DEVICE (0x53)   //ADXL345设备地址
#define TO_READ (6)    //我们要读取的字节数(每个轴两个字节)

byte buff[TO_READ] ;    //6字节缓冲区,用于保存从设备读取的数据
char str[512];          //字符串缓冲区在发送数据之前对其进行转换

int MATRIX_WIDTH = 8;
LedControl lc = LedControl(12, 10, 11, 1); // 点阵屏接脚:DIN, CLK, CS, NRDEV
unsigned long delaytime = 50;
int x_key = A1;
int y_key = A0;
int x_pos;
int y_pos;

// 表示单个灯光位置的对象
// 未来的重力更新
class Grain
{
  public:
    int x = 0;
    int y = 0;
    int mass = 1;
};
Grain *g;

void setup() {
  //设置一个grain对象
  g = new Grain();

  ClearDisplay();

  Wire.begin();        // 加入 i2c 总线(主机地址可选)
  Serial.begin(9600);  // 启动串口输出

  //开启ADXL345
  writeTo(DEVICE, 0x2D, 0);
  writeTo(DEVICE, 0x2D, 16);
  writeTo(DEVICE, 0x2D, 8);
}

void loop() {
  // 第一个轴加速度数据寄存器
  int regAddress = 0x32;
  int x, y, z;

  readFrom(DEVICE, regAddress, TO_READ, buff); //从ADXL345读取加速度数据

  // 合并每个方向的两个字节
  // 最低有效位在前
  x = (((int)buff[1]) << 8) | buff[0];
  y = (((int)buff[3]) << 8) | buff[2];
  z = (((int)buff[5]) << 8) | buff[4];

  // 将值转换为可以在矩阵上表示的值
  x = map(x, -300, 300, 0, 8);
  y = map(y, -300, 300, 0, 8);
  z = map(z, -300, 300, 0, 8);

  //我们将x y z值作为字符串发送到串口
  Serial.print("X: ");
  Serial.print(x);
  Serial.print("   Y: ");
  Serial.print(y);
  Serial.print("   Z: ");
  Serial.print(z);
  Serial.print("\n");

  ClearDisplay();
  //将grain分配到这个位置
  g->x = x;
  g->y = y;
  lc.setLed(0, g->x, g->y, true);

  //在每次更新之间添加一些延迟
  delay(10);
}

void ClearDisplay() {
  //设置液晶显示器
  int devices = lc.getDeviceCount();

  for (int address = 0; address < devices; address++)
  {
    lc.shutdown(address, false);
    lc.setIntensity(address, 1);
    lc.clearDisplay(address);
  }
}

//将val写入设备上的地址寄存器
void writeTo(int device, byte address, byte val)
{
  Wire.beginTransmission(device); //开始传输到设备
  Wire.write(address);        // 发送寄存器地址
  Wire.write(val);        // 发送要写入的值
  Wire.endTransmission(); //结束传输
}

//从设备上的地址寄存器开始读取num字节到buff数组
void readFrom(int device, byte address, int num, byte buff[])
{
  Wire.beginTransmission(device); //开始传输到设备
  Wire.write(address);        //发送要读取的地址
  Wire.endTransmission(); //结束传输

  Wire.beginTransmission(device); //开始传输到设备
  Wire.requestFrom(device, num);  // 从设备请求 6 个字节

  int i = 0;
  while (Wire.available()) //设备发送的数据可能少于请求的数据(异常)
  {
    buff[i] = Wire.read(); // 接收一个字节
    i++;
  }
  Wire.endTransmission(); //结束传输
  delay(300);
}

实验串口返回情况
 

6.3-44.jpg

实验串口绘图器返回情况

 

6.3-45.jpg

Arduino实验场景图

 

6.3-46.jpg

(6)实验的视频记录

https://v.youku.com/v_show/id_XNTgxMDI1NTc3Ng==.html?firsttime=0

 


程序十:ADXL345三轴传感器控制D13脚LED灯的亮灭
(1)实验接线示意图
 

6.3-47.jpg

【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)

实验四十八:GY-291 ADXL345 数字三轴重力加速度倾斜度模块 IIC/SPI传输

程序十:ADXL345三轴传感器控制D13脚LED灯的亮灭

Arduino实验开源代码


 

代码
/*
  【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
  程序十:ADXL345三轴传感器控制D13脚LED灯的亮灭
*/

#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_ADXL345_U.h>//导入ADXL345驱动库
#define LED_PIN 13 //LED接D13
Adafruit_ADXL345_Unified accel = Adafruit_ADXL345_Unified();

void setup(void) {
  Serial.begin(9600);//串口初始化
  Serial.println("ADXL345 传感器控制D13脚LED灯");
  if (!accel.begin())
  {
    Serial.println("未检测到 ADXL345 传感器。");
    while (1);
  }
  pinMode(LED_PIN,OUTPUT);//设置LED为输出
}

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 || x < -5) {      //设置点亮LED的X轴阙值
    digitalWrite(LED_PIN,HIGH);
    Serial.println("X值符合,LED灯亮");
  }
  else if (y > 5 || y < -5) { //设置点亮LED的Y轴阙值
    digitalWrite(LED_PIN,HIGH);
    Serial.println("Y值符合,LED灯亮");
  }
  else{
    digitalWrite(LED_PIN,LOW);
  }
  delay(500);//延时500毫秒
}

实验串口返回情况

 

6.3-48.jpg

实验串口绘图器返回情况

 

6.3-49.jpg

Arduino实验场景图

 

6.3-50.jpg

实验的视频记录

https://v.youku.com/v_show/id_XNTg2OTk2NjA2NA==.html

 

 

刚找到的三轴ADXL345模块内部功能框图与电原理图
 

360截图20220523161723130.jpg
360截图20220523161922195.jpg

评论

user-avatar
  • hacker_

    hacker_2023.08.12

    666

    0
    icon 他的勋章
      展开更多