El sensor MPU-6050.

El Sensor MPU-6050.

Practicas con el sensor de 3 ejes y Arduino.

INTRODUCCIÓN.

Cuando iniciamos una nueva tarea que requiere de un nuevo dispositivo como el MPU6050 al que no habíamos tenido la ocasión de utilizar, lo propio es tener dudas y naturalmente debemos buscar información que nos aclare los conceptos y conocimientos que se requieren para manejar, cuando no dominar el nuevo «juguete». Si usted se encuentra en este caso, tal vez haya llegado al sitio que estaba esperando. Espero aclararle las preguntas que tiene en estos momentos.

Cuando necesitamos orientar un dispositivo UAV, su velocidad, inclinación o aceleración nos encontramos con un verdadero problema.

Existen múltiples sensores que pueden ayudar a conocer estos datos, los sistemas de navegación satelital, como giroscópios, acelerómetros, barómetros, magnetrómetros, brújulas magnéticas o  etc. Las señales de estos sensores, en primer lugar hay que procesarlas y luego combinarlas para eliminar los errores y derivas intrínsecos de los sensores y el ruido o las interferencias del sistema.

El MPU-6050 no es caro, especialmente teniendo en cuenta el hecho de que combina un acelerómetro y un giroscopio en el mismo dispositivo.

Comprendo que tenga dudas, a la hora de configurar un IMU (Unidad de Medición de Inercia), utilizando un Arduino para obtener su lectura, ya que no es nada sencillo, pues la mayoría de estas unidades, utilizan protocolos como I2C o SPI que dan valores empíricos que requieren un conocimiento y desarrollo matemático importante. Sin mencionar que, algunas IMU siempre dan lecturas erróneas, dependiendo de como se utilicen que, es el caso en que se encuentran los principiantes. Veremos como depurar esos valores además, calcularemos ángulos de posición y aprovechando herramientas como los filtros para el «ruido» con un Filtro Complementario (Complementary Filter). Este es el aspecto que tiene este sensor:

mpu6050Fig. 1 MPU-6050 (15x21mm)

En este tutorial, haré una introducción básica al MPU-6050 y mostraré cómo se puede conectar a un Arduino. Veremos como hacer un modelo 3D utilizando los datos de MPU-6050 y Arduino. Este artículo viene a ser una descripción de la experiencia que he vivido, en mi primer contacto con un sensor de nueva generación de sensores de movimiento, inercia y aceleración, en el caso concreto del Invensense MPU-6050. Los sensores IMU básicos (Unidad de Medición de Inercia), compatibles con los microcontroladores actuales como el que nos ocupa el Arduino, para interactuar con el mejor sensor IMU disponible y económico.

EL SENSOR MPU-6050.

Según el fabricante. «La unidad de procesamiento de movimiento MPU-60X0 es la primera solución del mundo en procesamiento de movimientos, con la fusión integrada de sensores con 9-ejes, la fusión de sensores utiliza su motor propiedad MotionFusion™ probado en el campo de teléfonos móviles, tabletas, aplicaciones, controladores de juegos, mandos a distancia, puntero de movimiento y otros dispositivos de consumo.

El MPU-60X0 tiene integrado un giroscopio MEMS de 3 ejes, un acelerómetro de 3 ejes MEMS, y un procesador digital de movimiento (DMP™) motor acelerador de hardware con un puerto I2C auxiliar que se conecta a las interfaces de sensores digitales de terceras partes tales como magnetómetros. Cuando se conecta a un magnetómetro de 3 ejes, el MPU-60X0 entrega una salida completa de 9 ejes MotionFusion para su primario I2C o puerto SPI (SPI está disponible sólo en MPU-6000)».

El MPU-60X0 combina la aceleración y el movimiento de rotación más la información de rumbo en un único flujo de datos para la aplicación. Esta integración de la tecnología MotionProcessing™ presenta un diseño más compacto y tiene ventajas de costos inherentes en comparación con soluciones discretas de giroscopio más acelerómetro. El MPU-60X0 también está diseñado para interactuar con múltiples sensores digitales no inerciales, tales como sensores de presión, en su bus I2C auxiliar maestro. El MPU-60X0 es un procesador de movimiento de segunda generación y es la huella compatible con la familia MPU-30X0.

Así pues, el sensor MPU-6050 es una pequeña pieza tecnológica de procesamiento de movimiento. El cual mediante la combinación de un MEMS (Sistemas Microelectromecánicos) giroscopio de 3 ejes y un MEMS acelerómetro de 3 ejes en la misma pastilla de silicio junto con un DMP™ (Movimiento Digital Processor™), es capaz de procesar los algoritmos de movimientos complejos de 9 ejes (MotionFusion™) en una placa.

