60|0

12

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

【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

    初始化

    \small IMU.begin():初始化库

    作用:初始化是开发嵌入式程序中不可或缺的一步,其核心是为硬件和软件环境做好准备,确保系统运行的稳定性和正确性。

    采样率

    \small IMU.accelerationSampleRate():读取加速度采样率(Hz)

    \small IMU.gyroscopeSampleRate():读取陀螺仪采样率(Hz)

    作用:采样率决定了数据更新的频率。比如,采样率越高,数据更新越快,反应越灵敏,适用于高速运动的应用;采样率越低,数据更新越慢,适用于低速稳定的应用。

    读取数据

    \small IMU.accelerationAvailable():检查 IMU 是否有可用的加速度数据

    \small IMU.readAcceleration(Ax, Ay, Az):读取加速度计,并返回 x、y 和 z 轴的加速度值

    \small IMU.gyroscopeAvailable():检查 IMU 是否有可用的陀螺仪数据

    \small IMU.readGyroscope(Gx, Gy, Gz):读取陀螺仪,并返回 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();
  }
}

 

点赞 关注
 
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表