Saltar a contenido

2020-02-08 EdUzebox

Uzebox

En la pasada edición de RetroZaragoza me llamó la atención una consolita que alguien llevó montada sobre una breadboard. Al volver a casa investigué y me decidí a fabricar una ya que el proyecto era perfecto para poner a prueba el aprendizaje que había hecho con el diseñador de circuitos KiCad.

El proyecto original tiene como nombre Uzebox y es una consola de videojuegos basado en un microcontrolador de la amplia familia AVR de Atmel, en concreto el ATmega644. El creador es un tal Uze que explica muy bien el origen del proyecto en la sección Description de la página del mismo. La máquina resultante tiene una potencia y estilo muy similar a la de los clásicos microordenadores de 8 bits con los que me inicié en la informática en los 80. Aquí puede verse un ejemplo del estilo de los juegos que puede ejecutar:

Uzebox es hardware y software libre, con una amplia y activa comunidad alrededor del foro oficial. La documentación es extensa y de calidad, tanto a nivel de hardware como de software, lo que terminó de convencerme de que merecía la pena.

Diseño versión propia

Existen multitud de clones referenciados en el propio wiki oficial. El mejor documentado naturalmente es el original, pero tiene el inconveniente de que está orientado al mercado americano y por tanto la salida de vídeo es NTSC. Además utiliza un chip (el AD725) para mezclar la señal RGB que sale del microcontrolador, lo que es un desperdicio porque en Europa los televisores disponen de entrada para esta señal y es de mucha mejor calidad que la de vídeo compuesto o S-video que se expone en la Uzebox original.

Tras un análisis de las opciones existentes decidí diseñar mi propia placa, inspirándome en los esquemáticos de los proyectos EUzebox y el del español Doragasu RgbUzebox. Imprimí ambos esquemáticos junto al de la Uzebox original y cerré un diseño propio, éste:

Esquemático EdUzebox

Aunque este tipo de proyectos suelen realizarse con componentes de tipo THT, por considerarse más accesibles, me apetecía adentrarme en el mundo SMD, así que decidí utilizar muchos componentes de este tipo. La placa resulta más pequeña, sobre todo optando por la versión SMD del microcontrolador (utilicé el formato TQFP), y francamente, una vez dado el paso tiene más ventajas que inconvenientes (precio de componentes, tamaño, aspecto final, retrabajo, es decir sustitución o recolocación de componentes).

El aspecto de la placa según un render que hace el propio KiCad es el siguiente (faltan algunos componentes de los que tuve que hacer yo la huella ya que no existía en las librerías):

PCB EdUzebox

Todos los archivos del proyecto KiCad pueden encontrarse en este repositorio: https://github.com/eduardofilo/eduzebox

Construcción

En la construcción podemos distinguir las siguientes etapas:

  1. Encargar PCBs
  2. Encargar componentes
  3. Preparar herramientas SMD
  4. Montaje final

Vamos a detallarlas por separado.

Encargar PCBs

A partir del proyecto KiCad se generan los ficheros Gerber. Pueden encontrarse en el directorio gerber del repositorio. También se publican comprimidos en ZIP en los assets de cada release.

Hoy en día existen muchos servicios de prototipado de PCBs que encajan sobradamente en las dimensiones y calidades necesarias para la placa diseñada. Algunos ejemplos:

  • JLCPCB: 2€ por 5 PCBs de hasta 10x10cm y 2 capas. Los gastos de envío rondan los 7€.
  • NextPCB: $0 por 5 PCBs de hasta 10x10cm y 2 capas a cambio de poner el logo de NextPCB en la placa. Los gastos de envío son $10.80.
  • Seeed Studio: $4.90 por 5 PCBs de hasta 10x10cm y 2 capas.
  • PCBWay: $5 por 5 PCBs de hasta 10x10cm y 2 capas.

