如何使用 MPU-6050 加速度计和陀螺仪模块
MPU-6050是一款多功能传感器,将3轴加速度计和3轴陀螺仪集成在一个封装中。在本教程中,我们将探索如何将该模块与Arduino接口,以测量加速度和角速度。最终结果将是一个简单的程序,可以实时显示传感器的数据,使您能够监控设备的加速度和方向。

通过遵循本指南,您将学习如何设置硬件,正确接线组件,并编写必要的代码以使MPU-6050启动并运行。这将为您提供进一步涉及运动传感和方向检测的项目的基础。为获得额外的清晰度,请确保查看本教程附带的视频(视频在00:00)。
硬件解析
该项目的主要组件是MPU-6050传感器,它提供加速度计和陀螺仪的数据。加速度计测量沿X、Y和Z轴的线性加速度,而陀螺仪测量绕这些轴的旋转速率。这种组合使得MPU-6050成为需要运动追踪的应用的绝佳选择。
此外,该模块使用I2C接口进行通信,这简化了连接并允许多个设备连接在同一总线上。传感器通过VCC引脚供电,通常需要3.3V到5V之间的电压。接地与Arduino的公共接地相连。
数据表详情
| 制造商 | InvenSense |
|---|---|
| 零件编号 | MPU-6050 |
| 逻辑/IO电压 | 3.3 - 5 V |
| 供电电压 | 3.3 - 5 伏 |
| 每个通道的输出电流 | ... |
| 峰值电流(每通道) | ... |
| PWM频率指导 | ... |
| 输入逻辑阈值 | 抱歉,我无法翻译空输入。 |
| 电压降 / RDS(导通)/ 饱和度 | ... |
| 热极限 | ... |
| 包裹 | QFN |
| 备注 / 变体 | ... |
- 将VCC引脚连接到3.3V或5V。
- 将GND引脚连接到接地。
- 通过SDA(数据)和SCL(时钟)使用I2C通信。
- 确保在SDA和SCL线上存在上拉电阻。
- 检查电压水平以避免损坏传感器。
接线说明

