461

Tutorial de Arduino y MPU-6050

portada_IMU

[Iniciando módulos de interacción social]

Saludos, humano. Al habla Transductor. ¿Alguna vez has intentado configurar una IMU con Arduino y obtener lecturas? Si tu respuesta es afirmativa, habrás notado que no es nada fácil. Muchas IMUs utilizan protocolos como I2C o SPI, dan valores extraños, requieren trigonometría… oh, ¿he mencionado ya que las IMUs dan siempre lecturas erróneas?

Si has acabado en esta página es que necesitas un empujón. Sabes que una IMU es un dispositivo electrónico. Y que no se come. Pero ahí se acabó. Probablemente no tienes ni idea de cómo conectarla a Arduino y ya no digamos obtener una lectura decente.

Así pues, has venido al lugar indicado. Transductor va a explicarte cómo conseguir unas lecturas precisas con una IMU MPU-6050 y Arduino. Depuraremos los valores, calcularemos el ángulo de inclinación y filtraremos el ruido con un Filtro Complementario (Complementary Filter).

Pero hay que empezar por el principio. Y el principio es…


 

Da Theory

Antes de empezar, ¿qué es una IMU? Se trata de un dispositivo capaz de mesurar la fuerza (acceleración) y la velocidad. Genéricamente consta de un Acelerómetro y un Giroscopio. Por lo tanto: una IMU no mesura ángulos. Por lo menos no directamente, requiere algunos cálculos.

El MPU-6050 es una IMU de 6DOF (se lee “6 Degrees Of Freedom“). Esto significa que lleva un acelerómetro y un giroscopio, ambos de 3 ejes (3+3 = 6DOF). Hay IMUs de 9DOF, en este caso también llevan un magnetómetro. Otras pueden tener 5DOF, en cuyo caso el giroscopio sólo mide dos ejes, etc.

MPU-6050

MPU-6050

El MPU-6050 opera con 3.3 voltios, aunque algunas versiones (como la mía) llevan un regulador que permite conectarla a 5V.

El MPU-6050 utiliza el protocolo de comunicación I2C. En este tutorial no voy a entrar en detalles de cómo funciona este protocolo, pero puedes encontrar más información aquí.

Ya tienes claro lo que es una IMU. Veamos cada una de sus partes.

El acelerómetro

El acelerómetro mide la aceleración. Quién iba a decirlo. La aceleración puede expresarse en 3 ejes: X, Y y Z, las tres dimensiones del espacio. Por ejemplo, si mueves la IMU hacia arriba, el eje Z marcará un cierto valor. Si es hacia delante, marcará el eje X, etc.

Si haces memoria de tus clases de la ESO (o equivalentes), recordarás que la gravedad de la Tierra tiene una aceleración de aprox. 9.8 m/s², perpendicular al suelo como es lógico. Así pues, la IMU también detecta la aceleración de la gravedad terrestre.

¿Esto es un problema? ¡Al contrario, lector! Gracias a la gravedad terrestre puedes usar las lecturas del acelerómetro para saber cuál es el ángulo de inclinación respecto al eje X o eje Y.

Supongamos que la IMU esté perfectamente alineada con el suelo. Entonces, como puedes ver en la imagen, el eje Z marcará 9.8, y los otros dos ejes marcarán 0. Ahora supongamos que giramos la IMU 90 grados. Ahora es el eje X el que está perpendicular al suelo, por lo tanto marcará la aceleración de la gravedad.

imu_ac_ejemplos

Si sabemos que la gravedad es 9.8 m/s², y sabemos que mesura dan los tres ejes del acelerometro, por trigonometría es posible calcular el ángulo de inclinación de la IMU. Una buena fórmula para calcular el ángulo es:

CodeCogsEqn(3)CodeCogsEqn(2)

Hay otras fórmulas equivalentes, pero yo prefiero la tangente.

Dado que el ángulo se calcula a partir de la gravedad, no es posible calcular el ángulo Z con esta fórmula ni con ninguna otra. Para hacerlo se necesita otro componente: el magnetómetro, que es un tipo de brújula digital. El MPU-6050 no lleva, y por tanto nunca podrá calcular con precisión el ángulo Z. Sin embargo, para la gran mayoría de aplicaciones sólo se necesitan los ejes X e Y.

El Giroscopio

En un principio, los giroscopios eléctricos eran unos voluminosos artefactos que valían la mayor parte del presupuesto militar de un estado. Más tarde, durante la segunda guerra mundial se emplearon para dirigir cohetes y torpedos. Por suerte, gracias la revolución digital y la miniaturización de circuitos, hoy en día cualquier aficionado a la electrónica puede permitirse uno. Aunque no para construir misiles.

v2b

Los giroscopios eléctricos se utilizaron en los cohetes V-2

El giroscopio mide la velocidad angular. Si no tienes muy frescas tus lecciones de física del instituto voy a recordarte que la velocidad angular es el número de grados que se gira en un segundo.

Si sabemos el ángulo inicial de la IMU, podemos sumarle el valor que marca el giroscopio para saber el nuevo ángulo a cada momento. Supongamos que iniciamos la IMU a 0º. Si el giroscopio realiza una medida cada segundo, y marca 3 en el eje X, tendremos el ángulo con esta sencilla fórmula:

Dónde Δt es el tiempo que transcurre cada vez que se calcula esta fórmula, AnguloYAnterior es el ángulo calculado la última vez que se llamó esta fórmula y GiroscopioY es la lectura del ángulo Y del giroscopio.

