viernes, 16 de diciembre de 2011

Actividad: Paso de Parametros

Autor: Felipe Andres Lagos Morapasten
Competencia: Aprendizaje Autónomo (Nivel 1)
Palabras Clave: Proyecto de Robots, NXC, Robótica, Kit Lego.

Descripción de la Actividad:


Finalizando la competencia de aprendizaje autónomo, quiero compartirles la  actividad inicial del Curso de Proyecto Robot, esta actividad está enfocada en el uso de parámetros, además con el desarrollo de un código fuente en NXC.

La actividad consiste en que el robot debe desplazarse en una superficie (con paredes en su bordes) que en ella se encuentran puntos negros, el robot toma diferentes caminos durante la actividad, ejemplo de esto cuando choca con una pared, lo más fundamental de esto es disminuir su potencia de velocidad y retroceder más un giro lo que lo hace para retomar su rumbo, otro suceso diferente es cuando detectar un punto negro ya que debe aumentar su velocidad y girar aleatoriamente, menor a los 180° todo lo anteriormente nombrado lo realiza hasta escuchar una señal auditiva superior a los 80 decibeles ,  luego de esto genera un reporte sobre los puntos detectar y las paredes chocadas.


Solución

Para la solución de este problema se debe analizar la problemática presente para posterior realizar un pseudocódigo que facilita la creación del código fuente de la actividad.

Pseudocódigo:
Definir umbral Luz = 40
Definir umbral Sonido = 80
Potencia=80
Choques=0
Punto=0
Iniciar sensores de Luz, Tacto y sonido

Choque()

{ retroceder
   Girar 180º
   Potencia-10
   Choques++  }

Punto_negro()

{ girar con un grado random menor a 180º
   Potencia+10
   Punto++   }

Mostrar()

{Mostrar nº de choques y puntos}

Mientras(umbral sonido < 80)
  {avanzar con Potencia
   Si(choca)
     { llamar a Choque }

   Si(detecta punto)
     { llamar a Punto_negro}
   }

Llamar Mostrar

El código fuente correspondiente a la actividad:
 
#define UMBRAL_SONIDO 80  // Importante para marcar el final de la actividad.
#define UMBRAL_LUZ 40     // Usada para detectar un punto negro.
int potencia=80; // Rango inicial de potencia que con el desarrollo variará su valor.
int choques=0; // Variable usada para contar la cantidad que choques que se realizan en la actividad.
int punto=0;   // Al igual que el anterior sirve para contar los puntos negros durante la ejecución del programa.

sub GiroPotencia(int t, string direccion, string evento) // sub modo dedicado a los giros con parametros.
{
    if(evento=="choque" ) // Si el evento es igual a choque
      {  if(direccion == "d" )// Si la dirección es d, d= derecha.
          { OnRev(OUT_A,50); // Las dos instrucciones son para que realice un
           OnFwd(OUT_C,50); // giro de 180° a la derecha.
            Wait(900);}
            }          // Cierre del if del choque.
     
    if(evento=="punto") // Si la direccion es igual a punto.
       { if(direccion == "i") // Si la direccion es igual a i, i= izquierda.
            { OnRev(OUT_C,Random(50)); // Realiza un giro con valores random lo que hace que la dirección
              OnFwd(OUT_A,Random(50));// no se pueda determinar, aleatorio y menor que 180°
              Wait(900);  }
                         }   // Cierre if del punto

                         }// Cierre GiroPotencia
   
  sub choque()
  {
    OnRevReg(OUT_AC,potencia,OUT_REGMODE_SYNC); // Retroceso por medio segundo con motores sincronizados (igualados)
    Wait(1000);
    GiroPotencia(1000,"d","choque" ); // Le da los valores a los parámetros del sub modo GiroPotencia, 1 segundo,"direccion derecha",choque.
    potencia=potencia-10; // Esto modifica potencia restando 10 unidades por cada choque.
    choques++;      // Lo que realiza es sumar una unidad a la variable choque.
    if(potencia<30) // Si la potencia es menor que 30
    potencia=30;    // esta tomará un nuevo valor en este caso 30
    if(potencia>100) // Si la potencia es mayor que 100
    potencia=100;   // cambiará su valor a 100.
                     } // Cierre del sub modo choque
sub punto_negro()
{
  punto++;  // Suma una unidad a la variable punto.
  potencia=potencia+10; // La potencia cambia su valor, sumando 10 unidades al detectar un punto negro.
  GiroPotencia(1000,"i","punto" ); // Le da valores a los parámetros del sub modo GiroPotencia,1 segundo, "dirección izquierda”, punto.
  if(potencia<30)  // Si la potencia es menor que 30
  potencia=30;     // tomará un nuevo valor, siendo ahora 30.
  if(potencia>100)  // Si la potencia es mayor que 100 cambiará
  potencia=100;    // el valor de la potencia a 100.
}
sub mostrar()
{

 TextOut(0,40,"N Choques"); // Muestra en pantalla en palabras abreviadas Número de choques
 NumOut (85,40,choques); // Indica la cantidad ( numero) de la variable choques.
 TextOut(0,60,"N Puntos" ); // Muestra en pantalla en palabras abreviadas Número de puntos
 NumOut (80,60,punto);  // Indica la cantidad ( numero) de la variable punto.

}

task main()
{
 SetSensorLight(IN_3); // Encender Sensor de Luz en el puerto 3
 SetSensorSound(IN_2); // Encender Sensor de Sonido, puerto 2
 SetSensorTouch (IN_1); // Encender Sensor de Tacto, puerto 1


 while(Sensor(IN_2) < UMBRAL_SONIDO)// Mientras el sensor de Sonido sea menor al umbral_sonido(80 decibeles).
 {
  OnFwdReg(OUT_AC,potencia,OUT_REGMODE_SYNC);   // Avanzar con motores sincronizados(igualados).
  if(Sensor(IN_1) == 1) // Si el sensor de Tacto es igual a 1, sienta el choque.
  {choque();}   // Llamado al sub modo choque
 
  if(Sensor(IN_3) < UMBRAL_LUZ)// Si el sensor de luz es menor que el Umbral de luz(negro)
  {
   punto_negro(); // Llamado al sub modo punto_negro.
   }
  mostrar();
} // Cierre  while
   Float(OUT_AC);  // Usado para que al termina con la señal auditiva su frenado sea más suave.
}    // Cierre del Task

En este código podemos destacar el uso de los sensores de tacto y luz para las diferentes tareas que el robot debía cumplir, teniendo bastante importancia el uso de estos, además de subrutinas donde se le aplica el uso de parámetros.

El video de la actividad: 



Reflexión:

La principal dificultad de esta actividad fue determinar cuándo pasar un parámetro a las distintas subrutinas de las actividades ya que cada subrutinas está enfocado a sucesos totalmente diferentes como bajar ( subrutina choque) o aumentar( subrutina punto negro) la potencia de la velocidad

Te invito a que si tienes dudas o quieres complementar esta actividad mediante opiniones, otras informaciones no tengas miedo de emitir tus comentarios, a participar donde cada comentario hará que se haga más interactivo este espacio.

No hay comentarios:

Publicar un comentario