Arduino同时读取两个MPU6050的数据

开发背景

工作中有个项目,急需同时测量两套振动计的加速度数据。直接连示波器的话,通道数不够。于是想使用MCU通过I2C接口同时读取两个MPU6050的数据,但网上只有读取单个MPU6050的资料。为防后续自己忘记,做以下记录。

  • MCU型号:Arduino
  • 传感器型号:MPU6050
  • IDE环境 : Arduino IDE

MPU6050基础介绍:

Integrated sensor with 3-axis accelerometer, 3-axis gyroscope and a temperature sensor with I2C interface.
在MPU6050模块

Pin 定义

NameDescription
VCCVoltage supply
GNDGround
SCLI2C clock line
SDAI2C data line
XDAUnused*
XCLUnused*
AD0Address select pin
INTInterrupt

You normally only need to connect the VCC, GND, SCL, and SDA pins. The I2C address of the device is 0x68. You can change the address of 0x69 by connecting the AD0 pin to VCC.

属性

NameDescriptionDefault value
accelXInitial x acceleration value (g)“0”
accelYInitial y acceleration value (g)“0”
accelZInitial z acceleration value (g)“1”
rotationXInitial x rotation value (deg/sec)“0”
rotationYInitial y rotation value (deg/sec)“0”
rotationZInitial z rotation value (deg/sec)“0”
temperatureInitial temperature value (celsius)“24”

单位

All the acceleration values (x/y/z) use g-force units, where 1g = 9.80665 m/s². The gyroscope measures angular rotation and returns the number of degrees per second.

MPU6050传感器的检测轴如图

下图显示了灵敏度轴的方向和旋转的极性。注意图中pin 1标识符(•)。
检测轴的方向

单MPU6050数据读取演示

单MPU6050模块接线

在Arduino Uno上,连接SDA引脚到A4, SCL引脚到A5。
单MPU6050模块接线图

单MPU6050模块示例

// Basic demo for accelerometer readings from Adafruit MPU6050

#include <Adafruit_MPU6050.h>
#include <Adafruit_Sensor.h>
#include <Wire.h>

Adafruit_MPU6050 mpu;

void setup(void) {
  Serial.begin(115200);
  while (!Serial) {
    delay(10); // will pause Zero, Leonardo, etc until serial console opens
  }

  // Try to initialize!
  if (!mpu.begin()) {
    Serial.println("Failed to find MPU6050 chip");
    while (1) {
      delay(10);
    }
  }

  mpu.setAccelerometerRange(MPU6050_RANGE_16_G);
  mpu.setGyroRange(MPU6050_RANGE_250_DEG);
  mpu.setFilterBandwidth(MPU6050_BAND_21_HZ);
  Serial.println("");
  delay(100);
}

void loop() {

  /* Get new sensor events with the readings */
  sensors_event_t a, g, temp;
  mpu.getEvent(&a, &g, &temp);

  /* Print out the values */
  Serial.print("AccelX:");
  Serial.print(a.acceleration.x);
  Serial.print(",");
  Serial.print("AccelY:");
  Serial.print(a.acceleration.y);
  Serial.print(",");
  Serial.print("AccelZ:");
  Serial.print(a.acceleration.z);
  Serial.print(", ");
  Serial.print("GyroX:");
  Serial.print(g.gyro.x);
  Serial.print(",");
  Serial.print("GyroY:");
  Serial.print(g.gyro.y);
  Serial.print(",");
  Serial.print("GyroZ:");
  Serial.print(g.gyro.z);
  Serial.println("");

  delay(100);
}

串口窗口每0.1秒输出

AccelX:0.00,AccelY:0.00,AccelZ:9.81, GyroX:0.00,GyroY:0.00,GyroZ:0.00

示例讲解

Adafruit_MPU6050.h说明

关于此库,上github查阅,链接:https://github.com/adafruit/Adafruit_MPU6050
设置MPU6050的测量范围和精度

  mpu.setAccelerometerRange(MPU6050_RANGE_16_G);//设置加速度计测量范围
  //量程为±2g、±4g、±8g和±16g的3轴加速度传感器。默认是2g
  //精度随量程变化,详见芯片PDF。
    
  mpu.setGyroRange(MPU6050_RANGE_250_DEG);//设置陀螺仪测量范围
  //敏感度与全格测范围为±250、±500、±1000与±2000°/sec的3轴角速度感测器(陀螺仪)。默认是500
  //精度随量程变化,详见芯片PDF。
  
  mpu.setFilterBandwidth(MPU6050_BAND_21_HZ);//设置数字低通滤波器的带宽
  //带宽范围为5~260Hz。默认是260Hz

带宽参考“正点原子”的PDF介绍:
采样率与带宽的关系
MPU6050的芯片PDF。1

Wire.h说明

