Cómo usar el MPU6050 en un PSoC - using MPU6050 with PSoC


En muchos proyectos de electrónica el uso de sensores es indispensable, en la mayoría de los casos existen sensores que son fáciles de usar, pero hay otros en los que su uso no es tan trivial, en los cuales puede resultar más complejo obtener medidas coherentes y comúnmente requieren post-procesamiento.

Unos de los sensores más usados cuando se habla de medir la aceleración, velocidad angular o el desplazamiento angular es el MPU-6050, el problema de este sensor es que pertenece a esos que su uso no es tan fácil y requiere una serie de medidas para poder obtener datos representativos, debido a que las medidas de este sensor son muy ruidosas.

Módulo MPU-6050


El MPU-6050 es una unidad de medición inercial o IMU (Inertial Measurment Units) que cuenta con un acelerómetro y un giroscopio con el que podemos medir la aceleración y velocidad angular, cada uno con 3 ejes, teniendo así 6 grados de libertad (6DOF), con este podemos medir las componentes X, Y y Z de la aceleración permitiéndonos calcular el ángulo de inclinación de un objeto. Los signos de las aceleraciones y medidas del giroscopio vienen dados por las direcciones de la Fig.1 .

Figura 1. Dirección de las medidas para el MPU-6050.


Figura 2. Diagrama del MPU-6050.

El MPU-6050 funciona por medio de el protocolo de comunicación I2C, este está diseñado para una comunicación sincronía entre un maestro (Master) y un esclavo (Slave) y posee la ventaja de que puede ser implementado en la mayoría de micro-controladores, por ende en este caso en un PSoC.

Librerías para el MPU-6050 en PSoC Creator


En este tutorial trabajaremos con las librerías desarrolladas Jeff Rowberg y por Sam Walsh, las librerías se pueden descargar en el siguiente enlace:
PsoC Creator V4.2
Además para poder seguir con el tutorial se requiere tener instado los siguientes programas:
  • PSoC Creator 4.2
  •  PuTTY
  •  Arduino IDE

Primero desde PSoC Creator agregamos los archivos necesarios, en este caso "mpu6050.h", "i2cFunctions.c" y "mpu6050.c", el archivo "main.c" y "cyapicallbacks.h" se incluyen por defecto cuando se crea el proyecto.

Figura 3. Workspace con las librerías agregadas.

En este tutorial es necesario el uso defunciones matemáticas por lo que es necesario importar la función <math.h>, para poder habilitarla y que funcione de manera correcta hay que seguir los siguientes pasos:

Figura 4. Pasos para habilitar correctamente la librería matemática.


Conexiones entre el PSoC y el MPU-6050


Para poder establecer la conexión es necesario crear el "Top Desing" para esto colocamos el modulo I2C Master, además se coloca un componente UART para poder visualizar las medidas del sensor desde el computador por medio del software PuTTY, el diseño final es de la siguiente manera:

Figura 5. Top Desing para la obtención y recepción de datos.

Figura 6. Diagrama de interconexiones.

Calcular el ángulo de inclinación con el acelerómetro del MPU-6050


Una manera fácil de calcular los ángulos es por medio de la fuerza resultante, inicialmente sabemos que la única fuerza que actúa sobre el sensor es la de la gravedad, por lo que las medidas que obtendremos en cada una de las componentes corresponden a la de la gravedad y ademas los ángulos de la resultante cuando existe una inclinación serán los ángulos de la inclinación, dado que la gravedad siempre es vertical. De esta forma para calcular los ángulos de inclinación en X y en Y se usan las siguientes formulas:



El problema de estas mediciones es que funcionan de manera correcta si la única aceleración presente en el sistema es la de la gravedad, y en la realidad esto no ocurre, lo que sucede es que si movemos el sensor bruscamente aunque no exista una inclinación las medidas anteriores varían, por lo que implica una serie de errores en las medidas.

Calcular el ángulo de rotación usando el giroscopio del MPU-6050


Como se mencionó anteriormente el acelerómetro nos permite medir la aceleración y el giroscopio la velocidad angular, a partir del este valor podemos calcular el desplazamiento angular realizando un integración en el tiempo por medio de un delta y aproximando el área a un rectángulo, el problema que existe es que este debe medirse tomando en cuenta un valor inicial de ángulo de lo contrario el valor medido no tendría una referencia clara, si expresamos esto a manera de ecuaciones tenemos lo siguiente:

