云瑶琦鱼 2025-01-14 21:40 采纳率: 100%
浏览 152
已结题

MPU6050初始化没数据

破财消灾;问题解决有打赏;

问题描述: MPU6050初始化没数据,获取MPU6050地址出错

开发环境:Arduino IDE, ESP32C3,MPU6050;

接线:VCC>>3V3;GND>>GND;SCL>>SCL;SDA>>SDA。

获取MPU6050地址程序代码如下:

/*
  程序: I2C Scanner
  公众号:孤独的二进制 
*/
#include <Wire.h>

void setup()
{
  Serial.begin(9600);  //开启串口显示
  while (!Serial);
  Serial.println("\nI2C Scanner");

  Wire.begin();  // 开启I2C, 不写地址,就是主设备
  Wire.setClock(100000); //默认 100KHz
  // Wire.setWireTimeout(3000, true);  // timeout (us,reset_on_timeout)编译不通过所以注释了
}


void loop()
{
  Serial.println("Scanning...");

  for (int i = 0; i < 128; i++ )
  {
    Wire.beginTransmission(i); // 准备向指定地址开始传输数据
    byte code = Wire.endTransmission(); //结束传输

    if (code == 0) //反馈0,代表收到回应,一切正常
    {
      Serial.print("Found: 0x");
      Serial.println(i, HEX);
    }

  }

  delay(5000);
}

报错(问题)截图:

img

获取MPU6050数据使用到的程序代码如下:

