domingo, 13 de noviembre de 2011

Actividad #2 - pitFinder (Proyecto Robotica).

Autor: Rodrigo Andres Soto Parra
Competencia:Aplica las Ciencias de la ingeniería. (Nivel 1).



Descripcion 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.

Implementación

  • La meseta de la montaña estará dada por la mesa de competición sin paredes.
  • Cada vez que el robot detecte el fin de la mesa, deberá detenerse, y medir la altura del “precipicio”. Este dato será registrado y guardado en un ARRAY de enteros.
  • Después de medir, debe (al azar) buscar otro borde de la mesa, y realizar la misma operación.
  • El robot finaliza su trabajo de búsqueda cuando registró la medición del 4to “precipicio”.
  • Finalizada la búsqueda genera un reporte que guardará en un archivo (WriteLnString).. Un ejemplo del formato del reporte sería:

REPORTE PITFINDER
--------------------
Precipicio 1 ==> 20 mts
Precipicio 2 ==> 10 mts
Precipicio 3 ==> 30 mts
Precipicio 4 ==> 20 mts
  • Al final, deberá mostrar en el visor del NXT el reporte de los precipicios anteriormente guardado en el archivo, a través de la lectura del mismo (ReadLnString).
 



Introducción
Terminando el trabajo anterior, nos preguntábamos, ¿Cuál podría ser el siguiente trabajo?. Al leer la actividad, nos dimos cuenta que la intención de nuestros profesores no era complicarnos la vida como pensábamos, sino que atreves de tareas medianamente complicadas insertarnos los conocimientos y de alguna manera obligarnos a ocuparlos dentro del trabajo. Para la actividad numero 2, se nos pide que dentro de un espacio determinado (Sin paredes), nuestro robot se desplace de manera aleatoria, hasta que encuentre el fin de la acera. Al momento de conseguir el primer objetivo, se pide que nuestro robot tome la distancia que hay desde la pista hasta el suelo y guardarlo en un arreglo. Luego de repetir durante 4 veces este proceso, se solicita que los resultados sean expuestos por la pantalla del robot. Las nuevas funciones son “WriteLnString” (Escribir en el archivo, o guardar objetos) y “ReadLnString” (Leer el archivo).


Objetivos
Iniciada la actividad numero 2 y unas ves determinas las funciones de cada integrante del grupo, se plantea una serie de objetivos los cuales deben ser cumplidos al término de la actividad. Dentro de estos no estaba solamente entregar el trabajo, sino también que cada uno de los integrantes lograse entender de manera clara el nuevo código y la implementación de las nuevas funciones dentro de este.
· Implementar las nuevas sentencias en de programación pasadas en la semana como:
o WriteLnString (Escribir en el archivo, o guardar objetos).
o ReadLnString (Leer el archivo).
· Trabajar en Grupo.
· Entregar el trabajo puntualmente y sin mayores complicaciones.
· Optimizar el código de manera que sea entendible a simple vista.
· Trabajar con la materia anterior, para formar un código completo, optimizado y sin errores.


Estrategia de Trabajo
Para esta actividad, variaron los cargos rotundamente. En el ramo anterior (Programación de Robots), a medida que los cargos rotaban, todos los integrantes del grupo podían experimentar los diferentes cargos que hay dentro de este. Es por esto que ahora todos podrían estar en cualquier cargo y para demostrar esto, es que cambiamos los roles para este trabajo. Además, el trabajo ejecutado de esta manera, resulta dinámico y entretenido.
Jefe de Grupo: Representante legal de grupo. Encargado principalmente de que en este, se mantenga el orden, la disciplina y predomine el trabajo antes que la pérdida de tiempo. También tiene como función ayudar en lo que se le solicite y resolver dudas de los integrantes del grupo.
Productor multimedia: Preocupado de tomar fotografías para la entrega del informe, pero su principal función es grabar el video que corresponde a un segmento importante y de alto puntaje dentro del trabajo.
Secretario: Atento y veloz en la toma de apuntes y detalles, los cuales pueden ser muy útiles a la hora de la construcción del informe, donde la mayor participación la tiene el mismo.
Staff de apoyo: Ayuda de manera animosa y colaborativa en cualquier tarea donde se le solicite, puede ser en la construcción del informe, en la toma de fotografías o simplemente para subir el trabajo a la plataforma.