Yo hasta ahora sólo he utilizado JLCPCB y las placas han llegado siempre sin defectos y tardado en llegar lo acordado. El proceso de encargar las placas (las 5 del pedido mínimo) consiste únicamente en subir el fichero gerber.zip a la página de pedido ya que las opciones predeterminadas que ofrece el fabricante son perfectas. Sólo queda esperar alrededor de 20 días hasta recibir una caja dentro de la cual encontramos esto:

PCB EdUzebox

Encargar componentes

Antes de pensar en comprar los componentes hay que resolver la tarea de organizar la lista de materiales o BOM como se suele llamar (Bill Of Materials). En realidad gran parte de este trabajo se hace durante la fase de diseño con KiCad, ya que al crear la PCB a partir del esquemático, es necesario seleccionar la huella o footprint de cada componente. Es en ese momento cuando conviene realizar la investigación del mercado para averiguar si vamos a tener disponibilidad de todos los componentes en el formato que nos interesa. Puede ocurrir que tengamos ya el componente en casa o que encontremos uno que nos convenga y del que no exista la huella en las librería de KiCad. Es por ejemplo lo que me ocurrió con los conectores de los mandos de SNES. El conector que se utilizaba en todos los montajes de Uzebox que analicé tenía los pines rectos y yo sin embargo acabé comprando unos con los pines acodados. Éste:

SNES Connector

En estos casos lo que hay que hacer es diseñar nuestra propia huella o footprint (el proceso se detalla en el punto 5 del workflow de KiCad).

En la hoja LibreOffice incluida en los assets de cada release se detalla la lista de materiales junto con los enlaces que utilicé para comprarlos. Como puede verse la mayoría de los componentes los adquirí en LCSC que es una empresa del mismo grupo que JLCPCB. En Aliexpress sale más barato adquirir componentes sueltos, pero cuando se trata de pedir numerosos componentes distintos, conviene que alguien nos los envíe en un solo paquete como hace LCSC. En el pedido, encargué 100 unidades de los componentes más sencillos como resistencias y condensadores y de los más complejos como el ATmega644p, el lector de microSD o el cristal 5 ó 10 unidades. El pedido completo que me permite montar 5 consolas con envío includo fue de 43,60€. Si quisiera fabricar 95 más sólo habría que pedir el ATmega644p, los conectores (SNES y Euroconector), cristal y lector de microSD.

Pedido componentes

Preparar herramientas SMD

Como comentaba anteriormente, incorporé al proyecto desde un principio el reto añadido de que parte de él se realizara con componentes SMD. Esto requería adquirir nuevas herramientas y habilidades. La verdad es que aunque para aprender prefiero leer a ver vídeos de YouTube, en este caso YouTube resulta insuperable. Por ejemplo:

Aunque todos los componentes SMD que he utilizado en la placa se pueden llegar a soldar con hilo de estaño, soldador de punta fina, algo de paciencia y un par de técnicas (una y otra), si emprendía este camino era para recorrerlo hasta el final. Así que me hice con los siguientes elementos:

Montaje final

Una vez recibidos componentes y herramientas sólo queda buscar un momento en que poderse sentar con tiempo por delante y buena iluminación para disfrutar practicando nuevas habilidades.

Kit componentes

El primer paso consiste en aplicar un poco de pasta en cada uno de los pads donde va a ir un componente SMD. Como consejo, ayuda el que la placa esté un poco caliente para que la pasta fluya y se adhiera mejor a los pads. Para esto la cama caliente de la impresora 3D puede hacer ese papel. Por ejemplo ajustada a unos 50ºC para no quemarnos al apoyarnos.

Montaje 1

Lo vemos más cerca en una porción de la placa.

Montaje 2

A continuación y con la hoja BOM delante, vamos extrayendo los componentes de la tira en que suelen venir para colocarlos con unas pinzas finas en su lugar. La pasta, que tiene la consistencia de la pasta de dientes, ayuda a que el componente se quede en su sitio.

Montaje 3

