lunes, 10 de octubre de 2011

Robot Patrulla


Autor: Gabriel Pereira
Competencia: Desarrollo de Software (N1), Trabajo en Equipo (N1).
Palabras Clave: Regresión Lineal,Mysql,Base de datos.

Descripción:
Este trabajo tenía como objetivo lograr que el robot lograra hacer tres funciones o modos distintos, los que programamos en NXC. El primero era el modo patrulla en el cual el robot debía transitar por el rededor de la casa por una línea fija de color negro y debía avisar y contabilizar cualquier sonido extraño que escuchara, cada vez que escuchaba un sonido su nivel de alerta aumentaba al ser el nivel de alerta mayor o igual a cien este debía pasar a la siguiente fase. Modo guardián aquí el robot debía acercarse a la casa sin chocarla y debía girar en su propio eje escuchando en todo momento cualquier sonido su nivel de energía iba decreciendo,  cuando la energía fuera cero o menor a esto pasaba al último modo el de ataque en el cual debía quedarse parado y con el sensor ultrasonido al momento de encontrar a menos de 10 cm un objeto debía atacar avanzando fuertemente con su máxima potencia y devolverse al instante igualmente después de esto terminaba su trabajo y paraba definitivamente. Bueno la actividad por su complejidad y el uso de varios sensores se dividió en dos partes primeramente desarrollando el modo patrulla solamente y el pseudocódigo, para esta última terminarlo completamente.  



Pseudocódigo
Definimos constante umbral
Definimos constante luz
Definimos contante micrófono
Definimos contante distancia
Definimos variale Nivel alerta
Definimos variale Intentos de robo
Definimos variale Energia restante

Sub Rutina Modo Patrulla()
{
  Avanza los motores
  Si (Sensor de luz es mayor a negro)
  {
    Retrocede por 1 segundo
    pero si(es menor o igual a negro)
    Avanza sin detenerse
    Si (Sensor de sonido es mayor al umbral)
    {
      los motores se paran
      durante 3 segundos
      toca una melodia
      la variable Intentos de robo aumenta en uno
      la variable Nivel de alerta se le sumara un numero aleatorio entre 20 y 50
      la variable Energia restante se le restara un numero aleatorio entre 50 y 60
      imprimira en pantalla el nombre de cada variable y su valor
    }
  }
}

Sub Rutina Modo Guardian()
{
  Ingresa al ovalo
  Coloca el motor derecho en reversa
  Gira en su propio eje a velocidad media
}

Sub Rutina Modo Ataque()
{
  Los motores se detienen
  Si (Sensor ultrasonido es mayor o igual a 10 cm)
  {
    Avanzara con su maxima potencia
    Por 1 segundo
    Retroceder con su maxima potencia
    Por 1 segundo
    Apagar motores;
  }
}

Tarea Principal()
{
  Asignamos valor a Nivel alerta
  Asignamos valor a Intentos de robo
  Asignamos valor a Energia restante
  Encendemos Sensor de Luz
  Encendemos Sensor de Ruido
  Encendemos Sensor de Ultrasonido
  Mientras(Verdadero)
  {
    Imprimimos la variables y sus valores respectivos
    Activamos la Sub rutina Modo Patrulla()
    Si ( El Nivel de alerta es mayor a 100)
    {
      Se activara el Modo Guardian()
      Si (La Energia restante del robot es menor o igual a 0)
      {
        Se pasara a la Sub rutina de Modo Ataque()
      }
    }
  }
}
     

 Programa

//Grupo NXC
//Integrantes : Joel Cortes
//              Juan Navarrete
//              Jonathan Lincoqueo
//              Gabriel Pereira
#define UMBRAL 40                 // Define constante de sonido
#define LUZ 40                    // Define constante de luz
#define MIC SENSOR_3              // Define constante de sonido
#define CERCA 15                  // Define constante de ultrasonido
int NivAler;                      // define variable
int IntRobo;                      // define variable
int Eneres;                       // define variable

sub ModoPatrulla()                // define tarea mas pequeña para dar orden
{                                 // Llave de inicio subrutina
  OnFwd(OUT_AC,65);                  // avanza al 65%
  if (Sensor(IN_1) > LUZ)            // si el sensor de luz es menor a la constante luz
  {                                    // Llave de inicio if
     OnRev(OUT_C,65);                      // retrocede a 65%
     Wait(100);                            //por un segundo
     until(Sensor(IN_1) <= LUZ);     // en caso que el sensor de luz vuelva ser menor o igual a luz
     OnFwd(OUT_AC,65);                     // seguira avanzando al 65%
     if (MIC >= UMBRAL)                    //si el sensor de sonido es mayor al umbral
     {                                     //Llave de inicio if
        Off(OUT_AC);                         //los motores se paran
        Wait(300);                           //por 0,3 segundos
        PlayTone(2000,1000);                 //se tocara una melodia
        Wait(50);                            //por 50 milisegundos
        IntRobo++;                           //la variable intento de robo aumentara en uno
        NivAler = NivAler + (Random(50)+20); //nivel de alerta aumentara entre 20 y 50
        Eneres = Eneres - (Random(60)+50);   //energia restante disminuira entre 50 y 60
        TextOut(10,60,"Int. Robos");         //se imprime la variable
        NumOut(20,50,IntRobo);               //se imprime el valor de la variable
        TextOut(10,40,"Niv. Alerta");        //se imprime la variable
        NumOut(20,30,NivAler);               //se imprime el valor de la variable
        TextOut(10,20,"Ener. Restante");     //se imprime la variable
        NumOut(20,10,Eneres);                //se imprime el valor de la variable
     }                                    // Llave final de if
   }                                   //Llave final de if
}                                   // Llave fin de subrutina

sub ModoGuardian()                 //define una sub tarea para darle orden al programa
{                                  // Llave inicial de sub rutina

}                                  // Llave fin de subrutina

task main()                        //Tarea principal
{                                  //Llave inicial tarea principal
  NivAler = 0;                     //asigna valor a variable nivel alerta
  IntRobo = 0;                     //asigna valor a variable intento de robo
  Eneres = 500;                    //asigna valor a variable energia restante
  SetSensorSound(IN_3);            //activa el sensor se sonido
  SetSensorLight(IN_1);            //activa el sensor de luz
  SetSensorLowspeed(IN_2);         //activa el sensor ultrasonido
  while(true)                      //inicia ciclo mientras que sea verdadero
  {                                  //Llave de inicio ciclo while
    TextOut(10,60,"Int. Robos");        //se imprime la variable
    NumOut(20,50,IntRobo);              //se imprime el valor de la variable
    TextOut(10,40,"Niv. Alerta");       //se imprime la variable
    NumOut(20,30,NivAler);              //se imprime el valor de la variable
    TextOut(10,20,"Ener. Restante");    //se imprime la variable
    NumOut(20,10,Eneres);               //se imprime el valor de la variable
    ModoPatrulla();                     //Llama a la sub tarea Modo Patrulla
    if (NivAler > 100)                  //si el nivel de alerta supera 100
    {                                   //Llave inicial if
       ModoGuardian();                     // llama a la sub tarea Modo Guardian
    }                                   //Llave final de if
  }                                   //Llane final de ciclo while
}                                  //Llave final de la tarea principal
A continuación el vídeo de la actividad desarrollada.


Reflexión:
Aprendí a utilizar lo que son las subrutinas que sirven de mucho ya que ayudan a ordenar el programa en gran parte dividiendo en partes específicas lo que se desarrollara, y el uso del sensor de ultrasonido.

No hay comentarios:

Publicar un comentario