

Hace un tiempo, me encontré en la red un par de proyectos sobre cómo hacer video con microcontroladores. Uno de ellos, realizado por un tipo llamado Rickard Gunee, era un juego de Pong hecha con un solo microcontrolador PIC y algunas resistencias! El microcontrolador estaba generando en monocromo la señal de vídeo, y sonido básico. De hecho, me pareció bastante impresionante y finalmente me motivó a diseñar mi propia consola, construido con algunos de mis favoritos, los microcontroladores Atmel AVRs. Además, yo quería que fuera de color (por lo menos 256 colores simultáneos), además tienen buenas capacidades de sonido.

De todos los métodos de generación de color, opté por uno más sencillo y utilice un chip convertidor de RGB a NTSC, el AD725 de Analog Devices. También decidí a invertir tiempo en desarrollar un motor de juego impulsado que permitiese reproducir música, leer el estado joypad, generar sincronización de vídeo y hacer marcos independientemente del programa principal del juego.
Intenté simplificar al máximo mi diseño, para crear algo que cualquier aficionado puede construir en poco tiempo. La consola se basa únicamente en un ATMEGA644, un microcontrolador de propósito general de 8 bits basado en la arquitectura AVR de Atmel.Cuenta con 4K de RAM (!), 64 KB de flash para los datos gráficos de código, sonido, y un montón de líneas de E / S y muchas características periféricas. El vídeo se emite en uno de los ATmega 8-bit I / O puerto como RGB, 3 bits se asignan para el componente rojo, 3 bits para los bits verdes y 2 para el azul. Aquellos son alimentados a un DAC compuesta de tres. Esto da 256 colores fijos pero simultáneos en pantalla.
El sistema funciona overclockeado a ~ 28.6Mhz (8 veces la frecuencia de ráfaga de color NTSC). Incluso si la pieza tiene una potencia de 20 Mhz, nunca he tenido ningún problema hasta la fecha. El chip tiene sólo 4K de RAM y, puesto que la memoria de video es muy limitada, no hay memoria de vídeo. Cuanta con varios modos de vídeo son soportados actualmente por el kernel:
- "Modo 1": sólo modo Tiles 6 ciclos de reloj por píxel. La resolución es de 240x224 píxeles
- "Modo 2": Sprites y modo Tiles 10 ciclos de reloj por píxel. La resolución de 132x208. Hasta 32 sprites simultáneos en la pantalla sobre un fondo de azulejos. Este modo también soporta por píxel de desplazamiento de pantalla completa y múltiples "pantallas divididas".
- "Modo 3": Sprites y modo Tiles 6 ciclos por píxel. La resolución de 240x224. Esta modalidad admite el desplazamiento de pantalla completa y una superposición de las puntuaciones altas, etc
El sonido se compone de 3 ondas canales y 1 de ruido basado en LFSR o canal PCM. Cada uno tiene timbre independiente, la frecuencia y el volumen. La resolución es de 8 bits y se mezcla a velocidad de línea NTSC (~ 15Khz) y se emite en un solo pin mediante modulación por ancho de pulso (PWM). Un jugador hi-nivel puede reproducir archivos MIDI con un formato especial. Con un buen secuenciador (Cubase, Cakewalk, etc), una entrada MIDI IN permite la creación de música y efectos de sonido directamente en la consola.
Para la entrada al principio me decanto por mando de NES estándar, pero luego cambié de SNES. Controladores SNES Aftermarket son fáciles de comprar al contrario que los NES. Por otra parte, SNES tienen más botones y accesorios. La mejor fuente es la compra de una SNES multitap de eBay (~ 6 $ más gastos de envío).

Las nuevas versiones de Uzebox tienen palancas de mando de SNES, tarjeta SD e interfaces Ethernet. Todo este desarrollo ocurrió debido a una comunidad que llevó a una gran cantidad de conocimientos e ideas en los foros.
Asegúrese de echar un vistazo y ver el estado del proyecto. Compruebe también la WIKI de una gran cantidad de documentación sobre el proyecto.
Hardware
Las directrices de diseño de Uzebox eran simples: mantener una baja complejidad y número de componentes, sin renunciar a la calidad. Y el ATMEGA644 me ayudó mucho a lograr esto. Tienen periféricos y funciones integradas (como SPI, UARTS, contadores, comparadores analógicos, pull-ups, etc).
Vamos a tener un vistazo a la imagen general y luego veremos que hace cada parte.

