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í.

No hay comentarios:

Publicar un comentario