一、MPU6050传感器介绍
MPU6050传感器是一个带3轴加速度计,3轴陀螺仪和带I2C接口的温度传感器的集成传感器。
名称 | 描述 |
VCC | 正极 |
GND | 负极 |
SCL | I2C时钟线 |
SDA | I2C数据线 |
XDA | 闲置 |
XCL | 闲置 |
AD0 | 地址选择引脚 |
INT | 中断 |
MPU6050
*通常只需要连接VCC、GND、SCL、SDA引脚。
*设备的I2C地址是0x68。可以通过将AD0引脚接到VCC来更改0x69的地址。
属性:
名称 | 描述 |
X轴加速度 | X轴上的加速度。acceleration.x (g) |
Y轴加速度 | Y轴上的加速度。acceleration.y (g) |
Z轴加速度 | Z轴上的加速度。acceleration.z (g) |
X轴旋转值 | 在X轴上的旋转角度。gyro.x(rad/s) |
Y轴旋转值 | 在Y轴上的旋转角度。gyro.x(rad/s) |
Z轴旋转值 | 在Z轴上的旋转角度。gyro.x(rad/s) |
温度 | 温度测量数据。temperature(degc) |
单位:
所有的速度值(x/y/z)都是用重力单位(g),其中1g=9.80665m/s^2。陀螺仪测量角旋转,并返回每秒的读数。
个人理解:
一个物体在无约束情况下有6个自由度,分别是3个沿着(x/y/z)轴平移的自由度,3个在(x/y/z)轴上旋转的自由度。加速度陀螺仪就是测量这6个自由度的传感器。
6个自由度,3个旋转和3个平移
二、代码:
这个代码把6个自由度和温度检测到的数据打印在串口监视器上。
// 基本示例:从 Adafruit MPU6050 读取加速度计数据
//在Arduino上使用MPU60506轴加速度陀螺仪传感器要包含3个库,分别是:
#include <Adafruit_MPU6050.h> // 包含 MPU6050 库文件
#include <Adafruit_Sensor.h> // 包含 Adafruit 传感器库文件
#include <Wire.h> // 包含 I2C 通信库文件
//和舵机一样,都需要创建一个对象:
Adafruit_MPU6050 mpu; // 创建 MPU6050 对象(mpu是创建的对象名,可以用其他的)
//只执行一次的设置
void setup() {
//初始化、检测是否初始话是否成功
Serial.begin(115200); // 初始化串口通信,波特率设为 115200
while (!Serial) delay(10); // 等待串口初始化完成(对于 Zero、Leonardo 等板子)
Serial.println("Adafruit MPU6050 测试!");
// 尝试初始化 MPU6050
if (!mpu.begin()) {
Serial.println("未能找到 MPU6050 芯片");
while (1) delay(10); // 初始化失败则循环等待
}
Serial.println("找到 MPU6050!");
//在setup中有3个参数要设置:分别为加速度计量程、陀螺仪量程和滤波器带宽。
// 设置加速度计量程为 ±8G
mpu.setAccelerometerRange(MPU6050_RANGE_8_G);//只有这一句是设置加速度计,其他都是显示信息
Serial.print("加速度计量程设置为: ");
switch (mpu.getAccelerometerRange()) {
case MPU6050_RANGE_2_G:
Serial.println("±2G");
break;
case MPU6050_RANGE_4_G:
Serial.println("±4G");
break;
case MPU6050_RANGE_8_G:
Serial.println("±8G");
break;
case MPU6050_RANGE_16_G:
Serial.println("±16G");
break;
}
// 设置陀螺仪量程为 ±2000°/s
mpu.setGyroRange(MPU6050_RANGE_2000_DEG);//只有这一句是设置陀螺仪,其他都是显示信息
Serial.print("陀螺仪量程设置为: ");
switch (mpu.getGyroRange()) {
case MPU6050_RANGE_250_DEG:
Serial.println("± 250 度/秒");
break;
case MPU6050_RANGE_500_DEG:
Serial.println("± 500 度/秒");
break;
case MPU6050_RANGE_1000_DEG:
Serial.println("± 1000 度/秒");
break;
case MPU6050_RANGE_2000_DEG:
Serial.println("± 2000 度/秒");
break;
}
// 设置滤波器带宽为 21Hz
mpu.setFilterBandwidth(MPU6050_BAND_21_HZ);//只有这一句是设置带宽,其他都是显示信息
Serial.print("滤波器带宽设置为: ");
switch (mpu.getFilterBandwidth()) {
case MPU6050_BAND_260_HZ:
Serial.println("260 Hz");
break;
case MPU6050_BAND_184_HZ:
Serial.println("184 Hz");
break;
case MPU6050_BAND_94_HZ:
Serial.println("94 Hz");
break;
case MPU6050_BAND_44_HZ:
Serial.println("44 Hz");
break;
case MPU6050_BAND_21_HZ:
Serial.println("21 Hz");
break;
case MPU6050_BAND_10_HZ:
Serial.println("10 Hz");
break;
case MPU6050_BAND_5_HZ:
Serial.println("5 Hz");
break;
}
Serial.println();
delay(100); // 稍作延迟
}
//到这就设置完了,接下来是实时读取数据的代码。
void loop() {
// 获取新的传感器事件数据
//创建3个sensors_event_t类型的结构体变量,分别命名为a、g、temp
//定义了用来存储传感器数据的结构体变量。
sensors_event_t a, g, temp;
//调用Adafruit_MPU6050类的getEvent()函数,从传感器获取最新的加速度、陀螺仪和温度数据
//并将这些数据分别存储到对应的变量中。
mpu.getEvent(&a, &g, &temp);
// 打印出读数
Serial.print("加速度 X: ");
Serial.print(a.acceleration.x);
Serial.print(", Y: ");
Serial.print(a.acceleration.y);
Serial.print(", Z: ");
Serial.print(a.acceleration.z);
Serial.println(" m/s^2");
Serial.print("旋转 X: ");
Serial.print(g.gyro.x);
Serial.print(", Y: ");
Serial.print(g.gyro.y);
Serial.print(", Z: ");
Serial.print(g.gyro.z);
Serial.println(" rad/s");
Serial.print("温度: ");
Serial.print(temp.temperature);
Serial.println(" 度C");
Serial.println(); // 打印空行
delay(500); // 每隔 500ms 读取一次数据
}
在loop中有几句代码可能需要解释一下,方便读者理解:
1、 sensors_event_t a, g, temp;
sensors_event_t是Adafruit Sensor库中的一个结构体类型,用于存储传感器事件的数据,包括但不限于加速度、角速度(陀螺仪)和温度等。
2、 mpu.getEvent(&a, &g, &temp);
调用Adafruit_MPU6050类的getEvent()方法。这个方法从MPU6050模块中获取传感器事件的数据,并将结果存储到之前定义的变量中。分别指向sensors_event_t类型的变量a,g和temp的地址。通过传递指针。
getEvent()函数可以直接将读取到的加速度数据填充到a,角速度填充到g、温度填充到temp。
3、
a.acceleration.x:结构体变量a的成员,存储了X轴加速度的值。
a.acceleration.y:结构体变量a的成员,存储了Y轴加速度的值。
a.acceleration.z:结构体变量a的成员,存储了Z轴加速度的值。
g.gyro.x:结构体变量g的成员,存储了X轴上旋转角速度的值。
g.gyro.y:结构体变量g的成员,存储了Y轴上旋转角速度的值。
g.gyro.z:结构体变量g的成员,存储了Z轴上旋转角速度的值。
temp.temperature:结构体变量temp的成员,存储了温度数据。