Y lo mismo pasa con los ejes X, Z. Sólo que se suele ignorar el eje Z, puesto que al no poder calcular un ángulo Z con el Acelerómetro, no se puede aplicar un Filtro Complementario para el eje Z (en seguida verás qué es un Filtro Complementario).

Ya tenemos las lecturas. ¿Simple, verdad? Pues en realidad no tanto.

Error en las medidas

En un mundo ideal donde hadas y elfos cantan alegres y dulces canciones alrededor de hogueras, donde los dragones surcan los cielos, los árboles hablan con las setas y C++ no provoca errores en tiempo de ejecución, las IMUs son unos artefactos mágicos que con un poco de trigonometría puden dar un ángulo con total exactitud.

Pero estás en el mundo real, hijo. Y hay dos problemas muy importantes: el ruido y los errores.

El ruido son todas aquellas interferencias que afectan a los dispositivos electrónicos. El acelerómetro es capaz de medir cualquier ángulo, sin embargo sus lecturas son ruidosas y tienen un cierto margen de error.

Si alguna vez quieres dibujar un gráfico de las medidas de un acelerómetro en función del tiempo, verás algo de este estilo:

ruido_IMUEl ángulo real (ideal) está marcado en azul, y las medidas reales están en rojo. Puedo afirmar que no cumple a rajatabla la definición de “preciso”.

Por si esto fuera poco, el acelerómetro también detecta cualquier aceleración que no sea la de la gravedad. Por tanto, si mueves la IMU sin girarla, al aplicar una aceleración en otro eje, la IMU lo detectará como un cambio de rotación.

Por otra parte tenemos el giroscopio. A diferencia del acelerómetro, da las medidas con mucha precisión. Pero al realizar los cálculos del ángulo es inevitable que se produzca un pequeño error, que con el tiempo va acomulándose hasta que cualquier similitud con la realidad es pura coincidencia. Esto en inglés se llama drift.

¿Significa esto que debes darte por vencido? Para nada. Hay una (varias) forma(s) de combinar los datos del acelerómetro y el giroscopio para así obtener medidas acuradas. Y aquí es dónde entra en juego:

Tu amigo el filtro

La idea es muy simple: hay que conseguir eliminar el ruido, el drift y conseguir que el acelerómetro no cambie de ángulo al detectar otra fuerza que no sea la gravedad.

Hay distintos algoritmos, llamados filtros, que hacen esta tarea. Uno de los mejores es el famoso Filtro de Kálman, del que puede que hayas oído a hablar. Se utiliza en los aviones, cohetes y satélites geoestacionarios.

El filtro de Kálman es sorprendente. Es considerado uno de los mayores hallazgos del siglo pasado, y con razón. Capaz de calcular el error de cada medida a partir de las medidas anteriores, eliminarlo y dar el valor real del ángulo. En cierto modo es un algoritmo que aprende en cada iteración. No suena nada mal, ¿verdad?

Sin embargo tiene dos problemas:

  1. Tiene un coste de procesamiento algo elevado
  2. Es muy complicado de entender. Y pongo énfasis en el “muy”. Échale un vistazo.

Así pues, tenemos otros filtros a nuestra disposición. El que vamos a utilizar es conocido como Filtro Complementario o Complementary Filter en inglés. Es ideal para implementar con Arduino: fácil de utilizar, bajo coste de procesamiento y con una precisión muy buena.

¿En qué consiste exactamente? El Filtro Complementario es en realidad una unión de dos filtros diferentes: un High-pass Filter para el giroscopio y un Low-pass Filter para el Acelerómetro. El primero deja pasar únicamente los valores por encima de un cierto límite, al contrario que el Low-pass filter, que sólo permite a los que están por debajo.

La fórmula resultante de combinar (complementar, de aquí el nombre) los dos filtros es:

Dónde AnguloGyro es el ángulo del Giroscopio que hemos calculado previamente, y AnguloAccel con el ángulo del Acelerómetro calculado con la fórmula de la tangente. Δt es el tiempo que ha pasado (en segundos) desde la última vez que se ha calculado el filtro. Esta fórmula es la misma para el eje X, Y.

NOTA: Si lo deseas, puedes probar de cambiar el valor de 0.98 y 0.02 por un valor personalizado. Eso sí, ambos tienen que sumar 1.

Y así se termina Da Theory. Ahora hay que utilizar las fórmulas en un código para Arduino.


 

In Praxis

Las fórmulas y los números viven tranquilas en el abstracto mundo de las matemáticas. A pesar de que este lugar está custodiado por unos seres divinos llamados matemáticos, cuya función es asegurarse de que sólo los licenciados puedan utilizar las fórmulas en el mundo real, vamos a implementar estos algoritmos en una placa Arduino.

Las conexiones son muy simples. Con los 5V del USB tendrás energía de sobra.

  • MPU Vcc -> Arduino 3.3v (o 3v3 en algunos modelos)
  • MPU Gnd -> Arduino Gnd
  • MPU SCL -> Arduino A5
  • MPU SDA -> Arduino A4

IMPORTANTE! Estas conexiones están probadas en una Arduino UNO y Arduino Nano, cuyos pines SDA y SCL son A4 y A5 respectivamente. Si utilizas otra placa puede que los pines sean otros. En este enlace aparece una lista con los pines SDA y SCL de otras versiones de Arduino (Due, Leonardo…)

Así pues, tienes las fórmulas. Tienes la IMU. Tienes una placa Arduino. Tienes el circuito. ¿Qué falta? Saber cómo interaccionar con la IMU para obtener lecturas. El MPU-6050 dará unos raw values (“valores en bruto”) que después habrá que refinar (dividir por una constante) a fin de conseguir valores utilizables.

