MPU 6050 считывает только 0 в выводе

Я новичок в использовании MPU 6050. Я застрял на базовом коде получения показаний от датчика. Код, который я использовал, прилагается ниже. Это тот, у которого есть плата для прорыва GY 521. Придя к выводу, что мой датчик сломан, я сменил датчик и теперь использую третий. Все равно не везет. К вашему сведению, я запустил код сканера i2c, чтобы проверить, может ли arduino(nano) обнаружить датчик. Код реагирует на все датчики, которые я пробовал. Я понятия не имею, что я делаю не так. Если бы кто-нибудь мог дать некоторые предложения, это было бы полезно

    MPU6050 Triple Axis Gyroscope & Accelerometer. Simple Gyroscope Example.
    Read more: http://www.jarzebski.pl/arduino/czujniki-i-sensory/3-osiowy-zyroskop-i-akcelerometr-mpu6050.html
    GIT: https://github.com/jarzebski/Arduino-MPU6050
    Web: http://www.jarzebski.pl
    (c) 2014 by Korneliusz Jarzebski
*/

#include <Wire.h>
#include <MPU6050.h>

MPU6050 mpu;

void setup() 
{
  Serial.begin(115200);

  // Инициализировать MPU6050
  Serial.println("Initialize MPU6050");
  while(!mpu.begin(MPU6050_SCALE_2000DPS, MPU6050_RANGE_2G))
  {
    Serial.println("Could not find a valid MPU6050 sensor, check wiring!");
    delay(500);
  }
  
  // Если вы хотите, вы можете установить смещения гироскопа
  // mpu.setGyroOffsetX(155);
  // mpu.setGyroOffsetY(15);
  // mpu.setGyroOffsetZ(15);
  
  // Откалибровать гироскоп. Калибровка должна находиться в состоянии покоя.
  // Если вы не хотите выполнять калибровку, прокомментируйте эту строку.
  mpu.calibrateGyro();

  // Установить пороговую чувствительность. По умолчанию 3.
  // Если вы не хотите использовать пороговое значение, прокомментируйте эту строку или установите 0.
  mpu.setThreshold(3);
  
  // Проверьте настройки
  checkSettings();
}

void checkSettings()
{
  Serial.println();
  
  Serial.print(" * Sleep Mode:        ");
  Serial.println(mpu.getSleepEnabled() ? "Enabled" : "Disabled");
  
  Serial.print(" * Clock Source:      ");
  switch(mpu.getClockSource())
  {
    case MPU6050_CLOCK_KEEP_RESET:     Serial.println("Stops the clock and keeps the timing generator in reset"); break;
    case MPU6050_CLOCK_EXTERNAL_19MHZ: Serial.println("PLL with external 19.2MHz reference"); break;
    case MPU6050_CLOCK_EXTERNAL_32KHZ: Serial.println("PLL with external 32.768kHz reference"); break;
    case MPU6050_CLOCK_PLL_ZGYRO:      Serial.println("PLL with Z axis gyroscope reference"); break;
    case MPU6050_CLOCK_PLL_YGYRO:      Serial.println("PLL with Y axis gyroscope reference"); break;
    case MPU6050_CLOCK_PLL_XGYRO:      Serial.println("PLL with X axis gyroscope reference"); break;
    case MPU6050_CLOCK_INTERNAL_8MHZ:  Serial.println("Internal 8MHz oscillator"); break;
  }
  
  Serial.print(" * Gyroscope:         ");
  switch(mpu.getScale())
  {
    case MPU6050_SCALE_2000DPS:        Serial.println("2000 dps"); break;
    case MPU6050_SCALE_1000DPS:        Serial.println("1000 dps"); break;
    case MPU6050_SCALE_500DPS:         Serial.println("500 dps"); break;
    case MPU6050_SCALE_250DPS:         Serial.println("250 dps"); break;
  } 
  
  Serial.print(" * Gyroscope offsets: ");
  Serial.print(mpu.getGyroOffsetX());
  Serial.print(" / ");
  Serial.print(mpu.getGyroOffsetY());
  Serial.print(" / ");
  Serial.println(mpu.getGyroOffsetZ());
  
  Serial.println();
}

void loop()
{
  Vector rawGyro = mpu.readRawGyro();
  Vector normGyro = mpu.readNormalizeGyro();

  Serial.print(" Xraw = ");
  Serial.print(rawGyro.XAxis);
  Serial.print(" Yraw = ");
  Serial.print(rawGyro.YAxis);
  Serial.print(" Zraw = ");
  Serial.println(rawGyro.ZAxis);

  Serial.print(" Xnorm = ");
  Serial.print(normGyro.XAxis);
  Serial.print(" Ynorm = ");
  Serial.print(normGyro.YAxis);
  Serial.print(" Znorm = ");
  Serial.println(normGyro.ZAxis);
  
  delay(10);
}

