MPU9250_WE库详解

article/2025/7/14 22:43:23

MPU9250_WE库

https://docs.arduino.cc/libraries/mpu9250_we/

https://github.com/wollewald/MPU9250_WE

在这里插入图片描述

三款MPU6050、MPU6500、MPU9250陀螺仪

其初始化以及函数应用方法基本一致,创建初始化对象名称有所差异

初始化相关函数

用于初始化传感器。该函数会尝试与传感器建立通信,并进行必要的设置。

1. 使用 I2C 通信,默认Wire对象
MPU6500_WE(uint8_t const addr);#include "MPU6500_WE.h"
// 创建MPU6500对象,I2C地址为0x68
MPU6500_WE mpu(0x68);2.使用指定的TwoWire对象和 I2C 地址
MPU6500_WE(TwoWire * const w = &Wire, uint8_t const addr = 0x68);#include "MPU6500_WE.h"
#include <Wire.h>// 创建MPU6500对象,使用Wire对象进行I2C通信,I2C地址为0x68
MPU6500_WE mpu(&Wire, 0x68);3.使用 SPI 通信,指定SPIClass对象、片选引脚、是否使用 SPI 以及 SPI 引脚是否改变
MPU6500_WE(SPIClass * const s, int const cs, bool spi, bool pc = false);#include "MPU6500_WE.h"
#include <SPI.h>// 创建MPU6500对象,使用SPI通信,片选引脚为10
MPU6500_WE mpu(&SPI, 10, true);4. 使用 SPI 通信,指定SPIClass对象、片选引脚、MOSI 引脚、MISO 引脚、SCK 引脚、是否使用 SPI 以及 SPI 引脚是否改变MPU6500_WE(SPIClass * const s, int const cs, int mosi, int miso, int sck, bool spi, bool pc = true);#include "MPU6500_WE.h"
#include <SPI.h>// 创建MPU6500对象,使用SPI通信,片选引脚为10,MOSI引脚为11,MISO引脚为12,SCK引脚为13
MPU6500_WE mpu(&SPI, 10, 11, 12, 13, true);

init()

bool MPU6500_WE::init()
mpu.init();
//在默认情况下使用,它会自动使用预定义的 WHO_AM_I_CODE 常量。bool MPU6500_WE::init(uint8_t const expectedValue);
//expectedValue:这是一个 uint8_t 类型的常量参数,它代表的是传感器 WHO_AM_I 寄存器的期望值。这个值的作用是用来验证传感器的身份。    
mpu.init(MPU6500_WHO_AM_I_CODE);
//调用 mpu.init(MPU6500_WHO_AM_I_CODE) 对 MPU6500 传感器进行初始化。
//若初始化成功,init() 函数会返回 true,并在串口监视器输出 "MPU6500 initialized successfully!"。
//若初始化失败,init() 函数会返回 false,并在串口监视器输出 "MPU6500 initialization failed!"。

传感器配置

以下这些函数并不是必须全部配置的,具体是否需要配置取决于你的应用场景和需求。

MPU6500.autoOffsets();

这个函数用于自动计算并设置加速度计和陀螺仪的偏移量,以校准传感器的输出。

  • 是否必须:不是必须的。如果你的应用对传感器数据的精度要求不高,或者传感器本身的偏移量较小,不调用这个函数也可以正常使用。但如果需要高精度的数据,特别是在传感器安装位置或环境发生变化时,建议调用该函数进行校准。

MPU6500.enableGyrDLPF();

此函数用于启用陀螺仪的数字低通滤波器(DLPF)。

  • 是否必须:不是必须的。低通滤波器可以减少高频噪声的影响,但如果你的应用场景中噪声不是主要问题,或者你希望获得更高的响应速度,可以不启用该滤波器。

MPU6500.setGyrDLPF(MPU6500_DLPF_6);

该函数用于设置陀螺仪的数字低通滤波器(DLPF)的截止频率。

  • 是否必须:不是必须的。只有在启用了陀螺仪的 DLPF 后,这个函数才有意义。你可以根据实际需求选择合适的截止频率,如果不设置,传感器可能会使用默认的截止频率。

MPU6500.setSampleRateDivider(5);

此函数用于设置传感器的采样率分频器。

  • 是否必须:不是必须的。采样率分频器决定了传感器的采样频率,你可以根据应用的需求来调整采样频率。如果不设置,传感器可能会使用默认的采样频率。

MPU6500.setGyrRange(MPU6500_GYRO_RANGE_250);

该函数用于设置陀螺仪的量程。

  • 是否必须:不是必须的。陀螺仪的量程决定了其能够测量的最大角速度范围。你需要根据应用中可能出现的角速度大小来选择合适的量程。如果不设置,传感器可能会使用默认的量程。

