Вопросы по гироскопу MPU 6050

Тема в разделе "Схемотехника, компоненты, модули", создана пользователем pyro, 17 апр 2013.

  1. Инженер

    Инженер Нерд

    В документации есть указание на Digital Motion Processor кто нибудь разбирался как с этим работать?
     
  2. Pikrat

    Pikrat Нуб

    У меня те же симптомы, что и у вас - стадилизация на 45 грд. и
    "MPU-6050 with address 0x68 is not connected"

    Вам удалось решить проблему?
     
  3. Pikrat

    Pikrat Нуб

    Заработало!
    Как обычно вся беда была в банальном непропае. Надо мне менять мой лудильник уже...
     
  4. Onkel

    Onkel Гуру

    реанимирую - запустил 6050, по всем трем осям дает вместо ±g - только (примерно) ±g/2. Оно конечно dmp надо бы запускать, но все-таки надо разобраться с ½ - откуда она вылезла? "Плавная" регулировка может дать примерно ½?
     
  5. DavidG

    DavidG Нуб

    Какую дуню используете?
    Если мега то подключать SCL, SDA к соответствующим портам на дуине(находятся возле 13-го пина)
     
  6. Onkel

    Onkel Гуру

    dmp предполагает подключение к 6050 стороннего магнетометра. Я вот попробовал разобратья (особо много времени я этому уделить не могу-так, пару вечерних часов) - думаю проще взять готовый 9 DOF с уже имеющимся магнетометром, а у 6050 даташиты мутные и про dmp почти ничего нет.
     
  7. DrSergey

    DrSergey Нуб

    Приветствую. Подскажите - FSYNC вход, что происходит по нему, это синхронизация захвата измерений - измерение и запись в регистр (в FIFO если есть) по сигналу FSYNC или появление признака готовности всех данных в регистрах/FIFO данных по сигналу от 3-го устройства. Необходим оверсемплинг -> период измерений необходим очень точный (аналитически повысить быстродействие).
     
  8. ostrov

    ostrov Гуру

    Посидел сегодня над MPU 6050. Пока что он мне нужен в качестве показометра положения в пространстве относительно вертикальной оси. Смотрел показания с датчика без фильтра, с комплиментарным фильтром и с фильтром Кальмана. Два последних дрожат чуть меньше, но не значительно. Так и должно быть? Если есть хотя бы полсекунды для измерения, то старая добрая медиана справляется куда лучше.
     
  9. Onkel

    Onkel Гуру

    я ему процессор запустил, меряет и обрабатывает по кватернионам 10 мс, по прерываниям вызывает обработку. Но с компасом не удалось пока заставить работать, вроде его проц и не считает компас.
     
  10. Frosty

    Frosty Нерд

    Опять же вопрос относительно оси Z.
    Есть код
    Код (C++):
    #include <Wire.h>
    #include "Kalman.h"
    #include <Servo.h>
    Servo myservoX;
    Servo myservoY;
    Servo myservoZ;
    Kalman kalmanX;
    Kalman kalmanY;
    Kalman kalmanZ;
    uint8_t IMUAddress = 0x68;
    /* IMU Data */
    int16_t accX;
    int16_t accY;
    int16_t accZ;
    int16_t tempRaw;
    int16_t gyroX;
    int16_t gyroY;
    int16_t gyroZ;
    double accXangle; // Angle calculate using the accelerometer
    double accYangle;
    double accZangle;
    double temp;
    double gyroXangle = 180; // Angle calculate using the gyro
    double gyroYangle = 180;
    double gyroZangle = 180;
    double compAngleX = 180; // Calculate the angle using a Kalman filter
    double compAngleY = 180;
    double compAngleZ = 180;
    double kalAngleX; // Calculate the angle using a Kalman filter
    double kalAngleY;
    double kalAngleZ;
    uint32_t timer;
    void setup() {
      Wire.begin();
      Serial.begin(9600);
    myservoX.attach(8);
    myservoY.attach(9);
    myservoZ.attach(10);
      i2cWrite(0x6B,0x00); // Disable sleep mode    
      kalmanX.setAngle(180); // Set starting angle
      kalmanY.setAngle(180);
      kalmanZ.setAngle(180);
      timer = micros();
    }
    void loop() {
      /* Update all the values */
      uint8_t* data = i2cRead(0x3B,14);
      accX = ((data[0] << 8) | data[1]);
      accY = ((data[2] << 8) | data[3]);
      accZ = ((data[4] << 8) | data[5]);
      tempRaw = ((data[6] << 8) | data[7]);
      gyroX = ((data[8] << 8) | data[9]);
      gyroY = ((data[10] << 8) | data[11]);
      gyroZ = ((data[12] << 8) | data[13]);
      /* Calculate the angls based on the different sensors and algorithm */
      accYangle = (atan2(accX,accZ)+PI)*RAD_TO_DEG;
      accXangle = (atan2(accY,accZ)+PI)*RAD_TO_DEG;
      accXangle = (atan2(accY,accX)+PI)*RAD_TO_DEG;  
      double gyroXrate = (double)gyroX/131.0;
      double gyroYrate = -((double)gyroY/131.0);
      double gyroZrate = -((double)gyroZ/131.0);
      gyroXangle += kalmanX.getRate()*((double)(micros()-timer)/1000000); // Calculate gyro angle using the unbiased rate
      gyroYangle += kalmanY.getRate()*((double)(micros()-timer)/1000000);
       gyroZangle += kalmanZ.getRate()*((double)(micros()-timer)/1000000);
      kalAngleX = kalmanX.getAngle(accXangle, gyroXrate, (double)(micros()-timer)/1000000); // Calculate the angle using a Kalman filter
      kalAngleY = kalmanY.getAngle(accYangle, gyroYrate, (double)(micros()-timer)/1000000);
      kalAngleZ = kalmanZ.getAngle(accZangle, gyroZrate, (double)(micros()-timer)/1000000);
      timer = micros();
    Serial.println();
        Serial.print("X:");
        Serial.print(kalAngleX,0);
        Serial.print(" ");
        Serial.print("Y:");
        Serial.print(kalAngleY,0);
        Serial.println(" ");
        Serial.print("Z:");
        Serial.print(kalAngleZ,0);
    myservoX.write((int)kalAngleX-90);
    myservoY.write((int)kalAngleY-90);
    myservoZ.write((int)kalAngleY-90);
      // The accelerometer's maximum samples rate is 1kHz
    }
    void i2cWrite(uint8_t registerAddress, uint8_t data){
      Wire.beginTransmission(IMUAddress);
      Wire.write(registerAddress);
      Wire.write(data);
      Wire.endTransmission(); // Send stop
    }
    uint8_t* i2cRead(uint8_t registerAddress, uint8_t nbytes) {
      uint8_t data[nbytes];
      Wire.beginTransmission(IMUAddress);
      Wire.write(registerAddress);
      Wire.endTransmission(false); // Don't release the bus
      Wire.requestFrom(IMUAddress, nbytes); // Send a repeated start and then release the bus after reading
      for(uint8_t i = 0; i < nbytes; i++)
        data [i]= Wire.read();
      return data;
    }
    Это робоманипулятор. Х и У ведут себя более менее адекватно, а Z ведет себя почти как Y, глючит, да еще серва, на которую Z повешена, постоянно жужжит и подергивается. Что я тут сделал не так?
     
  11. Mifos

    Mifos Нуб

     
  12. Mifos

    Mifos Нуб

    Как минимум accXangle два раза прописали подрят
     
  13. Вы решили проблему? Если, да, то как?
    По X и Y работает идеально, по Z дрейф больше 40 град.
     
    Последнее редактирование: 20 авг 2017