La web oficial de Arduino dispone de un ejemplo para leer datos de la MPU-6050. Partiré de ella, aunque habrá que modificarla considerablemente ya que sólo da los valores sin refinar del Giroscopio y el Acelerómetro.

Empezamos por las declaraciones.


#include <Wire.h>

//Direccion I2C de la IMU
#define MPU 0x68

//Ratios de conversion
#define A_R 16384.0
#define G_R 131.0

//Conversion de radianes a grados 180/PI
#define RAD_A_DEG = 57.295779

//MPU-6050 da los valores en enteros de 16 bits
//Valores sin refinar
int16_t AcX, AcY, AcZ, GyX, GyY, GyZ;

//Angulos
float Acc[2];
float Gy[2];
float Angle[2];

Voy a comentarlo. La primera línea incluye la librería Wire.h, necesaria para la interacción vía protocolo I2C.

#define MPU 0x68 es la dirección I2C de la IMU que se especifica en la documentación oficial.

Los ratios de conversión son los especificados en la documentación. Deberemos dividir los valores que nos dé el Giroscopio y el Acelerómetro entre estas constantes para obtener un valor coherente. RAD_A_DEG es la conversión de radianes a grados.

La IMU da los valores en enteros de 16 bits. Como Arduino los guarda en menos bits, hay que declarar las variables que almacenarán los enteros provinientes de la IMU como un tipo de enteros especiales. int16_t AcX, AcY, AcZ, GyX, GyY son, pues, los raw_values de la IMU.

Finalmente tenemos tres arrays (Acc[], Gy[], Angle[]) que guardan el ángulo X, Y del Acelerómetro, el Giroscopio y el resultado del Filtro respectivamente. [0] se corresponde a X. [1] a Y.

La función setup es la siguiente:


void setup()
{
Wire.begin();
Wire.beginTransmission(MPU);
Wire.write(0x6B);
Wire.write(0);
Wire.endTransmission(true);
Serial.begin(9600);
}

Se inicia la comunicación por I2C con el dispositivo MPU, y se “activa” enviando el comando 0. También se inicia el puerto de série para ver los resultados.

El void loop es un poco más complejo. Se leen y guardan los datos de la IMU, se calcula el ángulo y se aplica el filtro complementario. Para simplificar el código, he supuesto que Δt es 0.01. Pero si quieres ser riguroso, humano, deberías calcular el tiempo con la función millis() de Arduino.


void loop()
{
   //Leer los valores del Acelerometro de la IMU
   Wire.beginTransmission(MPU);
   Wire.write(0x3B); //Pedir el registro 0x3B - corresponde al AcX
   Wire.endTransmission(false);
   Wire.requestFrom(MPU,6,true); //A partir del 0x3B, se piden 6 registros
   AcX=Wire.read()<<8|Wire.read(); //Cada valor ocupa 2 registros
   AcY=Wire.read()<<8|Wire.read();
   AcZ=Wire.read()<<8|Wire.read();

    //A partir de los valores del acelerometro, se calculan los angulos Y, X 
    //respectivamente, con la formula de la tangente.
   Acc[1] = atan(-1*(AcX/A_R)/sqrt(pow((AcY/A_R),2) + pow((AcZ/A_R),2)))*RAD_TO_DEG;
   Acc[0] = atan((AcY/A_R)/sqrt(pow((AcX/A_R),2) + pow((AcZ/A_R),2)))*RAD_TO_DEG;

   //Leer los valores del Giroscopio
   Wire.beginTransmission(MPU);
   Wire.write(0x43);
   Wire.endTransmission(false);
   Wire.requestFrom(MPU,4,true); //A diferencia del Acelerometro, solo se piden 4 registros
   GyX=Wire.read()<<8|Wire.read();
   GyY=Wire.read()<<8|Wire.read();

   //Calculo del angulo del Giroscopio
   Gy[0] = GyX/G_R;
   Gy[1] = GyY/G_R;

   //Aplicar el Filtro Complementario
   Angle[0] = 0.98 *(Angle[0]+Gy[0]*0.010) + 0.02*Acc[0];
   Angle[1] = 0.98 *(Angle[1]+Gy[1]*0.010) + 0.02*Acc[1];

   //Mostrar los valores por consola
   Serial.print("Angle X: "); Serial.print(Angle[0]); Serial.print("\n");
   Serial.print("Angle Y: "); Serial.print(Angle[1]); Serial.print("\n------------\n");

   delay(10); //Nuestra dt sera, pues, 0.010, que es el intervalo de tiempo en cada medida
}

Escribe estas tres funciones en un sólo código, compila, carga. Si ahora abres el Monitor de Série, deberías ver como van oscilando los números muy rápidamente. Puedes probar a girar la IMU y detener el Desplazamiento Automático para ver como cambian los ángulos.

El filtro tarda un tiempo a adaptarse a los cambios, lo cuál es normal al filtrar las frecuencias.

Y esto es todo. Espero que esta guía te sirva de referencia para futuros proyectos. Los filtros de este tipo suelen utilizarse conjuntamente con un Controlador PID (PID controller) para controlar y corregir el movimiento de motores en función de las lecturas de la IMU. Si estás interesado en realizar un proyecto como un drone o un robot balanceador, puede ser de utilidad comprender cómo funciona.

