当前位置:   article > 正文

MPU6050 加速度计和陀螺仪传感器与 Arduino 的接口_arduino mpu6050

arduino mpu6050

Arduino-MPU6050-加速度计-陀螺仪模块接口教程

该模块的核心是低功耗、低成本的 6 轴运动跟踪芯片 MPU6050,它将 3 轴陀螺仪、3 轴加速度计和数字运动处理器 (DMP) 集成到一个 4mm x 4mm 的微型芯片中。包裹。

它可以测量沿所有三个轴的角动量或旋转、重力引起的静态加速度以及运动、冲击或振动引起的动态加速度。

mpu6050模块硬件概述

该模块包含一个板载 LD3985 3.3V 稳压器,因此您可以安全地将其与 Arduino 等 5V 逻辑微控制器一起使用。

MPU6050 在测量期间的功耗低于 3.6mA,空闲时的功耗仅为 5μA。由于其功耗低,可用于电池供电的设备。

此外,该模块还有一个电源 LED,当模块通电时该 LED 会亮起。

测量加速度

MPU6050 具有一个片上加速度计,可以测量 ±2g、±4g、±8g 和 ±16g 四个可编程满量程范围内的加速度。

mpu6050模块加速度计轴

MPU6050配备了三个16位模数转换器,可同时对三个运动轴(沿X、Y和Z轴)进行采样。

测量旋转

MPU6050 具有一个片上陀螺仪,可以测量 ±250°/s、±500°/s、±1000°/s 和 ±2000°/s 四个可编程满量程范围内的角旋转。

mpu6050模块陀螺仪轴

MPU6050 还配备了三个 16 位模数转换器,可同时对三个旋转轴(沿 X、Y 和 Z 轴)进行采样。采样率可在每秒 3.9 至 8000 个样本之间调整。

测量温度

MPU6050 包含一个嵌入式温度传感器,可以测量 -40 至 85°C 的温度,精度为 ±1°C。

请注意,此温度测量是硅芯片本身的温度,而不是环境温度。这些测量通常用于补偿加速度计和陀螺仪校准或检测温度变化而不是测量绝对温度。

I2C 接口

该模块通过I2C接口与Arduino进行通信。它支持两种不同的 I2C 地址: 0x68 HEX和 0x69 HEX。这允许两个 MPU6050 在同一总线上使用,或避免与总线上的其他设备发生地址冲突。

mpu6050模块i2c地址选择引脚

ADO 引脚决定模块的 I2C 地址。该引脚通过 4.7K 电阻下拉。因此,当您将 ADO 引脚悬空时,默认的 I2C 地址为 0x68 HEX;当您将其连接到 3.3V 时,该线被拉高,I2C 地址变为 0x69 HEX。

添加外部传感器

您可以通过将外部传感器连接到 MPU6050 模块来进一步提高其精度。这些外部传感器可以通过第二条完全独立的 I2C 总线(XDA 和 XCL)连接到 MPU6050。

mpu6050模块外部i2c引脚

这种外部连接通常用于连接磁力计,磁力计可以测量沿三个轴的磁场。MPU6050 有六个自由度 (DOF),其中三个用于加速计,三个用于陀螺仪。添加磁力计将传感器的自由度从 6 个自由度增加到 9 个自由度。

技术规格

以下是规格:

工作电压5V(典型值)
加速度计范围±2g、±4g、±8g、±16g
陀螺仪范围±250°/秒、±500°/秒、±1000°/秒、±2000°/秒
温度范围-40 至 +85°C
绝对最大加速度高达 10,000 克

欲了解更多信息,请参阅下面的数据表。

MPU6050 模块引脚分配

MPU6050模块的引脚排列如下:

mpu6050 3轴加速度计陀螺仪模块引脚排列

VCC为模块供电。

GND是接地引脚。

SCL是 I2C 接口的串行时钟引脚。

SDA是 I2C 接口的串行数据引脚。

XAD是外部I2C数据线。外部I2C总线用于连接外部传感器,例如磁力计。

XCL是外部I2C时钟线。

