Académique Documents
Professionnel Documents
Culture Documents
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
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
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:
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)
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
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
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 time=0;
int tiempoactual=0;
int tiempofinal=0;
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;
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);
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
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/.