Tras colocar el último componente, ya sólo queda utilizar la pistola de aire caliente. De nuevo (como aprendí viendo este vídeo) conviene que la PCB se precaliente un poco para minimizar estrés térmico en componentes y placa. De nuevo la cama caliente de la impresora 3D puede ayudarnos, ajustada esta vez a 100ºC. La pistola de aire caliente la ajusté a 240ºC. Se aplica haciendo pequeños círculos alrededor de los componentes. Las micropartículas de estaño en un momento dado se funden entre sí, pasando del original gris oscuro mate de la pasta fría al característico brillo del estaño. En el momento de convertirse la pasta en estaño líquido, además, por la tensión superficial de éste, el componente se autoalinea por si mismo si no lo estuviera ya. Puede apreciarse por ejemplo en la resistencia R9 que coloqué un poco más elevada que el resto y que como vemos a continuación se alineó con sus hermanas.

Montaje 4

En los componentes con pines múltiples y muy próximos como el microcontrolador y el lector microSD, es muy fácil que se produzcan puentes de estaño entre varios pines. Para solucionar estos casos la técnica es aplicar flux en pasta y tratar de retirar algo de estaño con la punta del soldador peinando los pines hacia el exterior. En los casos más difíciles aplicar malla desoldadora.

Sólo queda soldar el resto de componentes de tipo THT con el tradicional soldador e hilo de estaño. La verdad es que una vez conocida la nueva técnica casi apetece continuar con ella y soldar también los componentes de este tipo, pero la pasta es más cara que el hilo, así que se reserva para SMD.

Al finalizar ya tenemos la parte de hardware resuelta.

Montaje 5

Flash de juegos

Sólo queda ocuparse de la parte software. Para que el microcontrolador ATmega644 haga algo hay que instalarle (flashearle) un firmware y configurar unos cuantos parámetros que determinan su modo de funcionamiento. inicialmente viene vacío y con los parámetros en sus valores predeterminados.

El ATmega644 es muy parecido al ATmega328 que está montado sobre las placas Arduino, pero éste tiene un par de ventajas:

  1. En Arduino existe además otro chip que implementa el estándar USB y conecta el microcontrolador al PC.
  2. El microcontrolador lleva preflasheado un pequeño firmware llamado bootloader que atiende a este puerto en busca de unos comandos especiales para flashear desde el PC por USB.

Aquí ni tenemos USB ni bootloader, por lo que necesitamos un mecanismo de más bajo nivel previsto en todos los microcontrolador de la famila AVR de Atmel. Este mecanismo se denomina ISP y básicamente consiste en un protocolo basado en la variedad SPI de puerto serie. En las placas que incorporan un microcontrolador programable mediante este sistema solemos encontrar un conector típico de 2x3 o 2x5 pines. En EdUzebox es el conector J3 que se encuentra justo encima del pulsador de reset.

ISP

Para poder programar el microcontrolador a través de este puerto necesitamos un programador ISP. Hay muchas opciones. Podemos por ejemplo utilizar un Arduino UNO con el scketch ArduinoISP que viene entre los ejemplos del Arduino IDE. Sin embargo por algún motivo que desconozco (a pesar de que creo que utilicé las opciones correctas), no tuve éxito utilizando esta alternativa.

Una opción seguramente más fiable es adquirir un programador ISP. De entre los muchos que hay en el mercado, seguramente uno de los más equilibrados es el USBtiny que además es hardware libre, por lo que se encuentran clones muy económicos.

Sin embargo cuando ya estaba a punto de adquirir uno de esos clónicos, descubrí que otra opción es utilizar la placa BusPirate de la que tengo una unidad hace tiempo. Realmente BusPirate es una navaja suiza en lo que a uso y depuración de transmisiones serie se refiere que ya me ha dado muy buen servicio en unas cuantas ocasiones.