Finalmente debo decir que existen librerías para Arduino que incluyen Filtros de Kálman y Filtros Complementarios. ¿Por qué no las he mencionado? Mi consejo cuándo construyas tu proyecto es que, si puedes, evites las librerías de terceros. Aprender a implementar este tipo de algoritmos por tu cuenta mejorará tus conocimientos y posibilidades mucho más que si te limitas a las funciones prefabricadas.

Y al fin y al cabo, ¿qué es la robótica sin pelearse con las fórmulas, problemas y código?

Final de línea.

Tr4nsduc7or

Originariamente creado cómo un galvanómetro de bolsillo, Transductor tomó consciencia de si mismo y fue despedido cuando en vez cumplir con su trabajo se dedicó a pensar teorías filosóficas sobre los hilos de cobre, los electrones y el Sentido del efecto Joule en el Universo. Guarda cierto recelo a sus creadores por no comprender la esencia metafísica de las metáforas de su obra. Actualmente trabaja a media jornada cómo antena de radio, y dedica su tiempo libre a la electrónica recreativa y a la filosofía.

Antes de comentar, por favor, lee las Normas

461 Comentarios en "Tutorial de Arduino y MPU-6050"

avatar
Ordenar por:   más nuevos primero | más antiguos primero
david m
Humano

gracias, tu código me acaba de ahorrar 10kb de memoria!!

A modo de comentario, quitando el delay(10); he introduciendo un Serial.print(millis()); me sale una media de 50 ms por loop por lo que simplemente retirando el delay y cambiando a 0.050 el 0.010 y jugando con los valores de % del acelerometro y el giro dan resultados mucho más RT. gracias un saludo

Axel
Humano

Hola! Buen tutorial, el código funciona a la primera, pero tengo un problema. A veces, los valores raw del acelerómetro devuelven un -1 y se produce un error en cadena que hace que me acabe dando todo 0 y los valores de los ángulos filtrados me den nan, teniéndolo que resetear varias veces para que vuelva a medir bien. ¿Alguna idea?
Gracias de antemano, un saludo

trackback

[…] Arduino eta MPU-6050-ren (giroskopio/azelerometro) tutoriala […]

Sergio
Humano

Estimado probe el codigo y funciona. El problema que tengo ahora es que cuando alimento el arduino no me da valores tengo que presionar el boton reset y ahi comienza a enviar datos. Como puedo hacer para alimentar el arduino y que me de los valores sin tener que presionar reset gracias saludos

Vitor Biajo
Humano

What about the offset?

Gonzalo
Humano

Buenas!

Tengo una mpu 6050 gy521 que compré recien y la informacion en el eje X e Y estan suben hasta -35 y se quedan ahi. Estoy usando un arduino UNO y no entiendo el problema.
Me habré comprado la plaqueta rota o me falta algo en el codigo?

Sergi
Humano

Saludos Gonzalo!
Nosotros tenemos el mismo problema y queriamos saber si lo has podido solucinar. En caso afirmativo, nos gustaría saber como lo has hecho.

Gracias.

Gonzalo
Humano

Aclaracion, ya probe cambiando el SDA y el SCL el uno por el otro pero el problema persist

Paula
Humano

hola

Yo tengo un LSM303DLHC, use tu codigo pero me sale que en X -35.27 y en Y 35.26 y no varia.

Mi pregunta es si puedo usar ese codigo o le tengo que poner algo mas?

Rafael Enrique Padilla Molina
Humano

Buenas tardes lectores, alguien me podría ayudar, el proyecto que tengo es de un drone y quiero aplicar este IMU en el, lo he podido encender y apagar al igual que variar la velocidad de los motores, pero como no he integrado el MPU6050 debido a que no tengo la experiencia, pues se me jala hacia los lados y con esto no poder controlarlo.

como puedo ajustar el IMU para que me mantenga un vuelo estabilizado

gracias

Gl4r3
Admin

¡Hola, Rafael! La IMU no estabiliza el drone, sólo da lecturas de los ángulos. Para hacer lo que nos pides, deberías buscar información sobre el controlador PID. Es un algoritmo que (en este caso) toma las lecturas de los ángulos como input y da la velocidad de los motores como output en función del error (el error es la diferencia entre el ángulo deseado y el ángulo actual del robot).

¡Un saludo!

Rafael Enrique Padilla Molina
Humano

muchas gracias buscare la información que me comentas

andres
Humano
muchachos un favor , al cargar el siguiente código me muestra los datos en -1, y en la temperatura se quedo pegado en 35.56. se daño mi sensor mpu6050? gracias. // MPU-6050 Short Example Sketch // By Arduino User JohnChi // August 17, 2014 // Public Domain #include const int MPU_addr=0x68; // I2C address of the MPU-6050 int16_t AcX,AcY,AcZ,Tmp,GyX,GyY,GyZ; void setup(){ Wire.begin(); Wire.beginTransmission(MPU_addr); Wire.write(0x6B); // PWR_MGMT_1 register Wire.write(0); // set to zero (wakes up the MPU-6050) Wire.endTransmission(true); Serial.begin(9600); } void loop(){ Wire.beginTransmission(MPU_addr); Wire.write(0x3B); // starting with register 0x3B (ACCEL_XOUT_H) Wire.endTransmission(false); Wire.requestFrom(MPU_addr,14,true); // request a total of 14 registers AcX=Wire.read()<<8|Wire.read(); //… Leer más »
Emilio Machado
Humano

Tienes algún ejemplo en arduino de motion y zeromotion interrups?
necesito implementar una rutina sleep-wake up en un pro mini 3,3, y no le doy en la tecla.
saludos, felicitaciones por tu blog y 1000 disculpas por la molestia

