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()
从磁力计中读取 x
、y
、z
三个方向的磁场强度数据,并将这些数据封装在 xyzFloat
对象中返回。
getTemperature()
用于获取传感器的温度值,返回一个浮点型的温度值。
角度
getAngles()
用于获取传感器在 x
、y
、z
三个轴上的角度数据。根据陀螺仪和加速度计的数据,通过一定的算法(如互补滤波、卡尔曼滤波等)计算出传感器在三个轴上的角度数据。
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()
方法获取传感器在 x
、y
、z
三个轴上的角度值,接着依据这些角度值来判断传感器的方向状态,并将结果存储在 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。
- 若 |y| < 45:
-
当 |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();