martes, 6 de diciembre de 2011

Robots Destructor

Autor: Cristian Lara
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