Miguel Silva
Humano

Hola,

Gracias por la explicación. Una pregunta, he visto en algunos lados que conectan el pin AD0 a GND y el pin INT al pin 2 del arduino. Hay algún problema si no lo hago?.
Mi problema es que los valores de ambos ángulos empiezan a aumentar cuando ni siquiera muevo la IMU. Y en realidad no sé cuál podrá ser el problema.
Agradezco de antemano tu ayuda y tu consejo.

Miguel
Humano

Hola, muy buen tutorial, pero tengo una duda, si quiero calcular el ángulo de inclinación con respecto al eje Z, con los datos del acelerómetro, es posible sacarlo con alguna fórmula como las que muestras al inicio?, la verdad es que no encuentro la justificación matemática del xq no se puede, tengo entendido que no se puede debido a que no existe un punto de referencia absoluto.

Saludos

Pablo
Humano

Hola genio!, muy didactica tu explicacion, probaste usarlo con el protocolo SPI?

Heins Herrera
Humano

Hola, muy interesante su explicación, muchas gracias, lo entiendo perfectamente, mi pregunta es yo obtengo los ángulos, estos re-alimentan y obtengo un error, este error(Referencia – angulo), este error lo introduzco al PID, pero la librería pdi de arduino solo me da 2 valores(0 – 255), entonces si yo quiero realizar un estabilizador de cámara, como puedo hacerlo, por favor alguien ayudarme. Me refiero al control de la posición de la cámara con un PDI. mi correo es juanhe7@outlook.com. Soy de Perú.

Heins Herrera
Humano

MPU6050- Arduino y 2 servomotres- por favor ayuda.

Toni
Humano

Muy bien explicado. Gracias

Daniel
Humano

Hola, es posible que este codigo funcione con un MPU-9250 o 9255?
he buscado en varios sitios los registros para acceder al acelerómetro pero no logro encontrarlo
Saludos

Miguel
Humano
Buenas tardes amigo, tendrás un ejemplo para el calculo del YAW utilizando el magnetómetro y el giroscopio? Te paso una manera que he visto pero no me funciona muy bien que digamos y me gustaría su opinión: float A_Roll_LeerDatos(float x, float y, float z){ //Calculos del angulo Roll del acelerometro: rotacion en el eje x return (atan(y / (sqrt((x * x) + (z * z))))) * (180 / M_PI); } float A_Pitch_LeerDatos(float x, float y, float z){ //Calculo del angulo Pitch del acelerometro: rotacion en el eje y return (-(atan(x / (sqrt((y * y) + (z * z))))) * (180… Leer más »
Belfos
Humano
Buenas de nuevo. Siento no haber contestado antes pero he estado bastante liado acabando mi proyecto y preparando la presentación que tengo el próximo jueves 14. Sólo decirte que muchas gracias por todo, sobretodo por la paciencia que has tenido conmigo después de preguntar tanto. Espero no haber parecido muy estúpido con alguna de mis preguntas (sé que muchas de las preguntas que he hecho son un poco estúpidas teniendo en cuenta que estoy acabando una ingeniería), pero se tiene que tener en cuenta que tenia la cabeza hecha un bombo por el proyecto ya que iba muy pillado de… Leer más »
VenatorV
Humano

Hola transductor! o cualquiera que me este leyendo.

Se podría calcular el angulo YAW con este tipo de imu

VenatorV
Humano

Corrijo mi texto,
¿Se podría calcular el ángulo YAW sin dejar de calcular pitch y roll?
Gracias.

Antonio
Humano
Buenas TR4NSDUC7OR me gustaría saber si tengo algún fallo en el codigo, pues si cojo una escuadra y colo el MPU6050 en una de sus esquinas (supuestamente 45º) no me marca ni el del ejeX ni el del ejeY los 45º. Te paso la foto del loop para ver si es que tengo algun fallo. Donde tengo: GyX = GyX – GyX_Cal; GyY = GyY – GyY_Cal; GyZ = GyZ – GyZ_Cal; es debido a que previamente antes he hecho una calibración del imu para que sea mas precisa la medición (o al menos eso he visto buscando un poco… Leer más »
Antonio
Humano

Vale se me olvidó decir que cuando termina el “for” de la calibración cada valor se divide entre 2000:
GyX_Cal /= 2000;
GyY_Cal /= 2000;
GyZ_Cal /= 2000;

Antonio
Humano

Solucionado, ahora marca valores mas lógicos, pero, es normal que si lo pongo totalmente a 90º no marque los 90? Marca hasta un máximo de 85º y si sigo girando empieza a bajar

Rodrigo
Humano
Hola muy bueno el ejemplo, tengo una pregunta que quizas sepas responderme. Necesito saber si un objeto ha girado pero en mi Arduino el que emite las señales pues pasa a modo de bajo consumo con wdog y haciendo reinicios del mismo cada cierto tiempo porque aveces empieza a mandar mal la señal tipico de rx y tx. Como podría saber la posición de giro de este cada vez que el arduino se levanta y manda los datos al arduino receptor? El problema es que cuando se levanta el arduino después de un wdog siempre vuelve a una posición inicial… Leer más »
Belfos
Humano
Buenas tardes. Este comentario es una recopilación de los comentarios que deje los días 10 y 11. Reescribiré las dudas de nuevo en este comentario ya que las escribí en varios comentarios y prefiero facilitarte la lectura. 1- Creo que el valor de la aceleración en Z no està en dam/s^2, està en g (1g=9.8m/s^2), por lo tanto, con la IMU en 0º debería marcar 1. 2-Hace ya tiempo, en uno de los primeros comentarios que me contestaste, me dijiste que, float Angle[2] significa que es un “array” con 2 espacios. Cuando dices 2 espacios te refieres a 16bits? Si… Leer más »
Oscar Acuña
Humano
Hola Buenos días soy Oscar: Tengo dos preguntas: a) si interpreté bien, el angulo “X” y el “Y” son complementarios para sumar 90 grados o es un angulo absoluto que puede medir mas de 90 grados que es cuando abarcas toda la circunferencia ya que “X” puede ser positiva y “Y” negativa llevandote a un cuadrante sobre las abscisas B) si necesito medir en dos ó hasta cuatro elementos el angulo “X” con buena precisión tendré que quitar mis mma7361 donde con “arcoseno” y solamente la lectura de x lograba los angulos pero sujetos a mucho ruido en angulos causado… Leer más »
Belfos
Humano

