martes, 11 de octubre de 2011

Proyecto robotica

 Dribbler

Autor: Martin Berkhoff Jerez
Competencia: Desarrollo de software
Palabra clave: Dribbler
curso: Proyecto robotica.

Bueno compañeros aqui les  traje un proyecto de robotica, realizado el segundo semestre de el presente año, aqui les enseñare el codigo con  una pequeña explicacion de el, para que vean como desarrollamos la solucion a lo que se pidio en la actividad.

Descripcion de la actividad
  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.

Solucion: aplicamos los conocimientos adquiridos en las guias subidas a moddle y el trabajo de equipo logro la finalizacion de este trabajo, bueno aqui les presento el codigo.


Codigo:


mutex bandera;
int potencia=20;
int t_inicial=0;  //tiempo entre circulos
int t=0;     //para calculo puntaje
int a_puntaje[100];  //arreglo
int i=0;        //variable arreglo
int k=0;        //variable arreglo
int ga=0;       //giro aleatorio

int total=0; //almacena contenido arreglo


#define NEGRO 35    //valor máximo para superficie negra
#define GRITO 80     //valor para ruido

task Avanza()
{
    t_inicial=CurrentTick();    //asignación de tiempo cero
    while(true)
    {
        OnFwd(OUT_BC,potencia);
        if(SENSOR_3 > GRITO)      //si sensor ruido
        {
            Acquire(bandera);      //se pide uso de:
            OnFwd(OUT_B,75);       //motor derecho
            Wait(180);
            OnRev(OUT_C,75);
            Wait(180);              // motor izquierdo
            Release(bandera);
        } //usado para esquivar cuando se le "grite"
    }
}   //tarea que permite avanzar y esquivar

task Circulo()
{
    while(true)
    {
        if(SENSOR_2 <= NEGRO)
        {
            PlayFile("! Click.rso"); 
//sonido usado cuando detecta punto
            t=(CurrentTick()-t_inicial)/1000; //variable que calcula segundos
            if(t<=10)
            {
                a_puntaje[i]=(-5*t)+50;
                i++;  //avanza a siguiente posición en arreglo
            } //si t es menor, igual a 10 asigna un puntaje en el arreglo
            else
            {
                a_puntaje[i]=0;
                i++;
            } // si no almacena un cero en el arreglo
            potencia=potencia+10;  //incremento de la potencia

            if(potencia>=100)
            {
                potencia=100;
            } //si el incremento resultara mayor a 100, ésta es igualada a 100
            ga=Random(721); //para dar un tiempo aleatorio
            Acquire (bandera);
            OnFwd(OUT_B,75); Wait(ga);  //giro entre 0 y 721 ms, (0 a 360 grados)
            OnRev(OUT_C,75); Wait(ga);
            Release (bandera);
            t_inicial=CurrentTick(); 
//reasinga el tiempo inicial al valor del CurrentTick() 
}
    }
} //tarea que almacena dato en arreglo y realiza giro


task Sonido()
{
    while(true)
    {
        PlayFileEx("nyan.rmd",4,true);  //sonido para avanzar
        Wait(3000);
    }
}

task Final()
{
    Acquire(bandera);
    Off(OUT_BC);   //apaga motores
    for(k=0;k<i;k++)
    {
        NumOut(30,k*10, a_puntaje[k]);
        total=total+a_puntaje[k];
  }//muestra en pantalla los valores del arreglo y además calcula el total.
    NumOut(60,0,total);   //muestra el total
    Wait(5000);
    Release(bandera);
    StopAllTasks(); //mata todo
}

task Choque()
{
    while(true)
    {
        if(SENSOR_1==1 || SENSOR_4==1)
        {
            ExitTo(Final);
        }
    }
} //cuando el robot choca llama a Final();

task main()
{
    Precedes(Avanza, Circulo, Choque, Sonido);
    SetSensorLight(IN_2);
    SetSensorTouch(IN_4);
    SetSensorTouch(IN_1);
    SetSensorSound(IN_3);

}
 
Para que vean como quedo el robot final mente aqui les dejo el video:
Reflexion, nunca terminamos de aprender sobre la programacion de los robot, 
siempre hay algo nuevo y eso nos motiva. 

No hay comentarios:

Publicar un comentario