domingo, 9 de septiembre de 2012

Circuito Millonario

Autor: Benjamín Navarrete
Competencia: Desarrollo de Software (Nivel 1)
Palabras Clave: Robot, NXC , lego , circuito ,sensores ,Subrutinas

Descripción de la Actividad


La actividad consistía en que debíamos programar un robot explorador, que sea capaz de recorrer una pista de obstaculos establecida por un concurso de televisión y competir contra los otros robots que participen para obtener la mayor cantidad de puntaje. La pista constaba de 3 secciones en las que se deben realizar diferentes funciones:
1. Primero tenemos un laberinto el cual se tiene que superar con éxito.
2. Luego una ruta establecida por señales especiales en el suelo que deben ser seguidas,
3. Y finalmente tenemos una sección en la cual los robots deben detectar la mayor
cantidad de puntos de bonificación antes de que el robot impacte 3 veces en los
obstaculos de la pista.

Solución


 Para comenzar plantearemos el Pseudocódigo de nuestra solución:



Variables  :
Avanza, utilizar (x).
Giro  en grados ( y ).
Sensores :
Luz (a) , Tacto (b), Ultrasonido (c)
Task main (){
El robot  x  , se activa (b) detectando la pared del laberinto  
Luego el  robot ( y,90) a la izquierda ,(X) detectando la pared con (c),
Luego (y,90) a la derecha , (x)  detectando la ultima pared con (c),
(y,90) a la derecha , (x) hasta llegar a la línea negra activando (a)
Detecta el umbral correspondiente y luego (x)  hasta terminar la línea negra,
Luego ( y ) a la izquierda, activando nuevamente el  (a) y luego detecta el color blanco y
(x)  además activa (b) para detectar la paredes de la pista y asi (x) aleatoriamente hasta encontrar los círculos negros  e ir sumando puntos cada vez que suma puntos suena un pito  , el programa finaliza una vez que se hayan sumando los puntos necesarios.




Y el código quedó de esta manera:

#define UMBRAL 40
#define CERCA 10//cm
//subrutina laberinto
sub laberinto () {
      SetSensorTouch(IN_1);
     SetSensorLowspeed(IN_4);

                             //primer recorrido
                 OnFwd(OUT_BC,50);
                 Wait(900);
                 while(SensorUS(IN_4)> CERCA);
                 OnFwd(OUT_B,35);  // giro en su propio eje
                 OnRev(OUT_C,30);
                 Wait(800);
                 //segundo reccorido
                 OnFwd(OUT_BC,40);
                 Wait(500);

                 while(SensorUS(IN_4)> CERCA);
                 OnRev(OUT_B,20);
                 OnFwd(OUT_C,45);
                 Wait(900);
                 //tercero
                 OnFwd(OUT_BC,50);
                 while(SensorUS(IN_4)> CERCA);
                 OnRev(OUT_B,20);
                 OnFwd(OUT_C,40);
                 Wait(750);
                 //recto
                 OnFwd(OUT_BC,50);
                 Wait(2300);
                 OnFwd(OUT_C,40);
                 OnRev(OUT_B,20);
                 Wait(300); 
                 Off(OUT_BC);
}
//subrutina linea negra
sub lineanegra () {
SetSensorLight(IN_3);
OnFwd(OUT_BC,50);
PlayTone(3000,500);
while (true)
{
if (Sensor(IN_3) > UMBRAL)
{
OnRev(OUT_B, 30);//giro
Wait(20);
OnFwd(OUT_C,30);

until(Sensor(IN_3) <= UMBRAL);
OnFwd(OUT_BC, 30);

Off(OUT_BC);
}
//subrutina puntos negros
sub puntosNegros () {
int j=0;
int a=150;
while (j<3){
NumOut(60,30,a);
Wait(500);

OnFwd(OUT_B,40);
OnFwd(OUT_C,40);
 if(Sensor(IN_3) <= UMBRAL){
Off(OUT_BC);
Wait(1000);
a=a+30;
NumOut(60,30,a);
Wait(500);
PlayTone(50,500);
OnRev(OUT_C,50);
Wait(Random(500)+1000);
}
if(SENSOR_1==1){
OnRev(OUT_BC,60);
Wait(500);

PlayTone(150,500);
OnRev(OUT_C,70);
OnFwd(OUT_B,70);
Wait(360);
j++;
a=a-50;
NumOut(60,30,a);
Wait(500);
}
}
Off(OUT_BC);
Wait(100);
PlayTone(500,500);
Wait(500);
PlayTone(250,500);
Wait(500);
PlayTone(70,500);
Wait(500);
NumOut(60,30,a);
Wait(20000);
}


task main ()
 {
laberinto () ;
lineanegra () ;
puntosNegros () ;
}





Reflexión
si bien la actividad no se logró como se esperaba, igualmente pudimos aprender muchas cosas como lo eran las sub-rutinas. Quizás nos faltó implementarlas de mejor manera pero desde esa actividad comenzamos a familiarizarnos mucho más con los sensores de luz, ultrasonido y tacto.

Si tienes algún aporte de esto, alguna opinión a lo que no pudimos solucionar, te invito a que comentes :)