Al igual que con el acelerómetro, las medidas por medio del giroscopio no están exentas de errores y en este caso se conoce como Drift error, este error se produce debido a las pequeñas variaciones en las medidas con respecto a la realidad, lo cual genera que durante el proceso de medición se vayan acumulando los errores cada vez que la variable se mide, por lo que el error va aumentando cada vez más y más por pequeño que sea, hasta el punto de afectar de manera considerable la medida.

Para lidiar con el Drift error comúnmente se acude al uso de filtros, o recurrir a algún otro tipo de medida en este caso la de la aceleración para poder mejorar la medición, de igual forma se puede utilizar un magnetógetro pero en este caso el IMU es de 6DOF para este caso tendría que ser de 9DOF.

Una manera de lidiar con este error es por medio del uso de un filtro Kalman, este básicamente funciona de manera análoga a un observador de Luenberger permitiéndonos identificar la dinámica de un sistema lineal, pero en este caso además sirve cuando un sistema se encuentra inmerso en ruido Gussiano blanco aditivo (AWGN), la principal diferencia con respecto a un observador es que las ganancias K no se establecen estéticamente sino que el filtro de Kalman es capaz de definirlas de manera óptima cuando se conocen las varianzas de los ruidos que afectan al sistema. La implementación de un filtro Kalman es costosa, por lo que normalmente no se recomienda en este tipo de micro-controladores dado que aumentaría de manera considerable los tiempos de ejecución y para el caso de un sistema de control dado por cierto tiempo de muestreo se arriesga a que el sistema reaccione de manera lenta.

Una opción mas barata y comúnmente utilizada es el filtro complementario, el cual nos permite de manera fácil lidiar con este tipo de errores.

Implementación un filtro de Complementario 


Un filtro complementario básicamente se basa en la unión de las medidas del acelerómetro y el giroscopio para la medición del ángulo, el fundamento de esto se debe a que si solamente se utiliza el acelerómetro para realizar las medidas se presenta el efecto de las fuerzas externas que afecta los datos, mientras que cuando se trata de posiciones fijas el ángulo no acumula errores de manera considerable. Así mismo si se utiliza el giroscopio para las medidas este presenta la desventaja que sufre del efecto de Drift error pero a cambio de que no es afectado por las fuerzas externas, de modo que sus medidas solamente son importantes en tiempos cortos, de lo contrario se acumula el error.

La ecuación de un filtro complementario se describe de la siguiente manera:



El valor de alpha α  es un valor del tipo float que está entre 0 y 1, este valor representa un filtro pasa altos que afecta el dato medido por el giroscopio, lo cual genera que cuando existan variaciones rápidas se escale por un valor alto mientras que cuando varia poco normalmente debido a el Drift error haga que la medición no varíe de manera considerable, el valor (1 - α) representa un filtro pasa bajos el cual ayuda a atenuar las variaciones bruscas producidas por fuerzas externas. El valor de α se ajusta dependiendo de cuanto ruido tenga el sistema, usualmente se define como 0.98 pero este valor para el filtro es muy estricto y a costas de una buena calidad de las medidas en ocasiones las lecturas tienen cierto retraso con respecto a los datos reales en ese instante, es como si le agregara un delay en las mediciones, por lo que se recomienda 0.92, de este modo se tiene un balance entre las mediciones y el tiempo de respuesta.

Figura 7. Diagrama a modo de idea de un filtro complementario.

El uso de un filtro complementario para las medidas del MPU-6050 se vuelve crucial si se quieren obtener medidas coherentes. Un parámetro el cual no se ha mencionado es Tf, este valor es el mismo que ΔT el cual representa el delta de tiempo en el que se toman las medidas. Al igual que se mencionaba para las medidas del giroscopio, el algoritmo del filtro complementario necesita ser iniciado en un valor de referencia.

Implementación del algoritmo

Una implementación de este algoritmo en PSoC Creator es el siguiente:

/* ====================================================================
 * Adapted by Alonso Hernández Bermúdez for PSoC 5LP
 * All Rigths Reserved , 2019
 *
 * Copyright Samuel Walsh & Jeff Rowberg, 2014
 * All Rights Reserved
 * UNPUBLISHED, LICENSED SOFTWARE.
 *
 ====================================================================
*/
#include <project.h>
#include <stdio.h>
#include <mpu6050.h>
#include <math.h>
//=====================================================================
//Ratios de conversion
#define A_R 16384.0   //Conversion del aceleracion
#define G_R 131.07     //Conversion del giroscopio 

//Conversion de radianes y grados 
#define RAD_TO_DEG  57.2957795
#define DEG_TO_RAD 0.017453
//=====================================================================
int16_t CAX, CAY, CAZ; 
int16_t CGX, CGY, CGZ;       

