lunes, 14 de noviembre de 2011

Pitfinder

 Título de la Entrada : Pitfinder

Autor: Martin Berkhoff Jerez

Competencia (Nivel):
     Ciencias de la ingenieria 

Palabras clave: archivo, arreglo.

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 genera

  • 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)
Estrategia de trabajo

 Presentada la actividad, divisamos que la principal complejidad se encuentra en el almacenamiento de un arreglo en un archivo, haciendo uso de punteros. Si bien la implementación de arreglos no resulta ser la primera vez, se debe estudiar el como asignar los valores a este.

. En la busqueda de aclarar la implementación de un archivo, tanto su creación como escritura y lectura, dimos con varios manuales, en donde mediante ejemplos, se explicaba el uso de esta instrucción. Al ser esta actividad una de las más complejas de abordar decidimos dilatar la creación de código, hasta tener el resto de la actividad completa.

Aplicando Subrutinas realizamos el pseudocódigo de la búsqueda de Pit y el almacenaje de las mediciones hechas por el sensor de ultrasonido.

Una vez abordado el resto de tareas, guiandonos por ejemplos dimos con la creación de una subrutina capaz de crear un archivo en donde se almacenaran los datos del arreglo y posteriormente creamos una subrutina que pudiera mostrar por pantalla los datos del archivo.

El pseudocódigo es el siguiente:

Subrutina Mide()
{
. . . Almacenar en Arreglo valor del SensorUS
. . . Retroceder
. . . Giro Aleatorio
}

Subrutina TraspasaArchivo()
{
. . . Crear Archivo "profundidad.txt"
. . . Escribe linea "Rep. PitFinder"
. . . Escribe linea "------------------"
. . . Escribe linea "Precipicio ", NumeroPrecipicio, ValorArreglo
. . . Cierra Archivo
}

Subrutina MuestraArchivo()
{
. . . Abrir Archivo "Profundidad.txt"
. . . Recorrer Archivo
. . . {
. . . . . . Leer Linea Puntero
. . . . . . Mostrar Linea
. . . }
}

Tarea Main()
{
. . . Mientras(i<4)
. . . {
. . . . . . Avanza
. . . . . . Si SensorUS > Suelo
. . . . . . {
. . . . . . . . . Apaga Motores
. . . . . . . . . Mide()
. . . . . . }
. . . }
. . . TraspasaArchivo()
. . . MuestraArchivo()
}

Una ves terminado eso, espesamos a implementar la programación en NXC quedando finalmente así:

Código fuente:

int Prof[4];  //Arreglo para almacenar dato
int i=0;
int j=0;
int k=0;   //i,j,k variables usadas para el arreglo y almacenamiento.
int l=6;  //permite mostrar 6 lineas del archivo.
int gr=0;  //usada para giro random
#define SUELO 20  //definido como la distancia máxima entre el sensor y suelo antes de considerar un pit.

sub Mide()
{
     Prof[i] = SensorUS(IN_2); //profundidad almacenada en arreglo
     i++;
     OnRev(OUT_AC,40);
     Wait(800);  //retrocede 
     gr=Random(500)+200;
     OnFwd(OUT_A,75);
     Wait(gr);
     OnRev(OUT_C,75);
     Wait(gr);
} // subrutina que calcula y almacena la profundidad

sub TraspasaArchivo()
{
    byte fileHandle;
    short fileSize;
    short bytesWritten;
    string read;
    string write;
    DeleteFile("Profundidad.txt"); //para borrar el archivo si es que fue creado antes
    CreateFile("Profundidad.txt", 512, fileHandle); //creación de archivo
    WriteLnString(fileHandle,"REP. PITFINDER", bytesWritten); //escribe una linea al archivo
    WriteLnString(fileHandle,"--------------", bytesWritten);
    for(j=0; j<i; j++ )
    {
        string tmp = NumToStr(Prof[j]);
        string numprecipicio = NumToStr(j+1);
        write = StrCat("Precip. ",numprecipicio, ">", tmp ,"cm");
        WriteLnString(fileHandle,write, bytesWritten);
    } //recorre el arreglo y lo almacena en un archivo
    CloseFile(fileHandle);
} //usada para almacenar el arreglo en un archivo

