Как узнать, правильно ли откалиброван GY-521 MPU6050?

Я планирую использовать акселерометр MPU6050 для своего проекта.

Я знаю, что перед использованием модуля (я использую GY-521 MPU6050) его необходимо откалибровать.

Для калибровки я использую код Луиса Роденаса: https://sites.google.com /view/autoaero/code/auto-калибровка-mpu6050

Этот код возвращает следующие смещения для моего модуля:

-1123 -4100 1562 111 8 -1

Смещения имеют формат Ax,Ay,Az,Gx,Gy,Gz. Я использую эти смещения в примере MPU6050_raw.ino для i2cdevlib после внесения необходимых изменений. Вот скетч

    // Класс устройства I2C (I2Cdev), демонстрационный скетч Arduino для класса MPU6050
// 7.10.2011, Джефф Роуберг <[email protected]>
// Обновления должны (надеюсь) всегда быть доступны по адресу https://github.com/jrowberg/i2cdevlib.
//


// I2Cdev и MPU6050 должны быть установлены как библиотеки, иначе файлы .cpp/.h
// для обоих классов должен находиться в пути включения вашего проекта
#include "I2Cdev.h"
#include "MPU6050.h"

// Требуется библиотека Arduino Wire, если реализация I2Cdev I2CDEV_ARDUINO_WIRE
// используется в I2Cdev.h
#if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE
    #include "Wire.h"
#endif

// адрес I2C класса по умолчанию — 0x68
// здесь в качестве параметра можно передать конкретные адреса I2C
// AD0 low = 0x68 (по умолчанию для оценочной платы InvenSense)
// AD0 высокий = 0x69
MPU6050 accelgyro;
//MPU6050 AccelGyro(0x69); // <-- использовать для максимума AD0

int16_t ax, ay, az;
int16_t gx, gy, gz;



// раскомментируйте "OUTPUT_READABLE_ACCELGYRO", если хотите видеть текст, разделенный табуляцией
// список значений ускорения X/Y/Z, а затем гироскопа X/Y/Z в десятичном формате. Легко читать,
// не так просто разобрать, и он медленнее по UART.
#define OUTPUT_READABLE_ACCELGYRO

// раскомментируем "OUTPUT_BINARY_ACCELGYRO", чтобы отправить все 6 осей данных как 16-битные
// двоичные, один за другим. Это очень быстро (настолько быстро, насколько это возможно)
// без сжатия или потери данных), его легко разобрать, но невозможно прочитать
// для человека.
//#define OUTPUT_BINARY_ACCELGYRO


#define LED_PIN 13
bool blinkState = false;

void setup() {
    // подключаемся к шине I2C (библиотека I2Cdev не делает этого автоматически)
    #if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE
        Wire.begin();
    #elif I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_FASTWIRE
        Fastwire::setup(400, true);
    #endif

    // инициализируем последовательную связь
    // (выбрано 38400, поскольку оно работает на частоте 8 МГц так же хорошо, как и на частоте 16 МГц, но
    // это действительно зависит от вашего проекта)
    Serial.begin(115200);

    // инициализируем устройство
    Serial.println("Initializing I2C devices...");
    accelgyro.initialize();
    accelgyro.setFullScaleAccelRange(3);
    // проверяем соединение
    Serial.println("Testing device connections...");
    Serial.println(accelgyro.testConnection() ? "MPU6050 connection successful" : "MPU6050 connection failed");

    // используйте код ниже, чтобы изменить значения смещения ускорения/гироскопа

    Serial.println("Updating internal sensor offsets...");
    // -76 -2359 1688 0 0 0
    Serial.print(accelgyro.getXAccelOffset()); Serial.print("\t"); // -76
    Serial.print(accelgyro.getYAccelOffset()); Serial.print("\t"); // -2359
    Serial.print(accelgyro.getZAccelOffset()); Serial.print("\t"); // 1688
    Serial.print(accelgyro.getXGyroOffset()); Serial.print("\t"); // 0
    Serial.print(accelgyro.getYGyroOffset()); Serial.print("\t"); // 0
    Serial.print(accelgyro.getZGyroOffset()); Serial.print("\t"); // 0
    Serial.print("\n");
    accelgyro.setXGyroOffset(111);
    accelgyro.setYGyroOffset(8);
    accelgyro.setZGyroOffset(-1);
    accelgyro.setZAccelOffset(1562);
    accelgyro.setXAccelOffset(-1123);
    accelgyro.setYAccelOffset(-4100);
    Serial.print(accelgyro.getXAccelOffset()); Serial.print("\t"); // -76
    Serial.print(accelgyro.getYAccelOffset()); Serial.print("\t"); // -2359
    Serial.print(accelgyro.getZAccelOffset()); Serial.print("\t"); // 1688
    Serial.print(accelgyro.getXGyroOffset()); Serial.print("\t"); // 0
    Serial.print(accelgyro.getYGyroOffset()); Serial.print("\t"); // 0
    Serial.print(accelgyro.getZGyroOffset()); Serial.print("\t"); // 0
    Serial.print("\n");

    // настраиваем вывод светодиода Arduino для вывода
    pinMode(LED_PIN, OUTPUT);
}