AD0允许您更改MPU6050模块的I2C地址。它可用于避免模块与其他 I2C 设备之间的冲突或将两个 MPU6050 连接到同一 I2C 总线。当您未连接 ADO 引脚时,默认 I2C 地址为 0x68 HEX;当您将其连接到 3.3V 时,I2C 地址更改为 0x69 HEX。

INT是中断输出引脚。MPU6050 可以编程为在检测到手势、平移、缩放、滚动、点击检测和摇动检测时生成中断。

将 MPU6050 模块连接到 Arduino

让我们将 MPU6050 模块连接到 Arduino。

连接非常简单。首先将 VCC 引脚连接到 Arduino 的 5V 输出,并将 GND 引脚接地。

现在我们剩下用于 I2C 通信的引脚。请注意,每个 Arduino 板都有不同的 I2C 引脚,必须正确连接。在采用 R3 布局的 Arduino 板上,SDA(数据线)和 SCL(时钟线)位于靠近 AREF 引脚的引脚头上。它们也称为 A5 (SCL) 和 A4 (SDA)。

查看下表以供快速参考。

SCLSDA
Arduino UnoA5A4
Arduino NanoA5A4
Arduino Mega2120
Leonardo/Micro32

下图显示了如何连接所有内容。

用arduino接线mpu6050加速陀螺仪模块

库安装

设置 MPU6050 模块以开始捕获设备的原始数据输出非常简单。另一方面,将数据处理成有意义的东西则更加困难,但我们可以使用一些库。

要安装库,请导航到Sketch > Include Library > Manage Libraries...等待库管理器下载库索引并更新已安装库的列表。

管理图书馆

输入“ mpu6050 ”来过滤您的搜索。查找AdafruitAdafruit MPU6050 库。单击该条目,然后选择安装。

adafruit mpu6050库安装

Adafruit MPU6050 库在内部使用Adafruit 统一传感器驱动程序Adafruit 总线 IO 库。因此,在库管理器中搜索 Adafruit Unified Sensor 和 BusIO 并安装它们。

adafruit统一传感器库安装

adafruit Busio 库安装

Arduino 示例代码

这是一个简单的程序,它从 MPU6050 模块读取线性加速度、角旋转和温度,并将它们打印在串行监视器上。

  1. #include <Adafruit_MPU6050.h>
  2. #include <Adafruit_Sensor.h>
  3. #include <Wire.h>
  4. Adafruit_MPU6050 mpu;
  5. void setup(void) {
  6. Serial.begin(115200);
  7. // Try to initialize!
  8. if (!mpu.begin()) {
  9. Serial.println("Failed to find MPU6050 chip");
  10. while (1) {
  11. delay(10);
  12. }
  13. }
  14. Serial.println("MPU6050 Found!");
  15. // set accelerometer range to +-8G
  16. mpu.setAccelerometerRange(MPU6050_RANGE_8_G);
  17. // set gyro range to +- 500 deg/s
  18. mpu.setGyroRange(MPU6050_RANGE_500_DEG);
  19. // set filter bandwidth to 21 Hz
  20. mpu.setFilterBandwidth(MPU6050_BAND_21_HZ);
  21. delay(100);
  22. }
  23. void loop() {
  24. /* Get new sensor events with the readings */
  25. sensors_event_t a, g, temp;
  26. mpu.getEvent(&a, &g, &temp);
  27. /* Print out the values */
  28. Serial.print("Acceleration X: ");
  29. Serial.print(a.acceleration.x);
  30. Serial.print(", Y: ");
  31. Serial.print(a.acceleration.y);
  32. Serial.print(", Z: ");
  33. Serial.print(a.acceleration.z);
  34. Serial.println(" m/s^2");
  35. Serial.print("Rotation X: ");
  36. Serial.print(g.gyro.x);
  37. Serial.print(", Y: ");
  38. Serial.print(g.gyro.y);
  39. Serial.print(", Z: ");
  40. Serial.print(g.gyro.z);
  41. Serial.println(" rad/s");
  42. Serial.print("Temperature: ");
  43. Serial.print(temp.temperature);
  44. Serial.println(" degC");
  45. Serial.println("");
  46. delay(500);
  47. }