引用“太极创客”的介绍:Wire库可以让Arduino与IIC / TWI设备进行通信。 与SPI总线一样, IIC也是主从方式通讯, 因此不能同时存在两个主设备,只能是一个主设备与一个或多个从设备进行通讯。
一般来说I2C地址有7位和8位的版本。 7位是设备标识码,而第8位则是为了确认设备当前状态是正在写入还是读取。 而Arduino -Wire库始终使用的是7位地址。 如果您使用了8位,则需要删除低位,从而得到0到127之间的地址。但是,地址从0到7 被保留了, 因此您在开发的时候请不要使用它们!!! 可以从8开始使用。
判断厂商提供的地址是7bit模式地址还是8bit地址模式的地址,7bit地址模式下,地址的取值范围在0x07到0x78之间,若超过了这个范围,那么这个地址可能就是8bit地址。2
请注意,连接SDA / SCL引脚时需要一个上拉电阻。
Wire库的实现使用了32字节缓冲区,因此任何通信都必须在此限制之内。 单次传输中超出的字节将被丢弃。
begin函数:
描述:初始化Wire库,并以主机或从机身份加入I2C总线。
通常来说这个函数只调用一次。
语法:

Wire.begin()
Wire.begin(address)

参数:
address(可选):7位从机的地址; 如果这个参数未指定,则默认以主机身份加入总线(注1)。

返回值:无

同时读取两个MPU6050数据的示例

双MPU6050模块接线

模块1的接线不变,模块2除AD0引脚接VCC,其它同模块1一样接线
双MPU6050模块接线图

双MPU6050模块示例

// Basic demo for accelerometer readings from double Adafruit MPU6050
#include <Adafruit_MPU6050.h>
#include <Adafruit_Sensor.h>
#include <Wire.h>

Adafruit_MPU6050 mpu1;
Adafruit_MPU6050 mpu2;

void setup(void) {
  Serial.begin(115200);
  while (!Serial) {
    delay(10); // will pause Zero, Leonardo, etc until serial console opens
  }

  // Try to initialize!
  if (!mpu1.begin(0x68))	//I2C地址出错会报:Failed to find 01-MPU6050 chip
   {
    Serial.println("Failed to find 01-MPU6050 chip");
    while (1) {
      delay(10);
    }
  }
  if (!mpu2.begin(0x69)) //I2C地址出错会报:Failed to find 02-MPU6050 chip
  {
    Serial.println("Failed to find 02-MPU6050 chip");
    while (1) {
      delay(10);
    }
  }

  mpu1.setAccelerometerRange(MPU6050_RANGE_16_G);
  mpu1.setGyroRange(MPU6050_RANGE_250_DEG);
  mpu1.setFilterBandwidth(MPU6050_BAND_21_HZ);
  Serial.println("");
  delay(100);
  mpu2.setAccelerometerRange(MPU6050_RANGE_16_G);
  mpu2.setGyroRange(MPU6050_RANGE_250_DEG);
  mpu2.setFilterBandwidth(MPU6050_BAND_21_HZ);
  Serial.println("");
  delay(100);
}

void loop() {

  /* Get new sensor events with the readings */
  sensors_event_t a1, g1, temp1;
  sensors_event_t a2, g2, temp2;
  mpu1.getEvent(&a1, &g1, &temp1);
  mpu2.getEvent(&a2, &g2, &temp2);

  /* Print out the values */
  Serial.print(a1.acceleration.x);
  Serial.print(",");
  Serial.print(a1.acceleration.y);
  Serial.print(",");
  Serial.print(a1.acceleration.z);
  Serial.print(",");
  Serial.print(a2.acceleration.x);
  Serial.print(",");
  Serial.print(a2.acceleration.y);
  Serial.print(",");
  Serial.println(a2.acceleration.z);
  
  delay(1000);
}

串口窗口每0.1秒输出

0.00,0.00,9.81,0.00,0.00,9.81

多个MPU6050的数据采集

控制AD0引脚采集多个数据

多个MPU6050的每一个AD0分别接一个 arduino 的IO口,这样可以用 arduino 控制它的高低来决定MPU6050的地址,每次要使用某一个MPU6050的时候,把这个AD0连接的 IO 口输出低电平,其它输出高电平,这些 MPU6050 的地址是 0x69,我们不用它,读取 IIC 的 0x68 地址的数据就是所要的了。
注意的是 IO 口是 5v,需要转换一下电平,或分压。
这应该使得在项目中有许多MPU-6050传感器成为可能。甚至超过10个传感器应该是可能的。注意,从许多MPU-6050传感器请求数据很慢,因为I2C总线很慢。具有SPI接口的传感器更快。
ZH有题主测试过该方案:
更新2016年3月25日:这个技巧确认工作正常使用三个GY-521开发版以及ESP8266 wifi /微控制器(NodeMCU)。
更新2017年5月2日:通过SPI驱动MPU6050可以带的动至少7个(我用的是7个)用来模拟出手部动作。

