11 de marzo de 2013

Contador 00 a 99 con Arduino Mega

Cómputo Integrado

Aquí les dejo el material y código para la realización de un contador del 00 al 99 con Arduino Mega, es una implementación simple, y que posiblemente pueda ser mejorada.

Herramientas usadas

  • Arduino IDE en Ubuntu 11.10

Material utilizado

  • Cable para conexión USB
  • Arduino Mega
  • 2 displays de siete segmentos de cátodo común
  • 4 resistencias de 330 ohms
  • Cables para conexión

Código



Imágenes





Vídeo


7 de marzo de 2013

Actividad 5: Detección de Círculos

Laboratorio de Visión Computacional
Actividad 5

En la entrada de la clase para la detección de círculos con radio definido tuve algunos problemas al encontrar los centros de los círculos para después dibujarlos, pero encontré que usando las máscaras para determinar el gradiente que se vieron en clase fueron las que ayudaron a reconocer bien donde estaban los centros, ya que las máscaras que anteriormente estaba utilizando no eran muy buenas.

También el haber hecho por separado las imágenes con círculos empeoraba mucho la determinación del radio, ya que no solían ser exactos, y esto lo arregle haciendo una rutina en el mismo programa que crea una imagen con círculos de diferentes radios, y después esta imagen entra en la rutina de la detección de círculos, por supuesto sin darle como parámetros los radios a la función de detección.

Y en la parte de la detección de círculos para que no tardara tanto en la búsqueda de posibles centros puse un rango de tamaños corto, normalmente hace lo mismo si lo dejo buscando en rangos desde 1 hasta la altura de la imagen, pero por ahorrar tiempo al hacer las pruebas utilice un rango definido.

Aquí vemos como resultan las imágenes después de aplicar las nuevas máscaras.


La imagen original para una de las pruebas fue:


Y el resultado de la detección:


Enseguida el original y resultado de algunas pruebas.



No es muy preciso al encontrar los radios de los círculos, pero detecta bien los centros en su mayoría.

Código



Cada que el programa es ejecutado en terminal podemos ver la impresión de las posiciones aleatorias donde los círculos son creados, y después la impresión de donde encontró el programa que son los centros encontrados.


6 de marzo de 2013

Karp-Rabin Algorithm

Information Theory and Coding Methods
Extra Assignment

The Karp-Rabin algorithm is a string searching algorithm created by Michael Rabin and Richard Karp in 1987 that uses hashing to find any one of a set of pattern strings in a text.

For text of length m and p patterns of combined length n, its average and best case running time is O(m+n), but its worst case time is O(mn).

Arithmetic replaces comparisons


Definition: For a test string $T$, let $T^n_{r}$ denote the n-length substring of $T$ starting at character r. Usually, n is known by context, and $T^n_{r}$ will be replaced by $T_{r}$.

Definition: For the binary pattern $P$, let
$$H(P) = \sum^{i=n}_{i=1} 2^{n-1}P(i)$$ Similarly, let
$$H(T_r) = \sum^{i=n}_{i=1} 2^{n-1}T(r+i-1)$$
That is, consider $P$ to be an n-bit binary number. Similarly, consider $T^n_{r}$ to be an n-bit binary number.

Theorem: There is an occurrence of $P$ staring at position $r$ of $T$ if and only if $H(P) = H(T_r)$.

Code


I implemented the Karp-Rabin algorithm using python. I try to strictly follow the mathematical method, but it some confusing because in the mathematical method we know that the index 1 of the substring is the first element of it, but thinking in how write code for this, we need to change some parts because normally the indexes of a string or list of elements start at 0, so as we can see in the code, some parts doesn't seems to be the same that the mathematical method, but it happens because I use the indexes starting at 0, like python do regularly.

In the first code I am using the definitions mentioned above only for get the result of $H(P)$ and $H(T_r)$. The program asks for the value of $r$ at the beginning and then calculate the result of both.

If the $r$ value is the start position of an occurrence in the complete string, we will get the same result in both definitions.



