MPU6050 mostrando valores de ángulo inconsistentes

0

Estoy usando este código Arduino para calibrar y leer desde un sensor de aceleración / giro MPU6050 de un Arduino Mega.

La calibración y lectura de valores parecieron ir bien. Sin embargo, estoy viendo algunos valores inconsistentes reportados desde el giroscopio. Cuando mi aparato se coloca plano, lee correctamente un tono de 0 grados. Cuando lo inclino 90 grados hacia delante, se lee con bastante precisión -89.6 grados. Sin embargo, cuando lo inclino hacia atrás a -90 grados ... se lee -26 grados.

¿Por qué es esto? ¿Podría deberse a una calibración incorrecta, a una interferencia, o es posible que mi MPU6050 esté dañada o defectuosa?

La orientación predeterminada de la placa es plana, por lo que el eje z apunta "hacia arriba". Sin embargo, he montado el sensor con el eje y apuntando "hacia arriba" y el eje z apunta hacia adelante / hacia atrás. ¿Calibración de este efecto? Además de tener que reasignar, mi eje al leer datos (que estoy haciendo), no he leído ninguna advertencia sobre la necesidad de ingresar explícitamente esta reorientación en el código MPU6050.

    
pregunta Cerin

1 respuesta

2

Resulta que la calibración requiere que el sensor esté en la posición predeterminada "z-up", y que incluso si ajusta las funciones de activación más adelante, los valores seguirán desactivados si usa una orientación diferente. Intenté quitar el MPU6050 de mi aparato, colocarlo plano y volver a ejecutar la calibración. Eso mejoró los valores, pero los rangos aún no se alineaban correctamente con mi orientación personalizada, así que agregué esta función para voltear los ejes X y Z según el código proporcionado en este comentario :

uint8_t MPU6050::dmpGetYawPitchRollOnEnd(float *data, Quaternion *q, VectorFloat *gravity) {
    // yaw: (about X axis)
    data[0] = atan2(2*q->z * q->y - 2 * q->w * q->x, 2 * q->w * q->w + 2 * q->z * q->z - 1);
    // pitch: (nose up/down, about Y axis)
    data[1] = atan(gravity->z / sqrt(gravity->y * gravity->y + gravity->x * gravity->x));
    // roll: (tilt left/right, about Z axis)
    data[2] = atan(gravity->y / sqrt(gravity->z * gravity->z + gravity->x * gravity->x));
    return 0;
}

Y luego, con eso y los valores de calibración adecuados, ahora devuelve el rango correcto de 90 a -90 grados cuando cambio el tono en 180 grados.

    
respondido por el Cerin

Lea otras preguntas en las etiquetas