domingo, 6 de septiembre de 2015

Medir la rotación de los motores Lego en Bricx

Rotación De Los Motores Lego NXT

Manejo de los motores y el codificador óptico

Para la odómetria de la plataforma móvil es necesario que el conteo del codificador óptico de rotación pueda ser controlado. Cuando se emplea la función onFwd y OnRev el conteo de la rotacion del motor es reiniciado constantemente y no se puede hacer los calculos necesarios para determinar la posición de la plataforma.

Funciones onFwdex() y onRevex() 

Estas funciones son similares a onFwd() y OnRev() pero con la opción de seleccionar por medio de 5 constantes el modo de controlar el codificador optico (tacometro) de la plataforma móvil, estas opciones son:

Ejemplo 

onFwdex(OUT_AC,100,RESET_NONE);

Los motores del Lego Mindstorm NXT tienen un codificador óptico para determinar cuanto y en que dirección a girado el motor. 
Los sensores tienen una resolución de un grado, es decir esto es lo mínimo que se puede medir.


Función MotorRotationCount

 Vídeo de ejemplo

Retorna el valor en grados de la posición relativa del motor. Hay que indicar el puerto en que esta conectado el motor. El valor que se retorna no vuelve a ser cero después de completar 360 grados, después de un giro el valor siguiente seria 361 grados y así sucesivamente.
Los puertos de conexión para los motores son OUT_A OUT_B OUT_C
El tipo de valor que retorna es long por lo que el valor en grados almacenado puede ser bastante grande.


Ejemplo básico:

long ValorGrados; //variable tipo long donde se guardara el valor en grados
ValorGrados = MotorRotationCount(OUT_A);//Almacena el valor del motor A

Ejemplo de aplicación:

void GirarRobotI(long GRADOS, int POTENCIA){
 long GradosActual;
 long GradosGirados=0;//Inicializar en cero
 GradosActual= MotorRotationCount(OUT_A);
 while(GradosGirados<=GRADOS){
    OnRev(OUT_B, POTENCIA);
    OnFwd(OUT_A, POTENCIA);
    GradosGirados=MotorRotationCount(OUT_A)-GradosActual;
     NumOut(0,0,GradosGirados);
 }
   Off(OUT_AB);
   TextOut(0, LCD_LINE3,"TerminoI");
}
//Funcion para girar el robot a la derecha (en realidad los grados son del motor)
void GirarRobotD(long GRADOS, int POTENCIA){
 long GradosActual;
 long GradosGirados=0;//Inicializar en cero
 GradosActual= MotorRotationCount(OUT_B);
 while(GradosGirados<=GRADOS){
    OnFwd(OUT_B, POTENCIA);
    OnRev(OUT_A, POTENCIA);
    GradosGirados= MotorRotationCount(OUT_B)-GradosActual;
    NumOut(0,0,GradosGirados);
 }
   Off(OUT_AB);
   TextOut(0, LCD_LINE3,"TerminoD");
}

task main(){
     while (true){
     GirarRobotD(180,70);
     Wait(1000);
     GirarRobotI(180,70);
     Wait(1000);
     }
}


No hay comentarios:

Publicar un comentario