Competencia: Aprendizaje Autónomo. (Nivel 1).
Asignatura: Proyecto de Robótica.
Palabras clave: Informe, lenguaje NQC, programa Bricx Command Center.
Descripción de la Actividad
Les voy a compartir mi experiencia, como estudiante de 1er año de Ingeniería civil informática, sobre la vez que tuve que realizar un informe sobre el Actividad 2: PitFinder que realice con el Robot NXT de la Universidad.
Este trabajo se trata de un robot que 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).
Solución
Grupo: Kmikse.
Jefe de grupo: Gianinna Salazar.
Productor multimedia: Erick Matus.
Staff de Apoyo: Hernán Espinosa.
Secretario: Jorge Muñoz.
Jefe de grupo: Gianinna Salazar.
Productor multimedia: Erick Matus.
Staff de Apoyo: Hernán Espinosa.
Secretario: Jorge Muñoz.
Introducción:
La actividad calendarizada para esta semana lleva por nombre "Pit finder". Actividad que tiende a trabajar con el uso de arreglos y el de guardar estos datos en un archivo. Este material está enfocado en lograr desarrollar código en la cual se logre utilizar la creación y uso de archivos dentro de la programación NXC desarrollada en la actividad nombrada y explicada a continuación.
La principal función del robot a programar es detectar las alturas que existen de una mesa al suelo. El robot se desplaza durante un ciclo determinado, específicamente si encuentra o cuenta cuatro alturas detendrá las tareas. Las alturas serán guardadas en un Array o arreglo, en la cual, luego de tener contadas todas las alturas, guardará esta información en un archivo. Para finalmente mostrar en pantalla los resultados obtenidos. Esta actividad dará énfasis en el uso de Array y el manejo de archivos. Herramientas nuevas para la creación de código NXC.
Estrategia de trabajo:
La estrategia de trabajo desarrollado para poder dar solución al problema planteado fue de la siguiente manera:
Como jefe de grupo fue asignada Gianinna Salazar en ella quedó la responsabilidad de llevar las "riendas" del equipo conformado, así como orientar a tener todos el documento, pseudocódigo, código fuente, imágenes, video, de la actividad en la que se trabajaba, en los plazos establecidos.
El productor multimedia fue Erick Matus. Para poder lograr un informe completo de la actividad en la que se trabajaba, la producción multimedia es crucial. Es por ello, que Hernán Espinosa se encargo de tomar cada foto, en primer lugar, de la construcción del robot para poder dar detalles de los implementos necesarios para la actividad. Luego, el productor multimedia se encargo de grabar el video de la ejecución final del robot con todo lo programado.
Jorge Muñoz estuvo en la parte de los reportes escritos que debía entregar el grupo en los plazos establecidos con anterioridad. Jorge Muñoz se enfoco en dar al informe contenido completo de la actividad de acuerdo a la pauta entregada.
El Staff de apoyo recayó en las manos de Hernán Espinosa el cual fue decidido por Gianinna Salazar. El ayudó en la forma de diseñar el robot, dándole estilo, para que una vez armado llevarlo la actividad con el código correspondiente.
Cada persona del grupo se le asignó tareas específicas. Pero, esto no quiere decir que cada quien, solo se enfoco en su tarea. Todo se distribuyo de acuerdo a etapas que se iban desarrollando durante la actividad. Por lo que, los integrantes en todo momento estuvieron trabajando para dar solución al problema. Ya que, si esto se desarrolla por asignación absoluta nada funciona con lo que se tiene planeado para desenvolverse de manera optima en lo que se tiene como solución final.
Modelo de la Solución:
Armado del robot:
Para lograr que nuestro robot estuviera en las óptimas condiciones durante la prueba a realizar. Este fue diseñado y adaptado a la actividad en que debía desempeñarse, para ello, el diseño implementado se mostrará a continuación:
Se tomó la decisión de armar un robot que tuviera las piezas adecuadas y precisas para la actividad. Se implementó un robot con el uso de tres ruedas, dos de ellas son medianas y la otra es pequeña (puesta en la parte de atrás del robot). Esta última es utilizada para que el robot tenga equilibro a la hora de desplazarse por la pista como también para dar vueltas con mayor eficacia.

El sensor utilizado en esta ocasión fue el de ultrasonido, ya que, la actividad lo requería. Este sensor fue implementado en la parte delantera del robot, apuntando directamente hacia el piso, ya que, una vez que saliera de la pista encontrándose específicamente en la orilla de esta hiciera una serie de suceso definidos en la actividad a realizar.

