Patricio Aros

xd

lunes, 10 de octubre de 2011

Robot Dribbler - Proyecto Robotica

Autor: Patricio Aros Erices.
Competecia: Desarrollo de software (Nivel 1).

Descripción de la actividad
Contexto:
Usted es el encargado de construir un robot de competencia para el nuevo juego del verano “Dribbler”.
Reglas del juego:
  1. La idea de la competencia es que un robot autónomo encuentre la mayor cantidad de “zonas de puntaje” (círculo negro) en la pista, sin chocar con los obstáculos presentes (paredes, bloques, etc), ya que cuando pase esto, termina el juego.
  2. Cuando el robot vaya a chocar, el jugador debe indicarle que existe peligro de choque, a través de una señal audible (grito, pitazo, aplauso, etc), de modo que el robot no colisione.
  3. Cada vez que el robot encuentra una zona de puntaje (círculo negro), acumula puntos, pero también aumenta su velocidad.
  4. Gana el jugador que logre el mayor puntaje, antes de chocar con algún obstáculo.
Especificaciones:
  1. El robot debe iniciar su recorrido con una potencia de 20 e iniciar un timer en 0.
  2. Mientras el robot busca zonas de puntaje se emitirá constantemente una música ad-hoc.
  3. Cuando detecte una zona de puntaje (círculo negro), el robot:
  1. Emitirá una música de anotación de puntos
  2. Registrará el puntaje obtenido en la posición correspondiente dentro de un arreglo (array)
  3. Aumenta la potencia de movimiento en 10, hasta el máximo de 100.
  4. Girará aleatoriamente sobre su eje
  5. Reiniciará el timer a 0.
  6. Seguirá su rumbo con la nueva velocidad.
  7. Volverá a su música de recorrido.
  1. El puntaje obtenido por el robot, estará dado por la siguiente función:
                P  =  - 5*t + 50              si t <= 10
                
                P = 0                        si t > 10
                Donde:
                        P= Puntaje.
                        t = Intervalo de tiempo (en segundos) para encontrar la zona de puntaje.
 
  1. Si el robot detecta una señal audible de 80 db (ud. puede ajustarla) girará en un ángulo apropiado (uds. lo definen) de modo de esquivar un obstáculo, o bien corregir su recorrido.
  2. Cuando el robot choque contra algún obstáculo se detendrá, finalizará todas las tareas y mostrará en el visor cada uno de los puntajes guardados en el arreglo y la suma total de los mismos.
NOTAS:
  1. Los obstáculos serán las paredes de la mesa de competición, más algunos obstáculos dentro de la mesa (por definir).
  2. Se sugiere que consigan un pito para dar la señal de advertencia al robot.
  3. Para construir su robot, deben utilizar la rueda de mayor diámetro del kit, conectada directamente al motor.-                   
COMIENZO DEL PROBLEMA

Ejemplo de como es un array
    Bien, estando ya en el segundo semestre, nos tocó una manera de programar mas compleja que la primera vez en NXC, aquí como se mencionó antes haremos un juego mas o menos simple, la idea es que el robot pase por la mayor cantidad de circulos negros dentro de la maqueta en menor tiempo posible, si pasa demasiado tiempo el puntaje será bajo o no habrá puntaje. Cada uno de estos puntajes debe guardarse en un Array o arreglo, en la imagen podemos ver el cuadro verde es la variable del array la cual es entero(int) los cuadros rojos son los elementos con los que se llena cada posicion(indexes) las cuales van de 0 a n, dependiendo de la cantidad que se le aplique al array cuando se declara. Lo que diferencia a los array de otras variables son los llamados corchetes [ ] que se usan para declararlos y que luego se usan para ver las posiciones y/o usarlas. Lo mejor de todo, es que los arrays se usan en todos, por lo menos hasta donde conosco ahora, todos los lenguajes de programacion, facilitanto en gran medida algunos problemas con variables.

En resumen la actividad era mas o menos asi:
CLICK AQUI PARA TAMAÑO ORIGINAL



La solución, como en el primer semestre, comenzo de un Pseudocodigo simple, luego lo arreglamos para que se asemejara un poco al codigo de NXC y poder tener un mejor trabajo. Lo que tenemos es asi:
PSEUDOCODIGO:


Se declaran las variables:

#define negro 30 //umbral de luz

#define ruido 60 //umbral de sonido


mutex semaforo; //

int puntos=0;

int tiempo=0;

int puntaje[];

int i=0;

int anterior=0;

int actual=0;

int P=0;

int potencia = 20;

int t =0;

int Total=0;

int k=0;


subrutina calculo (){

actual=CurrentTick(); //Tiempo actual desde que se inicia el programa

t=(actual-anterior)/1000;

si ( el tiempo es <= 10 ) {

puntaje aumenta }

sino { puntaje = 0}

guardamos puntaje en un arreglo }


//Subrutina que muestra el total del puntaje al terminar el programa.

sub MostrarTotal(){

Limpia la pantalla();

para(cuando el puntaje aumente){

mostrar puntaje en pantalla ;

}


//Melodia del programa

task Melodia()

{

Mientras (Sea verdadero)

{ Melodía

}

}


Tarea AntesChoke(){

mientras(verdadero){

si (Sensor detecta sonido >=60){

- Gira en 180°

}

}

}




Tarea Choque ()

{

mientras (sea verdadero)

{

Avanzar ;

Si (detecta pared)

{

Se detienen los procesos () ;

Muestra en pantalla

Durante 10 segundos

}

}

}

sub Cambio_potencia(){

aumenta la potencia en 10;

si (potencia es >= 100 ){

potencia se mantiene en 100;}


PlayTone(1000,90); } //emite sonido de puntaje(al encontrar el punto negro)



Tarea Circulo()

{ Mientras sea(verdaderos)

{

Si (detecta negro){

{

Cambio_potencia();

calculo();

}

} }


}

task main ()

{

anterior=guarda el tiempo desde que se inicio el programa

se llaman las tareas para ejecutarlas(Melodia,AntesCh oke, Choque, Circulo) ;

activar sensor touch;

activar sensor luz;

activar sensor sonido;

}

CODIGO FINAL NXC

5.4) Código Fuente:
/* @author: EQUIPO "NEXUS"
  @date:   16/08/2011

Integrantes y roles:

Jefe de Grupo        : Patricio Aros
Secretario           : Lidia Baschmann
Productor Multimedia : Nicole Rodríguez
Staff de Apoyo       : Omar Becerra   */