Además del programador o adaptador ISP que elijamos, necesitamos un programa que implemente este protocolo. Aquí, aparte de las herramientas oficiales, en mi mano tenía dos opciones:

  1. Configurar el entorno de Arduino (Arduino IDE) para que soportara el microcontrolador ATmega644.
  2. Utilizar la herramienta de bajo nivel avrdude (que además es la que utiliza Arduino IDE por debajo).

Me decanté por lo segundo, es decir por utilizar avrdude directamente. Necesitaba conocer los parámetros más recomendables para programar y configurar el ATmega644. Lo segundo es importante, es decir su configuración. Ésta se logra mediante 3 bytes especiales llamados fusebits que se mantienen en la memoria no volátil del microcontrolador, en los que cada bit tiene un significado distinto. Entre algunos de los ajustes está el tipo y la velocidad de reloj que va a utilizar el chip. Este dato es importantísimo, ya que el microcontrolador dispone de un reloj interno que es el que viene configurado de fábrica y que se activa simplemente al alimentar. Pero si más adelante se configura uno externo y no lo tenemos conectado o sin alimentar, no habrá manera de comunicarse con el microcontrolador ya que no arrancará el protocolo ISP (ni ninguna otra cosa). Uzebox utiliza un reloj externo, por lo que en un momento dado lo configuraremos para usarlo y a partir de entonces deberá estar conectado antes de hacer nada con el chip. Como decimos, para la primera programación todo esto no es problema porque de serie el chip viene con una configuración segura que activa el reloj interno, por lo que podremos comunicar sin problemas.

Estudiando este post del foro de Uzebox y este apartado de la wiki llegué a entender que tenía que flashear dos cosas:

  • Los siguientes fusebits:
    • LFuse: 0xFE
    • HFuse: 0xD2
    • EGuse: 0xFF
  • El bootloader que permite cargar los juegos desde la SD.

En cuanto a los fusebits, para entender que ajustan exactamente ayuda mucho la siguiente calculadora de fusebits.

El bootloader podemos encontrarlo en el post enlazado anteriormente. En concreto la última versión en el momento de escribir este artículo era: Bootloader_0_4_5.hex

A continuación se detalla el proceso de flasheo desde Linux (supongo que desde Windows resultará muy similar). Como digo lo he realizado con un BusPirate como programador. Con un programador distinto como USBtiny sólo hay que cambiar el parámetro -c:

  1. Para tener disponible en el sistema avrdude podemos instalarlo desde el gestor de paquetes de Linux o bien instalar el Arduino IDE y averiguar la ruta donde queda. En mi caso lo instalé desde el gestor de paquetes.

    1
    sudo apt install avrdude
    
  2. Cableo el BusPirate siguiendo la documentación del protocolo ISP para este aparato.

    Pin ISP Señal Pin BusPirate
    1 MISO Negro:MISO
    2 +5V Naranja:+5V
    3 SCK Morado:CLK
    4 MOSI Gris:MOSI
    5 CS Blanco:CS
    6 GND Marrón:GND

    BusPirate

  3. Flasheo primero el bootloader (ya que si empiezo por los fusebits temo perder la capacidad para comunicar con el chip):

    1
    sudo avrdude -c buspirate -p m644p -P /dev/ttyUSB0 -v -U flash:w:/home/edumoreno/Bootloader_0_4_5.hex
    
  4. Por último flasheo los fusebits:

    1
    sudo avrdude -c buspirate -p m644p -P /dev/ttyUSB0 -v -V -B 1 -U lfuse:w:0xFE:m -U hfuse:w:0xD2:m -U efuse:w:0xFF:m
    

En este momento si conectamos la consola a un televisor deberíamos ver una imágen indicando que la consola ha cobrado vida.

Juegos

Lo primero que haremos será copiar a la SD juegos. El directorio de los mismos podemos encontrarlo en este enlace del wiki. Allí por cada juego se nos suele proporcionar el código y el binario en dos formatos:

  • .hex: Para flasheo directo.
  • .uze: Para carga desde SD si se ha flasheado el bootloader.

Existe también un pack con todos los juegos publicados descargable desde esta página.