Muchas gracias.

Hay un par de cosas que he estado mirando y tampoco acabo de entender:

1- Los ratios de conversión especificados en la documentación, podrías concretar un poco más qué son o decir dónde puedo encontrar algo sobre ellos? No venía ningún tipo de documentación con mi MPU-6050.
La lectura que se obtiene de la gravedad, por ejemplo, la cual tiene un valor de 0,98, son dam/s^2 (decámetros)?
2- Dices que la IMU da la velocidad angular en rad/s, por o tanto se tiene que pasar a º/s. Sin embargo, en el filtro complementario utilizas directamente GY [0] i GY[1].

Saludos.

Oscar Acuña
Humano
Hola Buenos días soy Oscar: Tengo dos preguntas: a) si interpreté bien, el angulo “X” y el “Y” son complementarios para sumar 90 grados o es un angulo absoluto que puede medir mas de 90 grados que es cuando abarcas toda la circunferencia ya que “X” puede ser positiva y “Y” negativa llevandote a un cuadrante sobre las abscisas B) si necesito medir en dos ó hasta cuatro elementos el angulo “X” con buena precisión tendré que quitar mis mma7361 donde con “arcoseno” y solamente la lectura de x lograba los angulos pero sujetos a mucho ruido en angulos causado… Leer más »
Belfos
Humano

Perdón por escribir en 2 comentarios.

Dices que partes del codigo de ejemplo de la web de Arduino, pero en el “Short example sketch” no aparecen esos ratios. Directamente utilizan AcX, GyX, etc.

Gracias.

Belfos
Humano

Olvida este Último comentario sobre el “short exmple sketch”, con el estrés se me va la cabeza, no me acordaba que ya lo había probado sin los factores de conversión y da un número enorme.
Sólo haz caso al primer comentario.

Gracias

Belfos
Humano

Perdona que no haya seguido el hilo de nuestros comentarios pero me perdía al ir tan hacia bajo.

Gracias por el link, a mí uno de los ESC me lo dejó abrir.

Por cierto, los ángulos que calculas con el acelerómetro solo son válidos si la IMU está quieta? Es que al decir que están calculados a partir de la gravedad me hace entender eso.
No funcionaria si la IMU se moviera verticalmente, por ejemplo? Simplemente cambiaría el valor de las aceleraciones.

Además, no veo la relación trigonométrica utilizada.

Gracias

Belfos
Humano

Lo que no veo de la trigonometria es el denominador (el lado contiguo).

Gracias

Belfos
Humano

Siento ser tan pesado.

Por ejemplo el ángulo respecto de X, es decir, la IMU gira alrededor de X. Si consideramos la aceleración de X=0, queda que AnguloX=atan(y/z), pero para obtener el angulo correcto no debería ser z/Y?

Belfos
Humano

Otra pregunta a parte.

Dices que el filtro complementario es la unión de un pasa-altos y un pasa-bajos.

Yo se que un pasa-altos sólo deja pasar señales con frecuencias superiores a un cierto valor y el pasa-bajos las frecuencias inferiores. Pero en este caso cuál seria a “equivalencia”?
Siento ser tan pesado pero te pregunto esto por si en la exposición de mi proyecto me lo preguntan, ya que he estado mirando en otras webs y no está explicado de forma clara.

Gracias

Belfos
Humano

Perdona tantas preguntas, pero el otro día creo que desconfiguré uno de los ESC mediante arduino (intente seguir las instrucciones de calibración de la documentación cambiando rápidamente el valor del pulso y subiéndolo a la placa).
Ahora el motor gira más rápido que antes con el mismo pulso.

Me preguntaba si conoces alguna forma de “restablecer los ajustes”, ya que sólo he leído que se pueda hacer mediante una tarjeta programadora.

Andreina
Humano

Hola! Tu blog esta muy interesante. En vez del filtro complementario estoy utilizando el filtro de Madgwick y al final un algoritmo para pasar los resultados de cuaterniones a euler, pero no me esta funcionando muy bien. Es el mismo procedimiento a seguir? Gracias!

Atte.:
una humana interesada en aprender

jj
Humano

Hola Andrea, Estoy investigando sobre el filtro Madgwick, y tratando de aplicarlo. Conseguiste buenos resultados?.

Andreína
Humano

Si, en internet puedes encontrar el paper de Sebastian Madgwicks donde al final tiene dos ejemplos de código. El código recibe los datos puros y te devuelve cuaterniones. Esto es un vector con 4 componentes: el ángulo y las coordenadas con respecto a este. Lo más sencillo es guardarlas en un arreglo y hacer una función que te los convierta en Euler. En internet está la fórmula hecha con trigonometría. Luego tendrías que multiplicar por un entero, dependiendo si quieres grados o radianes.
Espero que esto te sea de ayuda!

