Actualmente tengo un problema en la interpretación de la información que entrega el sensor ya que deseo obtener datos de inclinacion en grados ( datasheet anexo – IDG500 - http://www.tiendaderobotica.com/tienda/download/Datasheet_IDG500.pdf - ) ya que no son coherentes los datos entregados, luego de consultar fuentes me topé con este post en el foro (http://arduino.cc/forum/index.php/topic,58048.0.html ) de la comunidad arduino donde explican el manejo del sensor, pero no tuve éxito reproduciendo los pasos sugeridos por el autor, así que procedí a intentar con un método propio, siguiendo estos pasos:
Aref: 3.3V
Resolucion ADC: 1023
Sensibilidad sensor: 9.1 mV / º / Seg
Procedimiento:
9.1 mV / ( 3.3 V / 1023 ) = 2.821
Cada º / Seg equivale a 2.821 unidades del ADC, por lo tanto una unidad del ADC equivale a 0.354 º / Seg
Luego de calcular el tiempo de ejecución de las instrucciones requeridas en dicho proceso llegue a la conclusión que es aproximadamente un milisegundo asi que partiendo de la formula de velocidad angular procedo a multiplicar el valor en velocidad por la unidad de tiempo calculada.
Esta es la línea de código empleada para dicho proceso: (anexo programa completo -- Gyro_con_LCD – Arduino V1.0)
if (TGX > (CGX+2)) // Giroscopio X antihorario
{
T = TGX - CGX;
T = T * 0.354;
T = T * 0.001;
GX = GX - T;
lcd.setCursor(4,0);
lcd.print(" ");
lcd.setCursor(4,0);
lcd.print(GX);
}
if (TGX < (CGX-2)) // Giroscopio X horario
{
T = CGX - TGX;
T = T * 0.354;
T = T * 0.001;
GX = GX + T;
lcd.setCursor(4,0);
lcd.print(" ");
lcd.setCursor(4,0);
lcd.print(GX);
}
El problema radica en que el resultado final no me entrega un valor coherente en grados, por ejemplo para 90º el valor entregado es aproximadamente 4 y para 180º es aproximadamente 8; también presenta un desajuste gradual siempre que se rota el sensor hacia uno de los sentidos, incrementando el valor de error cada vez que se gira en un sentido definido ( en este caso es el anti horario ), por ejemplo:
Valor inicial en cero: 0
…. Luego de unos movimientos
Valor en cero: -0.9
…. Luego de unos movimientos
Valor en cero: -1.45
Y asi sigue creciendo progresivamente el error cada vez que se hace una rotación en uno de los sentidos, por lo tanto me gustaría corregirlo porque si se usa este sensor como un punto de referencia para estabilizar la plataforma del cuadricoptero, llegaría el momento en que esta ya no seria paralela con respecto al plano terrestre.
#include <LiquidCrystal.h>
LiquidCrystal lcd(9,8,7,6,5,4);
int CGX = 0; // Variables giroscopio
int CGY = 0;
int TGX = 0;
int TGY = 0;
float GX = 0;
float GY = 0;
float T = 0;
int CAX = 0; // Variables Acelerometro
int CAY = 0;
int CAZ = 0;
int TAX = 0;
int TAY = 0;
int TAZ = 0;
float AX = 0;
float AY = 0;
float AZ = 0;
float t = 0;
void setup()
{
pinMode(3,INPUT);
lcd.begin(16, 2);
analogReference(EXTERNAL);
}
void loop()
{
TGX = analogRead (A1); // Lectura de valor de sensores
TGY = analogRead (A0);
TAX = analogRead (A4);
TAY = analogRead (A3);
TAZ = analogRead (A2);
/* --------------------------------------------------------------------------------------------------------------*/
if (CGX==0 && CGY==0) // Definir punto de referencia en los giroscopio
{ lcd.print("Definir CEROS");
CEROS:
if(digitalRead(3)==HIGH) // Boton para cargar el punto de referencia
{ CGX = analogRead(A1);
CGY = analogRead(A0); }
else
{ goto CEROS; }
if (CGX!=0 && CGY!=0) // Cargar interfaz de visualizacion
{ lcd.clear();
lcd.setCursor(0,0);
lcd.print("G-X: Y:");
lcd.setCursor(0,1);
lcd.print("A-X Y Z"); } }
/* --------------------------------------------------------------------------------------------------------------*/
if (TGX > (CGX+1)) // Giroscopio X antihorario
{ T = ((TGX - CGX) * 0.354) * 0.001;
GX = GX - T;
lcd.setCursor(4,0);
lcd.print(" ");
lcd.setCursor(4,0);
lcd.print(GX); }
if (TGX < (CGX-1)) // Giroscopio X horario
{ T = ((CGX - TGX) * 0.354) * 0.001;
GX = GX + T;
lcd.setCursor(4,0);
lcd.print(" ");
lcd.setCursor(4,0);
lcd.print(GX); }
if (TGY > (CGY+2)) // Giroscopio Y antihorario
{ T = ((TGY - CGY) * 2.821) * 0.001;
GY = GY - T;
lcd.setCursor(11,0);
lcd.print(" ");
lcd.setCursor(11,0);
lcd.print(GY); }
if (TGY < (CGY-2)) // Giroscopio Y horario
{ T = ((CGY - TGY) * 2.821) * 0.001;
GY = GY + T;
lcd.setCursor(11,0);
lcd.print(" ");
lcd.setCursor(11,0);
lcd.print(GY); }
/* --------------------------------------------------------------------------------------------------------------*/
}