Competencia: Creatividad e innovación.(nivel 1)
Palabras Claves: Programacion, nxc , rebotica,lego
Descripción de la Actividad:
Se pide que programen un robot patrullero, que sea capaz de recorrer una ruta
establecida alrededor de una casa que está vigilando, de manera que cada vez que que
escucha un ruido fuera de lo normal, aumenta su nivel de alerta y además pierde energía
pues se contacta con la central de seguridad. Cuando el nivel de alerta alcanza un limite
establecido, el robot entra en modo guardián, acercándose más a la casa, y comienza a girar
en su propio eje para repeler a los ladrones.
En cualquier momento, el robot puede quedarse sin energía; si esto sucede, apaga sus
funciones motores y queda en modo ataque, asechando a enemigos descuidados.
Solución
Primero, escribimos el pseudocodigo para formular el problema
#define UMBRAL 40
#define MIC SENSOR_2
#define CERCA 10
int alerta= 0
int robo= 0
int energia= 500
subrutina patrulla()
{
activar sensor de luz;
avanza;
mientras sea verdadero
{
si esta en negro
{
avanza con mayor potencia en una rueda;
hasta que sea blanco
se incorpora a lo negro;
}
}
activar sensor de sonido;
si( MIC > umbral)
{apaga(motores);
wait(1000);
melodia;
hasta(MIC < umbral)
avanza;
mayor potencia en una rueda;
robo+
}
subrutina guardian()
{si (alerta >100)
gira 90 grados;
avanza;
gira en su eje;
}
subrutina ataque ()
{
energia =>0
se detiene;
si(sensor ultrasonido = CERCA )
avanza 1 seg;
retrocede 1 seg;
}
tarea principal()
{
patrulla();
}
{
guardian();
}
{
ataque () ;
}
Luego hacemos el codigo fuente
#define UMBRAL 40
#define SONIDO 65
#define CERCA 10
int energia=500;
int alerta=0;
int intentos=0;
int suma;
int resta;
// subrutinas
sub Default()
{
if(Sensor(IN_1)<UMBRAL)
{
OnFwd(OUT_B,80);// avanza
OnFwd(OUT_C,55);// mayor potencia en una rueda
until(Sensor(IN_1)>UMBRAL)
OnFwd(OUT_B,55);// se incorpora
OnFwd(OUT_C,10);// mayor potencia en una rueda
}
}
sub Datos()
{
TextOut(0,LCD_LINE1,"Intentos de Robo");// se muestra en pantalla
NumOut(0,LCD_LINE2,0);
TextOut(0,LCD_LINE4,"Nivel de Alerta" );// se muestra en pantalla
NumOut(0,LCD_LINE5,0);
TextOut(0,LCD_LINE7,"Energia Restante" );// se muestra en pantalla
NumOut(0,LCD_LINE8,500);
}
sub Update()
{
suma=Random(25)+25; // se actualizan los datos
resta=Random(10)+50;
intentos=intentos+1;
energia=energia-resta;
alerta=alerta+suma;
}
sub tono()
{
PlayTone(700,500);// toca una melodia como una sirena
Wait(500);
PlayTone(300,500);// como la intensidad es menor simula una sirena
Wait(500);
PlayTone(700,500);
Wait(500);
PlayTone(300,500);
Wait(500);
PlayTone(700,500);
Wait(500);
PlayTone(300,500);
Wait(500);
PlayTone(700,500);
Wait(500);
PlayTone(300,500);
Wait(500);
}
sub DatosActualizados()
{
ClearScreen();
TextOut(0,LCD_LINE1,"Intentos de Robo");// muestra en pantalla los datos actualizados
NumOut(0,LCD_LINE2,intentos);
TextOut(0,LCD_LINE4,"Nivel de Alerta" );// muestra en pantalla los datos actualizados
NumOut(0,LCD_LINE5,alerta);
TextOut(0,LCD_LINE7,"Energia Restante" );// muestra en pantalla los datos actualizados
NumOut(0,LCD_LINE8,energia);
}
task main()
{
SetSensorLight (IN_1);// activa el sensor de luz
SetSensorSound (IN_2);// activa el sensor de sonido
SetSensorLowspeed (IN_3);// activa el sensor de ultrasonido
Datos();
while(alerta<100)// mientras el nivel de alerta sea menor a 100
{
Default();// subrutina
if(Sensor(IN_2)>=SONIDO)// si detecta un sonido
{
Update();// subrutina
Off(OUT_BC);// apaga los motores
tono();// subrutina
DatosActualizados();// subrutina
}
}
while(alerta>=100 && energia>0)//mientras el nivel de alerta sea mayor e igual a 100 y la energia mayor a 0
{
Off(OUT_BC);// apaga los motores
OnFwd(OUT_B,50);// gira con una rueda
Wait(400);
OnFwd(OUT_BC,50);// avanza
Wait(500);
OnFwd(OUT_B,50);// gira en su eje
OnRev(OUT_C,50);
if(Sensor(IN_2)>=SONIDO);// si detecta un ruido
{
suma=Random(25)+25;// valores al azar
resta=Random(10)+50;// valores al azar
energia=energia-resta;// disminuye energia
alerta=alerta+suma;// aumenta la alerta
DatosActualizados();// subrutina
}
}
if(energia<0)// si la energia es menor a 0
{
energia=0; // energia debe ser 0
}
while(energia<=0)// mientras energia sea menor e igual a 0
{
Off(OUT_BC); // apaga los motores
if(SensorUS(IN_3)<CERCA) // si detecta un objeto a cierta distancia
{
OnFwd(OUT_BC,100); // avanza
Wait(1000); //un segundo
OnRev(OUT_BC,100);// retrocede
Wait(1000);//un segundo
}
}
} // fin del programa
Video de la actividad
Reflexión.
Esta vez recibí bastante conocimiento en esta actividad ya que el profesor nos enseño el uso de
ciclos, operaciones matemáticas,acumuladores, contadores, sub rutinas y condicionales, lo que me ayudo bastante en la programación
No hay comentarios:
Publicar un comentario