El MPU-6050 elimina los problemas de alineación del eje transversal que puede arrastrarse hacia arriba en porciones discretas. Las piezas integran el algoritmo MotionFusion para 9 ejes ‘pueden incluso acceder a magnetómetros externos u otros sensores a través de un bus I2C auxiliar maestro, permitiendo reunir un conjunto completo de dispositivos sensores de datos, sin la intervención del procesador del sistema. El MPU-6050 es un 6 DOF (grados de libertad = Degrees of Freedom) o un sensor IMU de seis ejes, lo que significa que da seis valores de salida.

El procesador digital de movimiento (DMP) incorporado se encuentra dentro de la MPU-6050 y descarga el cálculo de los algoritmos de procesamiento de movimiento desde el procesador host. Los datos resultantes pueden ser leídos de los registros de la DMP, o pueden estar tamponados en un FIFO. El DMP tiene acceso a uno de los pines externos de la MPU, que pueden ser utilizados para la generación de interrupciones. El propósito del DMP es descargar los requisitos de temporización y la potencia de procesamiento del procesador anfitrión.

El sensor MPU-6050 es muy preciso, ya que contiene una conversión hardware de 16 bits de A/D por cada canal, para la digitalización de las salidas del acelerómetro. Para ello capta los canales x, y y z al mismo tiempo (el valor z es fijo). Como se ha comentado, el sensor utiliza el I2C-bus para interconectar con el Arduino. Aunque algunas versiones (como la mostrada) llevan un regulador que permite conectarla a 5V.
    Precaución con la gama de tensiones de funcionamiento desde 2.37V a 3.45V.

LA LECTURA DE LOS VALORES BRUTOS ES FÁCIL.

La lectura de los valores brutos para el acelerómetro y el giroscopio es fácil. El modo de suspensión tiene que ser inhabilitado, y luego los registros encontrados para el acelerómetro y el giroscopio se pueden leer.

Sin embargo, el sensor también contiene un buffer FIFO 1024 byte. Los valores de los sensores pueden ser programados para poder colocarlos en la memoria intermedia FIFO. Y el tampón podrá ser leído por el Arduino.

El buffer FIFO se utiliza junto con la señal de interrupción. Si los datos de lugares MPU-6050 en el búfer FIFO, el Arduino indica con la señal de interrupción por lo que el Arduino sabe que hay datos en el búfer FIFO a la espera de ser leído.

LAS COSAS SE PONEN REALMENTE COMPLEJAS CON EL «DMP».

El sensor tiene un «procesador digital de movimiento» (DMP), también llamado «unidad de procesamiento digital de movimiento«. Este DMP se puede programar con firmware y es capaz de hacer cálculos complejos con los valores de los sensores.

Para esta DMP, InvenSense tiene una política de desánimo, al no suministrar suficiente información de cómo programar el DMP. Sin embargo, algunos han usado la ingeniería inversa para capturar firmware.

El DMP («Procesador digital de movimiento») puede hacer cálculos rápidos o directamente en el chip. Esto reduce la carga para el microcontrolador (como el Arduino). Vamos a ser más prácticos.

BOCETO CORTO EJEMPLO.

El boceto corto de ejemplo es un esbozo muy breve y muestra todos los valores brutos (de acelerómetro, giroscopio y temperatura). El esquema práctico se muestra en la figura 3. Debería funcionar en Arduino Uno, Nano, Leonardo, y también Due.

bocetocortoFig. 2 Boceto corto.

UTILIZANDO EL MPU-6050.

El esquema que trazaremos en este caso es muy sencillo y conocido, utiliza un pin de interrupción de los que dispone el Arduino. Por lo que conectaremos el pin digital #2 del Arduino (pin de interrupción 0) al pin marcado como INT en el MPU-6050. Si el módulo de su MPU-6050 tiene un pin de 5V, entonces usted puede conectarlo al pin 5V del Arduino. En caso contrario, tendrá que conectarlo al pin 3.3V. A continuación, el GND del Arduino está conectado al GND del MPU-6050. Como el MPU-6050 que se comunica con el protocolo I2C, conectar el pin etiquetado como SDA en el MPU 6050 al pin analógico del Arduino A4 (SDA). Y el pin etiquetado como SCL en el MPU 6050 al pin analógico del Arduino A5 (SCL). Recomiendo utilizar cables flexibles y relativamente largos, ya hemos terminado el cableado al Arduino, como se muestra en el siguiente diagrama que es muy común.

esq_mpu6050
Fig. 3 Esquema MPU-6050

Descargue la librería MPU-6050 para Arduino. Usted puede encontrar la librería aquí, descomprima /extraiga la carpeta llamada «MPU6050» y pegarla dentro de la carpeta «library» del Arduino dentro de la carpeta de bibliotecas. Haga lo mismo con la librería I2Cdevlib, si no la tiene en su Arduino.

Para utilizar el MPU-6050, debemos saber la dirección I2C con la aplicación que hice en su día para estos casos, este es el enlace.

CARGAR EL CÓDIGO Y PROBAR EL MPU 6050.