sub MuestraArchivo()
{
    byte fileHandle2;
    short fileSize2;
    short bytesWritten2;
    string texto;
    OpenFileRead("Profundidad.txt", fileHandle2, bytesWritten2);
    for(k=0; k<6; k++)
    {
        ReadLnString(bytesWritten2, texto);
        TextOut(0,l*10,texto);
        l--;
    }//escribe de arriba hacia abajo 
    Wait(4000); //tiempo por el cual se muestra el archivo.
}

task main()
{
     SetSensorLowspeed(IN_2);
     while(i<4)
     {
               OnFwd(OUT_AC, 40);

               if  (SensorUS(IN_2) > SUELO) //si el sensor recibe una distancia mayor a suelo
               {
                   Off(OUT_AC);
                   Mide();
               }
     }
     TraspasaArchivo();
     Off(OUT_AC);
     MuestraArchivo();
}

El video de la actividad :


Reflexión 

El armado de el robot fue sencillo, porque este solo tenia que tener el armado básico mas un sensor ultrasonido para medir las distancias. Por eso no hubieron mayores inconvenientes al realizar el armado de el robot.

Con respecto al código, en un principio nos costo un poco generar de buena manera el archivo, por un tema de poca costumbre ya que era algo relativamente nuevo para nosotros. Pero finalmente generamos bien el archivo siendo esto una tarea que tampoco dio mayor complejidad.

En términos generales fue una actividad bastante sencilla aprendimos bastante, como guardar todos los datos en el arreglo mostrarlos luego en el archivo etc.




Movimiento Rectilineo Uniforme

 Título de la Entrada : MRU

Autor: Martin Berkhoff Jerez

Competencia (Nivel):
      Implementa y opera con modelos matemáticos de la ingeniería y de las    
      ciencias básicas, que contribuyan al mejoramiento de procesos vinculados a   
      los problemas de las ciencias de la ingeniería     
      Nivel: Opera con modelos matemáticos de la ingeniería y de las ciencias básicas.

Palabras clave: MRU, aceleración, velocidad.

Descripción de la actividad:

Los materiales que se usaron para el desarrollo de la actividad está compuesto por un 
robot programable NXT, código NXC  desarrollado por el profesor encargado de la actividad, un 
equipo computacional encargado de comunicador entre el grupo que desarrolla la actividad y el 
robot, una superficie ya demarcada con cinta negra, huincha de medir, calculadora y un software 
de planillas para ingresar los datos y graficar.
Con el fin de obtener los objetivos se plantearon 4 actividades. La primera era identificar la 
ecuación de MRU y velocidad para una potencia de programación determinada, para esto se usó la 
superficie plana marcada con cintas negras, las cuales estaban distanciadas a 0,35[m] una de otra. 
Además de un código NXC, entregado por el profesor.  Este código permitía ver en pantalla el 
tiempo que demoraba el robot en cruzar entre cada línea a una velocidad constante.


Solución:


Ejecutado el programa se obtuvieron los siguientes datos:

 
Gráficamente se obtiene: 


Mediante este gráfico se puede obtener la ecuación de itinerario, que está dada por x(t) = vt 
+ x0, siendo para este caso particular x(t)=0,2869t+0,0023 [m] la que nos entrega la velocidad en 
función del tiempo (0,2869t) y la posición inicial (0,0023), esta posición inicial pude interpretarse 
como un error en el calculo, pues se considera como posición inicial la primera cinta negra, sin 
embargo al ser una cantidad tan pequeña, en comparación a la escala del experimento, ésta es
despreciable.
Obtenida esta ecuación de itinerario, es posible determinar la posición del robot para 
cualquier instante de tiempo t, dando paso a la segunda actividad. A modo de verificar esta 
ecuación, se dio un tiempo t=10[s], para este tiempo reemplazamos en la ecuación de itinerario y 
vemos que:
                                                    x(10)=0,2869*10+0,0024 [m]
                                                    x(10)=2,8714 [m]

Esto significa que el robot avanzara 2,9 [m] aprox. En un tiempo de 10 segundos, lo cual 
fue demostrado implementando en el código NXC el tiempo deseado.

Para el desarrollo del cuarto objetivo se usó un código NXC, en el cual el robot avanzaba a 
una velocidad inicial constante, pero que a medida que avanzaba el tiempo se incrementaba la 
potencia para simular un incremento de aceleración, nuevamente el robot entregaba en pantalla 
tiempos cuando pasaba sobre las cintas negras


Al Gráficamente se obtiene: 


Mediante este gráfico se puede obtener la ecuación de itinerario considerando la 
aceleración, esta ecuación está dada por x(t)=0,5 at2 + v0t + x0 ,para este caso en particulares debe considerar que la expresión 0,0116 t2 considera a la aceleración y la multiplicación por la constante  0,5, quedando la aceleración en 0,0232 al ser despejada. Quedando finalmente como :
                                                   x(t)=0,5*0,0232*t2+ 0,0636*t + 0,0018.

Al igual que el caso anterior, el programa reconoce una posición inicial, pero al ser una 
cantidad pequeña en proporción al ejercicio, ésta es despreciable


Reflexión 

El implementar la teoría a la práctica presenta muchas complicaciones, pues en la física se 
trabaja sobre condiciones ideales inexistentes, pero que acercan mucho sus resultados a la 
realidad. Para el caso del MRU resultó práctico que con tan solo la recolección de tiempo por parte del robot se llegara a la ecuación de itinerario apoyado por la medición de distancias. Y a raíz de esto obtener la velocidad.

Para el caso de MRUA, al tener conocimiento de los valores pertinentes de la velocidad 
inicial y aceleración es posible determinar la posición para cualquier instante de tiempo.






Programacion

Título de la Entrada : Buscador de números amigos

Autor: Martín Berkhoff Jerez

Competencia (Nivel):
      Implementa y opera con modelos matemáticos de la ingeniería y de las    
      ciencias básicas, que contribuyan al mejoramiento de procesos vinculados a   
      los problemas de las ciencias de la ingeniería     
      Nivel: Opera con modelos matemáticos de la ingeniería y de las ciencias básicas.

Palabras clave: For, if, ciclos

Descripción de la actividad:

 Crear un programa que ingresemos dos números  y verificar si estos son amigos.
¿A que se refiere que sean amigos?, a que si la suma de todos los números divisores de el sean A iguales a el segundo numero ingresado B , y que la suma de todos los números divisores de B sean iguales a el número A

Solución: 


      Ingresamos dos números cualquiera de tipo INT, y dos contadores:




Luego creamos dos ciclo que dividiera todos los números menores que A hasta que sea la mitad de el mismo numero, para así buscar los divisores de A hasta la mitad.


Dentro de cada ciclo preguntamos si el numero que esta dividiendo A y B es divisor de el, si lo es lo guardamos en un contador, este mismo ira sumando todos los números divisores de A y B.

Después de tener los divisores sumados de A y B preguntamos si estos son amigos o no, esto lo hacemos de la siguiente manera:


Si el contador de A es igual al numero de B     Y  el contador de B es igual al numero de A, nos dirá por pantalla que son amigos. En caso de que esto no sea así nos mostrara por pantalla que no son amigos.



Reflexión :
Es importante aprender lógica matemática para poder programar de buena manera, y optimizar cada ves mas  los programas.

domingo, 13 de noviembre de 2011

Título de la Entrada : Proyecto Robotica

Autor: Martin Berkhoff

Competencia (Nivel): Gestión de TI

Palabras clave: android, app inventor, lenguaje NXC

Descripción de la actividad:

Dirty Lock, el nuevo sistema de seguridad; que con su novedosa tecnología mantendrá seguras nuestras viviendas, aplicando novedosas tecnologías: app inventor, bluetooth, lego mindstorm , programación en nxc y twitter. Una nueva herramienta que nos permitirá dejar una de las más comunes de las preocupaciones: la seguridad de nuestras viviendas.
El desarrollo de este sistema de seguridad fue pensado de manera estricta y rigurosa para que bajo ningúna circunstancia se pueda vulnerar la seguridad de nuestros hogares.
¿Cómo logramos esto?:
Hacer un sistema de seguridad de este tipo toma tiempo; pero aquí podrán ver el proceso, paso a paso de la creacion del sistema de seguridad DIRTY LOCK.

Solucion y Estrategia de trabajo:

Al comenzar el Proyecto tuvimos la claridad de lo que queríamos hacer como proyecto, esto nos llevó como grupo a dividir las funciones: 

Lo primero, luego de dividir el trabajo, fue pensar en las tecnologías que tenemos a nuestro alcance para poder hacer un eficiente sistema de seguridad.
Aquí seleccionamos básicamente cuatro tecnologías, sin contar los sensores: twitter, bluetooth, app inventor y lenguaje nxc. 


APP INVENTOR: Es una parte de Google Labs, un parque infantil para lo ingenieros de Google y aventureros usuarios de Google, con este programa para celulares Android es posible crear muchos tipos de aplicaciones; Con app inventor es posible crear aplicaciones que quedaran guardadas en la nube.
Para mas informacion ir a esta pagina http://www.appinventor.es/ aquí encontraran video de presentacion, tutoriales y manual de como descargar app inventor.


Creación de el software en app inventor:

La aplicación que logramos hacer pudo conectarse con el nxt via bluetooth y coordinar acciones mediante sensores. Esta es la base de la aplicación, cada ves que cualquier tipo de sensor detecta algo, la aplicación enviaba un twitter dando cuenta de que el sensor estaba activo, este también podia llamar a la persona dueña del hogar si esto era necesario; o si el nivel de alarma que marcaron los sensores era demasiado alto.
El uso de los sensores está especificado en el anexo de lego mindstorm. Como también la programación en nxc.
Aquí les presentamos imágenes de el programa junto con la aplicación en el celular android.

Asi queda finalmente la aplicación, donde los botones cambian de color según sea la alerta.



Creación de la interfaz de la aplicación, es sólo la interfaz app inventor


Aquí podremos crear la interfaz, osea arrastrar ventanas, imágenes textos, sonidos y muchas cosas mas.


Ahora les mostrare el interior o lo que no se ve que es la programación de todo lo que pusimos gráficamente, donde le damos la funcionalidad al sistema de alarma.



En paralelo nuestro sistema de seguridad utilizando las tecnologias: Lego mindstorm y programacion en nxc, registra y genera un archivo de todas las actividades sospechosas que ocurren en el transcurso de la noche o en el tiempo que el usuario considere dentro de su hogar, ya sea forzar la puertas o ventanas, movimientos dentro de su casa y sonidos sobre lo normal.

Uso de sensores: Utilizamos del quit de legos mindstorm los siguientes sensores: Sensor de Sonido, encargado de detectar los sonidos que sean poco comunes. Sensor tacto, este cuida las puertas y ventanas del hogar y también verifica si estas se abren. Sensor Ultrasonido, encargado de ver si algo se mueve dentro de el hogar.

Aquí esta el código comentado que genera un informe de todos los eventos que verifican los sensores, mientras la alarma este ativa:


/Simulación de un sistema de seguridad en un hogar




int verConexion;   //1 activo desconectado, 3 activo conectado
int evento[16];   //arreglo para almacenar tipo de evento
int tiempo[16];  //almacena el tiempo transcurrido desde inicio
int tiempoInicial;
int tiempoTranscurrido;
int j=0;
int i=0;
int muevemotor=0;

#define SONIDO 97
#define DISTANCIA 50

sub traspasaArchivo()
{
    byte fileHandle;
    short fileSize;
    short bytesWritten;
    string write;
    string cadena;
    DeleteFile("Registro.txt");
    CreateFile("Registro.txt", 512, fileHandle);
    WriteLnString(fileHandle,"Reporte de eventos", bytesWritten);
    WriteLnString(fileHandle,"------------------", bytesWritten);
    WriteLnString(fileHandle,"Sensor",bytesWritten);

    for(j=0; j<i; j++ )
    {
        if(evento[j]==2)
        {
           cadena = "Puerta";
        } 
        if(evento[j]==3)
        {
           cadena = "Ventana";
        }
        if(evento[j]==1)
        {
            cadena = "Ruido";
        }
        if(evento[j]==4)
        {
            cadena = "movimiento";
        } // depedendiendo del valor de evnto[j], se identifica la procedencia del evento
        string tiem = NumToStr(tiempo[j]);
        write = StrCat(cadena,"     ",tiem); //concatena tipo de evento con el tiempo de éste
        WriteLnString(fileHandle, write, bytesWritten);
    }

    CloseFile(fileHandle);
    StopAllTasks(); //cierra todo proceso
} //sub rutina para crear archivo

sub llenaarreglos(int x, int y)
{
    evento[i] = x;
    tiempo[i] = (y - tiempoInicial)/1000;
    i++;
    if(i==10)
    {
        traspasaArchivo();
    }//el valor de if, puede ser cambiado en función de la cantidad de eventos a registrar.
}//subrutina para llenar arreglos, si eventos es 10, llama a subrutina para crear archivo

task conexion()
{
    while(true)
    {
        verConexion = BluetoothState(); //verifica estado bluetooth y almacena en variable
        if(verConexion==1) //si estado es 1
        {
            PlayTone(400,400); //toca ruido
            TextOut(0,0,"BA - MD"); //muestra en pantalla Bluetooth Activadp- Movil Desconentado
            Wait(1000);
        } 
        if(verConexion==3)
        {
            TextOut(0,0,"BA - MC"); //Muestra en pantalla Bluetooth Activado-Movil Conectado
        }
    }
}//tarea muestra en pantalla estado conexión.

task sensorSonido()
{
    while(true)
    {
        if(SENSOR_1>SONIDO)//si ruido es mayor a SONIDO
        {
            tiempoTranscurrido = CurrentTick();//toma el tiempo actual y almacena
            llenaarreglos(1,tiempoTranscurrido);//se envian parametros a subrutina llenaarreglo
        }
        Wait(300);
    }
}//tarea detecta ruidos

task sensorTacto1()
{
    while(true)
    {
        if(SENSOR_2 == 0) //Si se abre puerta
        {
             tiempoTranscurrido = CurrentTick();//toma el tiempo actual y almacena
             llenaarreglos(2, tiempoTranscurrido);//se envian parametros a subrutina llenaarreglo
        }
        Wait(300);
    }
}//tarea detecta apertura puerta

task sensorTacto2()
{
    while(true)
    {
        if(SENSOR_3 == 1) //Si se abre ventana
        {
             tiempoTranscurrido = CurrentTick();//toma el tiempo actual y almacena
             llenaarreglos(3,tiempoTranscurrido);//se envian parametros a subrutina llenaarreglo
             if(muevemotor==0)//si el motor nunca se ha movido
             {
                 OnFwd(OUT_A,60);//mueve motor
                 Wait(150);
                 Off(OUT_A);//apaga motor
                 muevemotor=1;//se movio el motor
             }//usado para simular el encendido de un interruptor
        }
        Wait(300);
    }
}//tarea detecta apertura ventana

task sensorUltraS()
{
    while(true)
    {
        if(SensorUS(IN_4) < DISTANCIA)
        {
            tiempoTranscurrido = CurrentTick();//toma el tiempo actual y almacena
            llenaarreglos(4,tiempoTranscurrido);//se envian parametros a subrutina llenaarreglo

        }
        Wait(300);
    }
}//tarea detecta movimiento 


task main()
{
    SetSensorSound(IN_1);
    SetSensorTouch(IN_2);
    SetSensorTouch(IN_3);
    SetSensorLowspeed(IN_4);
    tiempoInicial=CurrentTick();//inicio de tiempo.
    Precedes(conexion,sensorSonido,sensorTacto1,sensorTacto2,sensorUltraS);
}


Aquí adjunto el vídeo de el trabajo:



conclusión 
El presente trabajo nos ha permitido implementar un sistema de seguridad, mediante la utilización de herramientas de la informática como lo son : app inventor, lenguaje nxc, bluetooth.
Para la creacion de una aplicación en android y la programacion en nxc.
Durante el proceso de investigacion fue necesario aprender sobre la creacion de archivos y arreglos en nxc y la programacion en app inventor. En este ultimo fue necesario buscar guias y tutoriales para poder aplicar una programacion adecuada a los requerimientos del equipo.
El trabajo en grupo no permitió avnazar sumando los aportes de cada uno de los integrantes, no obstante a medida que avanzabamos en el proceso se nos fueron presentando dificultades que nos llevaron a nuevas interrogantes, a la búsqueda de mayor información, a la consulta de nuevas fuentes de tal modo que el avanse se vio enrriquecido por el aprendizaje.
El resultado final de este proyecto, permite ver un sistema de Resguardo o de seguridad, funcionando a través de un equipo de tefelonía celular, con sistema Android en conjunto con la programación nxc y con la posibilidad de dar seguimiento de los eventos vía Twitter.