Usar Arduino con los IMU de 9DOF MPU-9150 y MPU-9250


arduino-mpu6050

¿Qué es un IMU MPU-9150 o MPU-9250?

Los sensores MPU-9150 y MPU-9250 son IMU de 9DOF nueva generación fabricado por Invensense. Ambos dispositivos forman parte de la misma familia de componentes, siendo el MPU-9250 el modelo actual y recomendado por el fabricante.

Internamente, el MPU-9250 incorpora en un mismo integrado una IMU MPU-6500, que a su vez está formado por acelerómetro de 3DOF y un giroscopio de 3DOF, y un magnetómetro AK8963 de 3DOF fabricado por Asahi Kasei Microdevices Corporation. Por su parte, el MPU-9150 está formado por una IMU MPU-6050 y un magnetómetro AK8975.

La comunicación en ambos modelos puede realizarse tanto por bus 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 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.

Anuncio:

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 con otros dispositivos I2C.

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, y el del magnetómetro hasta ±4800µT.

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

El MPU-9250 es un IMU de nueva generación, que proporciona resultados superiores a otros IMUs como el MPU-6050. Al incorporar un magnetómetro, el MPU-9250 elimina la deriva (drift) que puede aparecer en otros IMUs al cabo de unas horas de uso.

Pese a su precio superior, usaremos el MPU-9250 cuando necesitemos un IMU de características superiores, por ejemplo, en vehículos o robots que requieren precisión durante tiempos prolongados.

Precio

El MPU-9250 es un sensor con una gran relación entre calidad y precio. Podemos encontrarlo por unos 3.60€, en vendedores internacionales de AliExpress o eBay.

arduino-mpu6050-componente

Lógicamente, su precio es muy superior a los IMUs de 6DOF. Sin embargo, es uno de los IMUs de 9DOF más baratos.

Además, frente a otros IMUs de 9DOF dispone la ventaja de disponer de los tres sensores (acelerómetro, giroscopio y magnetómetro) en el mismo integrado, por lo que su DMP puede realizar cálculos y correcciones con las mediciones de los tres sensores de forma simultánea.

En los restantes IMUs de 9DOF estos cálculos deben realizarse de forma externa, lo que supone una pérdida de precisión y rendimiento.

Esquema de 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

El siguiente ejemplo emplea el bus I2C para realizar la lectura de los valores RAW del MPU-9250.

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

Anuncio:

Previous Determinar la orientación con Arduino y el IMU MPU-6050
Next Localización GPS con Arduino y los módulos GPS NEO-6
1000
15 Comment threads
8 Thread replies
1 Followers
 
Most reacted comment
Hottest comment thread
18 Comment authors
newest oldest
Jesus Fantova Lanau

Tengo una pregunta tonta, tengo un mpu 6050 por un lado y un magnetometro por otro como los conecto a un arduino nano???. Gracias

luisllamas

Sin mayor problema, al conectarse por I2C cada dispositivo tiene su Address, y se conectan igual que si los conectaras por separado.
Es una de las ventajas del bus I2C, échale un ojo a esta entrada https://www.luisllamas.es/arduino-i2c/

Jesus Fantova Lanau

Hola:
En primer lugar gracias por tu respuesta, eso pensaba yo.

Y menos mal que tenia 2 magnetometros, porque uno estaba defectuoso y no habia manera de que el nano lo pillara, me estaba volviendo loco…

Voy a seguir peleandome con el nano a ver si consigo que un quad casero se mantenga en vuelo y estatico y ya de paso que vuele solo con GPS…

Que mala leche tiene la artesania, con lo facil que es comprarse un dron hecho… Gracias de nuevo…

Cristian Sanchez

Hola a sido el mejor programa que e visto, pero quisiera saber como hacerlo mas estable en sus medidas, es decir que sea mas lineal o suave para poder utilizarlo con un dron.

luisllamas

Échale un ojo al filtro de mediana https://www.luisllamas.es/arduino-filtro-mediana-rapido/ 😉

Robert

Hola Luis, excelente aporte. Quería saber si me podrías ayudar en unas cuestiones…

A la hora de tener parámetros como YawPitchRoll, habría que aplicar un algoritmo como el de Madgwick a los datos que sacas del acelerómetro, giroscopio y magnetómetro. Sin embargo, al utilizar algoritmos ya implementados, el YawPitchRoll da resultados que ni siquiera son estables.

