jueves, 15 de diciembre de 2011

pitfinder

Autor:Cristian Lara
Competencia:Aprendizaje Autónomo.
Palabras claves:lego,nxc

 Descripción de la Actividad

Un robot recorre la meseta de una montaña, y su misión es detectar las alturas de los precipicios de ésta, información que servirá para escaladores, paracaidistas, deportes extremos en general.

Solución.

Primer paso es escribir el pseudocodigo para encontrar la solución.

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++
retrocede 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
}


Una vez que escribimos la solución pasamos al código.

#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
}

Video de la actividad realizada
 

Reflexion.

Respecto al aprendizaje autónomo en esta actividad, se da en buscar información de como poder crear un archivo y poder escribir sobre él, además de aprender las diferentes alturas que el robots puede lograr detectar.





No hay comentarios:

Publicar un comentario