Usando el MPU6050

Objetivos

 

  • Presentar los conceptos básicos de los sistemas de medida inercial o IMUs.
  • Plantear las nociones básicas de sistemas de referencia.
  • Acelerómetros y giróscopos.
  • El MPU6050, Medida inercial de 6 grados de libertad.
  •  

    Material requerido

     

     

    Imagen de Arduino UNO Arduino UNO o equivalente
    Giroscopo acelerometro IMU Un módulo MPU6050

     

    Usando el MPU6050

     

    En la sesión anterior dimos un repasito a cuatro ideas claves de las que era preciso asegúranos que las teníamos claras, y así poder empezar a hablar directamente de acelerómetros y giróscopos, y una vez sentadas las bases ya podemos empezar con la parte divertida.

    Es importante que entendáis que los IMUs son unas piezas de hardware bastante sofisticadas  y que el MPU650 que vamos a utilizar es un chip de 6 dof o grados de libertad porque incluye un acelerómetro de 3 ejes y un giróscopo de 3 ejes.

    Aunque lo que miden lo sensores internos son aceleraciones lineales y angulares el procesador interno del IMU es capaz de realizar cálculos sobre la marcha para darnos informaciones más útiles como los ángulos de inclinación con respecto a los 3 ejes principales.

    Por eso todos los tutoriales que veáis por ahí os dirán que conseguir los datos en bruto del MPU650 es la parte fácil, procesarlos y reaccionar es otra historia que se puede complicar un poco más.

    Pero como siempre se dice un viaje de 1000 km empieza con un sencillo paso, así que vamos a darlo. Empecemos viendo cómo se conecta a nuestro Arduino.

    Para estas sesión vamos a utilizar una Breakout board bastante típica llamada GY-201, que incluye un MPU650 y un regulador de tensión, con lo que podemos alimentar a tanto 3.3V como a 5V

    Esquema de conexión<

     

    EL MPU650 viene con interface I2C por lo que la conexión es trivial y podéis hacerla poco más o menos así:

    Diagrama conexion Arduino UNO

    Basta con conectar los pines de alimentación y montar los pines necesarios para el control del bus I2C. Cuando el IMU dispone de alguna medida se lo informa a nuestro Arduino mediante una interrupción y por eso conectamos el pin INT a nuestra primera interrupción en el pin 2.

    Si vas a usar un Arduino Mega la conexión es ligeramente diferente como se muestra aquí:

    Diagrama conexion Arduino Mega

    Poco más porque la conexión es muy sencilla y basta con hacer la conexión del bus I2C. Pasemos ahora a la parte del software.

    Sensor inercial

     

    El programa de control

     

    Vamos a montar las librerías correspondientes y a probar con uno de los programas de ejemplo que tanto las conexiones como el  MPU650 están en condiciones operativas.

    El señor Jeff Rowberg  ha puesto a nuestra disposición una bonita librería que podemos descargar desde aquí: MPU6050 y también vamos a necesitar una librería modifica de I2C que se lleve bien con el IMU llamada I2Cdev.

    [one-fourth]  [/one-fourth][three-fourth last][margin value=»5″ /][fancy-ul style=»rounded-tick»]

    [three-fourth last][margin value=»5″ /][fancy-ul style=»rounded-tick»]

    • Parece que el I2C del chip es un tanto peculiar a juzgar por lo que dicen por Internet la página oficial de Arduino y algunos doctos comentaristas, y con aspectos delicados si necesitáis colocar más elementos I2C al Bus. [/fancy-ul] [/three-fourth]

    Vamos a empezar cargando el ejemplo MPU6050_RAW:

    \\Archivo\Ejemplos\MPU6050\Examples\ MPU6050_RAW

    Y a continuación asegurándonos de que la consola serie está a 38400 baudios, porque los IMUs son muy charlatanes y mejor que nos aseguremos de que recibimos a suficiente velocidad porque de lo contrario la información se amontonará en nuestra puerta.

    Consola Arduino

    Este programa es de lo más sencillo, y lo que hace es leer e imprimir los valores en bruto que los acelerómetros y giróscopos le envían a tu Duino, es decir sin procesar en absoluto, algo que sirve de muy poco, pero es un programa que si vais saltando las partes de egipcio antiguo que contiene, encontrareis bastante comprensible, en líneas generales.

    Si todo está bien, deberíais ver una pantalla parecida a esta:

    Salida Arduino

    No te preocupes demasiado de estos valores, porque son las medidas reales que producen los acelerómetros y los giróscopos, pero así no valen de mucho. El objetivo es asegurarnos de que tu MPU6050 se comunica bien con tu Arduino.

    [one-fourth]  [/one-fourth][three-fourth last][margin value=»5″ /][fancy-ul style=»rounded-tick»]

    [three-fourth last][margin value=»5″ /][fancy-ul style=»rounded-tick»]

    • De todos modos fíjate en que hay 6 valores. Los tres primeros corresponden a los acelerómetros y los tres últimos a los giróscopos.(De ahí el a/g: al principio de la línea)
    • Si vas girando el IMU en direcciones perpendiculares verás con rapidez cual es cada uno de los ejes, porque aunque el chip este en movimiento inercial (O sea en reposo o movimiento lineal uniforme, ¿Te suena del cole?) aun detectará la aceleración de la gravedad, claramente en una de las direcciones.
    • Nosotros estamos tan acostumbrados a la gravedad que ni la notamos a no ser que nos dejemos los morros contra el suelo de un tropezón, pero el MP6050 es un sensor y mide de continuo su efecto, que es una aceleración y mira qué casualidad, es justo lo que mide un acelerómetro). [/fancy-ul] [/three-fourth]

    Vale, todo muy bonito. Pero… ¿Cómo mido los ángulos respecto a la horizontal? Que es lo que os interesa para aseguraros de que no nos estrellamos contra el pavimento.

    Y de nuevo, por una de esas increíbles casualidades de la vida, el segundo ejemplo trata de eso

     

    Midiendo ángulos de inclinación

     

    Vamos a cargar el segundo ejemplo que viene de demo con el MPU6050 que se llama DMP6:

    \\Archivo\Ejemplos\MPU6050\Examples\ MPU6050_DMP6

    Pero el autor quería comprobar que estabais despiertos y ha puesto el programa a 115200 baudios,  a diferencia del ejemplo anterior, así que empezar cambiando la velocidad de la consola Arduino en consonancia:

    Consola Arduino

    Si ahora volcáis el programa a vuestro Arduino, os aparecerá un mensaje con este:

    Salida consola arduino

    Donde como veis os pide que le enviéis cualquier pulsación más intro para empezar el programa.

    Dadle cualquier cosa, y enseguida veréis que empiezan a aparecer valores en la pantalla, pero esperad un poco porque necesita como 10 segundos para que los valores se estabilicen y tengan sentido:

    Muestra de arduino

    El texto que aparece al principio de cada línea “ypr” corresponde a las iniciales en ingles de los tres ángulos de referencia Yaw, Pitch y Roll, que si recordáis los presentamos con esta imagen:

    6 grados de libertad

    Y los valores que van cambiando son poco más o menos el valor instantáneo de cada uno de esos ángulos. Para tratar de dar un poco de sentido a es interminable flujo de valores tenemos que hablar de la gravedad, (De la de Newton, no del estado de nuestras finanzas) y si alguno pensabais  que se puede manejar y programar un IMU sin hablar de física más vale que os vayáis a la biblioteca a por un libro de poesía.

    Recordad que lo que mide un acelerómetro es una aceleración en tres ejes y resulta que nuestro acelerómetro siempre está sometido al menos a una aceleración presente por doquier… que llamamos gravedad y nuestro MPU6050 la detecta y mide permanentemente.

    Lo cual es una gran ventaja porque como además sabe que su valor en reposo es de 9,8 m/seg2 (Disfrutad que yo sé que esto os encanta) en cuanto sus lecturas se estabilizan, él sabe localizar el eje vertical porque es el que la gravedad le indica y por tanto ya tiene una primera referencia del plano horizontal (El plano horizontal es perpendicular a la gravedad, naturalmente)

    [one-fourth]  [/one-fourth][three-fourth last][margin value=»5″ /][fancy-ul style=»rounded-tick»]

    [three-fourth last][margin value=»5″ /][fancy-ul style=»rounded-tick»]

    • Si el IMU dispone además de un magnetómetro de 3 ejes, ya está en condiciones de apuntar al Norte además y puede fijar con precisión el segundo eje, y el tercero cae por su propio peso, pero no es el caso del MPU6050 que estamos usando. . [/fancy-ul] [/three-fourth]

    Ahora aplica la famosa regla de los tres dedos que tanto disfrutamos en las entretenidas clases de electromagnetismo entre otras:

    Regla de los tres dedos

    Con el pulgar apuntado en la dirección de la gravedad o z, y poniendo los dedos índice y anular poco más o menos a 90º entre sí y con el eje z, nuestro sensor es capaz de utilizar unas referencias primarias en tres ejes.

    Por eso veréis que si habéis hecho como yo, y habéis colocado vuestro sensor inercial poco más o menos horizontal,  los ángulos de Pitch y Roll tenderán rápidamente  a cero como corresponde a un IMU bien educado.

    En cambio, el Angulo que a mí me sale de 54º y a vosotros puede saliros cualquier cosa… ¿Mide la desviación con respecto a qué?

    Pues no lo tengo muy claro. Supongo que es una referencia que el elige a huevo, o como se dice  más elegantemente, es una referencia arbitraria. El IMU cuenta con una serie de mecanismos para elegir una referencia arbitraria en el arranque y después podemos corregir esas orientaciones, pero de momento no vale la pena complicarnos más la vida.

    En mi caso he montado el MPU6050 en una protoboard para poder mover con claridad el sensor y por eso si ahora vais girando con cuidado la protoboard (O la plataforma de base) veréis como los ángulos van reflejando la desviación respecto de la horizontal y con valores que pueden ser tanto positivos como negativos.

    Comentarios finales

     

    Bueno esto no ha pretendido más que ser una introducción al tema de acelerómetros y giróscopos y tendremos tiempo para ir hablando más sobre el asunto en futuras sesiones, pero por ahora nos conviene comentar que los IMUs tienen sus historias.

    En primer lugar no son demasiado estables y sus medidas bailan bastante por lo que será preciso filtrar los errores.

    Además son muy sensibles (Una mala combinación) por lo que la medida que te dan, baila mucho con cualquier golpecito o vibración que detecten. Haz la prueba moviendo un poco la plataforma y en seguida veras el baile de las cifras.

    No se puede despreciar tampoco las interferencias, que como sabéis afectan a todos los aparatos electrónicos y los IMUs no son la excepción.

    Y por último sufren también de un problema que se llama deriva (Shift en inglés) y que se produce porque el procesador interno del IMU calcula las orientaciones, o si prefieres, los ejes de referencia por cálculo de aceleraciones, que por mucha precisión que se intente al final tendrán pequeños errores que se irán acumulando.

    Este error acumulado puede hacernos perder el norte (Literalmente) y acabar recogiendo cachitos del asfalto para ver que podemos salvar del desastre.

    Todo tiene solución, pero supone cálculos y procesamiento abundante, además de nociones de física, geometría y otras disciplinas que, aunque no os lo creáis, no todos disfrutan.

    Por ultimo si vais a montar algún robot volador de un cierto valor, no os interesa perder la posibilidad de que vuestro chip incluya un magnetómetro de 3 ejes más para localizar direcciones absolutas de referencia y si el chisme va a volar, un sensor de presión barométrica no vendría mal tampoco para calcular la altitud.

    Ya habéis adivinado que hay cantidad de sensores de este estilo en el mercado y simplemente os comentaré que existe algún Breakout Board por ahí 10 dof o grados de libertad, como el GY-88 MPU-6050 HMC5883L 10 dof, que incluyen:

  • Un acelerómetro de 3 ejes
  • Un Giróscopo de tres ejes
  • Un magnetómetro de 3 ejes
  • Un sensor barométrico. [/fancy-

    Son algo más caros que este MPU6050 con el que llevo aburriéndoos ya buen rato, pero os compensará la diferencia de precio.

    Resumen de la sesión

     

  • Hicimos un primer acercamiento a los IMUs.
  • Presentamos la forma de conectarlos a nuestros Arduinos.
  • Presentamos un par de ejemplos de cómo leer valores en bruto y como medir ángulos sin entrar en detalles.
  • Presentamos el MPU650