MPU6050 DMP

Тема в разделе "Схемотехника, компоненты, модули", создана пользователем NeoProg, 5 фев 2017.

  1. NeoProg

    NeoProg Нуб

    Добрый день. Использую MPU6050 с Arduino UNO. Код программы представлен ниже. Проблема заключается вот в чем: я экспериментальным методом определил параметры калибровки гироскопа. Установил необходимые значения во время инициализации. Первые 6 - 10 секунд работы датчика (датчик неподвижен) данные с гироскопа по всем осям 0, потом начинаются скачки 0, -1, 0, -1, 0, -1 и тд. Предполагаю, что DMP сам производит калибровку первые 10 секунд потому, что даже когда я не устанавливаю свои значения, то датчик показывает: -3 по Х, -2 по Y, - 2 по Z, а через 6 - 10 секунд опять начинаются скачки 0, -1, 0, -1. Не подскажите как от этого избавится?

    Код (C++):
    #include "myMPU6050_6Axis_MotionApps20.h"
    MPU6050 mpu;

    uint16_t packetSize = 42;    // expected DMP packet size (default is 42 bytes)
    uint8_t fifoBuffer[64]; // FIFO storage buffer

    void setup()
    {
        Wire.begin();
        Serial.begin(500000);
        while (!Serial);
        //
        Serial.println(F("Initializing I2C devices..."));
        mpu.initialize();

        // verify connection
        Serial.println("CORE: Testing device connections...");
        Serial.println(mpu.testConnection() ? "CORE: MPU6050 connection successful" : "CORE: MPU6050 connection failed");

        // wait for ready
        Serial.println("CORE: Send any character to begin DMP programming and demo: ");
        Serial.flush();
        while (Serial.available() == 0);
        Serial.flush();
        //
        Serial.println("CORE: Initializing DMP...");
        if (mpu.dmpInitialize() == true)
        {
            mpu.setXGyroOffset(131);
            mpu.setYGyroOffset(87);
            mpu.setZGyroOffset(87);

            Serial.print("CORE: Enabling DMP...");
            mpu.setDMPEnabled(true);
            Serial.println("CORE: SUCCESS");
        }
        else
            Serial.println("FAIL");
        //
        Serial.println("SETUP END");
    }



    // ================================================================
    // ===                    MAIN PROGRAM LOOP                     ===
    // ================================================================


    void loop()
    {
        if (mpu.getFIFOCount() >= 42)
        {
            mpu.getFIFOBytes(fifoBuffer,packetSize);
            mpu.dmpGetGyro(Data,fifoBuffer);
            Serial.print("G:\t");
            Serial.print(Data[0]);
            Serial.print("\t");
            Serial.print(Data[1]);
            Serial.print("\t");
            Serial.println(Data[2]);
        }
    }
    Первые 10 секунд
    upload_2017-2-5_18-31-24.png

    После 10 секунд
    upload_2017-2-5_18-31-19.png
     
    Последнее редактирование: 5 фев 2017
  2. sslobodyan

    sslobodyan Гик

    Гироскоп это датчик относительных величин. Поэтому ему свойственно накапливать погрешность в течении времени. Для борьбы с этой погрешностью используют поправки по датчикам других типов: акселерометру и магнитометру. Все зависит от задачи.