lunes, 14 de noviembre de 2011

"Robot Cosechadora"

Autor: Jorge Henriquez Romero
Competencia: Gestión en TI. (Nivel 1)
Palabras claves: NXT, programacion, Robot, Lego.




Descripción de la actividad
Esta actividad fue propuesta por los profesores de programación de robot, y les daré a conocer los detalles de tal actividad.
La actividad consistia en utilizar un robot lego NXT que debía simular a un robot
cosechador el cual debia partir sobre un punto especifico y recorrer todo el
campo hasta su extremo, mientras recorre la superficie este tiene que registrar
los tiempos que recorre en cada linea, luego debe reconocer la linea negra y
guiarse hasta cada caja y reconocer si en el borde es negro si es asi botara
una manzana(cubo negro) y de no ser asi osea blanco seguira su camino hasta
recorrer toda la superficie.

Solución
Fue muy difícil llegar a la solución del problema, ya que había que calibrar muy bien al robot para que lograra el objetivo esperado. El codigo y pseudocodigo que les mostrare nos da la solucion.
pseudocodigo:
Definición variables y el umbral para el sensor de luz;
creamos subrutinas;
      sub avanzar()
      {
            avanzar el linea recta con velocidad 40;
            en un tiempo de 2 segundo;
      }
      sub regresar();
      {
            realiza un giro de 180°;
      while(true){
            avanza en linea recta con velocidad 40;
            si(sensor de luz supera el umbral de negro)
                  {
                  realiza un giro de 90°;
                  y se quiebra el while;

                  }            }
      }
      sub escanear()
      {
            entramos en un while donde el contador es menor a 4(){
                  avanza en linea recta con velocidad 40;
                  si(sensor de luz supera umbral)
                  {
                  guarda el tiempo;
                  contador++;
                  }
      }
      sub guiarse()
      {
            Si(sensor de luz supera umbral)
            {
            gira 90°
            entra a un while(true){
                  si(sensor supera el umbral)
                  {
                  avanza lento desviandose hacia la derecha;
                  }
                  else
                  se desvia hacia la izquierda;
                  si(sensor de tacto es tocado)
                  {
                  se rompe el while;
                  }
sub botar()
{
      si(sensor de luz supera el umbral)
      {
      el motor A(herramienta cosecha) gira 180°;
      motor A regresa a su posición;
      robot retrocede por medio segundo;
      gira 180°;
      }
      sino
      {
      retrocede por medio segundo;
      gira 180°;
      }
}
sub volver()
{

      while(true)
      {
      si(sensor supera umbral)
      {
      avanza desviandose hacia la derecha;
      }
      sino
      se desvia hacia la izquierda;
      si(sensor de tacto es presionado)
      {
      se quiebra el while;
      }
      }
}
sub alinear()
{
      while(true)
      {
      girar 90°;

      avanzar en linea recta;
      si(sensor luz supera el umbral)
      {
            se quiebra el while;
      }
}
task main()
{
Se enciende robot;

se declaran sensores;
se realiza la subrutina escanear();
regresar();
entra en un while donde contador va a ser menor a 8{
      guiarse();

      botar();
      contador++;
      volver();
      botar();
      contador++;
      avanzar();
      alinear();
      }
}


Codigo:




//subrutinas
sub avanzar()
{
  OnFwdReg(OUT_BC,40,OUT_REGMODE_SPEED);
  Wait(800);
  OnRev(OUT_B,40);
  OnFwd(OUT_C,40);
  Wait(990);

while(true){
                  OnFwdReg(OUT_BC,40,OUT_REGMODE_SPEED);
            if(Sensor(IN_3)<negro)
               {
               OnFwd(OUT_B,40);
               OnRev(OUT_C,40);
               Wait(800);
               break;
               }
         }
}

sub regresar()
{
    OnFwd(OUT_B,40);
            OnRev(OUT_C,40);
            Wait(1980);
   //       OnRevReg(OUT_BC,40,OUT_REGMODE_SPEED);
   //       Wait(800);
    while(true){
            OnFwdReg(OUT_BC,40,OUT_REGMODE_SPEED);
            if(Sensor(IN_3)<negro)
               {
               OnFwd(OUT_B,40);
               OnRev(OUT_C,40);
               Wait(800);
               break;
               }
         }
}

sub escanear()
{
     while(cont<4)
        {
        OnFwdReg(OUT_BC,40,OUT_REGMODE_SPEED);
        t0 = CurrentTick();
        NumOut(60,cont*10,40);
        while((t1-t0)<1500)
             {
             OnFwdReg(OUT_BC,40,OUT_REGMODE_SPEED);
             luz = Sensor(IN_3);
             t1 = CurrentTick();
                if(luz <50)
                {
                   tiempo = CurrentTick();
                   NumOut(10,cont*10,tiempo);   //pantalla
                   cont = cont+1;      //cuenta 1 mas
                if(cont==7)
                    {
                   break;
                    }
                if(pm < 40)
                    {
                    Wait(400);
                    }
                else
                    {
                    Wait(50);
                    }
                }
                t1 = CurrentTick();
                if((t1-t0)>1499)
                {
                conta = conta+1;
                pm = 10*(conta);
                }
          }
        }
      }

sub guiarse()
{
    while(true)
    {
      if(Sensor(IN_3)<negro)
      {
            OnFwd(OUT_B,25);
            OnFwd(OUT_C,10);
        }
        if(Sensor(IN_3)>negro)
        {
            OnFwd(OUT_B,10);
            OnFwd(OUT_C,25);
        }
        if(Sensor(IN_1)==1)
        {
        break;
        }
    }
}

sub botar()                                          //bien
{
     if(Sensor(IN_3)<negro)
     {
         Off(OUT_BC);
         OnRev(OUT_A,20);
         Wait(1500);
         OnFwd(OUT_A,20);
         Wait(1600);
         Off(OUT_A);
         OnRev(OUT_BC,50);
         Wait(500);
         OnFwd(OUT_B,40);
         OnRev(OUT_C,40);
         Wait(1980);
        Off(OUT_BC);
     }
     else
     {
     OnRev(OUT_BC,50);
     Wait(500);
     OnFwd(OUT_B,40);
     OnRev(OUT_C,40);
     Wait(1980);
     Off(OUT_BC);
     }
}

sub volver()
{
  while(true)
    {
      if(Sensor(IN_3)<negro)
      {
            OnFwd(OUT_B,12);
            OnFwd(OUT_C,30);
        }
        else
        {
            OnFwd(OUT_B,30);
            OnFwd(OUT_C,12);
        }
        if(Sensor(IN_1)==1)
        {
        break;
        }
    }
}

task main()
{
  SetSensorTouch(IN_1);
  SetSensorLight(IN_3);

escanear();
regresar();
while (conta<16)
    {
  guiarse();
            botar();
            conta++;
            volver();
            botar();
            conta++;
            avanzar();
}}

Fotos:



Video de la actividad:



Refexiones
Este trabajo final fue muy provechoso para cada uno de los integrantes del grupo, ya que puso a prueba nuestras habilidades en física y  de programación de robots lego NXT, demostrándonos que no es sencillo programar robots, incluso los lego, nunca se termina de aprender algo nuevo que se le pueda integrar a un código cualquiera y además que siempre se puede hacer algo mejor de lo que ya está hecho.
Espero les ayude la materia de este blog, a mí me presto una gran ayuda.

No hay comentarios:

Publicar un comentario