Determinar la orientación con Arduino y el IMU MPU-6050


arduino-mpu6050

¿Qué es un IMU MPU-6050?

El MPU-6050 es una unidad de medición inercial (IMU) de seis grados de libertad (6DOF) fabricado por Invensense, que combina un acelerómetro de 3 ejes y un giroscopio de 3 ejes.

La comunicación puede realizarse tanto por SPI como por bus I2C, por lo que es sencillo obtener los datos medidos. La tensión de alimentación es de bajo voltaje entre 2.4 a 3.6V.

Frecuentemente se encuentran integrados en módulos como el GY-521 que incorporan la electrónica necesaria para conectarla de forma sencilla a un Arduino. En la mayoría de los módulos, esto incluye un regulador de voltaje que permite alimentar directamente a 5V.

Dispone de conversores analógicos digitales (ADC) de 16bits. El rango del acelerómetro puede ser ajustado a ±2g, ±4g, ±8g, y ±16g, el del giroscopio a ±250, ±500, ±1000, and ±2000°/sec.

Anuncio: Tus propias PCBs a media en PCBWAY

Es un sensor consume 3.5mA, con todos los sensores y el DMP activados. Dispone de un sensor de temperatura embebido, un reloj de alta precisión e interrupciones programables. También puede conectarse a otros dispositivos I2C como master.

El MPU-6050 incorpora un procesador interno (DMP Digital Motion Processor) que ejecuta complejos algortimos de MotionFusion para combinar las mediciones de los sensores internos, evitando tener que realizar los filtros de forma exterior.

El MPU-6050 es uno de los IMUs más empleados por su gran calidad y precio. Será uno de los componentes que con mayor frecuencia incorporaremos a nuestros proyectos de electrónica y robótica.

Precio

El MPU-6050 es un sensor excelente en realidad precio debido, entre otros factores, a que es ampliamente utilizado y esto ha permitido reducir su precio.

arduino-mpu6050-componente

Podemos encontrarlo en placas de montaje como la GY-521, que incorpora la electrónica necesaria para conectarlo de forma sencilla a Arduino, por 1.10 € en vendedores internacionales de eBay o AliExpress.

Si quieres saber más sobre acelerómetros, giroscopios e IMU’s en Arduino consulta las serie de entradas Cómo usar un acelerómetro con Arduino, Cómo usar un giroscopio con Arduino y Medir la inclinación con IMU.

Esquema montaje

La conexión es sencilla, simplemente alimentamos el módulo desde Arduino mediante GND y 5V y conectamos el pin SDA y SCL de Arduino con los pines correspondientes del sensor.

arduino-mpu6050-esquema

Mientras que la conexión vista desde el lado de Arduino quedaría así.

arduino-mpu6050-conexion

En Arduino Uno, Nano y Mini Pro, SDA es el pin A4 y el SCK el pin A5. Para otros modelos de Arduino consultar el esquema patillaje correspondiente.
Verificar que vuestra placa es compatible con 5V antes de conectarla a Arduino. Si no, tendréis que usar un adaptador de nivel lógico.

Ejemplos de código

Para realizar la lectura del MPU-6050 usaremos la librería desarrollada por Jeff Rowberg disponible en este enlace. También emplearemos la librería I2Cdev desarrollada por el mismo autor, que mejora la comunicación I2C.

La librería proporciona ejemplos de código, que resulta aconsejable revisar. Los siguientes ejemplos son modificaciones a partir de los disponibles en la librería.

Leer valores RAW

En el primer ejemplo, aprendemos a leer los valores directamente proporcionados por el MPU-6050 (valores RAW) a través del bus I2C. Los valores RAW tienen un rango de medición entre -32768 y +32767.

Leer valores en Sistema Internacional

En el siguiente ejemplo aplicamos una escala a los valores RAW para obtener mediciones con significado físico. En el ejemplo, emplearemos valores G para la aceleración, y º/S para la velocidad angular. Con facilidad podréis modificar el código para que proporcione los valores en unidades del Sistema Internacional.

El escalado dependerá del rango de medición que seleccionemos en el MPU-6050, que recordamos puede ser 2g/4g/8g/16g para el acelerómetro y 250/500/1000/2000 (°/s) para el giroscopio.

Leer inclinación con acelerómetro

En el siguiente ejemplo, calculamos la inclinación del MPU-6050 mediante la proyección de la medición de la gravedad y las relaciones trigonométricas que vimos en la entrada Cómo usar un acelerómetro con Arduino.

Obtener orientación con giroscopio

En el siguiente ejemplo, realizamos la integración de la señal de la velocidad del giroscopio para obtener la orientación del MPU-6050, como vimos en la entrada Cómo usar un giroscopio con Arduino.

Obtener la orientación con filtro complementario

Este ejemplo empleamos un filtro complementario para combinar la señal del acelerómetro y giroscopio para obtener una mejor medición de la orientación del MPU-6050, como vimos en la entrada Medir la inclinación de un IMU con Arduino y filtro complementario.

Obtener la orientación mediante el DMP

En este último ejemplo empleamos el DMP integrado en el MPU-6050 para realizar la combinación de la medición del acelerómetro y el giroscopio, lo que proporciona mejor resultados que emplear un filtro complementario, y además libera a Arduino del proceso de cálculo.

Si te ha gustado esta entrada y quieres leer más sobre Arduino puedes consultar la sección tutoriales de Arduino

Anuncio:

Previous Usar un acelerómetro MMA7455 con Arduino
Next Usar Arduino con los IMU de 9DOF MPU-9150 y MPU-9250

7
¡Deja un comentario!...

1000
7 Comment threads
0 Thread replies
1 Followers
 
Most reacted comment
Hottest comment thread
7 Comment authors
newest oldest
luisllamas

m/s^2, al igual que el resto de aceleraciones

Jesus

Hola Luis, estoy siguiendo tus tutoriales, enhorabuena son muy buenos. Estoy intentando hacer que mi robot siga un camino con movimientos ortogonales preprogramados, esto me resulta imposible porque controlando solo el tiempo de ejecución los giros de 90° nunca los hace igual ¿crees que puedo utilizar el MPU-6050 para corregir este error?
Muchas gracias, saludos

Vicen

Me ha servido de mucho tu trabajo y me parece un gran aporte a los que empiezan con estos dispositivos.
Tengo una pregunta, veo que el programa funciona bien, aunque tiene mucho mas/menos en las muestras, mi pregunta es, porque pasados unos minutos se para el proceso, entonces como puede estar entregando datos por tiempo indefinido?
Gracias por tu trabajo.

Antonio

Buenos días Luis,
En primer lugar, gracias por sus tutoriales me son de gran ayuda.
Tenía una pregunta acerca de este post https://www.luisllamas.es/arduino-orientacion-imu-mpu-6050/ cuando calcula la orientación a través del giroscopio, acelerómetro y filtro complementario, ¿esos ángulos x e y que obtenemos son el azimut, es decir, los grados de orientación con respecto del norte?
Le escribía porque me gustaría poder calcular el azimut a través del módulo MPU6050, y no estoy muy seguro si algunos de esos ángulos es lo que busco
Un saludo y espero su respuesta

Ángel

Si alimentas a 3,3 tambien deberia funcionar no?
Saludos.

Carlos

hola que tal, oye una pregunta, que registros se necesitan configurar para activar el DMP sin utilizar librerias, gracias saludos

Matias Armani

Y como sería la conexión si quiero conectarlo a los pines ISP como indica que también está permitido?!