MPU6500.setAccRange(MPU6500_ACC_RANGE_2G);

此函数用于设置加速度计的量程。

  • 是否必须:不是必须的。加速度计的量程决定了其能够测量的最大加速度范围。你需要根据应用中可能出现的加速度大小来选择合适的量程。如果不设置,传感器可能会使用默认的量程。

MPU6500.enableAccDLPF(true);

该函数用于启用或禁用加速度计的数字低通滤波器(DLPF)。

  • 是否必须:不是必须的。与陀螺仪的 DLPF 类似,加速度计的 DLPF 可以减少高频噪声的影响。如果你的应用场景中噪声不是主要问题,或者你希望获得更高的响应速度,可以不启用该滤波器。

MPU6500.setAccDLPF(MPU6500_DLPF_6);

此函数用于设置加速度计的数字低通滤波器(DLPF)的截止频率。

  • 是否必须:不是必须的。只有在启用了加速度计的 DLPF 后,这个函数才有意义。你可以根据实际需求选择合适的截止频率,如果不设置,传感器可能会使用默认的截止频率。

MPU9250.setMagOpMode(AK8963_CONT_MODE_100HZ);

设置 MPU9250 传感器中磁力计(AK8963)的工作模式为连续测量模式,且测量频率为 100Hz。

数据读取函数

getAccRawValues()getGValues()

  • getAccRawValues():返回加速度计的原始输出数据,这些数据未经转换,是硬件层面的原始数值。
  • getGValues():返回经过处理和转换后的加速度值,单位为重力加速度 g,能更直观地反映实际的物理加速度。

getGyrRawValues()getGyrValues()

  • getGyrRawValues():返回陀螺仪的原始数据,适合需要对原始信号进行深入分析或自定义处理的场景。
  • getGyrValues():返回经过处理和校准后的陀螺仪数据,单位通常为度每秒(°/s),适合直接用于姿态解算、运动控制等应用开发。

getMagValues()

从磁力计中读取 xyz 三个方向的磁场强度数据,并将这些数据封装在 xyzFloat 对象中返回。

getTemperature()

用于获取传感器的温度值,返回一个浮点型的温度值。

角度

getAngles()

用于获取传感器在 xyz 三个轴上的角度数据。根据陀螺仪和加速度计的数据,通过一定的算法(如互补滤波、卡尔曼滤波等)计算出传感器在三个轴上的角度数据。

xyzFloat angles = myMPU9250.getAngles();/* This method provides quite precise values for x/y angles up 60°. */Serial.print("Angle x = ");Serial.print(angles.x);Serial.print("  |  Angle y = ");Serial.print(angles.y);Serial.print("  |  Angle z = ");Serial.println(angles.z);

getOrientation()getOrientationAsString

首先调用 getAngles() 方法获取传感器在 xyz 三个轴上的角度值,接着依据这些角度值来判断传感器的方向状态,并将结果存储在 MPU9250_orientation 枚举类型的变量 orientation 中,最后返回该变量。

