Проблемы с MPU-6050 (GY-521)

Тема в разделе "Arduino & Shields", создана пользователем versham, 16 дек 2017.

  1. versham

    versham Нуб

    Я использую скетч отсюда: http://playground.arduino.cc/Main/MPU-6050
    Код (C++):
    // MPU-6050 Short Example Sketch
    // By Arduino User JohnChi
    // August 17, 2014
    // Public Domain
    #include<Wire.h>
    const int MPU_addr=0x68;  // I2C address of the 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 register
      Wire.write(0);     // set to zero (wakes up the MPU-6050)
      Wire.endTransmission(true);
      Serial.begin(9600);
    }
    void loop(){
      Wire.beginTransmission(MPU_addr);
      Wire.write(0x3B);  // starting with register 0x3B (ACCEL_XOUT_H)
      Wire.endTransmission(false);
      Wire.requestFrom(MPU_addr,14,true);  // request a total of 14 registers
      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);  //equation for temperature in degrees C from datasheet
      Serial.print(" | GyX = "); Serial.print(GyX);
      Serial.print(" | GyY = "); Serial.print(GyY);
      Serial.print(" | GyZ = "); Serial.println(GyZ);
      delay(333);
    }
    Подключаю, вроде как надо:
    VCC - 3.3V
    GND - GND
    SCL - A5 (у меня Uno)
    SDA - A4

    Получаю нулевые результаты, все время одни и те же данные:
    AcX = -1 | AcY = -1 | AcZ = -1 | Tmp = 36.53 | GyX = -1 | GyY = -1 | GyZ = -1

    В чем может быть проблема?

    P.S. Модуль точно не бракованный, я его проверял таким скетчем:
    Код (C++):
    void setup() {
      Serial.begin(9600);
      pinMode(A4, INPUT);
      pinMode(A5, INPUT);
    }

    void loop() {
      Serial.print(analogRead(A4));
      Serial.print(' ');
      Serial.print(analogRead(A5));
      Serial.print('\n');
    }
    И он реагировал на повороты.
     
  2. rkit

    rkit Гуру

    Лол. А вы уверены, что это модуль на повороты реагировал? А не электрическое поле на ваши руки, например? Попробуйте то же самое, но совсем без модуля.
     
  3. DIYMan

    DIYMan Guest

    Код дикий. Смотрите: вы просите шину отдать вам 14 байт:
    Код (C++):
    Wire.requestFrom(MPU_addr,14,true);
    А потом - СРАЗУ читаете:
    Код (C++):
    AcX=Wire.read()<<8|Wire.read();
    Вопрос на засыпку: вы уверены, что в приёмном буфере Wire есть данные?

    Надо ждать Wire.available(), примерно так:
    Код (C++):
    Wire.requestFrom(MPU_addr,14,true);
    while(Wire.available() < 14);