sábado, 19 de junio de 2010

Lego 8297 Off Roader (I): Contenido

Pues de tanto mirar y mirar videos de youtube, al final pasa lo que pasa, que se te ponen los dientes largos, se te calienta la cabeza, y te compras cosas.

Mi último juguetito es, ni más ni menos, que el Lego 8297: Off Roader.

Aquí os dejo unas fotos de la caja, y del contenido.













He de decir que he estado alucinando sólo con la caja. Así que no sé qué pasará cuando la abra.

lunes, 10 de mayo de 2010

Semáforo con Arduino

Hoy os voy a contar un muy, pero que muy simple proyecto que he realizado con Arduino.

Ya he utilizado resistencias, la placa de prototipado, algún cable y, aprovechando que tengo un emisor rojo, otro amarillo y otro verde ... pues he hecho un pequeño semáforo.

Aquí os dejo un vídeo, digno de varios Óscar, donde se ve el semáforo en funcionamiento.





El código fuente del programa, está también aquí, como se puede ver es muy sencillo y creo que tampoco necesita mucha explicación.


int pinRojo = 4;
int pinAmarillo = 3;
int pinVerde = 2;

void setup(){
pinMode(pinRojo, OUTPUT);
pinMode(pinAmarillo, OUTPUT);
pinMode(pinVerde, OUTPUT);
}


void loop(){
digitalWrite(pinRojo, HIGH);
delay(1000);
digitalWrite(pinRojo, LOW);
delay(1000);

digitalWrite(pinAmarillo, HIGH);
delay(1000);
digitalWrite(pinAmarillo, LOW);
delay(1000);

digitalWrite(pinVerde, HIGH);
delay(1000);
digitalWrite(pinVerde, LOW);
delay(1000);
}



Para el próximo día, un semáforo con interruptores.

lunes, 3 de mayo de 2010

Hola Mundo u Hola LED

Hoy voy a dar mi primer paso con Arduino. Al parecer para iniciarse en este mundo, tenemos un Hola mundo!, pero a lo Arduino, y con un diodo emisor de luz. Voy a seguir los pasos de este tutorial, que iré comentado con las cosas que me encuentre.

A mano todo lo importante

Lo primero que necesitamos es obviamente un Arduino, yo tengo un Duemilanove, así que a partir de ahora, mis referencias a Arduino, son en realidad a Arduino Duemilanove.

También hace falta un cable USB, de conector A a B. El que viene con nuestro Lego(c) MindStorms, sirve perfectamente. Esto es para conectar el Arduino con el ordenador.

Y por último hace falta el entorno de desarrollo de Arduino, que se puede descargar desde aquí. Sigo pendiente de volver a instalar mi distribución GNU/Linux favorita, Gentoo, así que voy a comentar todo sobre un Microsoft Windows XP SP3. Es un fichero zip, que descomprimimos donde queramos y hay que ejecugtar arduino.exe. Es una aplicación java, así que hay que darle tiempo. Ahora podemos ver una pantalla que tengo la impresión que se me va a hacer muy familiar dentro de poco.

Conectado Arduino a un ordenador por primera vez

Conectamos el Arduino con el cable USB y a Windows le da un jamacuco intentando reconocer el hardware, pero no hay problema. Le damos a buscar los controladores por nuestra cuenta y seleccionamos el directorio drivers del zip que hemos descomprimido en el paso anterior.

Ahora muy importante, que a mi no me funcionó nada la primera vez por esto, es configurar el puerto donde está escuchando el Arduino y que tipo es la placa.

Para ello nos vamos al menú TOOLS -> BOARD y seleccionamos la que tengamos.

Y ahora en el menú TOOLS -> SERIAL PORT. Ahora viene la gran pregunta ... ¿en qué puerto tengo conectado el Arduino?, truquele fácil, enchufamos el Arduino y vemos la lista de puertos disponibles, desenchufamos el Arduino y vemos cuál ha desaparecido ... ese será nuestro puerto.

Darle al play

Ahora viene la parte más fácil. En el menú seleccionamos FILE -> OPEN y buscamos en examples/digital/blink el fichero blink.pde. Vemos que un código se ha cargado en la pantalla principal del editor.

Ahora, con el Arduino conectado pinchamos en el botón de upload, que es como el de play y si todo ha ido bien ... veremos a nuestro Arduino haciendo lo siguiente.