确保在串口监视器中将波特率设置为“115200”。由于MPU6050返回的数据量过多,因此需要更高的速度来显示它。

会显示很多信息,比如线加速度、角旋转、温度等。移动传感器并观察数据如何变化。

mpu6050 arduino代码加速陀螺仪温度输出

代码说明:

在草图的开头,包含了所有必需的库。如前所述,Adafruit_MPU6050 库实现了 MPU6050 的硬件功能,而 Adafruit_Sensor 库则实现了统一的传感器抽象层。Wire.h 也包含在内,它允许我们与 I2C 设备进行通信。

  1. #include <Adafruit_MPU6050.h>
  2. #include <Adafruit_Sensor.h>
  3. #include <Wire.h>

接下来,创建 Adafruit_MPU6050 类的实例以访问其关联方法。

Adafruit_MPU6050 mpu;

在代码的设置部分,我们首先初始化与PC的串行通信并调用该begin()函数。该begin()函数初始化I2C接口并验证芯片ID是否正确。然后它会软重置芯片并等待传感器在唤醒后进行校准。

  1. Serial.begin(115200);
  2. // Try to initialize!
  3. if (!mpu.begin()) {
  4. Serial.println("Failed to find MPU6050 chip");
  5. while (1) {
  6. delay(10);
  7. }
  8. }

然后使用以下三个函数来配置 MPU6050 的测量范围。

设置加速度计范围mpu6050_accel_range_t

setAccelerometerRange()函数设置加速度计的测量范围。该函数接受以下值:

  • MPU6050_RANGE_2_G – ±2g 范围(默认)
  • MPU6050_RANGE_4_G – 适用于 ±4g 范围
  • MPU6050_RANGE_8_G – 适用于 ±8g 范围
  • MPU6050_RANGE_16_G – 适用于 ±16g 范围

请记住,范围越小,加速度计读数就越灵敏。

设置陀螺仪范围mpu6050_gyro_range_t

setGyroRange()函数设置陀螺仪测量范围。该函数接受以下值:

  • MPU6050_RANGE_250_DEG – 每秒 250 度的范围(默认)
  • MPU6050_RANGE_500_DEG – 适用于每秒 500 度的范围
  • MPU6050_RANGE_1000_DEG – 适用于每秒 1000 度的范围
  • MPU6050_RANGE_2000_DEG – 适用于每秒 2000 度的范围

请记住,较小的每秒度数范围会导致更灵敏的输出。

设置滤波器带宽mpu6050_bandwidth_t

setFilterBandwidth()函数设置数字低通滤波器的带宽。该函数接受以下值:

  • MPU6050_BAND_260_HZ – 适用于 260 Hz 带宽(根据文档,这会禁用滤波器)
  • MPU6050_BAND_184_HZ – 适用于 184 Hz 带宽
  • MPU6050_BAND_94_HZ – 适用于 94 Hz 带宽
  • MPU6050_BAND_44_HZ – 适用于 44 Hz 带宽
  • MPU6050_BAND_21_HZ – 适用于 21 Hz 带宽
  • MPU6050_BAND_10_HZ – 适用于 10 Hz 带宽
  • MPU6050_BAND_5_HZ – 适用于 5 Hz 带宽

带宽选择允许您改变低通滤波器的截止频率,从而通过消除高频噪声来平滑信号。

在此示例中,我们将加速度计范围设置为 ±8G,陀螺仪范围设置为 ±500°/s,滤波器带宽设置为 21 Hz。

  1. mpu.setAccelerometerRange(MPU6050_RANGE_8_G);
  2. mpu.setGyroRange(MPU6050_RANGE_500_DEG);
  3. mpu.setFilterBandwidth(MPU6050_BAND_21_HZ);

测量范围是MPU6050可以读取的最大加速度或角速度。考虑一下您正在测量的内容并据此设定限制。您是否需要测量电唱机(非常慢)或旋转轮(可能非常快)的旋转速度?

