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 :)