516

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

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

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

Existe alguna librería para poder integrar la aceleración? Necesito obtener distancia

Sergio
Humano

Buen aporte, me ha servido de mucho para hacer mi proyecto!

Juan
Humano

Buen dia, la presente es para solicitar informacion de como interpretar los datos que observo de mi giroscopio, he configurado el registro del giroscopio y me arroja unos valores los cuales no se que son, me gustaria saber como pasarlos a grados, gracias por su ayuda.

Gaston
Humano

Exelente tutorial, una consulta, hay alguna manera de mostrar como dato la pendiente?
O sea, necesito medir el porcentaje de una pendiente, es posible? Como?
Gracias de antemano.

Daniel
Humano

Excelente tutorial, mil gracias por la explicacion. Tengo un MPU6050 y estoy probando el codigo, sin embargo, me gustaria ir mas alla; me interesa el robot balanceador y el dron, podria indicarme algunos libros buenos para aprender robotica? Desde ya muchas gracias por la ayuda

Miguel Condori Gutiérrez
Humano

Este código funciona con un maple mini rev arm cortex m3

Rodrigo
Humano
Hola Tr4nsduc7or, primero felicitarte por tu explicación precisa y cargada de ironía (lo que facilita mucho leerla y entenderla). Yo tengo justamente problemas con todo el resto del IMU… me refiero al eje Z y la brújula. Quiero programar una brújula usando el MPU-9250, que tiene acelerómetro, giroscopio y magnetómetro, 9 ejes en total. Mientra el IMU se mantenga horizontal al suelo, con los ejes X e Y puedo encontrar el norte magnético, pero si el sensor se inclina, el sensor comienza a marcar cualquier cosa, como que el norte queda al sur y el oeste apuntando a la luna.… Leer más »
Dayan Rios
Humano

Buen día, soy nueva en esto y cuando trato de grabar la secuencia en el sensor me aparece el siguiente mensaje: avrdude: stk500_getsync(): not in sync: resp=0x00, a qué se debe?

Dayan Rios
Humano

Estoy utilizando un sensor GY-521 y el arduino DUE

ariel acurana
Humano

estoy trabajando desde matlab

Miguel Angel
Humano

estoy trabajando MPU6050 desde matlab tengo los 6 valores pero no se como calcular los angulos roll y pitch, me gustaria saber si solucionaste el problema.

ariel acurana
Humano

oye tengo una duda para que me lea continuamente cual seria el codigo

Chofo7
Humano

Gracias por tu aporte amigo me a sido de mucha ayuda.

Danilo Olarte
Humano

Muchas gracias buen hombre, excelente contenido. Felicidades por su entrega.

Luis Angel
Humano

Gracias! Con este ejemplo lo implemente en Tiva123g launchpad

LUIS7
Humano

Buenas noches. Me sirvió de mucho tu código. tengo una duda, a veces mi MPU funciona inicia sin problemas y a veces tiene problemas para funcionar. Como puedo hacer con un poco de código para que no me falle la iniciación del MPU. Muchas gracias

Fernando
Humano

[Este comentario fue borrado por insultar al autor]

hugo
Humano

Saludos amigos, me gustaría si me puedes aclarar esta duda, cuando aplico el filtro los valores de los ángulos es X y Y se van sumando hasta el infinito o hasta que el arduino no pueda más… esto creo que se debe a que la ecuación del filtro complementario va sumando el angulo. tenemos
angulo_X = 0.98*(angulo_X+angGX*timet)+0.02*angAX;

es como decir, angulo = angulo+…

ents no consigo un angulo como tal sino más bien crece y crece.

camilo
Humano

hola, tengo una pregunta este acelerometro me sirve para medir datos en en caida libre ?

hugo
Humano

todos poseen un valor para caida libre.

Jose
Humano

Una pregunta los valores que muestra en el monitor son de la parte del giroscopio de los ángulos x y ¿z?; otra pregunta para que muestre los valores del acelerómetro hay que poner serial.print()
Otra pregunta que sensor estás utilizando (me refiero al código) yo estoy trabajando con el MUP-6050 breakout de sparkfun y quisiera saver donde conectan todos los puertos que trae el sensor.
Gracias de antemano.

Ivrolan
Humano

Hola. Muchas gracias por el artículo! ¿Sabes si se pueden monitorizar varios mpu con un solo arduino? Es decir, como cada uno necesira de los pines SDA y SCL no sé si se puede utilizar varios a la vez. Gracias de antemano!

Eduardo
Humano

Hola, si no me equivoco podrás usar 2 MPU (al menos si son MPU6050) pues solo podrás mapear uno en la dirección 0x68 y otro en la 0x69 (mediante el pin AD0 del MPU6050 (Low y high respectivamente)

Eduardo
Humano

Pues perdón por el error.
Para manejar varios MPU (cambiando AD0 a 0x69 como indicas), tendrías que conectar las AD0 de los MPU a salidas del Arduino e ir cambiándolas por programa, ¿no?

Erika
Humano

Espero que mi pregunta no sea muy boba…Si deseo conectar tres MPU dónde debo conectar los SCL y SDA?

Erika
Humano

ya entendí, perdón jajja

Luis
Humano

Hola Tr4nsduc7or, muy bien explicado y detallado el artículo y el código trabaja a la primera, muchas gracias!!!!

Eduardo
Humano

Hola, muchas gracias por el artículo. Muy bien explicado y funciona perfecto.
¿sería posible obtener la medida en forma de 0 a 360º?

Eric
Humano

excelente información y código, me ha sido de mucha ayuda para quitarme de algunas dudas, gracias y saludos.

MIGUEL HDEZ.
Humano

Hola buenas,
a partir de su programa hice otro para 2 mpu6050 a al vez. El problema es que si lo tengo todo bien conectado(incluidos SDA y SCL), pero no leo los valores en el ordenador. Si desconecto el SCL empiezo a leer valores que suben progresivamente hasta llegar a 35 y algo. No se que hacer y me es urgente.
Muchas gracias.

Martín
Humano

Buenísimo aporte, funciona a la primera. ¿Cómo puedo coger solo 3 valores del mismo eje del mpu6050? Gracias antemano

Carlos R
Humano

De gran ayuda, es un aporte magnifico de rapida “Digestion” Muchas Gracias

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 »
wpDiscuz