Space Invaders, Pac Man, Galaga, Donkey Kong, Burger Time. Estos juegos corrían en placas con procesadores Intel 8080, Zilog Z80 y MOS 6502 que llenaban un mueble arcade completo. Hoy el mismo código original puede correr en una ESP32 del tamaño de un chicle, con pantalla TFT de 2,4", audio I2S y batería para un viaje largo en bus al sur.
En esta guía vas a armar una consola portátil que ejecuta ROMs arcade originales en una Feather ESP32 V2. Vas a entender por qué este enfoque es distinto de un emulador tipo MAME, cómo preparar la microSD con los archivos de cada juego, cómo flashear el firmware sin compilar nada y cómo soldar el handheld sobre una placa perforada.
Por qué "un solo juego" es una ventaja
La mayoría conoce MAME (Multiple Arcade Machine Emulator): un programa que corre en un computador con sistema operativo y carga cientos de juegos. Este proyecto sigue otra filosofía, llamada SAMP (Single Arcade Machine Port):
- Corre directo en el microcontrolador, sin sistema operativo. El juego parte al instante al encender, sin menús ni tiempos de carga.
- Un firmware = un juego. Cada juego es un port nativo en Arduino compilado para la ESP32. No hay un menú para saltar de juego en juego, así que dejas de abandonar la partida a la primera frustración.
¿Cómo puede una ESP32 emular un Z80? Estos procesadores de fines de los 70 corrían a 2-4 MHz, y la ESP32 corre a 240 MHz con dos núcleos. Hay margen de sobra para interpretar instrucción por instrucción del CPU original y todavía dibujar la pantalla a velocidad correcta. Lo que no se emula es el chip de sonido original: el sistema reproduce muestras WAV grabadas de los sonidos reales, lo que ahorra CPU y suena igual al oído.

Hardware: qué lleva y cómo se conecta
| Componente | Función |
|---|---|
| Feather ESP32 V2 (8 MB flash + 2 MB PSRAM) | Ejecuta la emulación |
| TFT FeatherWing 2,4" 320x240 | Pantalla ILI9341 + lector microSD integrado |
| Amplificador I2S MAX98357A | Convierte el audio digital I2S en señal para parlante (clase D, 3 W) |
| Parlante ovalado 8 Ω 1 W | Salida de sonido |
| Pulsadores de 6 mm con tapa de silicona | Controles (dirección, disparo, COIN, 1P/2P, ROTATE) |
| Placa perforada Perma Proto tamaño completo | Base del handheld |
| Resistencias 10 kΩ | Pull up para los botones |
| Batería LiPo 3,7 V 2000 mAh | Autonomía de 8-10 horas |
| Headers cortos macho y hembra para Feather | Montaje desmontable |
Por qué un amplificador I2S y no un DAC + amplificador analógico: el MAX98357A recibe audio digital directamente por tres pines (BCLK, LRCLK, DATA) y lo amplifica en el mismo chip. La ESP32 no necesita usar su DAC interno de 8 bits, que suena ruidoso, y la ruta de audio queda inmune al ruido de la pantalla.
Armado del handheld, por bloques
En lugar de ir soldadura por soldadura, conviene pensar el armado en cuatro bloques.
1. Controles
Ubica los pulsadores según el diagrama Fritzing de la guía original y suelda sus patas por el reverso. Cada botón tiene una pata a tierra y otra al pin de la Feather que le corresponde, con una resistencia pull up hacia el riel de 3,3 V. Cualquier valor entre 4,7 kΩ y 22 kΩ sirve, y 10 kΩ es el punto medio. La pull up mantiene el pin en alto cuando nadie presiona y el botón lo lleva a 0 V al apretarlo. Sin ella, el pin "flota" y el juego detecta pulsaciones fantasma.
2. Montaje en sándwich: pantalla arriba, Feather abajo
- Suelda los headers macho cortos en la cara superior de la Perma Proto, con el lado largo hacia arriba. Ahí se enchufa la TFT FeatherWing. Úsala como plantilla para que los pines queden alineados mientras sueldas.
- Por la cara inferior van los sockets hembra cortos. Enchufa en ellos los headers macho de la Feather, pon la Feather encima, suelda los pines a la Feather y después los sockets a la placa. Así la Feather queda desmontable.
3. Audio
Suelda el MAX98357A con sus pines y corta el sobrante con un alicate. Aliméntalo con un puente desde el riel de 3,3 V a VIN del amplificador. Podrías alimentarlo desde BAT, pero si juegas conectado a USB sin batería el amplificador se queda sin corriente suficiente. El riel de 3,3 V funciona en ambos casos. Luego cablea los tres pines I2S a la Feather (conviene sacar la Feather para trabajar cómodo).
El parlante va al borne atornillable: corta el conector, pela las puntas, rojo a + y negro a **, **. Puedes pegarlo sobre la batería con su adhesivo.
4. Alimentación y terminaciones
Cablea 3V y GND de la Feather a los rieles de alimentación y une ambos lados de la Perma Proto. Lleva todas las tierras de los botones a un riel. Conecta la batería al JST de la Feather. Si quieres, pega trozos de goma EVA con cinta doble contacto donde vas a tomar la consola y entre la batería y la placa.
Software: flashear sin compilar
El código vive en la librería Adafruit Arcade Machines para Arduino. Lo más rápido es no compilar nada:
- Ve a la última release del repositorio del proyecto y baja a la sección Assets.
- Descarga el
.bindel juego que quieras.

