Mostrando entradas con la etiqueta Lego. Mostrar todas las entradas
Mostrando entradas con la etiqueta Lego. Mostrar todas las entradas

lunes, 2 de octubre de 2017

Reto sacar bloques con Lego NXT

Descripción del reto Reto

El reto consiste en sacar las cajas de icopor de la pista según el color que tenga en la parte superior . Competirán dos robots simultáneamente donde ganará el que más puntos realice.

RetoLegoBloquesRev002.png
Figura 1. Configuración de la pista
  1. Reglas

  • El día del evento se entregará a los concursantes el mapa de los bloques, indicando la ubicación y el color.
  • Los equipos tendrán tiempo de introducir el mapa de los bloques en el programa. El mapa solo se introducirá una vez en el robot.
  • En el momento de participar el color del bloque a sacar se hará de forma aleatoria por medio del lanzamiento de una moneda.
  • Para hacer un punto solo es necesario que el robot toque el bloque del color correcto, no es necesario moverlo o sacarlo de la pista, aunque no hay penalización en caso de hacerlo.
  • El robot debe tener un menú en pantalla para seleccionar el color del bloque que debe sacar.
  1. Puntuación

    Bloques
    Puntos
    1 a 5
    1 punto por bloque
    6 a 10
    2 puntos por bloque
    11 a 12
    5 puntos por bloque

    Tocar o sacar bloques del color opuesto, dará puntos al equipo contrario

    El equipo que termine primero el recorrido tendrá un bonificación de 5 puntos.
  2. Tipo de robot

La configuración empleada será el multibot Seguidor (Figura 2) al cual se le adecuará un sensor de color frontal.

SeguidorLinea.JPG
Figura 2: Multibot Seguidor consultado en: http://nxtprograms.com/NXT2/multi-bot/index.html
  1. Características de la pista de la pista

La pista de exploración tendrá las siguientes características
RetoLegoBloquesRev001
Figura 3: Pista vista superior

  • 1 metros de ancho.
  • 2 metros de largo.
  • Cubos de incopor de 5 cm.
  • Los cubos están distribuidos cada 20 cm
    Cada columna tendrá 8 cubos, 4 verdes y 4 azules distribuidos de forma aleatoria.
  • Fondo del piso de color blanco.
  • Robot inician a la Izquierda.
    El primer cubo estará a 10 cm del punto de inicio del robot.
    El Punto de cruce estará a 10 cm del ultimo cubo de la primer fila
  • Línea negra de 2 cm de ancho.
    Construcción de la pista
     En la pista de la figura el robot encontrá siempre los cubos al lado izquierdo.
    • Primer columna verde,azul,azul,verde,verde,verde,azul,azul
    • Segunda columna verde,verde,azul,azul,azul,verde,verde

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);
     }
}