And the next code shows the complete implementation of the algorithm, where I calculate the hash for $H(P)$, then in the iteration I compare if $H(P)$ is equals to $H(T_r)$, if it is true, I add the index in a list, and at the end the matching positions of the substring in the complete string are printed.



References:
Algorithms on Strings, Trees, and Sequences, Dan Guesfiel, pp. 77-80
Rabin-Karp String Searching

5 de marzo de 2013

Detección de Círculos

Visión Computacional
Tarea 4

Mi código es el mismo código que se vio en clase, solo que adaptándolo a la estructura que había estado llevando en las tareas anteriores, e incluyendo la parte para dibujar círculos encima de la imagen con ImageDraw. Pero aún tengo algunos problemas para detectar correctamente el círculo teniendo el radio definido dentro del código.

El problema puede estar en que el radio que ingreso manualmente en el código no es el correcto y por eso el programa se confunde, o que al momento de escalar la imagen para adaptarla a la ventana esta provoque que se desfacen los círculos de sus centros reales.

Les dejo las capturas de los intentos que realicé, y como pueden ver un problema más es que suele detectar centros de círculos donde no debería, pero la solución ahí podría ser cambiar la forma en que se suman los votos para los posibles centros y diferenciarlo de los centros detectados con mucho más votos que los demás.




Código


Este es el código actualizado, donde logré la detección de los círculos con radio conocido. Para poder lograrlo tuve que crear una rutina que crea los círculos por separado, y además cambié las máscaras para obtener el gradiente.


Así es la salida obtenida al correr el programa, sin la necesidad de algún parámetro adicional.


Referencias:
http://elisa.dyndns-web.com/~elisa/teaching/comp/vision/circulo.py

2 de marzo de 2013

Actividad 5: Simulación de Redes

Laboratorio de Redes de Telecomunicaciones
Actividad 5

Esta semana hicimos una simulación con el programa Network Simulator, que ofrece actualmente dos versiones estables, 2 y 3, conocidas mejor como NS-2 Y NS-3, con las cuales se pueden hacer simulaciones de redes.

La versión que yo he instalado es la NS-2 la cual he logrado instalar de dos formas distintas, la primera involucra escribir varios comandos en una terminal, y la segunda con los comandos de siempre para instalar paquetes en Ubuntu, en mi caso la versión 12.04.

Página del simulador: The Network Simulator: NS-2

Instalación


Estoy usando Ubuntu 12.04 versión de 64 bits para la instalación de este paquete. Veamos el método clásico para la instalación más reciente de este simulador, en este caso la versión 2.35.

Primero hay que descargar la carpeta comprimida de NS-2, de la siguiente liga: Descarga de ns-allinone-2.35.tar.gz

Una vez descargado, hay que asegurarse de que tenemos instaladas todas las actualizaciones:
~$ sudo apt-get update
Instalamos paquetes necesarios:
~$ sudo apt-get install build-essential autoconf automake libxmu-dev
Descomprimimos el paquete descargado:
~$ tar zxvf ns-allinone-2.35.tar.gz
Entramos a la carpeta creada:
~$ cd ns-allinone-2.35
Y una vez adentro ejecutamos el archivo install:
~/ns-allinone-2.35$ ./install
Si todo resulta bien, podemos entrar a la carpeta ns-2.35 y ejecutar el simulador ns:
~/ns-allinone-2.35$ cd ns-2.35
~/ns-allinone-2.35/ns-2.35$ ./ns
%
Cuando se despliega el signo % significa que ya estamos dentro de la consola interactiva del simulador. Se recomienda agregar el path de este comando al archivo .bashrc, para no tener que estar siempre dentro de la carpeta para ejecutar el simulador.

La segunda forma de instalación, que es la forma más fácil y rápida, se hace escribiendo y ejecutando las siguientes dos líneas:
~$ sudo apt-get install ns2
~$ sudo apt-get install nam
El último sirve para poder ver la simulación en la consola gráfica de nam. Cabe mencionar que con estos últimos comandos la versión que tendremos instalada es la 2.34, que parece funcionar bien.

Correr un programa en NS-2


Como sucede con varios lenguajes, por ejemplo python, es posible entrar en la consola de forma interactiva o ejecutar archivos con el código escrito.