Si usted ha instalado correctamente la librería, vaya a la carpeta ejemplos y encontrará los archivos: MPU6050_raw.ino, MPUTeapot.pde y la carpeta MPU6050_DMP6 con el archivo que nos interesa: MPU6050_DMP6.ino es el que debe cargar en Arduino. La forma sencilla es, cuando abra el IDE Arduino, en: Archivo -> Ejemplos se puede ver el «MPU6050». A continuación, abra el programa de ejemplo de: Archivo -> ejemplos -> MPU6050 -> Ejemplos -> MPU6050_DMP6, el cual viene muy descrito y le será de utilidad leer su contenido, por dicho motivo no expondré aquí, este archivo.

Ahora, tiene que subir este código a su Arduino. Después de cargar el código, abra el monitor Serie y ajuste la velocidad de transmisión sobre 115200. A continuación compruebe si ve en el monitor de serie algo como, «Inicializando dispositivos I2C …». Si no lo ve, sólo tiene que pulsar el botón de reinicio de Arduino. Ahora, verá una línea que dice «Enviar cualquier carácter para comenzar la programación y demostración DMP:». Así que sólo tiene que escribir cualquier carácter en el monitor serie y enviarlo. Y usted comenzará a ver los valores de guiñada, cabeceo y balanceo que vienen de la MPU-6050.

[Según Wikipedia. Dado un sistema de tres ejes fijos en el aeroplano, llamados eje de guiñada (yaw en inglés), de cabeceo (pitch) y de alabeo(roll), existen tres rotaciones principales, normalmente llamadas igual que el eje sobre el que se producen, que permiten alcanzar el sistema del aeroplano desde el sistema de referencia…]
Al igual que:

Como ya se sabe, cada dispositivo I2C contiene una dirección única que lo representa, en el caso de la plaquita GY-521, por lo general es la dirección 0×68 o 0×69. Una buena forma de encontrar la dirección exacta es utilizando el boceto i2c_scanner, cargamos el boceto en el Arduino y en la consola serial debemos ver la dirección de nuestro módulo MPU6050.

COMO LEER DATOS RAW DEL SENSOR.

Para obtener dichos datos y al mismo tiempo obtener mayor información, podemos leer y usar el boceto publicado en el artículo MPU-6050 de ArduinoPlayGround.

Dependiendo de la dirección de nuestro modulo (0×69 o 0×68), debemos indicar dicha dirección en la constante MPU6050_I2C_ADDRESS.

Ahora en el monitor serial, debemos poder ver un conjunto de valores que arroja el módulo.

monitor-serialFig. 4 Monitor Serial.

Con este boceto el monitor nos muestra los ángulos x e y que es lo que hemos pedido que muestre.

Este es un tutorial que nos sirve para entrar en este mundo de la nueva generación de sensores que la industria pone a nuestro alcance. El límite en estos momentos una vez más podemos asegurar que está en manos de los técnicos cada vez mejor formados y por supuesto ayudados por las técnicas puestas a su alcance.

 

6 thoughts on “El sensor MPU-6050.”

  1. estimados alguien me puede ayudar necesito medir vibraciones con este sensor, necesito que los valores de salida salgan en distancia / tiempo 2 (al cuadrado).

    1. Hola oscar.

      Siento decirte que no se me ocurre nada al respecto, ya que las vibraciones, considero de una variación bastante errática, por decirlo de alguna forma.

      Un saludo.

  2. Hola Soy Federico desde Argentina, de ante mano Muy buena explicación!!! muy detalla y completa!. Te queria consultar si hay forma de usar este mpu6050 para saber si un objeto que lo contenga sepa si esta yendo hacia adelante y hacia atras con solo la variable de Acceleracion X. Ya que ya sea usando filtros o valores raw, nadie me puede decir como hacerlo. Ya hace tiempo que vengo investigando y cargando muchos sketeches de arduino y luego su correspondiente en Processing pero ninguno hace uso de la aceleración. Desde ya muchas gracias. Saludos.

    1. Hola Federico, disculpa el retraso en la respuesta.

      La verdad es que no se me había ocurrido dicho planteamiento y la verdad es que es una buena idea. Considero que una forma (que no he probado), podría resultar que partiendo de una posición guardada en una variable, sea comparada con la aceleración positiva por el tiempo cuyo resultado te indicaría la dirección, teniendo en cuenta que una aceleración en contra dirección, nos proporcionaría un valor negativo, indicaría una dirección negativa.

      Es cuestión de probarlo.

  3. Hola Teresa, creo que encontrarás dicha información en la Red, como comprenderás es muy extensa la información y por otra parte, considero muy interesante la información que ya existe en las webs que circulan por Internet.

    Gracias por tu interés.

  4. Buenas tardes!
    Por favor aconsejeme algo para léer sobre los filtros complementarios para IMU. Encontré mucha información, pero el tema es nuevo para mi, solicito un fuente en que puedo confiar.
    Muchas gracias de antemano!
    Teresa K.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.