Si algo ha fallado, nos toca buscar en este enlace.

Por hoy ya he tenido suficiente. Al próximo día más y mejor. Hay muchos tutoriales y vídeos por internet donde se pueden encontrar ideas interesantes. De momento no tengo nada definido de cual será mi siguiente paso

Arduino: entre mis manos

Hoy por fin he podido recoger mi Arduino Duemilanove. Una vez más el servicio de FunGizmos ha sido muy bueno, correcto embalaje y protección de todo lo pedido y en un tiempo más que razonable.

Aquí os dejo algunas fotos de mi nuevo juguetito y de cómo ha venido. Una vez más, un diez para FunGizmos

Podeis ver que a parte he pedido también algunas resistencias, unos interruptores y unos diodos emisores.




Tampoco tiene mucho sentido contar cosas de un Arduino en un blog sobre Lego(c) MindStorms, pero como el objetivo es que en un futuro, todo esté dentro del mismo saco ... Además así tiene más actividad el blog.

¡ El arduino ! ¡Qué viene!. Tenía que hacer la gracia, lo siento. En breve mi primera aventura y espero que no desventuras.

lunes, 5 de abril de 2010

WiiChuck

Navegando por internet, que es una fuente inagotable de ideas trastear con nuestro Lego(R), me he encontrado con los siguientes enlaces, que vienen a tratar todos más o menos de lo mismo.





Resumen: se puede conectar el Nunchuck de Nintendo a NXT para controlarlo con el joystick y también servir de sensor de aceleración.

* Enlace al vídeo anterior en youtube
* http://forums.nxtasy.org/index.php?showtopic=3075
* http://www.hispalug.com/foro/index.php?topic=9882.0

En el segundo y tercer enlace, que la verdad, pongo como obligada lectura, se explica como conectar el nunchuk al nxt. Un foro en inglés, y otro en castellano. De todo un poco.

Aquí me pongo como objetivos:

* Aprender a utilizar el i2c (algo bastante general)
* Hacer con un Nunchuck un sensor para nuestro Lego (ejemplo concreto de lo mencionado anteriormente)

Ni corto ni perezoso he pedido un WiiChuck Adapter por internet. No tengo acciones de ninguna tienda ni me llevo beneficios, pero como la experiencia con Fungizmos ha sido muy buena, os la voy a comentar.

El WiiChick Adapter es, hablando un poco en plata, una pequeña placa que permite conectar un NunChuck a un cabezal de cuatro. Y luego ya se puede conectar este cabezal a cualquier invento electrónico que se nos venga a la cabeza, como por ejemplo, un Arduino

La pieza que pedí fue la siguiente. Se pudo pagar con PayPal, tuve tan sólo un dolar de gastos de envío y llegó en tres días, desde Estados Unidos a España. Experiencia 100% recomendable y asequible para bolsillos en crisis, 3,75 euros en total.

Aquí os dejo unas fotos de cómo vino embalado y del adaptador en cuestión.









Como se puede ver, no se han gastado mucho en embalaje, pero es que el producto, tampoco lo requería. Ha sido enviado por correo ordinario.











El adaptador es bastante pequeño, parece muy poca cosa, aunque espero que dé mucho juego a la hora de la verdad







Y poco más puedo contar de este nuevo juguetito de momento. Dentro de poco espero poder trastear un poco más con él y escribir la crónica de algún experimento interesante. Además en este afán consumista que me rodea ultimamente, he pedido hoy un Arduino y unos componentes básicos (leds, resistencias, y botones) para trastear un poco más con este tema.

En breve ... mis aventuras y desventuras con el Lego(R) y el Arduino.

viernes, 19 de marzo de 2010

Máquinas de Turing (II): Leyendo una cinta

Voy a empezar a construir un robot que sea capaz de leer una cinta.

La cinta, serán tiras de papel de distinta longitud, puestas en línea recta por el suelo.



Y el robot encargado de leerlas, será este. Es un poco cutrecillo, porque está hecho a lo deprisa y corriendo, pero cumple su función con creces.







No voy a añadir un LDD en este momento, pero si un par de fotos para que veaís como se ha construido.

Y ahora vamos a ponerlo en marcha. Aquí tenéis el video, el cable que cuelga es el del usb, porque hoy no funcionaba la conexión bluetooth, yo creo que es porque llueve.




He registrado con matlab los valores que lee el sensor de luz y este es el resultado