, 👍2

Обсуждение

Не могли бы вы предоставить схему того, как вы все соединили вместе? MPU-6050-это устройство 3,3 В, в то время как Arduino-5 В. Кроме того, GY 521 имеет встроенный регулятор 3,3 В, который должен поставляться с напряжением 5 В, а не 3,3 В. Дополнительная информация о [Arduino Plaground](https://playground.arduino.cc/Main/MPU-6050/) и [принципиальная схема](https://playground.arduino.cc/uploads/Main/MPU6050-V1-SCH/index.jpg), @tim


2 ответа


2

Ответа не последовало ... Я надеюсь, что это полезно для отладки ...

Только скетч, который я нашел (здесь), не помня, проверял ли я ...

// Краткий пример скетча MPU-6050
// By Arduino User JohnChi
// August 17, 2014
// Public Domain
#include<Wire.h>
const int MPU_addr=0x68;  // I2C адрес MPU-6050
int16_t AcX,AcY,AcZ,Tmp,GyX,GyY,GyZ;
void setup(){
  Wire.begin();
  Wire.beginTransmission(MPU_addr);
  Wire.write(0x6B);  // Регистр PWR_MGMT_1
  Wire.write(0);     // установлено значение ноль (пробуждает MPU-6050)
  Wire.endTransmission(true);
  Serial.begin(9600);
}
void loop(){
  Wire.beginTransmission(MPU_addr);
  Wire.write(0x3B);  // начиная с регистра 0x3B (ACCEL_XOUT_H)
  Wire.endTransmission(false);
  Wire.requestFrom(MPU_addr,14,true);  // запросить в общей сложности 14 регистров
  AcX=Wire.read()<<8|Wire.read();  // 0x3B (ACCEL_XOUT_H) & 0x3C (ACCEL_XOUT_L)    
  AcY=Wire.read()<<8|Wire.read();  // 0x3D (ACCEL_YOUT_H) & 0x3E (ACCEL_YOUT_L)
  AcZ=Wire.read()<<8|Wire.read();  // 0x3F (ACCEL_ZOUT_H) & 0x40 (ACCEL_ZOUT_L)
  Tmp=Wire.read()<<8|Wire.read();  // 0x41 (TEMP_OUT_H) & 0x42 (TEMP_OUT_L)
  GyX=Wire.read()<<8|Wire.read();  // 0x43 (GYRO_XOUT_H) & 0x44 (GYRO_XOUT_L)
  GyY=Wire.read()<<8|Wire.read();  // 0x45 (GYRO_YOUT_H) & 0x46 (GYRO_YOUT_L)
  GyZ=Wire.read()<<8|Wire.read();  // 0x47 (GYRO_ZOUT_H) & 0x48 (GYRO_ZOUT_L)
  Serial.print("AcX = "); Serial.print(AcX);
  Serial.print(" | AcY = "); Serial.print(AcY);
  Serial.print(" | AcZ = "); Serial.print(AcZ);
  Serial.print(" | Tmp = "); Serial.print(Tmp/340.00+36.53);  //уравнение для температуры в градусах C из таблицы данных
  Serial.print(" | GyX = "); Serial.print(GyX);
  Serial.print(" | GyY = "); Serial.print(GyY);
  Serial.print(" | GyZ = "); Serial.println(GyZ);
  delay(333);
}

Есть также длинный пример скетча ...

,

1

Вы не говорите нам, в чем проблема, поэтому я предполагаю, что это адрес или уровень. Если вы получаете сообщение "Не удалось найти действующий датчик MPU6050, проверьте проводку!", это проблема с адресом. По умолчанию MP6050 использует x068 в качестве адреса I2C. Если у вас есть что-то еще, подключенное к шине, может возникнуть конфликт. Если это так, подключите AD0 к 3,3 В (подтягивание с резистором 2,2 Ком), чтобы установить адрес 0x69 (используйте сканер I2C в /пример/провод, чтобы убедиться). Если вы видите нули, это может быть проблемой логического уровня: Чтобы уточнить предыдущий ответ, MP6050-это устройство напряжением 3,3 В. Схема GY 521 имеет регулятор напряжения (5 В->3,3 В), но на выходе она по-прежнему использует логический уровень TTL 3,3 В. При некотором шуме, плохих контактах или длинных проводах Arduino может неправильно считывать I2C. Были аналогичные проблемы, решаемые с помощью двунаправленного сдвигателя логического уровня между Uno и MPU6050. Вы можете получить предварительно собранную 4-канальную плату (того же размера, что и плата GY521) за ~ 1 доллар. Я надеюсь, что это поможет

,