void loop() {
    // читаем необработанные измерения ускорения/гироскопа с устройства
    accelgyro.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);

    // эти методы (и некоторые другие) также доступны
    //accelgyro.getAcceleration(&ax, &ay, &az);
    //accelgyro.getRotation(&gx, &gy, &gz);

    #ifdef OUTPUT_READABLE_ACCELGYRO
        // отображаем значения ускорения/гироскопа x/y/z, разделенные табуляцией
        Serial.print("a/g:\t");
        Serial.print(ax); Serial.print("\t");
        Serial.print(ay); Serial.print("\t");
        Serial.print(az); Serial.print("\t");
        Serial.print(gx); Serial.print("\t");
        Serial.print(gy); Serial.print("\t");
        Serial.println(gz);
    #endif

    #ifdef OUTPUT_BINARY_ACCELGYRO
        Serial.write((uint8_t)(ax >> 8)); Serial.write((uint8_t)(ax & 0xFF));
        Serial.write((uint8_t)(ay >> 8)); Serial.write((uint8_t)(ay & 0xFF));
        Serial.write((uint8_t)(az >> 8)); Serial.write((uint8_t)(az & 0xFF));
        Serial.write((uint8_t)(gx >> 8)); Serial.write((uint8_t)(gx & 0xFF));
        Serial.write((uint8_t)(gy >> 8)); Serial.write((uint8_t)(gy & 0xFF));
        Serial.write((uint8_t)(gz >> 8)); Serial.write((uint8_t)(gz & 0xFF));
    #endif

    // мигаем светодиодом, указывая на активность
    blinkState = !blinkState;
    digitalWrite(LED_PIN, blinkState);
}

Это вывод на последовательном мониторе, когда модуль расположен горизонтально, а буквы упаковки обращены вверх. Итак, правильно ли я откалибровал акселерометр? Пожалуйста, помогите, если вы видите какую-либо аномалию. Спасибо.

, 👍1


1 ответ


-1

Рассмотрите возможность просмотра данных ускорения и гироскопа. Если у вас есть устройство, лежащее на столе идеально ровно, вы обнаружите силу гравитации по какой-то оси. наклоните всю установку и проверьте, отображается ли теперь сила перегрузки на другой оси (надеюсь, на той, которую вы ожидаете), затем поверните установку на 90 градусов вокруг любой оси. (всегда по одному, пожалуйста!) Если ваш гироскоп сообщает вам, что ваша скорость вращения за какой-то промежуток времени примерно равна пи, вы знаете, что все работает так, как ожидалось. на самом деле это работает для каждого акселерометра и гироскопа, а также для тех, которые вы найдете, скажем, на плате sparkfun 9dof, если вам когда-нибудь придется с ними столкнуться.

Вашу калибровку можно проверить путем сравнения некалиброванного измерения с калиброванным. Тогда различия между ожидаемым значением и измеренным должны уменьшиться.

,