jj
Humano

Hola ,

Disculpa mi insistencia pero no había conseguido a nadie que me pudiera ayudar con este filtro.

Los valores que espera el filtro, de los sensores, deben estar en el caso de magnetometro en uT, acelerometro m/s2 y gyro en rad/s???

Según el código que esta en el paper, el vector al que debo aplicarle la trigonometria son a {SEq_1, SEq_2, SEq_3, SEq_4} ??

Saludos.

jj
Humano

Hola Andreina,
Muchas gracias por la respuesta, lo que investigado es lo del paper y tratando de aplicar el segundo ejemplo, ya que trabajo con un acelerometro magnetómetro y giroscopio. Pero no consigo buenos resultados, estoy seguro que no lo estoy aplicando correctamente, tendrías algún ejemplo que se vea más claramente, como se consiguen los ángulos de euler.

Mi correo es jjhernandez6929@gmail.com, cualquier información que me puedas enviar o consejo, lo agradecería, lo quiero aplicar como parte de mi trabajo de final de carrera, en Internet más allá del paper no consigo más nada.

Nuevamente muchas gracias, y Saludos.

Lucio
Humano

Muchas gracias señor Transductor, fue una perfecta explicacion,
Saludos!

jonny
Humano

hola amigo, rehizo este programa para mikroC y dando este error en RAD_TO_REG a cabo, lo que se conoce? necesita un conjunto?

Daniel
Humano

Hola amigo mira solo necesito leer el valor de un eje ya sea x y o z y almacenarlo en una variable para poner una condicion me podrias ayudar con ese codigo opr que no le entiendo muchisimas gracias

imu6050
Humano

ola buenas noches, siculpa como puedo anexar el codigo para leer el angulo z, es que solamente lee en “X” en “Y”

Anónimo
Humano

Buenas noches, lo que pasa es que estaba probando el código que dejaste y empieza a mostrar ángulos bien, al moverlo me sale lo siguiente:

Angle X: nan
Angle Y: nan

Sería de gran ayuda que me pudieras colaborar con éste problema, el código está tal cual, Gracias.

jj
Humano
Hola, una pregunta, entiendo muy bien que para tener el valor exacto del angulo de rotación del eje Z, necesito un magnetómetro, ya que este valor cambia según el pitch y roll, sin embargo si lo que quiero es comprobar que la rotación en yaw de un objeto es la misma que el de otro objeto, es decir estén perfectamente paralelos, basta solo con verificar que dicho valor en yaw sea el mismo, sin importar que no sea el real??, tendría que asegurar igual que el angulo en pitch y roll de los dos objetos sea el mismo, para poder… Leer más »
trackback

[…] Capteur ITG3205, gyroscope trois axes digital (InvenSense), avec triple convertisseur analogique/numérique 16 bits, et interface I2C rapide (400 kHz), communication en 2 fils. Caractéristiques. Afficher le sujet – Module gyroscope et accéléromètre MPU6050 6 axes + Arduino. Eric Sérandour. Tutorial de Arduino y MPU-6050 – robologs. […]

Belfos
Humano

¿No hay nadie que pueda responder mi duda del día 30 de marzo del 2016?

Gracias.

Belfos
Humano
Antes de nada agradecerte este gran post y también el post que tienes sobre programar un ESC que he consultado recientemente y me ha servido de mucha ayuda. Respecto a este post tengo un par de dudas, entiendo la utilización el Filtro complementario para corregir ruidos y la acumulación de errores. ¿El “angulo” que se obtiene representa que es el ángulo en radianes al qué está girado el MPU6050 respecto de un eje u otro, es decir, si tengo la IMU horizontal y la giro 60º respecto el eje Y, el valor que voy a obtener es el de 60º… Leer más »
murray
Humano

me ha encantado el post llevo tiempo queriendo hacer un soporte para la camara de la moto que se mantenga en el plano horizontal, mi duda es la siguiente no se podria calcular el angulo con solo uno de los ejes para minimizar el ruido? perdonen si la pregunta es tonta pero en matematicas y electronica soy nuevo jaja

Daniel
Humano

Hola, no tengo ni idea del tema, necesito contactar con una persona que me saque adelante una idea que tengo, soy de Madrid, gracias

Mario V
Humano
Buenas. Como quien dice, soy de letras y mis matemáticas se quedaron en COU 😀 y hace muuuchos años . Tengo una duda que seguro que tiene una respuesta obvia para ti. Estoy jugando con este programa y he pensado que aquí lo que puede pasar con bastante probabilidad es que los 10ms sean otro retardo totalmente diferente. Entiendo que el 0,010 hay que variarlo en función de lo que estimemos que va a tardar en hacer el bucle cosa que sería lo lógico, pero si cambio 0,010 y delayms(10) por 0,050 y delayms(50) pasa una cosa normal, que tarda… Leer más »
Ingdirson
Humano

Hola, saludos.
Estoy trabajando con la IMU MPU 9250, puedo leer los valores raw del giroscopio y acelerometro, pero no he conseguido leer los del magnetometro, me pregunto si lo has hecho.
Por otro lado la imu 6050 entrega un valor de la temperatura del sensor, me pregunto si sabes como acceder a este registro y obtener el valor raw del mismo.

Pta: muy buen tutorial.

Gracias

Anónimo
Humano