char buf[50];  //buffer para los mensajes
//=====================================================================
float Angle=0;   //Angulo inicial
float Ang;
//=====================================================================
int main()
{
    I2C_MPU6050_Start();
    SERIAL_Start();
    MPU6050_init();
    MPU6050_initialize();
    
    //Obtener valores 
    MPU6050_getMotion6(&CAX, &CAY, &CAZ, &CGX, &CGY, &CGZ);        
    
    //Calcular el angulo
    Ang = atan((CAX/A_R)/sqrt(pow((CAY/A_R),2) + pow((CAZ/A_R),2)))*RAD_TO_DEG;
    
    //Complementary Filter
    Angle = 0.92*(Angle + (CGX/G_R)*0.002) + 0.08*Ang;
    
    for(;;)
    {      
        //Print values
        sprintf(buf, "Angle: %f", Angle);
        SERIAL_PutString(buf);
        SERIAL_PutString("\n\r");
   }
}
//=====================================================================

Para visualizar las medidas se puede utilizar el software PuTTY para esto debemos conocer cual es el puerto serial COM y el Data rate, en este caso es de 115200 Bits per second el inconveniente de este software es que solamente nos permite ver los datos por lo que si queremos ver algún tipo de gráfica debemos recurrir a exportar los datos y gratificarlos en otro software. Otra manera de visualizar las medidas es por medio de el Serial Platter de Arduino que al igual que PuTTY se debe configurar el puerto serial y el Data rate. En la siguiente figura se muestran las medidas obtenidas por medio del Serial Platter de Arduino, en esta se puede ver los datos del acelerómetro (curva roja) que son un poco ruidosos en cambio cuando se agrega el efecto del filtro complementario (curva azul) se presenta las medidas mas suaves y con menos ruido. Como se mencionaba anteriormente el valor de alpha α puede volver el sistema lento, en este caso se usó 0.98 y se ve como los datos con el filtro complementario presentan un pequeño desplazamiento hacia la derecha este Delay no es deseado y se puede arreglar disminuyendo el valor de alpha α.

Figura 8. Datos obtenidos desde el Serial Platter de Arduino.

Con estas consideraciones en mente la incorporación del MPU-6050 en un algoritmo de control se vuelve manejable para el micro-controlador, aunque a la hora de realizar la implementación se deben de tomar otra serie de consideraciones como manejo de interrupciones, tiempo de ejecución, etc... las cuales se discutirán en otro Blog.

Muchas gracias, espero este tutorial sea de ayuda a muchas personas.

Referencias 

Walsh, S. (s.f.). Sam's Blog. Recuperado de http://samselectronicsprojects.blogspot.com/

Interiano, E. 100 Trucos en el Laboratorio de Control Automático. [online] Available at: http://www.ie.tec.ac.cr/einteriano/control/.

Madhira, K., Gandhi, A., \& Gujral, A. (2016, March). Self balancing robot using complementary filter: Implementation and analysis of complementary filter on SBR. In 2016 International Conference on Electrical, Electronics, and Optimization Techniques (ICEEOT) (pp. 2950-2954). IEEE.

Comentarios

  1. Como se puede configurar el Putty para visualizar datos? al momento de realizar la conexión no me muestra ningún dato Gracias

    ResponderBorrar
    Respuestas
    1. Para usar PuTTY tienes que conocer cual es el puerto serial COM para el UART y el Data rate, en este caso es de 115200 Bits per second. En Putty pones un tipo de conexión serial y pones en serial line el puerto COM# ( Por ejemplo COM3 ) y en speed pones el Data rate y abres el puerto.

      Borrar
  2. yo lo hice para psoc 5 lp y no tuve buenos resultados....

    ResponderBorrar
    Respuestas
    1. hola, pudiste lograr utilizar este código con el 5lp ?

      Borrar
    2. La idea de este post es dar una guia en este proceso; sin embargo, no se trata solo de copiar y pegar, se requieren otro ajustes que el estudiante debe explorar. Este codigo fue utilizado exitosamente en mi grupo de trabajo.

      Borrar
  3. Muchas gracias, las librerías si funcionan. Se detecto un pequeño detalle, cuando los componentes se actualizan, salen errores en los codigos i2cFunctions.c
    Aquí esta el link para realizar correcciones:

    https://community.cypress.com/t5/PSoC-4-MCU/MPU-6050-Need-help-reading-sensor-values/m-p/135364

    Me funciono en un PSoC 4.

    Saludos

    ResponderBorrar

Publicar un comentario

Entradas más populares de este blog

Guía para resolución de la Turoría 3