找不到带有ESP32的MPU6050



我想把我的MPU6050和我的ESP32一起使用。(链接到特定的ESP板)

这不是我第一次使用MPU6050。我以前在Arduino Uno和MPU6050_light.h库的项目中使用过它。效果很好。现在我正在用我的新ESP32试试。

我尝试了MPU6050_light和Adafruit MPU6050库,但第一个返回

MPU6050 status: 2

和最后一个抛出错误:

查找MPU6050芯片失败

电线是绝对正确的:

  • 接地→接地
  • V3V→VCC
  • SDA->PIN 21 (SDA PIN)
  • SCL->PIN 22 (SCL PIN)

我使用I2C扫描仪来检查是否找到了MPU以及它的地址。这也奏效了。是标准地址0x68。我观察到,当我拔出一根电线然后重新连接时,找到的地址变为0x69

所以MPU被找到了。有谁知道怎么解决我的问题吗?

代码:MPU6050_light.h
#include <Arduino.h>
#include <MPU6050_light.h>
#include "Wire.h"
MPU6050 mpu(Wire);
long angle = 0;
unsigned long timer = 0;
void gyroSetUp()
{
byte status = mpu.begin();
Serial.print("MPU6050 status: ");
Serial.println(status);
while (status != 0)
{
} // stop everything if could not connect to MPU6050
Serial.println("Calculating offsets, do not move MPU6050");
delay(1000);
mpu.calcOffsets(true, true); // gyro and accelero
Serial.println("Done!n");
}
void PrintAngles()
{
Serial.print("X: ");
Serial.print(mpu.getAngleX());
Serial.print("tY: ");
Serial.print(mpu.getAngleY());
Serial.print("tZ: ");
Serial.print(mpu.getAngleZ());
Serial.print("n");
}
void setup()
{
Serial.begin(115200);
Serial.println("Starting");
Wire.begin();
gyroSetUp();
}
void loop()
{
mpu.update();
if ((millis() - timer) > 1000)
{
PrintAngles();
timer = millis();
}
}

Adafruit MPU6050代码

/* Get tilt angles on X and Y, and rotation angle on Z
* Angles are given in degrees
*
* License: MIT
*/
#include "Wire.h"
#include <Adafruit_MPU6050.h>
#include <Adafruit_Sensor.h>
Adafruit_MPU6050 mpu;
sensors_event_t a, g, temp;
float gyroX, gyroY, gyroZ;
float gyroXerror = 0.07;
float gyroYerror = 0.03;
float gyroZerror = 0.01;
unsigned long lastTime = 0;
unsigned long gyroDelay = 10;
void initMPU()
{
if (!mpu.begin())
{
Serial.println("Failed to find MPU6050 chip");
while (1)
{
delay(10);
}
}
Serial.println("MPU6050 Found!");
}
void getGyroReadings()
{
mpu.getEvent(&a, &g, &temp);
float gyroX_temp = g.gyro.x;
if (abs(gyroX_temp) > gyroXerror)
{
gyroX += gyroX_temp / 50.00;
}
float gyroY_temp = g.gyro.y;
if (abs(gyroY_temp) > gyroYerror)
{
gyroY += gyroY_temp / 70.00;
}
float gyroZ_temp = g.gyro.z;
if (abs(gyroZ_temp) > gyroZerror)
{
gyroZ += gyroZ_temp / 90.00;
}
Serial.print("X: ");
Serial.print(String(gyroX));
Serial.print("tY: ");
Serial.print(String(gyroY));
Serial.print("tZ: ");
Serial.print(String(gyroZ));
Serial.print("n");
}
void setup()
{
Serial.begin(115200);
initMPU();
}
void loop()
{
if ((millis() - lastTime) > gyroDelay)
{
getGyroReadings();
lastTime = millis();
}
}

我找到问题的根源了。

解决方案:Adafruit_MPU6050.h

#define MPU6050_DEVICE_ID 0x68 ///< The correct MPU6050_WHO_AM_I value

这个"0 x68"必须更改为0x98

只在这一行

NOT here:

#define MPU6050_I2CADDR_DEFAULT 
0x68 ///< MPU6050 default i2c address w/ AD0 high

必须保持不变0x68

我找到了解决我的特定问题的方法。这花了我一生的4小时。如果您使用MPU6050_light.h,则示例草图中有一个错误的函数:

mpu.calcOffsets();

你必须把它改成:

mpu.calcOffsets(true, true);

我不明白为什么这个函数是这样设计的,但是使用它不带参数是可以的。

我仍然不知道为什么另一个库不能工作,但我希望我在未来为别人节省了时间。

相关内容

  • 没有找到相关文章

最新更新