- Grábalo con la herramienta Web Serial ESPTool desde el navegador, o con
esptooldesde la terminal. Este es el comando para Burger Time (en Linux o Windows el puerto se llama distinto, por ejemplo/dev/ttyUSB0oCOM3):
esptool.py --chip esp32 --port /dev/cu.SLAB_USBtoUART write_flash 0x0 btime_featheresp32.bin
Si prefieres compilar en Arduino IDE
- Agrega
https://espressif.github.io/arduino-esp32/package_esp32_index.jsoncomo URL adicional de placas e instala el core esp32 de Espressif. - Instala la librería Adafruit Arcade Machines y sus dependencias: SdFat - Adafruit Fork y Adafruit ILI9341 (que trae Adafruit GFX y Adafruit BusIO). El audio usa
ESP_I2Sdel propio core, sin instalar nada extra. - Selecciona la placa Adafruit Feather ESP32 V2.
- Abre Archivo → Ejemplos → Adafruit Arcade Machines → Games → _featheresp32 y sube por USB.

La microSD: donde vive el juego
El firmware es solo el "hardware virtual". El juego en sí, las ROMs, se carga desde la microSD al arrancar.
- Formatea la tarjeta en FAT32 con tabla de particiones MBR. GPT o exFAT no montan.
- Crea dos carpetas en la raíz:
/rom/y/samples/.
Los archivos de /rom/ se cargan en orden alfabético inverso a partir de la dirección 0x0000. La nomenclatura estándar de MAME (.h → .g → .f → .e) coincide con las direcciones correctas, porque cada archivo representa uno de los chips de memoria de la placa original. Para Space Invaders queda así:
/rom/
invaders.h
invaders.g
invaders.f
invaders.e
Y los sonidos:
/samples/
0.wav
1.wav
...
9.wav
Si falta algún WAV, el juego corre igual y solo se salta ese sonido. Cada juego (Lunar Rescue, Galaga, Pac Man, Ms. Pac Man, Donkey Kong, Burger Time) tiene su propia lista de archivos, detallada en la guía original y en el README del repositorio.
Sobre lo legal: las ROMs siguen teniendo derechos de autor. La vía limpia es tener la placa arcade original y hacer un volcado de sus chips.
Diagnóstico por color de pantalla
| Color al encender | Qué significa |
|---|---|
| Rojo | La microSD no está o no monta (revisa FAT32 + MBR) |
| Amarillo | La tarjeta montó, pero /rom/ no tiene ROMs usables o fallaron todas las muestras |
| Sin color, arranca el juego | Todo cargó bien |
A jugar
- Inserta la microSD en el lector de la TFT FeatherWing y pasa el interruptor a ON.
- Si la imagen sale al revés o de lado, presiona ROTATE hasta que quede bien.
- COIN agrega créditos (dos para jugar a dos jugadores por turnos) y luego eliges 1P o 2P.
La batería dura 8 a 10 horas. Para recargar, conecta un cable USB a la Feather. Para cambiar de juego, flashea otro .bin y cambia el contenido de la microSD.
Variantes y mejoras
- Versión con ESP32 DevKit genérica: si no tienes la Feather, una ESP32 DevKit con PSRAM (WROVER) más una TFT ILI9341 de 2,4" SPI con lector microSD sirven, pero tendrás que reasignar pines en el ejemplo y cablear todo en protoboard o PCB propia. Sin PSRAM, los juegos más pesados pueden no caber.
- Control por joystick analógico: reemplaza los cuatro botones de dirección por un joystick tipo KY-023 leyendo dos entradas analógicas y convirtiéndolas en direcciones digitales con un umbral. Es más cómodo para Pac Man.
- Mini cabinet de escritorio: imprime o corta en MDF un mueble arcade a escala, cambia los pulsadores por botones arcade de 24 mm y usa un parlante más grande. El amplificador de 3 W da para un parlante de 3-4" sin problema.
Personalización para Chile
Esta corrida no pudo consultar el catálogo en línea de MechatronicStore, así que no vinculamos productos específicos con SKU ni precio. Busca en la tienda:
- Placa ESP32 (idealmente con PSRAM). La Feather ESP32 V2 es la del tutorial, y una ESP32 DevKit sirve con la adaptación descrita arriba.
- Pantalla TFT 2,4" ILI9341 con lector microSD.
- Amplificador I2S MAX98357A.
- Parlante 8 Ω 1 W.
- Pulsadores táctiles 6 mm, resistencias 10 kΩ, placa perforada y cable de conexión 22 AWG.
- Batería LiPo 3,7 V 2000 mAh con conector JST PH.
- Tarjeta microSD (con 1 GB sobra, ya que las ROMs pesan kilobytes).
Recursos
- Tutorial original (inglés): Arcade Machine Emulator for ESP32 Handheld, de John Park en Adafruit Learning System
- Firmware precompilado: archivos
.binpor juego en la sección Assets de la última release del proyecto (enlazada desde la guía original) - Core ESP32 para Arduino:
https://espressif.github.io/arduino-esp32/package_esp32_index.json - Documentación adicional: README y DEVNOTES del repositorio Adafruit Arcade Machines, con la lista completa de ROMs por juego
Versión chilena basada en la guía original, con componentes en stock local.