在代码的循环部分,我们创建了三个类型的对象sensors_event_t来保存结果。sensors_event_t只是一个用户定义的数据类型(C 中的结构),用于存储各种传感器数据,例如加速度、陀螺仪、温度、光、压力等。更多信息可在github上找到。

sensors_event_t a, g, temp;

getEvent()然后调用该函数。该函数从传感器读取一组新值(传感器“事件”),将它们转换为正确的 SI 单位和比例,然后将结果分配给我们的mpu对象。

mpu.getEvent(&a, &g, &temp);

最后,这些值显示在串行监视器上。

  1. Serial.print("Acceleration X: ");
  2. Serial.print(a.acceleration.x);
  3. Serial.print(", Y: ");
  4. Serial.print(a.acceleration.y);
  5. Serial.print(", Z: ");
  6. Serial.print(a.acceleration.z);
  7. Serial.println(" m/s^2");
  8. Serial.print("Rotation X: ");
  9. Serial.print(g.gyro.x);
  10. Serial.print(", Y: ");
  11. Serial.print(g.gyro.y);
  12. Serial.print(", Z: ");
  13. Serial.print(g.gyro.z);
  14. Serial.println(" rad/s");
  15. Serial.print("Temperature: ");
  16. Serial.print(temp.temperature);
  17. Serial.println(" degC");

Arduino 示例代码 – 绘制 MPU6050 数据

仅仅查看 MPU6050 的原始数据是没有帮助的。如果您确实想了解移动 MPU6050 时的反应,请使用串行绘图仪。

Arduino IDE 包含一个有用的工具,称为串行绘图仪。它可以提供变量的实时可视化。这对于可视化数据、调试代码和将变量可视化为波形非常有用。

让我们用下面更新的代码来尝试一下。编译并上传下面的程序,然后导航到“工具”>“串行绘图仪”(Ctrl+Shift+L)。代码使用波特率为115200;确保串行绘图仪也设置为 115200。

  1. #include <Adafruit_MPU6050.h>
  2. #include <Adafruit_Sensor.h>
  3. #include <Wire.h>
  4. Adafruit_MPU6050 mpu;
  5. void setup(void) {
  6. Serial.begin(115200);
  7. // Try to initialize!
  8. if (!mpu.begin()) {
  9. Serial.println("Failed to find MPU6050 chip");
  10. while (1) {
  11. delay(10);
  12. }
  13. }
  14. // set accelerometer range to +-8G
  15. mpu.setAccelerometerRange(MPU6050_RANGE_8_G);
  16. // set gyro range to +- 500 deg/s
  17. mpu.setGyroRange(MPU6050_RANGE_500_DEG);
  18. // set filter bandwidth to 21 Hz
  19. mpu.setFilterBandwidth(MPU6050_BAND_21_HZ);
  20. delay(100);
  21. }
  22. void loop() {
  23. /* Get new sensor events with the readings */
  24. sensors_event_t a, g, temp;
  25. mpu.getEvent(&a, &g, &temp);
  26. /* Print out the values */
  27. Serial.print(a.acceleration.x);
  28. Serial.print(",");
  29. Serial.print(a.acceleration.y);
  30. Serial.print(",");
  31. Serial.print(a.acceleration.z);
  32. Serial.print(", ");
  33. Serial.print(g.gyro.x);
  34. Serial.print(",");
  35. Serial.print(g.gyro.y);
  36. Serial.print(",");
  37. Serial.print(g.gyro.z);
  38. Serial.println("");
  39. delay(10);
  40. }

当您沿 Z 轴上下移动模块时,您应该看到类似这样的内容。

mpu6050 arduino绘图仪输出

代码说明:

您会注意到,该草图的大部分内容与前一个草图相同,但以下内容除外:

  • 不打印温度读数。
  • 所有其他读数都以形成逗号分隔的值列表的方式打印。
  • 每 10 毫秒读取一次读数。
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/467169
推荐阅读
相关标签
  

闽ICP备14008679号