Se pueden ver claramente que hay cuatro tramos de color blanco detectado, uno mediano, dos pequeños consecutivos y por último uno largo final. Que se corresponden con las tiras que había en el suelo.


Y con esto y un bizcocho, he hecho una primera aproximación a leer una cinta de una máquina de turing, no sé si el modelo final será así, pero para empezar me vale.

Máquinas de Turing (I): Primera toma de contacto

Navegando por internet me encontré con algo que resultó muy interesante: máquinas de turing construidas con legos.

Este es el primer blog de máquinas de turing hechas con el nxt que encontré. El video, aparte de divertido, es bastante espectacular.

Utilizan el sensor de contacto para leer los valores de la cinta, montada sobre unos railes de lego. Y para escribir utilizan un motor que hace girar los cuadrados de lego.

La segunda referencia sobre legos y máquinas de turing la encuentro en el capítulo 3 del libro Lego Mindstorms Masterpieces.

En la previsualización del libro, en el índice, se puede ver una foto del resultado. No la pongo porque vete tú a saber que pasaría ... igual es ilegal y todo.

Aquí la cinta es una serie de "interruptores" fabricados con vigas de tres y un dispositivo motor que las gira de un lado al otro, posición borrar y escribir. Es un resultado un poco menos vistoso que el anterior.

Em ambos casos la cinta está limitada, podría ser interesante construir una máquina que tuviera cinta ilimitada.

Una vez que he visto todo esto y se me han puesto los dientes largos ... voy a ver como construyo mi propia máquina de turing.

Para empezar me hace falta un poco más de teoría sobre las máquinas de turing, para ver exactamente qué puedo construir.

Creo recordar así del tirón que había casos en los que no hacía falta escribir, sólo leer. En este caso por ejemplo con el sensor de luz podría leer líneas dibujadas en el suelo de algún color para distinguir

#ROJA# #VERDE## #VERDE# #ROJA# #VERDE#

Luego en matlab ver una gráfica del tipo ___---____----___ e interpretarla como 0 ó 1.

Mientras refresco todos mis conocimientos de máquinas de turing, voy a intentar construir un primer prototipo de este modelo.

Bueno, ya hemos empezado otra aventurita con el lego :D

sábado, 27 de febrero de 2010

laberintos (IX): resultado

Mucha letra ... pero lo que más interesa es ver un video de todo esto que os he contado en funcionamiento.





Qué los disfruteis

Laberintos (VIII): Conclusiones y líneas de trabajo futuras

Ya habéis visto que el que no tiene un lego que escapa de laberintos es porque no quiere. Voy a intentar resumir aquí las conclusiones que he obtenido de este experimento.

- El lego sigue sin parecerme una herramienta de precisión. Obviamente es un juguete.

Esto lo he visto muy patente a la hora de realizar los giros, que prácticamente nunca eran de 90 grados justos. A veces te giraba más y a veces menos. A veces avanzaba hasta la mitad del cuadrado y otras veces hasta el final

Esos pequeños fallos se iban acumulando y no se obtenían resultados buenos. El robot se iba de la habitación, se quedaba dando vueltas sobre sí mismo.

- Roborealm es la repanocha !!! le veo muchas posibilidades y todas muy interesantes. Creo que no va ser el último proyecto en que lo utilice.

- He utilizado un montón de herramientas y he visto como colaboran todas en paz y armonía para obtener el resultado final. Cámara web -> Roborealm -> Telnet -> Java -> Matlab -> Lego.

Que buen integrador soy :D.

Como futuros trabajos quiero proponerme que sea el propio lego el que sin ayuda de ningún sistema externo salga del laberinto. Ya tengo algo en mente, pero utilizando NXC, así que dentro de poco ... mis aventuras y desventuras con NXC.

Espero que os haya gustado esta entrada. Ale, todos a hacer el Prison Break

laberintos (VI) : algoritmo de búsqueda A*

Esto si que es superior a mis fuerzas explicarlo ... así que aquí tenéis un enlace a la wikipedia, que seguro que lo explica mucho mejor que yo.

Lo que intento obtener del algoritmo, son las posiciones por las que tiene que pasar el robot para salir del laberinto. Y con qué acción se ha llegado a ellas.



Asi tenemos una lista de movimientos por ejemplo

AV, avanza
GT, gira 180 grados
GD, gira 90 grados a la derecha
GI, gira 90 grados a la izquierda

