【Follow me第二季第4期】IMU 原始数据打印
[复制链接]
IMU 基础
Arduino® Nano RP2040 Connect 使用的 IMU 传感器为:LSM6DSOXTR。
LSM6DSOXTR 简介
LSM6DSOXTR 是由意法半导体(STMicroelectronics)推出的一款 6轴惯性测量单元(IMU),包含了加速度计和陀螺仪的功能。是一款小型、低功耗的传感器。
加速度计:3轴,测量物体的加速度变化。
陀螺仪:3轴,测量物体的角速度(旋转速度)
LSM6DSOXTR 集成了这两种传感器,因此是一个 6轴 IMU。
LSM6DSOXTR 的主要特点
加速度计范围:±2g、±4g、±8g、±16g(可配置)
陀螺仪范围:±125°/s、±250°/s、±500°/s、±1000°/s、±2000°/s(可配置)
低功耗模式:适用于电池供电设备,具备多个省电模式。
内置FIFO缓存:用于存储加速度和角速度数据,可以减少主机的读取频率。
传感器输出接口:通过 I²C 或 SPI 接口与外部设备(如微控制器)进行通信。
运动检测:支持运动检测、步数计数、自由落体检测、休眠模式等多种功能。
LSM6DSOXTR 的工作原理
加速度计通过内部的微机械传感器测量加速度。当物体加速时,传感器的质量块会在微小的弹簧中发生位移,根据位移的大小可以计算出加速度。
单位:加速度的单位是 g(重力加速度,1g = 9.8 m/s²)。
测量方向:LSM6DSOXTR 的加速度计是三轴的,因此可以测量沿 X、Y、Z 轴的加速度。
作用:可以用来判断物体的倾斜角度、运动方向、加速度大小等。
陀螺仪使用 MEMS 技术(微电子机械系统),通过微型的振荡结构测量物体围绕各轴旋转的速度。
单位:角速度的单位是 °/s(每秒旋转度数)。
测量方向:与加速度计类似,陀螺仪也是三轴的,可以测量绕 X、Y、Z 轴的角速度。
作用:可用于姿态估算,特别是在无外部定位信息的情况下。
读取 IMU 数据
在 Arduino® Nano RP2040 Connect 中,由图1 可知 LSM6DSOXTR 通过 I²C 与 RP2040 进行连接。
图1 Arduino Nano RP2040 Connect 框图
Arduino 官方有一个处理 LSM6DSOXTR 的库:Arduino_LSM6DSOX
初始化
:初始化库
作用:初始化是开发嵌入式程序中不可或缺的一步,其核心是为硬件和软件环境做好准备,确保系统运行的稳定性和正确性。
采样率
:读取加速度采样率(Hz)
:读取陀螺仪采样率(Hz)
作用:采样率决定了数据更新的频率。比如,采样率越高,数据更新越快,反应越灵敏,适用于高速运动的应用;采样率越低,数据更新越慢,适用于低速稳定的应用。
读取数据
:检查 IMU 是否有可用的加速度数据
:读取加速度计,并返回 x、y 和 z 轴的加速度值
:检查 IMU 是否有可用的陀螺仪数据
:读取陀螺仪,并返回 x、y 和 z 轴的角速度值
演示视频
示例代码
#include <Arduino_LSM6DSOX.h>
// 存储加速度和陀螺仪数据
float Ax, Ay, Az;
float Gx, Gy, Gz;
// 时间间隔参数(非阻塞式输出控制)
unsigned long previousMillis = 0;
const long interval = 500; // 每500毫秒输出一次数据
void setup() {
// 初始化串口通信
Serial.begin(9600);
while (!Serial) {
; // 等待串口准备好
}
Serial.println("串口初始化完成,开始读取IMU数据...");
// 初始化IMU传感器
if (!IMU.begin()) {
Serial.println("错误:IMU 初始化失败,请检查硬件连接!");
while (1); // 如果初始化失败,程序停留在这里
}
Serial.println("IMU 初始化成功!");
Serial.println();
}
void loop() {
// 获取当前时间
unsigned long currentMillis = millis();
// 每隔500毫秒读取并输出一次数据
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis; // 更新上一次的时间
// 读取加速度数据
if (IMU.accelerationAvailable()) {
IMU.readAcceleration(Ax, Ay, Az);
} else {
Serial.println("警告:未能读取到加速度数据!");
}
// 读取陀螺仪数据
if (IMU.gyroscopeAvailable()) {
IMU.readGyroscope(Gx, Gy, Gz);
} else {
Serial.println("警告:未能读取到陀螺仪数据!");
}
// 串口输出加速度和陀螺仪数据
Serial.print("Accel:Ax=");
Serial.print(Ax, 2); // 保留两位小数
Serial.print(" m/s², Ay=");
Serial.print(Ay, 2);
Serial.print(" m/s², Az=");
Serial.print(Az, 2);
Serial.print(" m/s² | ");
Serial.print("Gyros:Gx=");
Serial.print(Gx, 2); // 保留两位小数
Serial.print(" dps, Gy=");
Serial.print(Gy, 2);
Serial.print(" dps, Gz=");
Serial.print(Gz, 2);
Serial.println(" dps");
// 在不同数据组之间添加空行,便于查看
Serial.println();
}
}
|