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

【花雕学编程】Arduino动手做(233)---ESP32-S3 UNO同时显示ADXL校准前后的俯仰角和滚动角 简单

头像 驴友花雕 2024.10.05 10 0

00-4.jpg

ESP32-S3 UNO 开发板是基于 ESP32-S3-WROOM-1-N16R8 微控制器的扩展板,基于 Arduino 开发板架构。凭借 2.4GHz Wi-Fi 和集成蓝牙 5.0 等高级功能,它为开发各种项目提供了一个强大的平台。ESP32-S3 UNO 配备 16MB 闪存和 8MB RAM,特别适用于物联网 (IoT)、机器人和其他工程项目的复杂应用。该开发板支持 Python 和 C 等流行的编程语言,可以在 Arduino IDE 开发环境中轻松编程和使用。该板的高级功能,包括对多种通信协议的支持和高处理能力,使其成为专业工程师和开发人员的理想工具。

 

00 (2).jpg
00.jpg

ADXL345是一款由Analog Devices公司推出的三轴数字加速度计,具有高分辨率和低功耗的特点,非常适合移动设备和其他需要精确加速度测量的应用。以下是对ADXL345三轴模块的详细介绍:

1、主要特点
高分辨率:ADXL345能够提供高达13位的分辨率,能够测量高达±16g的加速度1。
低功耗:在测量模式下,功耗低至23 μA,在待机模式下功耗仅为0.1 μA1。
多种测量范围:用户可以选择±2g、±4g、±8g或±16g的测量范围,适应不同的应用需求1。
数字接口:支持SPI(3线或4线)和I2C数字接口,方便与各种微控制器进行通信1。
内置功能:具有活动/非活动检测、单击/双击检测、自由落体检测等多种功能,可以独立映射到两个中断输出引脚1。

2、应用场景
移动设备:用于检测设备的倾斜、运动和冲击。
医疗仪器:用于监测患者的运动状态。
游戏和定点设备:用于检测用户的动作和姿态。
工业仪器仪表:用于监测机器的振动和运动状态。
个人导航设备:用于检测设备的方向和运动。

3、引脚功能
ADXL345模块通常有以下引脚:
VCC:电源引脚,连接到2.0V至3.6V的电源。
GND:地引脚。
SDA/SDI/SDIO:数据输入/输出引脚,用于I2C或SPI通信。
SCL/SCLK:时钟引脚,用于I2C或SPI通信。
CS:片选引脚,用于SPI通信。
INT1/INT2:中断引脚,用于输出检测到的事件。

4、使用步骤
连接电源和地:将VCC引脚连接到电源,GND引脚连接到地。
选择通信接口:根据需要选择I2C或SPI接口,并连接相应的引脚。
初始化传感器:在代码中初始化ADXL345传感器,设置测量范围和其他参数。
读取数据:通过I2C或SPI接口读取加速度数据,并进行处理。
ADXL345是一款功能强大且易于使用的三轴加速度计,适用于各种需要精确加速度测量的应用。

 

78.jpg
78-.jpg


搜索安装:Adafruit BusIO,Adafruit_Sensor和Adafruit_ADXL345_U库
链接:https://github.com/adafruit/Adafruit_Sensor

 

78-1.jpg
78-2.jpg
78-3.jpg


校准ADXL345传感器的俯仰角和滚动角可以显著提高测量精度。以下是校准过程:

1、初始化传感器:确保传感器正确连接并初始化。
2、读取原始数据:在不同的静止位置读取传感器的X、Y、Z轴加速度数据。
3、计算偏移量:根据读取的数据计算每个轴的偏移量。
4、设置校准参数:将计算得到的偏移量应用到传感器中。
5、验证校准效果:重新读取数据并计算俯仰角和滚动角,验证校准效果。

 【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
 实验二百三十三:ESP32-S3 UNO开发板 双核16M+8M+Wi-Fi+蓝牙5.0+45个GPIO
 {花雕动手做}项目之七:ESP32-S3 UNO同时显示ADXL校准前后的俯仰角和滚动角

实验开源代码

 

代码
/*
  【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
  实验二百三十三:ESP32-S3 UNO开发板 双核16M+8M+Wi-Fi+蓝牙5.0+45个GPIO
  {花雕动手做}项目之七:ESP32-S3 UNO同时显示ADXL校准前后的俯仰角和滚动角
*/

#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_ADXL345_U.h>

// 创建ADXL345对象
Adafruit_ADXL345_Unified accel = Adafruit_ADXL345_Unified(12345);

// 校准偏移量(根据实际测量值调整)
float offsetX = 0.0;
float offsetY = 30.0;
float offsetZ = 0.0;

void setup() {
  // 初始化串口通信,波特率为115200
  Serial.begin(115200);
  Serial.println(" ");
  Serial.println("ESP32-S3 UNO(N16R8)准备就绪");

  // 初始化I2C总线,设置SDA为GPIO4,SCL为GPIO5
  Wire.begin(4, 5);

  // 初始化ADXL345传感器
  if (!accel.begin()) {
    // 如果传感器初始化失败,打印错误信息并停止程序
    Serial.println("无法找到ADXL345传感器");
    while (1);
  }
  Serial.println("ADXL345传感器初始化成功");

  // 设置传感器的测量范围为±16g
  accel.setRange(ADXL345_RANGE_16_G);
}

void loop() {
  // 创建一个事件对象,用于存储传感器数据
  sensors_event_t event;

  // 读取传感器数据并存储到事件对象中
  accel.getEvent(&event);

  // 原始数据计算俯仰角和滚动角
  float rawPitch = atan2(event.acceleration.y, event.acceleration.x) * 180.0 / PI;
  float rawRoll = atan2(event.acceleration.x, event.acceleration.y) * 180.0 / PI;

  // 应用校准偏移量
  float correctedX = event.acceleration.x + offsetX;
  float correctedY = event.acceleration.y + offsetY;
  float correctedZ = event.acceleration.z + offsetZ;

  // 校正后的俯仰角和滚动角
  float correctedPitch = atan2(correctedY, correctedX) * 180.0 / PI;
  float correctedRoll = atan2(correctedX, correctedY) * 180.0 / PI;

  // 打印原始和校正后的计算结果
  Serial.print("原始滚动角X= "); Serial.print(rawRoll); Serial.print(" 度, ");
  Serial.print("校正滚动角X= "); Serial.print(correctedRoll); Serial.print(" 度 | ");
  Serial.print("原始俯仰角Y= "); Serial.print(rawPitch); Serial.print(" 度, ");
  Serial.print("校正俯仰角Y= "); Serial.print(correctedPitch); Serial.println(" 度");
  

  // 延时1000毫秒,控制数据输出频率
  delay(1000);
}

实验串口返回情况

 

78-16.jpg

挺失望的,实验没整成,原始与校正都不准,非线性,一口气做了几十次尝试,无果而终。
实验串口绘图器返回情况

 

78-17.jpg

评论

user-avatar
icon 他的勋章
    展开更多