Llegando al diseño final de nuestro robot listo para poder desempeñarse en la actividad encomendada por los programadores.
Código fuente:
Integrante grupo = Gianinna Salazar - Erick Matus - Hernán Espinosa - Jorge Muñoz
Programa en el cual un robot luego de encontrarse a la orilla de una mesa cuenta la altura que hay desde su posición hasta el piso, guardando los datos en un arreglo para luego llevar estos registro a un archivo txt.
#define Distancia_mesa 10 // define la distancia entre el sensorUS y la mesa
int Altura[5]; // arreglo que guardara la medida del precipicio
int i=0; // declara la variable i
int k=0; // declara la variable k
int a=0; // declara la variable a
byte punteroarchivo; // declara la variable punteroarchivo
string cadena; // declara la variable cadena
byte bytesescritos; // declara la variable bytesescritos
int aumenta; // declara la variable aumenta
string escri="Abismo"; // declara la variable escri="Abismo"
string nun; // declara la variable nun
string raya=" ="; // declara la variable raya=" ="
int tamano; // declara la variable tamaño
string leer; // declara la variable leer
mutex dejar; // declara la variable dejar
sub GuardarDatos() // subrutina que guarda el archivo
{
CreateFile("reporte.txt",tamano,punteroarchivo); // crea el archivo
WriteLnString(punteroarchivo, "REPORTE PITFINDER", bytesescritos);
aumenta++;
nun= NumToStr(aumenta);
cadena=NumToStr(Altura[k]);
cadena= escri + nun + raya + cadena;
WriteLnString(punteroarchivo, "--------------------", bytesescritos);
for(k=0;k<ArrayLen(Altura);k++) // for para guardar los arreglos
{
WriteLnString(punteroarchivo,cadena,bytesescritos);
} //fin for
CloseFile(punteroarchivo);
} //fin subrutina GuardaDatos
sub Guarda_altura() // subrutina que guarda altura
{
Altura[i] = SensorUS(IN_2); // guarda la distancia en el arreglo
NumOut(0, i*10, Altura[i]); // imprimir la altura por pantalla
i++;
} //fin subrutina Guarda_altura
task avanzar () // tarea principal avanzar
{
while(i < 5)
{ // cuando la accion buscar se repita 4 veces
OnFwd(OUT_B,55);
OnFwd(OUT_A,80);
if(SensorUS(IN_2)> Distancia_mesa) // si la distancia es mayor a la mesa
{
a++;
Acquire(dejar); //aumentara en uno la variable i
Off(OUT_AB); // se apagaran los motores
Wait(2000); // esperara por 2 segundos
Guarda_altura();
TextOut(50,5,"Centimetros"); //en conjunto muestra el texto cm
NumOut(20,30,a);
TextOut(30,30,"Precipicio"); // muestra el texto 1,2,3 & 4 de precipicio
Off(OUT_AB); //mantiene los motores apagados
Wait(1500); // para mostrar los datos imprimidos
OnRevReg(OUT_AB,80,OUT_REGMODE_SPEED); //retrocede
Wait(2200); //por un segundo
OnRev(OUT_B,70); //realiza giro
OnFwd(OUT_A,90); // realiza giro
Wait(Random (100)+600); //random giro
Release(dejar);
} //fin if
} //fin while
int co=50;
bool val = false;
Off(OUT_AC);
GuardarDatos();
ClearScreen();
OpenFileRead("reporte.txt", tamano, punteroarchivo);
while (val == false)
{
if(ReadLnString(punteroarchivo,leer) != NO_ERR) val = true;
TextOut(LCD_LINE8,co,leer);
co= co-10;
Wait(500);
} //fin while
Wait(5000);
CloseFile(punteroarchivo);
} //fin tarea principal
task main() // main principal
{
SetSensorLowspeed(IN_2); // se inicia el sensorUS
Precedes(avanzar); //realiza las tareas
}
Video de la Actividad:
Reflexión
Esta actividad nos sirvió mucho para trabajar con el uso de arreglos y manejo de archivos, puestos que, estas herramientas fueron fundamental para el funcionamiento de nuestro robot y para la creación del código. Los nuevos conceptos adquiridos durante el desarrollo de este proyecto son de gran ayuda al estar programando.
Para que todo el equipo pueda adquirir por igual estos instrumentos de programación los primero que todo, es que debe haber un fuerte compromiso con el equipo de trabajo, ya que, si no hay interés de las cosas nada se puede lograr. Para enfatizar en ello, los integrantes del grupo deben estar dispuestos a ayudar, para que, así se lograra de gran forma la solución al problema.
Nuestros resultados durante la actividad fueron óptimos y precisos a la hora de trabajar, pues, mediante el trabajo bien distribuido y asignado, y dispuesto a estar en constante evolución, de los saberes de la programación. Se alcanza la solución al problema planteado.
Quedando como grupo muy conforme con la actividad desarrollada.
No hay comentarios:
Publicar un comentario