Para salir del laberinto hay que pasar por las siguientes posiciones

00,10,20,30,31,32,33,34,24,14,04,03,02,21

que son los siguientes movimientos del robot

GT,AV,AV,AV,GD,AV,AV,AV,AV,AV,GD,AV,AV,AV,GD,AV,AV,GD,AV

Estas son las instrucciones que le enviamos a Matlab. Las escribimos en un fichero de texto plano en un directorio en el que Matlab está escuchando constantemente en busca de instrucciones para enviar al robot.

Laberintos (V): ROBOREALM

Roborealm es, hablando muy por encima, una aplicación de visión artificial y procesamiento de imagenes. Roborealm podría llenar por sí sólo blogs y blogs, así que lo que voy a contar aquí, no hace más que arañar la superficie de la cantidad de cosas que se pueden hacer con él.

En este ejemplo vamos a proporcionar sentido de la vista a nuestro robot. Y hablando más técnicamente, vamos a transformar una imagen de un laberinto, en información que pueda entender el robot. En este caso, una matriz de dos dimensiones, que indique si hay pared o hay camino libre para moverse.



Como se puede ver, lo que voy a intentar conseguir en que posiciones de la matriz habrá pared o no. Que podría ser perfectamente una matriz de booleanos.

Empecemos a trabajar con RoboRealm. Recordar que tenéis que jugar con ello para obtener buenos resultados y que yo disto mucho de ser un experto en su uso. seguro que se os ocurren muchas y mejores maneras de hacer lo mismo que yo.

Información en bruto

El punto de partida en RoboRealm es un dispositivo capturador de imagenes, como puede ser una cámara web, o una imagen, como es el caso que nos ocupa.



Sobre estas imágenes se aplican una serie de filtros de manera consecutiva que van filtrando, extrayendo, modificando ... de modo que podamos extraer información útil de la misma.

Lo primero que vamos a realizar sobre la imagen es aplicar el filtro Affine. Este filtro modifica los límites de la imagen para cuadrarla. Y fingir que estamos mirando el laberinto desde arriba. De este modo queda mucho mejor delimitado el laberinto.



De todo lo que aparece en la foto, sólo nos interesa los papeles verdes. Vamos a filtrar utilizando el RGB Filter.





Ahora ya sólo tenemos en la imagen información interesante. Vamos a centrarnos en obtener tres cosas: dónde está la meta, dónde está la salida y dónde están las paredes.

Obtener la meta
Como se puede ver en la imagen inicial, la meta está representada con un triángulo. Luego deberemos buscar en la imagen objetos con forma de triángulo. Yo lo he resuelto de la siguiente manera.

Utilizando el Blob Filter, podemos buscar formar en la imagen. En este caso queremos sólo buscar formas que tengan un área triangular y pulsamos CREATE BLOBS VARIABLE. Esta variable almacena el centro de gravedad de todos los objetos devueltos por el filtro. De este modo tenemos el punto donde está la salida dentro de la imágen.



Y ahora con el lenguaje de script que tiene roborealm, introducimos la variable BLOBS en la variable TRIANGULO.



Tras esta serie de pasos, tenemos en la variable TRIANGULO de RoboRealm la posición de la salida.

Obtener la salida

El procedimiento es similar. Volvemos a la posición de partida, con el marcador de inicio. Aplicamos un nuevo Blob Filter, pero esta vez buscamos objetos que tengan forma circular. Marcamos "CREATE BLOBS ARRAY VARIABLE"

De forma similar a antes introducimos la variable BLOBS en una nueva variable CIRCULO. Tenemos que hacer esto, porque si no, la llegada, habría sobrescrito el valor de la llegada.



Tras esta serie de pasos, tenemos en la variable CIRCULO de RoboRealm la posición de la meta.

Obtener las paredes

Las paredes se obtienen de manera similar. La única salvedad es que ahora tendremos no sólo un punto, sino un array de los mismos. Esto es importante de cara a recuperar los valores desde aplicaciones fuera de roborealm.

Aquí podemos ver los pesos que tienen las figuras, el triángulo y el círculo han desaparecido porque hemos ajustado un valor muy alto. De este modo podemos ajustar los objetos "más cuadrados", "más redondos" ... Este filtro es muy interesante y creo que es el que más juego puede ofrecer.





