domingo, 29 de septiembre de 2013

Programa en NQC

Proyecto "La Rampla"


Alumno: Remigio Valdebenito
           Competencia: Desarrollo de Software
Asignatura: Proyecto de Robotica

Proyecto "La Rampla"

Descripción de la actividad:


El robot debe realizar la subida de una rampla, comienza siguiendo la línea verde hasta llegar a la intersección donde debe leer el color negro y activar sus sensores de tacto y continuar el recorrido solo con el choque de los tactos. Cuando llega a otra línea negra debe continuar con la búsqueda del verde. Al momento de llegar a la última línea negra, la cima de la rampla, el robot debe girar en 180º emitir una música y quedar en posición de descenso.


Solución:

Para poder cumplir con la pista que se nos presentó llamada “La Rampla” fue indispensable tener 2 sensores de Tactos y 1 sensor de luz. Se nos complicó en un principio con la estructura del Robot, ya que era muy ancho pero  luego lo compactamos un poco y quedó en un aspecto más acorde a la Pista, igual  hubieron algunos fallos pero fue netamente por la empinación de las subidas. Utilizamos un contador para las líneas negras, dentro de While, en si el código no fue tan complejo, si hubieron muchas pruebas y error, pero se logró cumplir con la Tarea.

sub fwd_light()
 {
 si(sensor_1 >= blanco)
   {
    apaga motores;
    avanza c;
    gira a;
 //segundo giro en caso de no estar en linea verde
 si(sensor_1 >= blanco)
   {
    apaga motores
    avanza c;
    gira a;
    }
  }
}
 sub fwd_touch()
  {
  si(sensor_3 == 1)
   {
   gira ac;
   espera 10 centesimas;
   avanza a;
   espera 30 centesimas;
   }
 }
 task main()
  {
   establecer potencias a los motores;
   encender sensor1_light;
   encender sensor2_touch;
   encender sensor3_touch;
   //inicia contador linea negra
   count=0;
   cuando(true)
    {
    avanza ac;
si(count modulo 2 = 0)
          {
          //luz
          llama fwd_light();
          }si no
            {
    // tacto
           llama fwd_touch();
    }
    si (sensor_1 <= negro)
              {
// Avance y giro
      sonido;
              espera 20 centesimas;
              avanza ac;
      espera 1 segundo y 30 centesimas;
              gira c;
              espera 80 centesimas;
              apaga motores;
              espera 1 segundo;
            // aumento contador
            count++;
          // giro 360
          si (count == 7)
             {
             // HACER GIRO
              avanza c;
      gira a;
      espera 2 seg. y 30 centesimas;
              apaga motores;
              musica;
         break;
                  }
} // /negro
} // /while
} // /main

Código:

Código Fuente:
#define NEGRO 39
#define VERDE 46
#define BLANCO 51
#define AVANCE 8
#define GIRO 8
#define GIRO_R 10
// Avance del robot
sub fwd_light() {
if (SENSOR_1 >= BLANCO) {
Off(OUT_AC);
OnFwd(OUT_C); OnRev(OUT_A);
Wait(GIRO);
// segundo giro en caso de no estar
// en la linea verde
if (SENSOR_1 >= BLANCO) {
Off(OUT_AC);
OnFwd(OUT_A); OnRev(OUT_C);
Wait(GIRO_R);
}
}
} // /fwd_touch
sub fwd_touch() {
    if (SENSOR_3 == 1) {
        OnRev(OUT_AC); Wait(10);
        OnFwd(OUT_C); Wait(30);
    }
    if (SENSOR_2 == 1) {
        OnRev(OUT_AC); Wait(10);
        OnFwd(OUT_A); Wait(30);
    }
} // /fwd_touch
task main() {
// Power
SetPower(OUT_A, 5);
SetPower(OUT_C, 6);
// Sensors
SetSensor(SENSOR_1, SENSOR_LIGHT);
SetSensor(SENSOR_2, SENSOR_TOUCH);
SetSensor(SENSOR_3, SENSOR_TOUCH);
// Variable que contara la cantidad de veces que
// el robot pasa por una linea negra.
int count = 0;
while (true) {
    OnFwd(OUT_AC);
// if % 2 == 0 => Tacto
// else Luz
if (count % 2 == 0) {
        // luz
        fwd_light();
}
else {
 // tacto
fwd_touch();
}
if (SENSOR_1 <= NEGRO) {
// Avance y giro
// sonido
      PlaySound(3); Wait(20);
OnFwd(OUT_AC); Wait(130);
OnRev(OUT_C); Wait(80);
// espera 1 seg
Off(OUT_AC); Wait(100);
// aumento contador
      count++;
      // giro 360
      if (count == 7) {
         // HACER GIRO !!
         OnFwd(OUT_C);
         OnRev(OUT_A); Wait(230);
         Off(OUT_AC);
         PlayTone(262,40); Wait(50);
         PlayTone(294,40); Wait(50);
         PlayTone(330,40); Wait(50);
         PlayTone(294,40); Wait(50);
         PlayTone(262,160); Wait(200);
         break;
      }
} // /negro
} // /while

} // /main


Cabe destacar que los // sirven para comentar cada código.
Como podemos ver, hay distintos tipos de instrucciones echas en nuestro código, tales como el PlayTone (realiza un sonido), OnFwd(anvanza con cierto motor), OnRev(retrocede con cierto motor), tambien hay convinaciones como la siguiente que es para que el robot gire OnFwd(OUT_A); OnRev(OUT_C); .

Como dicen por ahí, una imagen vale mas que mil palabras así que presentaré un vídeo de este proyecto.