MPU9250_orientation MPU6500_WE::getOrientation(){xyzFloat angleVal = getAngles();MPU9250_orientation orientation = MPU9250_FLAT;if(abs(angleVal.x) < 45){      // |x| < 45if(abs(angleVal.y) < 45){      // |y| < 45if(angleVal.z > 0){          //  z  > 0orientation = MPU9250_FLAT;}else{                        //  z  < 0orientation = MPU9250_FLAT_1;}}else{                         // |y| > 45if(angleVal.y > 0){         //  y  > 0orientation = MPU9250_XY;}else{                       //  y  < 0orientation = MPU9250_XY_1;}}}else{                           // |x| >= 45if(angleVal.x > 0){           //  x  >  0orientation = MPU9250_YX;}else{                       //  x  <  0orientation = MPU9250_YX_1;}}return orientation;
}

根据角度值判断方向状态:

  • 当 |x| < 45 时:

    • 若 |y| < 45:
      • 当 z > 0 时,方向状态为 MPU9250_FLAT。
      • 当 z < 0 时,方向状态为 MPU9250_FLAT_1。
    • 若 |y| > 45:
      • 当 y > 0 时,方向状态为 MPU9250_XY。
      • 当 y < 0 时,方向状态为 MPU9250_XY_1。
  • 当 |x| >= 45 时:

    • 当 x > 0 时,方向状态为 MPU9250_YX。
    • 当 x < 0 时,方向状态为 MPU9250_YX_1。
  • getOrientation() 返回枚举类型,适用于代码内部的逻辑判断。

  • getOrientationAsString() 返回字符串类型,适用于显示和记录,能为用户提供更直观的方向状态信息。

getResultantG(gValue)

函数的作用是计算并返回三个轴(x, y, z)上重力加速度分量的合加速度(即合重力)。在三维空间中,根据勾股定理的扩展形式,合加速度可以通过三个轴上加速度分量的平方和的平方根来计算。

xyzFloat gValue = myMPU9250.getGValues();
float resultantG = myMPU9250.getResultantG(gValue);

在航空航天和机器人领域,通常使用欧拉角(Euler angles)来描述物体在三维空间中的姿态,欧拉角包含横滚(Roll)、俯仰(Pitch)和偏航(Yaw)三个角度:

  • 横滚(Roll):指的是飞行器绕自身纵轴(从机头到机尾的轴)的旋转角度。当飞行器向一侧倾斜时,就产生了横滚运动。
  • 俯仰(Pitch):是飞行器绕横轴(从机翼一侧到另一侧的轴)的旋转角度。当飞行器机头向上或向下时,就发生了俯仰运动。
  • 偏航(Yaw):表示飞行器绕竖轴(垂直于机身平面的轴)的旋转角度,即飞行器的转向。

getPitch()

float MPU6500_WE::getPitch(){xyzFloat angleVal = getAngles();float pitch = (atan2(-angleVal.x, sqrt(abs((angleVal.y*angleVal.y + angleVal.z*angleVal.z))))*180.0)/M_PI;return pitch;
}float pitch = myMPU9250.getPitch();

getRoll()

<

http://www.hkcw.cn/article/isGKmGJJvE.shtml

相关文章

onlyoffice docspace 协作空间企业版使用秘籍-1.如何连接外部存储

背景介绍 ONLYOFFICE 协作空间是一个可在自定义房间中协作处理文本文档、电子表格、演示文稿、表格和 PDF 文件的平台。用户可设置灵活的访问权限&#xff0c;与同事、客户及合作伙伴共享房间和文档。最棒的一个功能是支持文档的中文全文检索功能,方便根据内容找到需要的文档。…

openppp2 -- 1.0.0.25225 优化多线接入运营商路由调配

本文涉及到的内容&#xff0c;涉及到上个发行版本相关内容&#xff0c;人们在阅读本文之前&#xff0c;建议应当详细阅读上个版本之中的VBGP技术相关的介绍。 openppp2 -- 1.0.0.25196 版本新增的VBGP技术-CSDN博客 我们知道在现代大型的 Internet 网络服务商&#xff0c;很多…

Predixy的docker化

概述 当前已有一套redis cluster的集群&#xff0c;但是fs中的hiredis只能配置单实例redis。 AI了一下方案&#xff0c;可以使用redis的proxy组件来实现从hiredis到redis cluster的互通。 代码地址&#xff1a;https://github.com/joyieldInc/predixy Predixy特性介绍&…

Fusion引擎赋能:流利说如何用阿里云Serverless Spark实现数仓计算加速

作者&#xff1a;流利说 Ibson&#xff08;大数据负责人&#xff09;/ Bruce&#xff08;数据工程师&#xff09; 背景介绍 行业 流利说是领先的科技驱动的教育公司&#xff0c;公司自主研发了领先的英语口语评测、写作打分引擎和深度自适应学习系统&#xff0c;致力于为用户…

Leetcode 340. 至多包含 K 个不同字符的最长子串

1.题目基本信息 1.1.题目描述 给你一个字符串 s 和一个整数 k &#xff0c;请你找出 至多 包含 k 个 不同 字符的最长子串&#xff0c;并返回该子串的长度。 1.2.题目地址 https://leetcode.cn/problems/longest-substring-with-at-most-k-distinct-characters/description…

历年中南大学计算机保研上机真题

2025中南大学计算机保研上机真题 2024中南大学计算机保研上机真题 2023中南大学计算机保研上机真题 在线测评链接&#xff1a;https://pgcode.cn/school 进制转换 题目描述 请写出一段程序&#xff0c;将十进制数字转为八进制。 输入格式 第一行输入 T T T ( 1 ≤ T ≤…

【js逆向】某某省过验证码逆向

查看响应 查看验证码包 send里面就是载荷的密文 向上跟栈 进入到i里面 找到params的加密处 断点&#xff0c;刷新 提示少扣取 报错&#xff1a;st is not defined 全部扣完后发现不报错但是没输出&#xff1a; 一个难以发觉的错误&#xff0c;大量扣取&#xff0c;不容易被发现…

土耳其总统:支持俄乌代表团的谈判继续推进

当地时间5月30日,土耳其总统埃尔多安与乌克兰总统泽连斯基通电话。双方讨论了两国双边关系以及地区与全球局势。△土耳其总统埃尔多安(资料图)埃尔多安在对话中表示,土耳其将继续努力推动乌克兰与俄罗斯之间实现公正与持久的和平。土耳其支持两国代表团在伊斯坦布尔开启的谈…

下一代液晶显示底层技术与九天画芯的技术突围

一、液晶产业&#xff1a;撑起数字经济的显示脊梁 &#xff08;一&#xff09;全球显示市场的核心支柱 作为电子信息产业的战略基石&#xff0c;液晶显示&#xff08;LCD&#xff09;占据全球平板显示市场超 60% 的份额&#xff0c;2022 年全球市场规模达 782.41 亿元&#xf…

工控机安装lubuntu系统

工控机安装lubuntu系统指南手册 1. 准备 1个8G左右的U盘 下载Rufus&#xff1a; Index of /downloads 下载lubuntu系统镜像&#xff1a; NJU Mirror Downloads – Lubuntu 下载Ventoy工具&#xff1a; Releases ventoy/Ventoy GitHub 下载后&#xff0c;解压&#…

完整解析 Linux Kdump Crash Kernel 工作原理和实操步骤

完整解析 Linux Kdump Crash Kernel 工作原理和实操步骤 一、前言 在使用 Linux 操作系统进行内核开发或者系统维护时&#xff0c;内核 panic 是最常见的系统崩溃环节。如果想要在内核崩溃后立即分析环境和输出内核内存 dump&#xff0c;Kdump crashkernel 是最接近完美的解…

day 25 异常处理

异常处理机制 Python 的异常处理机制赋予程序强大的容错能力。当程序在运行时遇到意外情况&#xff08;即异常&#xff09;&#xff0c;它不会直接崩溃&#xff0c;而是可以被设计成优雅地处理错误&#xff0c;或继续执行后续逻辑&#xff0c;或按可控方式结束。 在异常发生时…

智能流体仿真软件AICFD 2025R1新版本功能介绍

智能流体仿真软件AICFD是天洑软件自主研发的一款通用型智能热流体仿真工具&#xff0c;其核心代码拥有完全自主知识产权。该软件在业界率先引入人工智能技术&#xff0c;高效解决工业级流动、传热、多相流、噪声及燃烧等复杂仿真问题。 图1 AICFD软件界面 一、版本更新介绍 A…

数据结构之队列:原理与应用

一、基本原理 队列是一种特殊的线性表队列是一个有序表(可以用数组或链表实现)遵循“先来先服务”的原则&#xff0c;它只允许在表的前端&#xff08;队头&#xff09;进行删除操作&#xff0c;在表的后端&#xff08;队尾&#xff09;进行插入操作 (一) 核心操作 入队&…

windows下安装docker、dify、ollama

一、docker安装 镜像源配置 {"builder": {"gc": {"defaultKeepStorage": "10GB","enabled": true}},"experimental": true,"registry-mirrors": ["https://docker.m.daocloud.io","ht…

mysql隐式转换会造成索引失效的原因

现在我们看一个例子 比如现在我有一张表叫做test 涉及的字段有id code name age address id 是int数值类型 code 是varchar字符串类型 name 是varchar字符串类型 age是int 数值类型 address是varchar 字符串类型 创建语句&#xff1a; CREATE TABLE test ( id INT …

鲲鹏Arm+麒麟V10,国产化信创 K8s 离线部署保姆级教程

Rainbond V6 国产化部署教程&#xff0c;针对鲲鹏 CPU 麒麟 V10 的离线环境&#xff0c;手把手教你从环境准备到应用上线&#xff0c;所有依赖包提前打包好&#xff0c;步骤写成傻瓜式操作指南。别说技术团队了&#xff0c;照着文档一步步来&#xff0c;让你领导来都能独立完成…

Python训练营---Day40

知识点回顾&#xff1a; 彩色和灰度图片测试和训练的规范写法&#xff1a;封装在函数中展平操作&#xff1a;除第一个维度batchsize外全部展平dropout操作&#xff1a;训练阶段随机丢弃神经元&#xff0c;测试阶段eval模式关闭dropout 作业&#xff1a;仔细学习下测试和训练代码…

LeetCode 高频 SQL 50 题(基础版)之 【连接】部分 · 下

前五道题&#xff1a;LeetCode 高频 SQL 50 题&#xff08;基础版&#xff09;之 【连接】部分 上 题目&#xff1a;577. 员工奖金 题解&#xff1a; select r.name,b.bonus from Employee r left join Bonus b on r.empIdb.empId where b.bonus <1000 or b.bonus is nul…

C++八股 —— 手撕线程池

文章目录 一、背景二、线程池实现1. 任务队列和工作线程2. 构造和析构函数3. 添加任务函数4. 完整代码 三、阻塞队列实现1. 基础队列2. 升级版队列 四、测试代码五、相关问题六、其他实现方式 来自&#xff1a;华为C一面&#xff1a;手撕线程池_哔哩哔哩_bilibili 华为海思&am…