Patricio Aros

xd

lunes, 14 de noviembre de 2011

Proyecto Robotica - PitFinder

Autor: Patricio Aros Erices
Competencia: Gestión en tecnologias de la información(Nivel 1)

Sinceramente uno de los proyecto que desde mi punto de vista fue de gran utilidad y podria llegar a serlo en la vida real, ya que no se ve tan dificil de sacar de la maqueta para convertirlo en un proyecto, e incluso es posible que ya se encuentre, no obstante, el aprendizaje dejado y la cantidad de sentencias nuevas creadas, creo que subio un poco el nivel de conocimientos que poseiamos.

Prototipo de lo que realizaría el robot
Este proyecto, era a simple vista fácil, pero no lo fue, dentro del codigo implementado en este programa, se tubo que crear arreglos, guardar datos en un archivo y mostrar este mismo archivo por pantalla de ladrillo. El objetivo principal del robot era que tenia que registrar las distintas distancias de los acantilados, la maqueta no poseia los bordes asi que es aqui donde hacemos llamar acantilado dentro de el contexto.Al momento de llegar al acantilado el robot debia detenerse, guardar la altura en un arreglo girar de manera aleatoria y dirigirse hacia otro lado, esto debia realizarlo un numero determinado de veces. A continuacion unas imagenes para demostrar de manera mas didactica lo escrito.





 A continuación un pequeño pseudocodigo de lo que debia hacer, sólo en algunas partes difiere del codigop debido que tubimos que reestructurarlos por sentencias nuevas y por lo que se pedia especificamente en la actividad

Declaramos nuestras variables;
Sub ARCHIVO(){
Crea un archivo;
Guarda las cadenas en nuestro archivo;
para precipicios sea <= 4 {
precipicios++;
Transforma cantidad de precipicios a estring;
Transforma el arreglo[precipicos] a estring;
Junta los String creando una nueva cadena;
Guarda la nueva cadena;
}
Cierra el archivo;
}
Sub Guarda_Distancia(){
Guarda las alturas en un arreglo[a];
Muestra en pantalla la altura registrada;
Aumenta en 1 la variablea a para guardar en el siguiente arreglo;
}
Tarea Recorrido(){
Mientras (alturas sea<=4){
Avanzar;
Si (sensor de proximidad > 20){
Apagar motores;
Esperar 1 segundo;
Llamar sub GUarda_Distancia();
Retroceder durante 1,20 segundos;
Girar aleatoriamente;}
}
Apagar motores;
Llama sub Archivo();
Limpia la pantalla;
Abre nuestro archivo;
Revisa que todo este correcto;
Si (es correcto?)
Imprime en pantalla;
Espera 5 segundos;
Cierra el archivo;
}
Ejecutar programa(){
Llama las tarea(Recorrido);
Activa sensor de proximidad();
}

El codigo fuente es el siguiente:


Código Fuente:

//Declaramos las variables que ocuparemos.
int Distancia[4];
int a=0;
int i=0;
int j=0;
int num=0;
string linea="=>";
string nums;
byte puntero;
string cadena;
byte bytesEscritos;
mutex Mult;
string leer;
int bit=512;
string Dis="Distancia ";
sub Archivo()
{
    DeleteFile("Reportefinder.txt"); //Borra el archivo para actualizar los datos
    CreateFile("Reportefinder.txt", bit, puntero); //Creamos un archivo con un tamño de 512 bytes
    WriteLnString(puntero, "ReporteDistancia", bytesEscritos);// guardamos una cadena en nuestro archivo
    WriteLnString(puntero, "--------------------", bytesEscritos);
    for(j=0; j < ArrayLen(Distancia); j++)// for en el cual hace que se realize 4 veces
    {
     num++;// cuenta los precipicios
     nums= NumToStr(num);//Transorme la cantidad de precipios a String.
     cadena = NumToStr(Distancia[j]); //Transforma la altura obtenida en String
     cadena =  Dis + nums + linea + cadena; //Junta todas las cadenas
     WriteLnString(puntero, cadena, bytesEscritos);// Guardamos la cadena creada el archivo.
    }
 CloseFile(puntero);// Cerramos el archivo creado.
}
sub Guarda_Distancia()    //subrutina donde guardaremos la cada una de las alturas.
{
Distancia[a]=SensorUS(IN_3);  //Guardamos altura
NumOut(0,10*a,Distancia[a]);  //Imprimimos en pantalla
a++;  // aumentamos a para guardar la nueva altura en el siguiente arreglo
}
task Recorrido()  //Tarea recorrido
{
while (i<4)    //Mientraas i sea <a 4 realizar:
{
 OnFwd(OUT_AB,50); // Avanzar a potencia 50
 if (SensorUS(IN_2)>20)// si el sensor de proximidad  es mayor a
 {
  i++; // aumentar en uno i
  Acquire(Mult);
  Off(OUT_AB); //Apagar motores
  Wait(1000);  //Esperar 1 segundo
  Guarda_Distancia();// Llamar sub rutina
  OnRev(OUT_AB,40); // Retroceder
  Wait(1200);  // Durante 1,2 segundos
  OnFwd(OUT_B,20); //girar en una forma aleatoria
  OnRev(OUT_A,20);
  Wait(Random(280)+380);
  Release(Mult);
 }
}
int coordenada=50; //Cordenadas de la pantalla
bool fals = false; //Variable booleana
Off(OUT_AB);  //Apagar motores
Archivo();    //Llamar subrutina archivo
ClearScreen();//Limpiar pantalla
OpenFileRead("Reportefinder.txt", bit, puntero); //Abrir el archivo guardado y agregar datos
while (fals == false){ // Leer el archivo de texto hasta el final
if(ReadLnString(puntero,leer) != NO_ERR) fals = true;//si la linea leida es distinta a NO_ERR falsa es verdadero
TextOut(LCD_LINE8,coordenada,leer);  //Imprime en pantalla
coordenada= coordenada-10; //cambia las coordenadas de impresion.
Wait(500);}
Wait(5000);//Espera 5 segundos
CloseFile(puntero); //cierra el archivo
}
task main()//conmienza a funcionar nuestro programa.
{
Precedes(Recorrido);//Llama las tareas
SetSensorLowspeed(IN_2);//se activa el sensor e proximidad.
}

Y para finalizar lo con respecto al proyecto una pequeña muestra del video, que fue grabado mientras se ejecutaba este codigo y como trabajaba el robot sobre la maqueta.

Reflexion

Lo que desarrollo en mi esta actividad fue un tanto el hecho de poder integrar nuestros conocimientos en algo que hoy en dia mucha gente practica y es el montañismo, con un robot de este tipo se podria verificar zonas y acantilados para poder realizar una subida mas segura y por caminos mas confiables, ademas de partes donde el humano ya pierde o puede perder el sentido debido a la presion del aire, dejando claro que no es un proyecto sólo por trabajar sino uno que puede usarse para implementarlo en situaciones reales para problemas y/o motivos de investigacion.

0 comentarios:

Publicar un comentario