要将MPU-6050连接到您的Arduino,首先将MPU-6050的VCC引脚连接到Arduino的5V引脚。接下来,将MPU-6050的GND引脚连接到Arduino的一个GND引脚。对于I2C通信,将MPU-6050的SDA引脚连接到Arduino的A4引脚,将SCL引脚连接到A5引脚。确保您的Arduino设置为使用I2C通信,通过在代码中包含适当的库来实现。
在给系统供电之前,请仔细检查连接。如果使用面包板,请确保连接牢固,并且没有短路。如果模块没有按预期响应,请验证布线并检查代码中MPU-6050的I2C地址。
代码示例与指南
以下代码片段初始化 MPU-6050 并开始从中读取数据。关键标识符包括mpu6050,作为MPU6050类的实例,和timer用于控制数据输出时机。
MPU6050 mpu6050(Wire);
long timer = 0;
void setup() {
Serial.begin(9600);
Wire.begin();
mpu6050.begin();
mpu6050.calcGyroOffsets(true);
}
在此设置函数中,我们初始化串行通信和MPU-6050传感器。mpu6050.calcGyroOffsets(true)调用至关重要,因为它校准陀螺仪的偏移量,确保读取的准确性。
在循环函数中,我们不断更新传感器数据并将其打印到串行监视器。以下代码片段显示了如何读取和打印温度和加速度数据:
if(millis() - timer > 1000){
Serial.print("temp : ");Serial.println(mpu6050.getTemp());
Serial.print("accX : ");Serial.print(mpu6050.getAccX());
Serial.print("\taccY : ");Serial.print(mpu6050.getAccY());
Serial.print("\taccZ : ");Serial.println(mpu6050.getAccZ());
}
此块检查自上次输出以来是否已过去一秒。然后,它从 MPU-6050 获取温度和加速度值,并将其打印到串行监视器上。您可以实时观察这些值的更新。
演示 / 期待内容
一旦一切接线完成并且代码上传,你可以预期每秒在串口监视器中看到温度和加速度数据的打印。如果你倾斜或移动 MPU-6050,加速度值应该相应地改变。请注意,接线错误或供电不足可能导致读数不稳定或根本没有数据(视频中在 01:30)。
/*
*
* This code is basic usage of the MPU-6050 Accelerometer and Gyroscope.
*
* This code displays all data:
* -Gyroscope X, Gyroscope Y, Gyroscope Z
* -Gyroscope Angle X, Gyroscope Angle Y, Gyroscope Angle Z
* -Accel X, Accel Y, Accel Z
* -Accel Angle X, Accel Angle Y, Accel Angle Z,
*
* Library and code have been taken from:
* https://github.com/tockn/MPU6050_tockn
*
* Updated by Ahmad Shamshiri on July 03, 2018 in Ajax, Ontario, Canada
* for Robojax.com
* Get this code from Robojax.com
* Watch video instructions for this code at: https://youtu.be/uhh7ik02aDc
*
*/
#include <MPU6050_tockn.h>
#include <Wire.h>
MPU6050 mpu6050(Wire);
long timer = 0;
void setup() {
Serial.begin(9600);
Wire.begin();
mpu6050.begin();
mpu6050.calcGyroOffsets(true);
}
void loop() {
mpu6050.update();
if(millis() - timer > 1000){
Serial.println("=======================================================");
Serial.print("temp : ");Serial.println(mpu6050.getTemp());
Serial.print("accX : ");Serial.print(mpu6050.getAccX());
Serial.print("\taccY : ");Serial.print(mpu6050.getAccY());
Serial.print("\taccZ : ");Serial.println(mpu6050.getAccZ());
Serial.print("gyroX : ");Serial.print(mpu6050.getGyroX());
Serial.print("\tgyroY : ");Serial.print(mpu6050.getGyroY());
Serial.print("\tgyroZ : ");Serial.println(mpu6050.getGyroZ());
Serial.print("accAngleX : ");Serial.print(mpu6050.getAccAngleX());
Serial.print("\taccAngleY : ");Serial.println(mpu6050.getAccAngleY());
Serial.print("gyroAngleX : ");Serial.print(mpu6050.getGyroAngleX());
Serial.print("\tgyroAngleY : ");Serial.print(mpu6050.getGyroAngleY());
Serial.print("\tgyroAngleZ : ");Serial.println(mpu6050.getGyroAngleZ());
Serial.print("angleX : ");Serial.print(mpu6050.getAngleX());
Serial.print("\tangleY : ");Serial.print(mpu6050.getAngleY());
Serial.print("\tangleZ : ");Serial.println(mpu6050.getAngleZ());
Serial.println("=======================================================\n");
timer = millis();
}
}
/*
*
* This code is basic usage of the MPU-6050 Accelerometer and Gyroscope.
*
* This code displays:
* - Angle X, Angle Y, Angle Z,
*
* Library and code have been taken from:
* https://github.com/tockn/MPU6050_tockn
*
* Updated by Ahmad Shamshiri on July 03, 2018 in Ajax, Ontario, Canada
* for Robojax.com
* Get this code from Robojax.com
* Watch video instructions for this code at: https://youtu.be/uhh7ik02aDc
*
*/
#include <MPU6050_tockn.h>
#include <Wire.h>
MPU6050 mpu6050(Wire);
long timer = 0;
void setup() {
Serial.begin(9600);
Wire.begin();
mpu6050.begin();
mpu6050.calcGyroOffsets(true);
}
void loop() {
mpu6050.update();
if(millis() - timer > 1000){
Serial.println("=======================================================");
Serial.print("temp : ");Serial.println(mpu6050.getTemp());
Serial.print("accX : ");Serial.print(mpu6050.getAccX());
Serial.print("\taccY : ");Serial.print(mpu6050.getAccY());
Serial.print("\taccZ : ");Serial.println(mpu6050.getAccZ());
Serial.print("gyroX : ");Serial.print(mpu6050.getGyroX());
Serial.print("\tgyroY : ");Serial.print(mpu6050.getGyroY());
Serial.print("\tgyroZ : ");Serial.println(mpu6050.getGyroZ());
Serial.print("accAngleX : ");Serial.print(mpu6050.getAccAngleX());
Serial.print("\taccAngleY : ");Serial.println(mpu6050.getAccAngleY());
Serial.print("gyroAngleX : ");Serial.print(mpu6050.getGyroAngleX());
Serial.print("\tgyroAngleY : ");Serial.print(mpu6050.getGyroAngleY());
Serial.print("\tgyroAngleZ : ");Serial.println(mpu6050.getGyroAngleZ());
Serial.print("angleX : ");Serial.print(mpu6050.getAngleX());
Serial.print("\tangleY : ");Serial.print(mpu6050.getAngleY());
Serial.print("\tangleZ : ");Serial.println(mpu6050.getAngleZ());
Serial.println("=======================================================\n");
timer = millis();
}
}
|||您可能需要的东西
-
亚马逊从亚马逊购买 MPU-6050amzn.to
资源与参考
-
外部制造商网站invensense.com
文件📁
Arduino 库(zip 格式)
-
MPU9250的Arduino库
robojax-MPU9250-master.zip3.38 MB