Diseño y uso de sensores
Analizando la actividad, nos dimos cuenta de que para este proyecto, la estructura actual del robot no nos serviría, por lo tanto tomamos una clase de laboratorio para estructúralo nuevamente y el resultado fue el siguiente: Se desconectaron todos los sensores excepto en de ultrasonido, el cual, es el único utilizado para esta ocasión. El sensor recién mencionado, es ubicado en la parte Frontal-Posterior del robot (Obviamente, no obstruyendo el trabajo de las ruedas) en dirección hacia el suelo, (De manera que cuando no detectara piso, tomara sin complicaciones la distancia desde este, hacia el suelo). Todo lo demás fue dejado donde mismo, ya que su cambio de ubicación, no afectaría en el resultado final de la actividad.







Código Fuente
int medidas[4];
int a=0;
int i=0;
int j=0;
int num=0;
int tam=512;
byte punteroArchivo;
byte bytesEscritos;
mutex semaforo;
string numeros;
string linea="_==>";
string cadena;
string leer;
string mas="precipicio";
#define Medid 20
sub Altura()
{
medidas[a]=SensorUS(IN_2);
NumOut(0,10*a,medidas[a]);
a++;
}
sub Archivos()
{
CreateFile("Dato.txt", tam, punteroArchivo);
WriteLnString(punteroArchivo, "REPORTE PITFINDER", bytesEscritos);
WriteLnString(punteroArchivo, "--------------------", bytesEscritos);
for(j=0; j < ArrayLen(medidas); j++)
{
num++;
numeros= NumToStr(num);
cadena = NumToStr(medidas[j]);
cadena = mas + numeros + linea + cadena;
WriteLnString(punteroArchivo, cadena, bytesEscritos);
}
CloseFile(punteroArchivo);
}
task Programa()
{
while (i<4)
{
OnFwd(OUT_C,50);
OnFwd(OUT_A,55);
if (SensorUS(IN_2)>Medid)
{
i++;
Acquire(semaforo);
OnFwd(OUT_C,50);
OnFwd(OUT_A,55);
Wait(300);
Off(OUT_AC);
Wait(1000);
Altura();
OnRev(OUT_C,50);
OnRev(OUT_A,55);
Wait(1000);
OnFwd(OUT_C,50);
OnRev(OUT_A,55);
Wait(Random(1500)+400);
Release(semaforo);
}
}
int pa=50;
bool eof = false;
Off(OUT_AC);
Archivos();
ClearScreen();
OpenFileRead("Dato.txt", tam, punteroArchivo);
while (eof == false){ if(ReadLnString(punteroArchivo,leer) != NO_ERR) eof = true;
TextOut(LCD_LINE8,pa,leer);
pa= pa-10;
Wait(500);}
Wait(5000);
CloseFile(punteroArchivo);
}
task main()
{
Precedes(Programa);
SetSensorLowspeed(IN_2);
}


Link del video



Conclusión
 Cuando el informe estuvo totalmente construido, el video editado y el código optimizado y funcionando, pudimos concluir que la actividad resulto todo un éxito, ya que todos los integrantes del grupo cumplieron su función de manera plena y sin complicación alguna. También se ve de manera clara un buen manejo de las funciones aprendidas hasta ahora, junto con las más recientes que son “WriteLnString” y “ReadLnString”, las cuales fueron aplicadas de manera adecuada y se puede comprobar en el video, donde se ve que el código no tuvo ningún problema al momento de su ejecución.

 

No hay comentarios:

Publicar un comentario