Vous êtes sur la page 1sur 9

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 del giroscopio (la velocidad) para poder encontrar la posición.
La comunicación entre el microcontrolador y el sensor Se utilizó la comunicación I2C, para realizar el 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


potencia capaz de proporcionar stablility de sin
tasa cero y la sensibilidadde
precedentes sobre
nivellade
temperatura y el tiempo. Incluye
un

elemento de detección y una interfaz IC capaz de proporcionar la


velocidad angular medida con el mundo exterior a través de una
interfaz
digital (I 2 C / SPI). El elemento de detección se fabrica utilizando
un
proceso de micro-mecanizado dedicado desarrollado por
STMicroelectronics para producir sensores inerciales y actuadores
en
C) que permite
obleas un La
de silicio. altointerfaz
nivel de
ICintegración para diseñar
se fabrica utilizando un
un circuito
proceso CMOS
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 programa, 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) BW1-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, 0b00010000 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 Datos 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 dps, 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 <LiquidCrystal.h>
#include <Wire.h>
#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 actualizació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, CTRL_REG1, 0b00001111);


//Modo normal, activox, y, z

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 address){
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. 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 comunicaciones
2. El protocolo de comunicación I2C es muy susceptible a todo tipo de ruido y puede dar en ocasiones lecturas erróneas.
3. 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.
4. 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-nuestros-
android.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-avr-
comunicacion-serial-twi/.
[4 «Protocolo I2C,» [En línea]. Available:
] https://programarfacil.com/blog/arduino-blog/conectar- dos-arduinos-i2c/.

Vous aimerez peut-être aussi