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);
}
@user78465, 👍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);
}
Есть также длинный пример скетча ...
Вы не говорите нам, в чем проблема, поэтому я предполагаю, что это адрес или уровень. Если вы получаете сообщение "Не удалось найти действующий датчик 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 доллар. Я надеюсь, что это поможет
- Как подключить вывод INT MPU 6050?
- Как очистить буфер FIFO на MPU6050?
- Как сгенерировать аппаратное прерывание в mpu6050 для пробуждения Arduino из режима SLEEP_MODE_PWR_DOWN?
- MPU6050 не работает
- Понимание того, почему следует избегать «String» и альтернативных решений
- Объяснение кода MPU6050
- Как подключить MPU9250 к NodeMCU с помощью SPI или I2C Slave?
- Линейное ускорение от MPU 6050
Не могли бы вы предоставить схему того, как вы все соединили вместе? 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