// Basic demo for accelerometer readings from Adafruit MPU6050
// 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(2000); // will pause Zero, Leonardo, etc until serial console opens

  Serial.println("Adafruit MPU6050 test!");

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

  mpu.setAccelerometerRange(MPU6050_RANGE_8_G);
  Serial.print("Accelerometer range set to: ");
  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;
  }
  mpu.setGyroRange(MPU6050_RANGE_500_DEG);
  Serial.print("Gyro range set to: ");
  switch (mpu.getGyroRange()) {
  case MPU6050_RANGE_250_DEG:
    Serial.println("+- 250 deg/s");
    break;
  case MPU6050_RANGE_500_DEG:
    Serial.println("+- 500 deg/s");
    break;
  case MPU6050_RANGE_1000_DEG:
    Serial.println("+- 1000 deg/s");
    break;
  case MPU6050_RANGE_2000_DEG:
    Serial.println("+- 2000 deg/s");
    break;
  }

  mpu.setFilterBandwidth(MPU6050_BAND_21_HZ);
  Serial.print("Filter bandwidth set to: ");
  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() {

  /* Get new sensor events with the readings */
  /* 获取新的传感器事件和读数 */
  sensors_event_t a, g, temp;
  mpu.getEvent(&a, &g, &temp);

  /* Print out the values */
  /* 打印出值 */
  Serial.print("Acceleration 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("Rotation 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("Temperature: ");
  Serial.print(temp.temperature);
  Serial.println(" degC");

  Serial.println("");
  delay(500);
}

问题相关截图:

img

相关开发版端口信息如图:

img

  • 写回答

4条回答 默认 最新

  • GISer Liu 2025-01-15 03:38
    关注

    该回答引用自GPT-deepseek, 由博主 GISer Liu 编写:

    问题分析

    用户在使用ESP32C3开发板与MPU6050传感器进行通信时,遇到了初始化失败的问题。具体表现为:

    1. I2C扫描程序:用户使用了I2C扫描程序来检测MPU6050的地址,但程序没有找到任何设备。
    2. MPU6050初始化失败:在使用Adafruit MPU6050库进行初始化时,程序提示“Failed to find MPU6050 chip”,即无法找到MPU6050芯片。

    可能的原因

    1. 硬件连接问题:虽然用户已经按照VCC>>3V3;GND>>GND;SCL>>SCL;SDA>>SDA的接线方式连接了MPU6050,但可能存在接触不良或接线错误。
    2. I2C地址问题:MPU6050的默认I2C地址是0x68或0x69,具体取决于AD0引脚的电平。如果AD0引脚接高电平,地址为0x69;接低电平或悬空,地址为0x68。
    3. I2C总线问题:ESP32C3的I2C引脚可能没有正确配置,或者I2C总线上的其他设备干扰了通信。
    4. 电源问题:MPU6050的电源电压可能不稳定,导致芯片无法正常工作。

    解决方案

    1. 检查硬件连接

    • 确认接线:确保VCC、GND、SCL、SDA的接线正确无误,尤其是SCL和SDA引脚是否与ESP32C3的I2C引脚对应。
    • 检查接触:检查所有连接点是否接触良好,尤其是杜邦线是否插紧。

    2. 确认I2C地址

    • AD0引脚:检查MPU6050的AD0引脚是否接高电平或低电平,以确定I2C地址是0x68还是0x69。
    • 修改I2C扫描程序:在I2C扫描程序中,可以尝试手动指定I2C地址进行扫描。
    void loop() {
      Serial.println("Scanning...");
    
      for (int i = 0; i < 128; i++ )
      {
        Wire.beginTransmission(i); // 准备向指定地址开始传输数据
        byte code = Wire.endTransmission(); //结束传输
    
        if (code == 0) //反馈0,代表收到回应,一切正常
        {
          Serial.print("Found: 0x");
          Serial.println(i, HEX);
        }
      }
    
      delay(5000);
    }
    

    3. 检查I2C总线配置

    • 确认I2C引脚:ESP32C3的默认I2C引脚可能与其他开发板不同,确保SCL和SDA引脚正确。
    • 修改I2C初始化代码:在Wire.begin()中指定正确的I2C引脚。
    void setup()
    {
      Serial.begin(9600);  //开启串口显示
      while (!Serial);
      Serial.println("\nI2C Scanner");
    
      Wire.begin(SDA, SCL);  // 指定SDA和SCL引脚
      Wire.setClock(100000); //默认 100KHz
    }
    

    4. 检查电源

    • 电源电压:使用万用表测量MPU6050的VCC引脚电压,确保电压在3.3V左右。
    • 电源稳定性:如果电源不稳定,可以尝试使用外部稳压电源为MPU6050供电。

    修改后的完整代码

    I2C扫描程序

    #include <Wire.h>
    
    void setup()
    {
      Serial.begin(9600);  //开启串口显示
      while (!Serial);
      Serial.println("\nI2C Scanner");
    
      Wire.begin(SDA, SCL);  // 指定SDA和SCL引脚
      Wire.setClock(100000); //默认 100KHz
    }
    
    void loop()
    {
      Serial.println("Scanning...");
    
      for (int i = 0; i < 128; i++ )
      {
        Wire.beginTransmission(i); // 准备向指定地址开始传输数据
        byte code = Wire.endTransmission(); //结束传输
    
        if (code == 0) //反馈0,代表收到回应,一切正常
        {
          Serial.print("Found: 0x");
          Serial.println(i, HEX);
        }
      }
    
      delay(5000);
    }
    

    MPU6050初始化程序

    #include <Adafruit_MPU6050.h>
    #include <Adafruit_Sensor.h>
    #include <Wire.h>
    
    Adafruit_MPU6050 mpu;
    
    void setup(void) {
      Serial.begin(115200);
      while (!Serial)
        delay(2000); // will pause Zero, Leonardo, etc until serial console opens
    
      Serial.println("Adafruit MPU6050 test!");
    
      // Try to initialize!
      // 尝试初始化!
      if (!mpu.begin(0x68)) {  // 指定I2C地址为0x68
        Serial.println("Failed to find MPU6050 chip");
        while (1) {
          delay(10);
        }
      }
      Serial.println("MPU6050 Found!");
    
      mpu.setAccelerometerRange(MPU6050_RANGE_8_G);
      Serial.print("Accelerometer range set to: ");
      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;
      }
      mpu.setGyroRange(MPU6050_RANGE_500_DEG);
      Serial.print("Gyro range set to: ");
      switch (mpu.getGyroRange()) {
      case MPU6050_RANGE_250_DEG:
        Serial.println("+- 250 deg/s");
        break;
      case MPU6050_RANGE_500_DEG:
        Serial.println("+- 500 deg/s");
        break;
      case MPU6050_RANGE_1000_DEG:
        Serial.println("+- 1000 deg/s");
        break;
      case MPU6050_RANGE_2000_DEG:
        Serial.println("+- 2000 deg/s");
        break;
      }
    
      mpu.setFilterBandwidth(MPU6050_BAND_21_HZ);
      Serial.print("Filter bandwidth set to: ");
      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() {
    
      /* Get new sensor events with the readings */
      /* 获取新的传感器事件和读数 */
      sensors_event_t a, g, temp;
      mpu.getEvent(&a, &g, &temp);
    
      /* Print out the values */
      /* 打印出值 */
      Serial.print("Acceleration 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("Rotation 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("Temperature: ");
      Serial.print(temp.temperature);
      Serial.println(" degC");
    
      Serial.println("");
      delay(500);
    }
    

    总结

    通过以上步骤,用户可以逐步排查并解决MPU6050初始化失败的问题。首先检查硬件连接和电源,然后确认I2C地址和总线配置,最后修改代码以确保正确初始化MPU6050。如果问题仍然存在,建议进一步检查ESP32C3的I2C总线是否存在其他问题。

    如果该回答解决了您的问题,请采纳!如果没有,请私信联系或评论您的疑惑

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
    1人已打赏
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 1月23日
  • 已采纳回答 1月15日
  • 创建了问题 1月14日