1
COMUNICACIÓN I2C ENTRE PMOD GYRO (GIROSCOPIO) DE 3 EJES Y EL MICROCONTROLADOR Resumen
El proyecto consiste en obtener datos del a velocidad angular de un sensor PMOG GYRO, para obtener la posición del mismo, tomando en cuenta los ejes Y, X, ya que, en el eje Z actúa la fuerza de la gravitacional. Para poder realizar esta operación se debe integrar señal analógica ana lógica del giroscopio (la velocidad) para poder encontrar la posición. La comunicación comunica ción entre el microcontrolador y el sensor Se utilizó la comunicación I2C, para realizar el proyecto proyecto se utilizó “Arduino ”, por su facilidad de adquisición y costo. Finalmente, para poder visualizar de mejor manera los datos con la ayuda del software “MATLAB” se graficó la posición respecto al tiempo
2
INTRODUCTION 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. 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, Angulo Y Anterior es el ángulo calculado la última vez que se llamó esta fórmula y Giroscopio Y es la lectura del ángulo Y del giroscopio.(2)
MARCO TEÓRICO Giroscopio
El L3G4200D es un sensor de velocidad angular de tres ejes de baja tasa cero y a sensi i i a so re a temperatura y e tiempo. Inc uye un elemento de detección una interfaz IC ca az de ro orcionar la velocidad angular medida con el mundo exterior a través de una digital (I 2 C / SPI). El elemento de detección se fabrica utilizando proceso de micro-mecanizado dedicado desarrollado por STMicroelectronics para producir sensores inerciales y actuadores en C) que permite un alto nivel de integración para diseñar un circuito dedicado que se recorta para adaptarse mejor a las características del elemento de detección. El L3G4200D tiene una escala de ± 250 / ± 500
3
/ 2.000 ± dps y es capaz de medir las tasas con un ancho de banda
Protocolo I2C I2C significa Circuito Interintegrado (Por sus siglas en Inglés Inter-Integrated Circuit) es un protocolo de comunicación serial desarrollado por Phillips Semiconductors allá por la década de los 80s. Básicamente se creó para poder comunicar varios chips al mismo tiempo dentro de los televisores. [1] El protocolo I2C toma e integra lo mejor de los protocolos SPI y UART. Con el protocolo I2C podemos tener a varios maestros controlando uno o múltiples esclavos. Esto puede ser de gran ayuda cuando se van a utilizar varios microcontroladores para almacenar un registro de datos hacia una sola memoria o cuando se va a mostrar información en una sola pantalla. El protocolo I2C utiliza sólo dos vías o cables de comunicación, así como también lo hace el protocolo UART.
SDA – Serial Data. Es la vía de comunicación entre el maestro y el esclavo para enviarse información. SCL – Serial Clock. Es la vía por donde viaja la señal de reloj. I2C es un protocolo de comunicación serial. Como podemos observar, el protocolo I2C envía información a través de una sola vía de comunicación. La información es enviada bit por bit de forma coordinada. I2C es un protocolo síncrono. Al igual el protocolo SPI, el protocolo I2C trabaja de forma síncrona. Esto quiere decir que el envío de bits por la vía de comunicación SDA está sincronizado por una señal de reloj que comparten tanto el maestro como el esclavo a través de la vía SCL.
Una transmisión es finalizada por la señal de parada. Como alternativa, puede ser enviada una señal de reset al arranque de una nueva transmisión, sin necesidad de parar la transmisión anterior con una señal de parada.
Uso: Aunque es más lento que los sistemas de bus más nuevos, I²C es beneficioso (debido al bajo coste) para los sistemas periféricos que no necesitan ser rápidos. A menudo es usado para la transmisión de datos de control y configuración, por ejemplo para control de volumen, conversor de señal analógica-digital o digital-analógica con baja tasa de frecuencia de muestreo, relojes a tiempo real, pequeños espacios de memoria o conmutadores bidireccionales y multiplexores. Incluso los sensores electrónicos integran con frecuencia un convertidor analógico-digital con un I²C.
4
Características: Será un bus serie síncrono El sentido del enlace será semi-bidireccional Un mismo dispositivo podrá actuar o como emisor o como receptor Deberá admitir topologías multi-maestro Un maestro podrá funcionar también como un esclavo Deberá establecer un mecanismo de adaptación de velocidad Calculando el ángulo de rotación Como se explicó al inicio el giroscopio nos entrega la velocidad angular, y para calcular el ángulo actual necesitamos integrar la velocidad y conocer el ángulo inicial. Esto lo hacemos usando la siguiente formula:
Tener en cuenta que cuando nos referimos a θx nos referimos al ángulo que gira el eje X sobre su propio eje. En la siguiente imagen se observa que la velocidad angular es perpendicular al plano de rotación.
Materiales: -Arduino UNO -Kit de electrónica básica (cables, protoboard, etc.) -Matlab -Giroscopio L3G4200D 3 Axis.
5
Procedimiento:
1. Configuración de registros en el sensor desde el microcontrolador, para sincronizar la comunicación I2C entre los dos dispositivos. El flujograma del programa realizado directamente al microprocesador (Atmel) del microcontrolador se adjuntará en los anexos al igual que el pro grama, con su explicación. 2. Se procede a configurar el control numérico de los datos que ingresan por parte del sensor, por modelos matemáticos básicos y programación del microcontrolador. 3. Se interconecta Matlab con Arduino, mediante una comunicación Serial del puerto donde entran los datos del microcontrolador a nuestro ordenador, para así proceder a graficar los resultados. De igual manera se adjuntará el programa realizado en Matlab. Configuración de Registros: Tabla de direcciones de los Registros a utilizer, en el mapa de memoria.
REG1: REG1, 0b00001111 DR1-DR0 Selección de velocidad de datos de salida. (100) BW 1-BW0 Selección de ancho de banda. PDPD Activar el modo de apagado. (0: modo de apagado, 1: modo normal o modo de reposo) Activación del eje Zen Z. (0: eje Z deshabilitado, 1: eje Z habilitado) Yen habilitar eje Y. (0: eje Y desactivado, 1: eje Y habilitado) Activación del eje Xen X. (0: eje X desactivado, 1: eje X habilitado) REG2: REG2, 0b00000000 HPM1 - HPM0 Selección de modo de filtro de paso alto. 0 0 Modo normal 0 1 Señal de referencia para filtrar 1 0 Modo normal
6 1 1 Autoreset en el evento de interrupción HPCF3 - HPCF0 Filtro de paso alto Selección de frecuencia de corte 0 0 0 0 (8) REG3: REG3, 0b00001000 Activación de interrupción en el pin INT1 e INT2. I2_DRDY Fecha Listo en DRDY / INT2. (0: Desactivar; 1: Activar) REG4: REG4, 0b00000000 para 250dps REG4, 0b000 10000 para 500dps REG4, 0b00110000 para 2000dps Actualización de datos de bloques BDU. (0: actualización continua; 1: registros desalida no actualizados) Selección de Dato s BLE Big / Little Endian (0: datos LSB @ dirección inferior, 1: datos MSB @ dirección inferior) FS1-FS0 Selección de escala completa. (00: 250 dps, 01: 500 dps, 10: 2000 dp s, 11: 2000 dps) Reservado ST1-ST0 Habilitación de autotest. (00: Prueba automática desactivada; Otros: Ver tabla) SIM SPI Selección del modo de interfaz serie. (Interfaz de 0: 4 hilos, interfaz de 1: 3 hilos). REG5: REG5, 0b00000000); Controla el filtro de paso alto de salidas, es muy necesario para controlar de mejor manera, pero en este caso no lo usaremos. RESULTADOS
1) LCD (16X2): Imprime el valor del ángulo al que se encuentra en cada eje, tanto en el x, y como en z
2) Matlab: Gráfica del ángulo “x” y del ángulo “y” respecto al tiempo en el que se encuentra el Giroscopio.
7
3) Código: #include #include #define CTRL_REG1 0x20 #define CTRL_REG2 0x21 #define CTRL_REG3 0x22 #define CTRL_REG4 0x23 #define CTRL_REG5 0x24 L3G4200D int L3G4200D_Address = 0x69 ; int x; int y; int z; int X; int Y; int Z; float Xprev; float Yprev; float Zprev; int time=0; int tiempoactual=0; int tiempofinal=0; LiquidCrystal lcd(12, 11, 5, 4, 3, 2); void setup(){ //Comunicacion I2C Wire.begin(); Serial.begin(9600); lcd.begin(16, 2); tiempoactual=millis();
8 setupL3G4200D(250); } void loop(){ getGyroValues(); tiempofinal = millis()-tiempoactual; tiempoactual=millis(); X = (x/131)*tiempofinal/1000.0 + Xprev; Y = (y/131)*tiempofinal/1000.0 + Yprev; Z = (z/131)*tiempofinal/1000.0 +Zprev; Xprev= X; Yprev= Y; Zprev= Z; delay(100); lcd.clear(); //Imprimo el LCD y envñio datos al puerto sobre la velocidad angular, para poder graficar en Matlab Serial.print(X); Serial.print(","); lcd.setCursor(0, 0); lcd.print("X: "); lcd.print(X); lcd.setCursor(8, 0); lcd.print("Z: "); lcd.print(Z); lcd.setCursor(0, 1); Serial.print(Y); lcd.print("Y: "); lcd.print(Y); Serial.print(","); Serial.println(z); } //Rutina de a ctualización de datos void getGyroValues(){ byte xMSB = readRegister(L3G4200D_Address, 0x29); byte xLSB = readRegister(L3G4200D_Address, 0x28); x = ((xMSB << 8) | xLSB); byte yMSB = readRegister(L3G4200D_Address, 0x2B); byte yLSB = readRegister(L3G4200D_Address, 0x2A); y = ((yMSB << 8) | yLSB); byte zMSB = readRegister(L3G4200D_Address, 0x2D); byte zLSB = readRegister(L3G4200D_Address, 0x2C); z = ((zMSB << 8) | zLSB); } int setupL3G4200D(int scale){ writeRegister(L3G4200D_Address, //Modo normal, activox, y, z
CTRL_REG1,
0b00001111);
writeRegister(L3G4200D_Address, CTRL_REG2, 0b00000000); writeRegister(L3G4200D_Address, CTRL_REG3, 0b00001000); if(scale == 250){ writeRegister(L3G4200D_Address, CTRL_REG4, 0b00000000); //b5,b4 00 para 250dps }else if(scale == 500){ writeRegister(L3G4200D_Address, CTRL_REG4, 0b00010000); //b5,b4 01 para 500dps }else{ writeRegister(L3G4200D_Address, CTRL_REG4, 0b00110000); //b5,b4 11 para 2000dps } writeRegister(L3G4200D_Address, CTRL_REG5, 0b00000000); } void writeRegister(int deviceAddress, byte address, byte val) { // inicia la transmisión al dispositivo Wire.beginTransmission(deviceAddress); // enviar la dirección del registro Wire.write(address);
9 // enviar valor para escribir Wire.write(val); // finalizar la transmisión Wire.endTransmission(); } int readRegister(int deviceAddress, byte a ddress){ int v; Wire.beginTransmission(deviceAddress); // registrarse para leer Wire.write(address); Wire.endTransmission(); Wire.requestFrom(deviceAddress, 1);// lee un byte while(!Wire.available()) { // Esperando } v = Wire.read(); return v;
}
Conclusiones. 1. 2. 3. 4.
El protocolo de comunicación I2C, es muy útil y versátil al momento de tener una comunicación, al ser muy sencilla de programar a comparación de otro tipo de comun icaciones El protocolo de comunicación I2C es muy susceptible a todo tipo de ruido y puede dar en ocasiones lecturas erróneas. Existe una diversa cantidad de giroscopios en el mercado, la selección de alguno se da en base a las necesidades, por ejemplo, los digitales, a diferencia de los analógicos son menos susceptibles al ruido. El control numérico es muy importante la obtención del modelo a controlar y el diseño del sistema para poder obtener el comportamiento deseado del sistema a controlar.
Bibliografía [1 Android, «El Android,» 15 Septiembre 2003. [En línea]. ] Available: https://elandroidelibre.elespanol.com/2014/07/cuales- son-y-para-que-sirven-los-sensores-de-nuestrosandroid.html. [2 «Acelerómetro y Giroscopio,» [En línea]. Available: ] http://www.naylampmechatronics.com/blog/45_Tutoria l-MPU6050-Aceler%C3%B3metro-y-Giroscopio.html. [3 «Comunicación I2C,» [En línea]. Available: ] http://microcontroladores-mrelberni.com/i2c-avrcomunicacion-serial-twi/. [4 «Protocolo I2C,» [En línea]. Available: ] https://programarfacil.com/blog/arduino-blog/conectar- dos-arduinos-i2c/.