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
// 创建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
// 创建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
// 创建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)的截止频率。
MPU6500.setSampleRateDivider(5);
此函数用于设置传感器的采样率分频器。
MPU6500.setGyrRange(MPU6500_GYRO_RANGE_250);
该函数用于设置陀螺仪的量程。
MPU6500.setAccRange(MPU6500_ACC_RANGE_2G);
此函数用于设置加速度计的量程。
MPU6500.enableAccDLPF(true);
该函数用于启用或禁用加速度计的数字低通滤波器(DLPF)。
MPU6500.setAccDLPF(MPU6500_DLPF_6);
此函数用于设置加速度计的数字低通滤波器(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| < 45
if(abs(angleVal.y) < 45){ // |y| < 45
if(angleVal.z > 0){ // z > 0
orientation = MPU9250_FLAT;
}
else{ // z < 0
orientation = MPU9250_FLAT_1;
}
}
else{ // |y| > 45
if(angleVal.y > 0){ // y > 0
orientation = MPU9250_XY;
}
else{ // y < 0
orientation = MPU9250_XY_1;
}
}
}
else{ // |x| >= 45
if(angleVal.x > 0){ // x > 0
orientation = MPU9250_YX;
}
else{ // x < 0
orientation = MPU9250_YX_1;
}
}
return orientation;
}
根据角度值判断方向状态:
当 |x| < 45 时:
当 |x| >= 45 时:
getOrientation()
返回枚举类型,适用于代码内部的逻辑判断。
getOrientationAsString()
返回字符串类型,适用于显示和记录,能为用户提供更直观的方向状态信息。
getResultantG(gValue)
函数的作用是计算并返回三个轴(x
, y
, z
)上重力加速度分量的合加速度(即合重力)。在三维空间中,根据勾股定理的扩展形式,合加速度可以通过三个轴上加速度分量的平方和的平方根来计算。
xyzFloat gValue = myMPU9250.getGValues();
float resultantG = myMPU9250.getResultantG(gValue);
在航空航天和机器人领域,通常使用欧拉角(Euler angles)来描述物体在三维空间中的姿态,欧拉角包含横滚(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()