domingo, 29 de enero de 2012

RGB

Para hacer las pruebas con colores estoy utilizando un viejo monitor 1084S de Commodore que cuenta con entradas por componentes. Concretamente utilizaré el DIN de 6 pìns que consta de 3 pins para el color en RGB, dos pins de sincronía (vertical y horizontal) y otro pin de tierra.
1. Verde - 2. Sincronía horizontal - 3. Tierra - 4. Rojo - 5. Azul - 6. Sincronía vertical
Imagen original (Miguel Durán - CC BY-SA 2.5)


Navegando por la red encontré el código de Alastair Parker, un sencillo Pong en Arduino con toda la programación dentro del mismo sketch, sin utilizar ninguna librería. Buscando un poco más encontré un ejemplo en Daily Duino hecho por un tal Phizone a partir del código del Pong. El ejemplo en cuestión simplemente pinta unas letras en la pantalla. Descargué el código, lo cargué en un Arduino Nano, conecté las resistencias y el monitor por entrada de video compuesto y funcionó.



Luego me dije ¿Y si pruebo de utilizar la entrada RGB conectando la salida de video de Arduino con uno de los componentes y la salida de sincronía con alguno de los pins de sincronía? No esperaba ver colores, pero si lo deseaba y pasó, los elementos blancos de pantalla se veían del color del pin utilizado.

Esquema de Daily Duino

Resultado en el monitor
Esquema rojo
Resultado en el monitor
Esquema verde
Resultado en el monitor
Esquema azul
Resultado en el monitor

El próximo paso fue crear 3 salidas de video y pintarlas a la vez en el puerto correspondiente. Además de intentar conseguir más resolución disminuyendo el tamaño del pixel. Para esto último había que conseguir delays más pequeños que el mínimo que ofrece Arduino (1 microsegundo). Esto se consigue con una instrucción de ensamblador llamada "nop" (no operation performed) que espera un ciclo de reloj sin hacer nada. Si Arduino utiliza un cristal de cuarzo de 16MHz, podemos calcular el tiempo de delay que representa un "nop" de la siguiente forma:

nop = 1 ciclo = 1/16 us = 62.5 ns

Así que tras probar varias combinaciones llegué a la conclusión de que con 6 nop's detrás de cada pixel podía llegar a pintar 84 columnas. Y ajustando el tiempo de delay vertical con 470 us después de cada fotograma, podía pintar 60 filas.
Aquí está el resultado:

Esquema RGB
Barras en el monitor con una inscripción en negro

Podeis descargar el código de la prueba de color RGB de 3 bits aquí.

viernes, 27 de enero de 2012

Loading...

Hace tiempo que conozco Arduino y siempre estoy pensando en proyectos que podría hacer con él. Lo conocí por mi afición al modelismo ferroviario, buscando algún tipo de placa que me permitiese controlar dispositivos mecánicos como relés y desvíos desde un ordenador. Lo primero que me llamó la atención fue lo fácil que resulta de programar, sobre todo después de haberlo intentado con los famosos Pic de Microchip o con los Rabbit.

Al principio no estaba muy de acuerdo con la idea de utilizar un microcontrolador que no se pudiese programar a bajo nivel, ya que esto supondría que las instrucciones más sencillas necesitasen muchos ciclos de reloj para ejecutarse. Pero después de ver y comprobar su funcionamiento en entornos bastante duros durante horas y horas sin quejarse, Arduino pasó a ser mi juguete favorito. Y por cierto, se pueden incluir comandos de bajo nivel en ensamblador.

He pensado en utilizarlo para hacer una red de sensores inalámbricos en casa, para controlar una maqueta de tren (esto requiere un mínimo de espacio y no lo tengo), para hacer un mini-ordenador de bicicleta, para hacer una batería midi y para mil cosas que se me han ido pasando por la cabeza y que al final se han quedado en el tintero.

Soy analista programador, especializado en programación gráfica y con un postgrado en desarrollo de videojuegos, un nostálgico de los juegos de 8 bits y por fin he decidido que quiero hacer con Arduino: Una consola de 8 bits con Arduino Mega.

Mientras voy avanzando en mis pruebas os dejo unos enlaces interesantes sobre el tema:

Arduino TvOut
Librería para generar imagen monocromo en la tele, con formato PAL y NTSC.

Video Game Shield
Un shield para Arduino, utiliza la librería TvOut y permite conectar la tele y 2 Nunchuk de Nintendo Wii.

Hackvision
Una placa con forma de mando y un chip Arduino. También utiliza TvOut y se conecta directo a la TV.

Uzebox
Una consola open source de 8 bits, no es Arduino, pero está basada en ATmega644. Tiene conexiones para TV y mandos Super Nintendo. La versión PAL tiene euroconector.

Gameduino
Otro shield para Arduino, con su propio motor gráfico y salida VGA.