La CPU

El corazón del sistema es un chip llamado un micro-controlador (MCU o, para abreviar). Contrariamente a los primeros ordenadores que tenían chips separados para la CPU, la memoria RAM, ROM, periféricos y así sucesivamente, MCU tiene todo en el interior del mismo chip. Esto no sólo reduce el tamaño y el costo, sino que también reduce la complejidad.
Hay literalmente cientos de MCU en el mercado, cada uno con sus propias particularidades. Algunos tienen 32 bits de núcleo, puede ejecutar hasta varios cientos de megahercios y tienen cientos de pines y un conjunto muy complejo de periféricos. Otros son más simples, cuentan con nucleos de 8 bits y corre a 20Mhz. Ese es el caso de la ATMEGA644, un miembro de la familia AVR de Atmel. Son relativamente fáciles de entender, sin embargo, tiene núcleos RISC muy eficientes que los rendimientos de cerca de uno por MIPS megahertz. Los RAV han incorporado RAM, memoria flash para los programas y los datos estáticos, EEPROM y un ciclo multiplicador 2 hardware. Además, tienen una de las más extensas conjunto de periféricos de su clase. Un montón de puertos I / O, 8 y 16 bits de Contadores, UART, SPI, TWI, watchdog timer, detector de brown-out...
El ATMEGA644 es, naturalmente, el corazón del sistema. Su trabajo es muy simple: hacer todo! Bueno, excepto la generación de color NTSC. Esto habría sido demasiado para un procesador de gama baja. Entonces, ¿qué significa casi todo?
- Generar las señales de sincronización de vídeo. El AD725 no hace eso, sólo la conversión de color, por lo que el MCU tiene que hacerlo. Y tiene que ser precisa para evitar parpadeos
- Render de la imagen. Esto incluye el desplazamiento y la determinación de sprites transparencia de fondo
- Mezcla y la salida de los efectos de sonido y música.
- Leer el estado de los botones del joystick
- Leer y manejar el flujo de datos MIDI.
- Lectura/Escritura de la tarjeta SD
- Y por último pero no menos importante ... ejecutar los juegos!
La salida más importante de la MCU es 'pipeline' de los gráficos. El MCU tiene un puerto de 8 bits dedicado (PORTC) sobre el que los datos de píxeles es de salida. Se trata de un puerto digital y sólo puede dar salida a datos binarios, 0 o 1 s (o si se prefiere, 0 voltios y 5 voltios). Cada píxel tiene exactamente un byte para representar el color. 3 bits se asignan a la componente rojo, 3 bits a la componente verde y 2 bits para el azul. En teoría, esto da 256 colores simultáneos. Aunque en la práctica hay una serie de colores que están muy cerca de los demás. De todos modos, este acuerdo le dará a una tabla de colores que se ve así:

El DAC

Un DAC, o un convertidor de digital a analógico, es un circuito que convierte un valor binario a un voltaje de salida proporcional o actual. Así que si su DAC tiene una potencia máxima de 1 V, y que le dan un valor binario de 128 (la mitad del valor máximo que puede contener un byte), obtendrá 0,5 voltios en la salida. Hay varias formas de implementar un DAC. Se puede comprar uno hecho, en un chip o construirlo mediante resistencias. Con el enfoque de resistencias, hay dos tipos principales: R-2R y ponderado. He utilizado el método R-2R. Explicar cómo funciona es un poco fuera del alcance de este documento, así que voy a animar a los lectores a buscar en la red. Hay un montón de buen tutorial disponible sobre el tema. Así que vamos a decir que, según la Wikipedia:
"La escalera R-2R opera como una cadena de divisores de corriente de salida cuya exactitud depende únicamente de lo bien que cada resistencia se hace coincidir con los otros. La escalera R-2R es barato y relativamente fácil de fabricar ya que se requieren solamente dos valores de resistencia. es rápido y ha fijado impedancia de salida R. "
El DAC Uzebox está en realidad compuesta de 3 más pequeñas, una para cada componente de color. Si nos fijamos en el esquema verás, cada caja con el color que representan. Usted puede ver el rojo y el verde cada uno tiene 3 cables que van de nuevo al MCU, mientras que el componente azul solo tiene 2. Además, si se mira de cerca, te darás cuenta de que la salida de cada bloque va a un pin de entrada del AD725, que se corresponde con el color adecuado. En el medio, esos pequeños condensadores se utilizan para bloquear el voltaje de CC al en el AD725. (Nota: Esto representa mi DAC R-2R Desde el lanzamiento inicial, se cambió a una versión diferente 'ponderado' que tiene la mitad de las resistencias y da mejores blancos Desde mi esquema no se actualiza con él, sin embargo, si usted quiere construir.. su cuenta con el nuevo DAC, vea la sección de descargas del esquema "Avcore".)