Tras esta serie de pasos, tenemos en la variable PAREDES de RoboRealm la posición de las paredes.

Comunicación con otros sistemas

Ahora voy a mostraros otra característica bastante interesante de RoboRealm, que es la comunicación con otros sistemas a partir de su API. Vamos a facilitar toda la información que ha extraído RoboRealm a la imagen, a un pequeño programa escrito en java. Este programa será el encargado de encontrar una salida al laberinto. Pero eso será en otra entrada.

De este modo estoy separando el procesado de la imagen, con el procesado de la información extraida de la imagen. Así, detrás de RoboRealm, podemos tener cualquier otro sistema de resolución de problemas, más apropiado al caso que nos concierna.

El uso de la API es bastante sencillo. Roborealm disponibiliza un servidor de telnet al que podemos atacar, por ejemplo, solicitando variables con

 
<request>
<get_variables>VAR_1_NAME, VAR_2_NAME, etc.</get_variables>
</request>



y aquí podemos ver como Roborealm nos ha devuelto los puntos donde estaban las paredes.

Y con esto he dado una pequeña introducción a RoboRealm. Espero que haya quedado relativamente claro, y animaros una vez más a trastear por vuestra cuenta, porque con la visión artificial se amplían bastante los límites de los proyectos que podemos emprender con nuestro robot.

laberintos (IV): ¿Qué vamos a utilizar?

Todo esto está muy bien: tenemos un lego, un laberinto en el suelo ... pero nos falta algo. ¿Cómo vamos a hacer a lego inteligente para encontrar la salida? ¿Cómo va a ver el lego el laberinto? ... hay muchas preguntas, así que vamos a contestarlas por partes.

¿Cómo va el lego a interpretar el laberinto?
Vamos a utilizar Roborealm. Es un software de visión artificial. De este modo, podemos hacer que el lego "vea" a través de roborealm (mediante una foto del laberinto o una cámara web enfocada al laberinto), dónde está metido.

Una vez que ya sabe dónde está metido ¿Cómo va a saber salir?
Para esto vamos a usar inteligencia artificial. Vamos a aplicar algoritmos de búsqueda de soluciones sobre lo que ve Roborealm y dar una solución al problema.

Chuck Norris una vez tuvo un Lego Mindstorms. La televisión hizo documental sobre él, le llamó The Terminator.

Uff, muchas cosas ¿Cómo lo vamos a unir todo?
Es un poco lio la verdad, pero lo voy a intentar explicar lo mejor que pueda.

Roborealm va a reconocer la información del laberinto.

Esa información va a ser procesada por un algoritmo de búsqueda de soluciones implementado en java. De este algoritmo se obtienen una serie de movimientos que son los que tiene que hacer el robot para salir del laberinto.

Mediante matlab vamos a enviar esa serie de movimientos al robot para que salga del laberinto.

Es importante resaltar que no es el bloque el que sabe salir del laberinto, si no que se limita a escuchar los movimientos que le llegan.

Hay una entrada para cada una de estas partes, así que allí intentaré explicarlo un poco mejor

Vamos al lío !!!

Laberintos (II): el laberinto

Vamos a hablar de las partes de las que va a constar este experimento: un lego saliendo de un laberinto. Creo que a estas alturas todos sabemos lo que es un lego, así que no queda otra que hablar del laberinto.

Recortando trozos de papel cuadrados he dibujado en el suelo de mi habitación un laberinto cuadrado 5x5 como puede ver en la siguiente imagen. Los bordes no están limitados por otros cuadrados, si no por las dimensiones.




El robot se puede mover por el suelo que no está ocupado por cuadrados verdes.

La salida estará representada por un triángulo y el punto de llegada con un círculo.



Y aquí diferentes laberintos.








Si mi habitación fuera más grande ... pues podría hacer un laberinto enorme.


Lo que pretendo es que el robot situado en la entrada, vaya hacía la salida.


Con esto creo que ya está explicado el dominio del problema.

Laberintos (I)

Hola a todos,

Hace bastante bastante tiempo que no publico nada. No es que haya estado sin tocar estos temas, pero nada de lo que he intentado me ha salido bien.

Aunque hoy escribo porque tengo un nuevo tema, y he obtenido un bonito resultado. A lo largo de las siguientes entradas podréis ver como mi lego escapa de un laberinto dibujado en el suelo.

Un saludo y espero que la espera haya merecido la pena.