Veamos un ejemplo desde la consola de forma interactiva. Esta sería una versión del clásico Hola Mundo.
ramon@pavilion:~$ ns
% set ns [new Simulator]
_o4
% $ns at 1 "puts \"Hola Mundo!\""
1
% $ns at 1.5 "exit"
2
% $ns run
Hola Mundo!
ramon@pavilion:~$
Inmediatamente despupes de escribir $ns run se ejecuta lo escrito e imprime el resultado.

La forma más habitual es escribir por separado el código en un archivo con la extensión .tcl, y ejecutarlo directamente en la consola.
ramon@pavilion:~$ ns ejemplo.tcl
Hola Mundo!
ramon@pavilion:~$

Simulación de prueba


Para ver como era el funcionamiento del simulador NS-2 junto con NAM busqué en Internet un ejemplo, para poder probar y entender que significa cada acción, así que de la siguiente liga descargue el ejemplo y lo probé.

Página de donde obtuve el ejemplo: Simple Simulation Example

El código descargado fue el siguiente, y como pueden ver es de gran ayuda ya que explica para que sirve cada línea:


La visualización del mismo es la siguiente.


Y claro, se ve muy bien la simulación pero que significa estos cuadros de color pasando de un nodo a otro. Bueno como podemos ver tenemos 4 nodos, el 0 envía paquetes mediante conexión TCP visualizados como cuadros azules, y el 1 envía paquetes mediante conexión UDP visualizados con cuadros rojos. EL nodo 2 los recibe y retransmite al nodo 3, donde el nodo 3 es el que, para el caso de los paquetes que vienen a través de TCP, envía una respuesta ACK hasta el nodo 0 cuando recibe estos cuadros azules. En el nodo 3 también podemos ver como se forma una cola por la llegada de muchos paquetes, y en el transcurso algunos de ellos se pierden, y se visualiza como cuadros grandes cayendo.

Cuando tenemos la visualización de la simulación en NAM se crean archivos de salida con el nombre de out.tr y out.nam, con un resumen de la simulación. Yo estoy usando el archivo out.tr porque la estructura del archivo es más entendible. Este archivo tiene las siguientes columnas:


Del resultado obtenido de la simulación obtuve los tiempos para poder conocer el tiempo que tardaba entre un paquete y otro, y después hice esta gráfica.


Una prueba más que hice fue calcular el número de paquetes enviados y recibidos mediante el protocolo TCP, y calculando la diferencia obtenemos el número de paquetes perdidos.


Referencias:
Instalar NS-2.35 en Ubuntu 12-04
Tutorial NS-2

1 de marzo de 2013

Actividad 5: Hardware y Software

Laboratorio de Cómputo Ubicuo
Actividad 5

Como actividad de esta semana se nos pidió hacer un catálogo de proveedores de hardware para el proyecto que tenemos pensado hacer en la clase de Cómputo Ubicuo, así como una lista de software libre para sistemas inteligentes, que nos pudiera ser de gran ayuda en la elaboración del proyecto.

Hardware necesario


En el equipo que estoy trabajando para el proyecto de esta clase, después de hacer el estudio de campo hemos decidido especificar los componentes electrónicos que usaremos en el desarrollo de nuestro proyecto. En seguida tenemos un listado de los componentes principales, sin mencionar componentes básicos como las resistencias y cables.
  • Arduino Bluetooth
  • Sensor de presión FlexiForce
  • Adaptador Phidgets para sensores Flexiforce

El catálogo de tiendas que contemplamos para la compra de estos componentes es muy diverso, pero preferimos optar por tiendas que residen en nuestra localidad, ya que nos permiten ahorrarnos el gasto de envío de productos y podemos tener un contacto directo con los vendedores de los mismos.

5Hz Electrónica


La primer tienda a considerar fue 5Hz electrónica, porque anteriormente ya he comprado componentes ahí y no he tenido ningún problema, además de que el trato siempre suele ser muy amable. Esta tienda tiene un amplio catálogo de productos, y venden componentes que se suelen usar en la mayoría de proyectos de cómputo integrado, y proveen placas de desarrollo como Arduino, además de varios kits de desarrollo para los que se inician en el ámbito de desarrollo.

Enlace: http://www.5hz-electronica.com/

De esta tienda ya se ha adquirido con anterioridad el Arduino Bluetooth del cual vamos a hacer uso en nuestro proyecto. Algunos compañeros del equipo ya han tenido experiencia en el uso del mismo, y se nos facilitará al momento del diseño físico e implementación.


Pero como actualmente no tenemos a nuestra disposición este producto, tenemos que asegurar una alternativa para el caso en que no consigamos que nos regresen este mismo, por lo que la alternativa es usar el Arduino Uno junto con el Módulo Bluetooth. El Arduino Uno ya lo tenemos asegurado, y solo sería de comprar el módulo faltante para obtener la misma función que el Arduino Bluetooth ya tiene consigo.

Arduino Uno


Módulo Bluetooth Mate


El Arduino Uno tiene un costo de 415 MXN (lo tenemos disponible), y el módulo Bluetooth tiene un costo de 580 MXN, lo cual genera un costo menor que comprar el dispositivo completo de Arduino con Bluetooth con costo de 1455 MXN.

Los otros dos componentes mencionados, y que también se venden en esta tienda son el Sensor FlexiForce y su adaptador, que juntos tienen un precio total de 495 MXN.


Steren

Otra de las tiendas que son habituales para nosotros, y que tenemos varias tiendas cercas de nuestros hogares, son Steren, en donde pensamos comprar los componentes electrónicos que hagan falta como resistencias, posibles push buttons, cables y más. Y por supuesto esto no es todo lo que venden, ya que también tienen un gran surtido en cuanto a electrónica, con la única excepción de que no venden ni sensores y tarjetas de desarrollo.

Enlace: http://www.steren.com.mx/


Sparkfun

Una tienda más que también contemplamos como opción alternativa fue Sparkfun, que tiene en venta también todos los componentes que necesitamos para el proyecto, con el único inconveniente que es una tienda que no se encuentra en México, pero es posible adquirir productos mediante envíos.

Enlace: https://www.sparkfun.com/


Mouser

Una tienda más por contemplar para compra de electrónica es Mouser, que de forma similar a Sparkfun, tienen una gran cantidad de electrónica, que va desde iluminación led, hasta tarjetas de desarrollo, sensores e inclusive productos de Texas Instruments.

Enlace: http://mx.mouser.com/


Software libre


En cuanto al software necesario para el desarrollo de nuestro proyecto, contemplamos plataformas que ya hemos usado anteriormente para el desarrollo de otros proyectos. Estas plataformas son las siguientes:

Eclipse y Android SDK

Utilizaremos el IDE de Eclipse junto con los paquetes para desarrollo de Android, ya que crearemos una aplicación móvil para la interacción con la alarma inteligente que vamos a desarrollar.


Arduino IDE

Y para la programación de la tarjeta Arduino, usaremos la plataforma Arduino IDE donde podemos crear los programas y posteriormente pasarlos a la tarjeta y poder probarlos.


En esta última plataforma se cuenta con librerías de libre uso proveídas por la página oficial de Arduino, y que pueden servir no solo a nuestro proyecto, si no también al de los demás, ya que proveen facilidad de comunicación entre los componentes que seguramente muchos utilizaremos.

Librerías para comunicación (networking y protocolos):
  • CmdMessenger - Para procesar mensajes de texto desde la computadora
  • PS2Keyboard - Lee caracteres de un teclado PS2
  • SSerial2Mobile - Envía mensajes de texto o emails usando un teléfono móvil (vía comandos AT a través de software serial)
  • Webduino - Librería de web server extendible (para usar con Arduino Ethernet Shield)
  • XBee - Para comunicaciones entre XBees en modo API
  • SerialControl - Para controlar remotamente otras Arduino a través de una conexión serial

Enlace a la página de librerías: Librerías para Arduino

Referencias:
http://www.5hz-electronica.com/
http://www.steren.com.mx/
https://www.sparkfun.com/
http://mx.mouser.com/