viernes, 16 de diciembre de 2011

PitFinder

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:

Iniciando la competencia de aprendizaje autónomo, quiero compartirles con ustedes mi actividad número dos llamada PitFinder que es correspondiente al Curso de Proyecto Robot, donde se tuvo que realizar un código fuente en NXC.

El problema de la actividad consistió en hacer que el robot sea capaz de recorrer toda la plataforma (pista) en busca de detectar las alturas de los precipicios presentes en la pista, todo esto termina al realizar las mediciones de cuatro precipicios, entregando un reporte sobre esto.

Solución

Lo primero que se debe hacer para realizar esta actividad es analizar la problemática correspondiente a la actividad esto hace que se simplifique y facilite para llegar a un buen resultado donde el análisis sirve de ayuda para la realización del pseudocódigo, para luego finalizar con la creación de el código fuente en el lenguaje NXC.

Pseudocódigo:
CERCA 10
altura[4]
i=0     

sub medir()       
{ Obtener altura según el sensor de proximidad
  Guardar el valor de la altura en un arreglo
  i++
  Retroceder y gira en un ángulo random
}

sub escribir()
{ Crear un archivo
  Escribir los datos del arreglo en el archivo
  Mostrar los datos del archivo por pantalla
 }

tarea detectar()
{  Mientras (i<=3)
            { Avanza
              Si(sensor de proximidad > CERCA)    
                        {Llamar a subrutina medir()
                           } //cierre de Si
             }  // Cierre del Mientras
Llamar a subrutina escribir ()
} // Cierre de la tarea detectar

Tarea principal ()
{  Ejecutar tarea detectar
  Encender sensor de proximidad }

El código fuente del programa en NXC es el siguiente: 

#define CERCA 10  // Variable usada para definir un valor para el sensor de Proximidad mida, en cm.

int altura[4];   // Es el arreglo de tipo entero para que se guarden los valores cada vez que detecte una medición del precipicio.

int i=0             // Esta variable se usó para guarda el valor en valor entregado por el sensor en la primera posición.

int a=0;          // Para que se pueda recorrer el arreglo, mostrando todos los valores.

int giro;          // Variable que se usará para el giro aleatorio.



sub medir()               // sub modo medir.

{

 Off(OUT_AC);   // Apagar motores por 3 segundos.

 Wait(3000);

 altura[i]=SensorUS(IN_2);// Acá es donde se guarda el valor de la medición en la posición 0 del arreglo.

 i++; // Se le suma uno a i para que guarde en la siguiente posicion del arreglo.

 OnRev(OUT_AC,75);// Retroceso por 3 milisegundos con potencia 75

 Wait(300);

 OnRev(OUT_A,75);// Las dos instrucciones es para realizar un giro con un valor aleatorio.

 OnFwd(OUT_C,75);

 giro=Random(400)+200;  // Como anteriormente dicho, el valor del giro es aleatorio.

 Wait(giro);                // el valor esta entre 400 y 600 milisegundos.

}

sub escribir() // sub modo escribir

  { int fsize; // entero para el tamaño del archivo.

   bool eof = false; // booleano para que al finalizar siempre muestre en pantalla        

   int i=0;// Valor inicial del arreglo, posición 0 

   int x=0,y=0; // Variables que indican las coordenadas de la pantalla del ladrillo.

   byte punteroArchivo;  // Usado para acceder al archivo.

   string cadena;// Donde se guardará el texto que se mostrará en pantalla.

   int pos=1;   // entero para que en pantalla muestra el número de precipicio

   byte bytesEscritos;



    CreateFile("MedicioneS.txt", 1024, punteroArchivo);  // Creación del archivo

            for(i=0; i < ArrayLen(altura); i++) {            // Todo esto nos permite recorrer TODO el arreglo.

                        string alturax = NumToStr(altura[a]); // Se pasa el valor entero del arreglo a String para poder mostrarlo, posición inicial(a=0)

                       string posicion = NumToStr(pos);// Al igual que el anterior se pasa a String, muestra el numero de precipicio que corresponde la medición.

                  cadena = StrCat("Pre.",posicion,"==>",alturax,"m");// Lo que se muestra en pantalla. (Pre.1 ==> 94 m por ejemplo)

                    a++;   pos++;// Sumar uno a y pos lo que nos dice que se avanza en la posición del arreglo y numero de precipicio.

                    WriteLnString(punteroArchivo, cadena, bytesEscritos); // Escribir en el archivo la cadena.

            }           // Cierre del for

           

    CloseFile(punteroArchivo); // Cerrado del archivo

      if(OpenFileRead("MedicioneS.txt", fsize, punteroArchivo) == NO_ERR) // Aqui es donde se abre el archivo que antes se creó.

            {

             while (eof == false) // Mientras sea eof igual a false

            {

             if(ReadLnString(punteroArchivo,cadena) != NO_ERR) eof = true;  // Leer el contenido del archivo que se guardo en cadena.

                 TextOut(x,y,cadena);// Mostrar en pantalla el texto(medición) que contiene cadena.

                y+=10; // Usado para que en la coordenada y aumente en 10 lo que muestra los valores de la mediciones sin errores como sobre escritura en la pantalla.

              Wait(2000); // Por 2 segundos.

             

}           // Cierre del while.

            }  //Cierre if

            }           // Cierre del sub modo



task detectar()   // Tarea detectar.

{

    while(i<=3)             // Mientras i sea menor o igual a 3, lo que nos garantiza que realiza las 4 mediciones.

            {

            OnFwd(OUT_AC,70);  // Avanzar con una potencia 70

            if(SensorUS(IN_2) > CERCA) // Si el sensor de proximidad es mayor que Cerca

            {

            medir(); // Llamar al sub modo medir.

            }           // Cierre del if

            }  // Cierre del While

            escribir(); // Llamado al sub modo escribir.

           

 } // Cierre de la tarea detectar



 task main () // Tarea Principal.

 {

   Precedes(detectar);// Usado para que la tarea detectar trabajen paralelamente al main.

   SetSensorLowspeed(IN_2); // Encender Sensor de Proximidad, Puerto numero 2

         }


En resumidas cuentas en el código está basado solamente en el funcionamiento del Sensor de Proximidad lo que hace posible medir las distancias de altura en los precipicios, además del uso de subrutinas para cada caso que se pueda plantear en el camino del robot.

El video de esta actividad es el siguiente:




Reflexión:

Para la realización de esta actividad la gran dificultad estuvo marcada por el hecho de escribir un reporte sobre las mediciones de altura que hacia el robot todo esto en un archivo el cual debe ser leído, ya que el archivo se debe crear, se debe abrir y por ultimo cerrar el mismo archivo, además de mostrar en pantalla porque se tuvo que calcular las coordinadas (x, y) en la pantalla para que el texto no se sobrescribiera.

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