// Se declaran las variables:

#define negro 30   //umbral de luz
#define ruido 50   //umbral de sonido

mutex semaforo;    //
int tiempo=0;
int puntaje[];
int i=0;
int anterior=0;
int actual=0;
int P=0;
int potencia = 20;
int t =0;
int acumulado=0; //velocidad de ejecucion de la melodia
int Total=0;
int k=0;



sub calculo(){
    actual=CurrentTick();  //Tiempo actual desde que se inicia el programa
    t=(actual-anterior)/1000;
    anterior=actual;

    //Si el tiempo de ir de un punto hacia otro es igual o menor a 10 segundos suma puntos.
    if(t<=10){
    P = (-5*t + 50);} //Formula para obtener el puntaje
    // De lo contrario no aumenta puntaje.
else{ P=0;}
    puntaje[i]= P;  //Guardamos el valor de P  (Puntaje) en un arreglo.
    i++;
    acumulado =P+Total;
    NumOut(30,20,Acumulado);
    }
   
//Subrutina que  muestra el total del puntaje al terminar el programa.
sub MostrarTotal(){
    ClearScreen(); //Limpiar la pantalla
    for(k=0; k<i;k++){   // se muestra el puntaje de forma ordenanda en la pantalla
            NumOut(50,40-k*5,puntaje[k]);
            Total=Total+puntaje[k];
    }
    NumOut(30,20, Total); //imprime el total del puntaje
}
            

       
       //Melodia del programa
task Melodia()
{
while (true)
{
PlayTone(330,200);
Wait(240);
PlayTone(440,200);
Wait(240);
PlayTone(494,200);
Wait(240);
PlayTone(554,300);
Wait(360);
PlayTone(587,100);
Wait(120);
PlayTone(554,400);
Wait(480);
Wait(240);
PlayTone(440,200);
Wait(240);
PlayTone(440,200);
Wait(240);
PlayTone(330,200);
Wait(240);
PlayTone(494,200);
Wait(240);
PlayTone(440,200);
Wait(240);
PlayTone(415,200);
Wait(240);
PlayTone(440,200);
Wait(240);
}
}

task AntesChoke(){ // tarea antes choke
    while(true){   
if(SENSOR_2>=60){  // si el robot detecta un ruido mayor a 60 desibeles

  Acquire(semaforo);
  OnRev(OUT_A,75);   // girar en 180 grados;
  OnFwd(OUT_C, 75);
  Wait(500);
  Release(semaforo);
                }
}
}


task Choque ()
{
while(true)
{
Acquire(semaforo);
OnFwd(OUT_AC, potencia); //Avanzar durante todo el programa
Release(semaforo);
if (SENSOR_1 == 1) // si el sensor de toque es activado
{
Acquire(semaforo);
Off(OUT_AC);       // Apagar motores
MostrarTotal();    // Mostrar en pantalla llamando a la sub rutina
Wait(10000);       // esperar 10 segundos
Release(semaforo);
StopAllTasks() ;   // Detener toda funcionalidad del robot
}
}
}
sub Cambio_potencia(){
potencia = potencia+10; // Aumenta la pontencia con un hasta limite de 100
 if (potencia >= 100){
      potencia=100;}

PlayTone(1000,90);  }


task Circulo()
{ anterior = CurrentTick();
while(true)
{
 if(SENSOR_3<=negro){ //si el robot tetecta el color negro
{
Cambio_potencia();  //aumenta la potencia llamando a la subrutina
calculo();          // Hace el calculo de puntaje
Acquire(semaforo);
OnRev(OUT_A, potencia); //hace un giro en un angulo aleatorio
Wait(Random(500));
Release(semaforo);
}
}         }
      }  //tarea


task main () // comienzan todas las intrucciones del robot
{
anterior=CurrentTick();
Precedes(Melodia,AntesChoke, Choque, Circulo);
SetSensorTouch(IN_1);     //Tacto
SetSensorLight(IN_3);     //LUz
SetSensorSound(IN_2);     //Sonido
}        

SI DESEA VER DE MANERA MAS ORDENADA EL CODIGO RECOMIENDO DAR CLICK AQUI            

                                                 



Dentro de todo la actividad la pudimos realizar, lo que nos complicó en gran medida a mi y mi grupo fueron los enredados calculos para llevar la cuenta de los puntajes y luego mostrarla por pantalla, pero logramos hacer la mayor parte del trabajo sin complicación alguna y con el apoyo de todos.

REFLEXION:
El gran aporte que nos dejo este proyecto fue aclararnos mucho el uso de los Arreglos(Arrays) los cuales como mensione anteriormente nos quitan grandes problemas en este y otros lenguajes al momento de realizar algunas operaciones concretas dentro de los programas lo bueno de NXC y varios otros lenguajes es que son similares y pueden complementarse, dejando en cada materia todo mas claro y mas entendible que si lo pasaramos tan solo en una materia.

0 comentarios:

Publicar un comentario