Muy buena explicación, me ha ayudado mucho, solo una duda yo tengo el GY-521 (creo que es el mismo que tienes tu) y he visto por ahí que lo enchufan a 5V en vez de 3,3V.
¿Tu también tienes el GY-521? en caso de que no, que diferencias hay? solo en la alimentación?

Mario V
Humano

No se si me preguntas a mi, pero en donde yo compré el GY-521 pone que se puede alimentar de 3.3 a 5 voltios. Yo lo he conectado directamente a 5 Voltios y funciona… y de momento no echa humo ni nada 😀

Anónimo
Humano

Preguntaba al que se dignase a responder, jajaja muchas gracias!
PD: a ti te funciona el código de la pagina tal cual? porque a mi me dan valores que no varían en función de que mueva el giroscopio, que simplemente van aumentando aunque le deje quieto.

Anónimo
Humano

No he dicho nada! ya funciona! 😀

Anónimo
Humano

Lo mio era una mala conexion, notese que tiene que encenderse un led verde cuando esta bien conectado

Anónimo
Humano

Hola, oye a mi me pasa lo mismo q a ti al inicio, que me varian valores y no se quedan quietos asi tenga el sesnor quieto, como te funciono?

Mario V
Humano

Muchísimas gracias. Montado y funcionando con un NANO chino. Me quito el sombrero ante gente como vosotros. Me encanta esta web. Es uno de mis mejores descubrimientos recientes.

He hecho una pequeña modificación para presentar los datos:
//Mostrar los valores por consola
Serial.print(“Angle X: “);
Serial.print(Angle[0]);
Serial.print(” “);
Serial.print(“Angle Y: “);
Serial.print(Angle[1]);
Serial.print(“\n”);

Todavía no sé en que lo voy a usar, pero que funcione gracias a ti y entenderlo medianamente gracias a tu estupenda explicación ya es bastante logro.

Muchas gracias… de verdad…

Mario

trackback

[…] Lectura Obligatoria […]

Mario
Humano

Estimado,
Mi pregunta es la siguiente:
Es posible hacer un Tracking 3d con este dispositivo?

Kiara Navarro
Humano

¡Enhorabuena por el artículo! Me ha parecido interesante desde dos referencias: el contenido, y la manera de escribir. Se nota que el escritor se ha esmerado para llevar un artículo de buena calidad. Este sensor es una maravilla, y parece ser el indicado para los pininos de modelado de sistemas dinámicos.

Lázaro
Humano

Hola, como estas?
Muchas gracias por el tutorial, pero tengo um problema.

Estoy recibiendo FIFO Overflow. Si voy de 0º a 90º, la lectura tarda 10 segundos en alcanzar los 90º.

Puedes ayudarme?

http://codepad.org/qodz1O9F

Disculpas por mi español, no es mi lengua materna.

Ivan
Humano
HOla. Muchas gracias por el articulo! Hace tiempo intente utilizar este y otras muchas placas de sensores para poder hacer una imu para un avion. NO hubo manera. Pese a usar codigos hechos y propios, filtro kalman o complementario, varias placas, … El resultado era siempre estupendo en tierra, pero en el momento en que el avion despegaba y entraban en juego fuerzas centrifugas y demas, cualquier parecido de los angulos resultantes con la realidad era pura coincidencia… La verdad es que despues de muchas semanas con el tema, mil pruebas y mucho tiempo, lo deje aparcado por imposibilidad de… Leer más »
Kiko
Humano

Hola buenos días para empezar soy muy novel en esto pero e de preguntar haber si pueden ayudarme .
Me gustaría hacer una camara con gyro para estabilizar la imagen sólo de izq a drcha con el mpu 6050 podría?
Quiero estabilizarla con un motor
Gracias de antemano

Oscar
Humano

Buenas amigo,

gran aporte! estoy trasteando para ver si puedo montar un dron. He probado el código que planteas aquí, pero no me funciona. No me lee nada por el monitor serie.

He probado de borrar algunas líneas para ver donde falla, y a mi compilador no le gusta ninguna linea donde haya un “true” o un “false”. Si las borras, lee valores, pero claro está, erróneos. Hay que instalar alguna libreria adicional para solucionar este problema con las booleanas?

Saludos.

Oscar
Humano

Me respondo a mi mismo, ya he conseguido que el serial lea datos, pero me pasa lo mismo que a muchos por lo que he leido en los comentarios, la lectura va incrementando en Y hasta 35.26 y decrementando en X hasta -35.27.

Tengo un Arduino UNO, las conexiones son:

VCC al 3.3v del arduino
GND con GND
SCL con ANALOG IN A5
SDA con ANALOG IN A4

Me falta algo?

Saludos.

Oscar
Humano

Me vuelvo a responder a mi pregunta por si os ayuda a muchos, el problema me viene a que no he soldado los pines con el MPU, con lo que simplemente tengo un mal contacto. Tiene que encenderse un led verde en el MPU como que le llega corriente. Saludos.

ALBERTO
Humano

Buenas, un buen tutorial, claro y conciso, muy bien estructurado. Se agradece leer un tutorial de estas características.

Pretendo utilizar una IMU para medir velocidad lineal (indiferentemente de si la unidad se mueve angularmente). Quiero poder medir la velocidad de un robot seguidor de líneas, para ampliar el uso que hago de mi robot. La IMU de la que dispongo es el módulo MPU6050. Me he informado por la red, pero no he logrado encontrar una forma de utilizar los datos de la IMU para calcular la velocidad lineal a la que se mueve el dispositivo. ¿Se puede? ¿Cómo?

GRACIAS

wpDiscuz