Mi pregunta entonces es, hay que calibrar el acelerómetro, giroscopio y magnetómetro antes de realizar cualquier cosa? Si es así, cómo debería hacerse?

Gracias

luisllamas

Yo empezaría por revisar los algoritmos que estas empleando.

luisllamas

El MPU en si no tiene pull-ups, pero normalmente los módulos llevan integradas resistencias de 10K.
(Lo cuál abre un debate interesante sobre si es correcto poner resistencias de pull-up a 3.3V mientras tenemos las internas, donde la respuesta corta es «no, no está bien del todo», y la larga es «normalmente no pasa nada»)
https://www.luisllamas.es/wp-content/uploads/2017/07/9250-sch.jpg

angel alejandro rodriguez aya

Hola, muchas gracias por el programa, pero tengo un problema, lo estoy tratando de implementar y el solo me ejecuta una sola vez la medición por le puerto serial, para que me haga una nueva medición me toca resetear la Arduino, no se a que se deba para que realice la ejecución continua, gracias

David

¡Ola Luis!

Gracias por el código.

En mi MPU-9265 tuve que añadir la línea:
I2CwriteByte (MAG_ADDRESS, 0x0A, 0x01);
Antes del ciclo «do / while», y todo funciona.

¿Solo no entiendo por qué restar 200, 70 y 700 al mx, my y mz?

Gracias,
David

Emmanuel

vaya! muy buen aporte, gracias.

FELIPE ORTIZ

GRACIAS POR ESTE APORTE!!!!!!!!!!!!!

David
¡Ola Luis!

Gracias por el código.

En mi MPU-9265 tuve que añadir la línea:
I2CwriteByte (MAG_ADDRESS, 0x0A, 0x01);
Antes del ciclo «do / while», y todo funciona.

¿Solo no entiendo por qué restar 200, 70 y 700 al mx, my y mz?

Gracias,
David

Ricard Palomar

Hola:
Estoy haciendo un proyecto sobre un AGV que se guía mediante un GPS. Primero muevo el AGV por un recorrido y este enregistra los datos de GPS y ángulo de giro. Después el AGV realiza autonomamente la misma ruta comparando los datos que obtiene con los ya enregistrados anteriormente. Supongo que para registrar este ángulo de giro este módulo me sirve, ¿es así?
En tal caso, se podrían obtener solo los datos del magnetometro o recomiendas otra cosa?

matias

se debe calibrar? he visto varias IMU que requieres calibración. pero no he encontrado mucha info del MPU9250

TzJavier

Hola Amigos, tengo un problema, estoy usando un MPU9250 pero el sensor me presenta mucha lentitud al momentos de captar los cambios, no sabes a que se puede.

Diego

buenas… una consulta… me arroja un único valor estático el magnetómetro con este código, no así acelerometro y giroscopio… pero varia en cada reseteo de la arduino. ¿esto a que se debe?

Harold Susa

También me sucede lo mismo y presumo que se debe al cambio de posición del sensor, por lo cual debe cambiar el valor en los ejes de cada medición.

Alejandro

Hola, como hago para saber si mi sensor puede funcionar a 5v?

Juan Luis

Hola, gracias por el artículo y el código. Según describes el MPU9250 dispone de un procesador interno o DMP, ¿De que manera se obtiene acceso a las funciones de DMP para utilizar los datos ya filtrados en Arduino?

Carol

Hola,
Estoy realizando un proyecto con un IMU, quisiera saber como podría implementar este con comunicación bluetooth, no se si exista esa posibilidad, es decir si pueda acoplar el IMU a un maestro o esclavo para hacer transición de dato.
Gracias.

Daniel QH

Las lecturas están en qué unidades? [m/s ^2] ??

Federico

Estimado Luis, gracias por los tutoriales y sketchs. Leí y probé los sketchs para el MPU6065, pero tengo un MPU9250 y no encuentro la forma de utilizar el DMP. En esta entrada (la referida al 9250) solo hay un ejemplo para datos en crudo, y no he podido hallar más información hasta el momento. Si tuvieras algún ejemplo de uso del DMP para el MPU9250 me sería de gran utilidad. Desde ya, muchas gracias y saludos.