通过模拟开关芯片连接传感器

每传感器的SCL/SDA引脚不再连接MCU,改为连接模拟开关芯片,然后通过控制开关芯片的使能,控制每个传感器的SCL/SDA分别与MCU的导通,来采集数据。


  1. 链接:MPU6050的芯片PDF ↩︎

  2. 引用"IIC从地址之7位,8位和10位详解",链接:https://blog.csdn.net/geju323/article/details/119787270 ↩︎

### 回答1: 要实现MPU6050控制小车走直线,可以按照以下步骤进行操作。 首先,需要将MPU6050传感器与小车主控板进行连接。MPU6050传感器有多个引脚,例如VCC、GND、SCL、SDA等,需要根据具体的硬件情况进行正确的连接。 接下来,需要编写代码来读取MPU6050传感器的数据。可以使用适当的库函数或者驱动来实现这一步骤。通过读取传感器的数据,可以获取小车的加速度和角度信息。 然后,需要对于读取到的加速度和角度数据进行处理。可以使用滤波算法,如卡尔曼滤波器来优化数据的准确性。处理后的数据可以用来控制小车的运动。 接下来就是控制小车的行进方向和速度。可以根据小车的设计情况,使用适当的电机控制方法来实现。例如,可以通过PWM信号控制电机的转速和方向,进而控制小车的运动。 最后,根据读取到的传感器数据和控制方法,设计合适的算法来实现小车走直线。例如,可以通过控制小车的转向和加速度来保持小车在直线上的平衡,并弥补传感器的误差。 需要注意的是,实现MPU6050控制小车走直线是一个复杂的过程,需要对硬件和软件进行深入的理解和设计。同时,还需要根据具体的应用场景进行适当的调整和优化。因此,建议在具体操作之前,先查阅相关的资料和文档,了解相关的知识和技术。如果遇到问题,可以咨询相关的专业人士或者技术支持。 ### 回答2: 要实现MPU6050控制小车走直线,我们需要进行以下几个步骤: 1. 硬件连接:将MPU6050传感器与控制小车的主控板进行正确的电路连接。通常,MPU6050有6个引脚,包括电源引脚、地引脚、SCL引脚、SDA引脚、INT引脚和AD0引脚。正确连接各引脚至主控板相应的引脚。 2. 软件编程:使用合适的编程语言(如C++或Arduino语言),编写程序以读取MPU6050传感器的数据并控制小车走直线。首先,需要初始化MPU6050传感器,设置合适的采样率和滤波器参数。然后,通过读取MPU6050传感器的加速度计和陀螺仪数据,计算小车需要调整的方向和速度。根据所得的数据,调整小车的电机转速,使其保持直线行驶。 3. 数据处理:根据MPU6050传感器读取数据,判断小车是否偏离了直线。如果检测到偏移,需要根据偏移的方向和幅度来调整小车的行驶方向和速度。可以使用比例控制、PID控制或其他自动控制算法来实现精确的控制。 4. 实时反馈:为了实现更精确的控制,可以利用小车上的其他传感器(例如编码器)来实时检测小车的行驶状态,并将其反馈给MPU6050传感器的控制算法。通过实时反馈,可以更准确地调整小车的行驶方向和速度,从而实现更直线的行驶效果。 总之,实现MPU6050控制小车走直线需要正确连接硬件、编写合适的软件程序,根据传感器数据进行精确的控制,并通过实时反馈来进行优化。通过这些步骤,我们可以实现小车在不倾斜的情况下保持直线行驶。 ### 回答3: 实现MPU6050控制小车走直线,需要进行以下步骤: 首先,确保MPU6050传感器与小车控制器(如Arduino)正确连接。将MPU6050的SCL和SDA引脚连接到相应的Arduino引脚,并通过I2C协议进行通信。 其次,通过编程读取MPU6050传感器的原始数据。通过使用适当的库,你可以获得加速度计和陀螺仪的数据。加速度计可以用于检测小车的倾斜角度,而陀螺仪可以提供小车的角速度。 接下来,对读取数据进行处理。首先,可以通过将加速度计数据进行平滑处理,获得小车的倾斜角度。其次,可以通过对陀螺仪数据进行积分,获得小车的角度变化。 然后,根据处理后的数据调整小车的电机输出。根据小车的倾斜角度和角度变化,可以将相应的修正值应用于左右电机的输出,以使小车保持在直线上。 最后,反复读取和处理数据,并持续调整电机输出,以保持小车在直线上平稳移动。 需要注意的是,实现MPU6050控制小车走直线还需要考虑其他因素,例如小车的重心位置、轮子的摩擦力等。因此,可能需要进行一些试验和调试,以找到最佳的控制方式。同时,根据具体的需求和条件,可以灵活调整控制算法和参数。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蓝影影

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值