Así que al final, los DACs simplemente convierte los valores binarios que representan componentes de color (0-7 para el rojo y el verde y el 0-3 para el azul) a los rangos de voltaje (0-0.7V) adecuados para el AD725.
El AD723 / AD725
Como se mencionó anteriormente, la generación de color compuesto NTSC no es trivial. Y sobre todo no es eficiente en el software puro. El AD725 (y la más reciente AD723) Saca este problema de la ecuación. Se acepta como entrada voltajes discretos para cada componente de color RGB y, a nivel interno, los convierte en la información de crominancia luminancia y apropiada. También genera la ráfaga de color, lo añade a la sincronización compuesta generada por la MCU. Sin problemas y resultados estables garantizados.

El AD725 requiere dos más de entrada para llevar a cabo su trabajo. Una de ellas es la señal de sincronización compuesta generada por la MCU. La otra es una señal de reloj a 14,31818Mhz. Este reloj pasa a ser cuatro veces la frecuencia de la ráfaga de color y es absolutamente necesaria con el fin de generar color. Frecuencia de reloj que también pasa a ser exactamente la mitad de la de la MCU. Esto no es casualidad. El MCU tiene un temporizador programado para cambiar un pin de salida en la mitad de su reloj principal.
La interfaz del Joystick

La belleza de la interfaz de NES es su simplicidad y facilidad de integración. En cada joypad NES hay un pequeño chip, registro un turno de 8 bits. El modo de funcionamiento es simple. Cuando la consola quiere leer el estado de los botones, se activa la línea de cierre que le dice al registro de desplazamiento para cargar todos los estados del botón. Luego se libera la línea y los botones son memorizados por el registro de desplazamiento. La consola comienza a alternar la línea de reloj y ocho bits en serie se cambió a la línea de datos de la consola. No hay partes externas necesarias, y sólo 4 líneas de E / S para 2 joysticks. No puede ser más simple. Además, la interfaz de SNES es idéntica, excepto que usted cambia de 16 bits, para dar cuenta de los botones extra. Tenga en cuenta que quedan libres puertos suficientes cómo para utilizar para apoyar a otros joysticks como PSX 2 o 1 Sega o Atari.
Para más información, echa un vistazo a este documento de interfaz de Parallax.
MIDI

MIDI o Musical Instrument Digital Interface, es una especificación desarrollada hace muchos años para permitir la interconexión de los instrumentos musicales y computadoras. Es una interfaz en serie unidireccional sencilla funcionando a un poco lentos 31250 baudios. MIDI-In es la corriente de comunicación del host (PC, teclado) para el instrumento. MIDI-Out es el flujo de la comunicación desde el instrumento al anfitrión. Un flujo de comunicación MIDI se compone de eventos: tempo, que, como señala sido presionado, la velocidad, el volumen de canal, etc En la actualidad, sólo el MIDI-In se ha implementado. Hardware aconsejado es absolutamente simple: Sólo se requiere un optoacoplador, 2 resistencias y un diodo.
Tarjetas SD

La interfaz de la tarjeta SD también es muy simple. Se requiere sólo pocos componentes externos. Un zócalo de la tarjeta SD, algunas resistencias para actuar como traductor de tensión y otro regulador de voltaje desde la tarjeta SD funciona a 3,3 voltios. Todo lo demás que podría ser remotamente complejo forma parte de la propia tarjeta SD!
Descargas
![]() |
![]() |
![]() |
PCB | Esquematico | Ficheros EAGLE |
Puedes ver todos los juegos que hay para la uzeBox en aquí
Galeria de imagenes
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |