
Una extraña réplica de una consola creada con Arduino/ESP32. Es un proyecto de aficionado,
no un producto real. La idea final es crear una pequeña consola portátil que permita jugar a mis propios
juegos, con sonido y una pantalla a color. Todavía queda mucho para llegar a eso. Debería
ejecutar sin problemas juegos de la época de la NES y la SNES. Lograr resoluciones más altas es lo que
se espera de una placa con PSRAM.
Todo se reduce a la RAM. La Arduino Mega 2560 en la que funciona actualmente solo tiene 8 KB de
SRAM. Eso no da para un framebuffer en color, así que en esa placa se limita al modo de solo texto.
La siguiente plataforma es un ESP32 WROOM, que pasa a tener unos 520 KB de SRAM y un
rápido procesador de doble núcleo. Eso permite un búfer de fotogramas de 240x240 (aproximadamente 115 KB) y ejecuta
juegos reales a esa resolución. El WROOM no tiene PSRAM, por lo que no puede albergar los
buffers de imagen mucho más grandes que necesitaría una pantalla de mayor resolución. Un ESP32-WROVER o
un ESP32-S3 cubren esa necesidad más adelante con varios megabytes de PSRAM y almacenamiento integrado, que
es lo que necesitará una pantalla de más de 240p.
Estado
En fase inicial y sin terminar. De momento arranca, detecta el botón de encendido, reproduce música
a través de un motor de melodías sin bloqueo y muestra texto en la pantalla LCD. Aún no hay
juegos.
Actualmente funciona en un Arduino Mega con una pantalla LCD de 16x2 caracteres, que es para lo que está
diseñado el código. La próxima plataforma ya está decidida: un ESP32 WROOM que controla una pantalla IPS ST7789 de 1,54 pulgadas
y 240x240 píxeles a través de SPI. Ambos componentes funcionan a 3,3 V y se conectan sin
necesidad de conversión de nivel, a diferencia de la pantalla LCD actual de 5 V. Esos componentes están de camino, y
no se va a portar nada hasta que lleguen.
Los juegos se alojarán en lyszt.net y se descargarán a la placa a través de WiFi. Para la
primera versión, se almacenarán en la memoria flash integrada del ESP32.
Hardware
- MCU: Arduino Mega 2560 (ATmega2560) por ahora
- Pantalla: LCD de caracteres de 16x2 con I2C (dirección
0x27) - Audio: zumbador pasivo en el pin 3
- Entradas:
- botón de encendido en el pin 2 (
INPUT_PULLUP, con supresión de rebotes) - botones direccionales: arriba / abajo / izquierda / derecha; de momento son solo botones simples,
aún no están conectados a nada - Botones de acción: A / B, lo mismo, aún no están conectados
- botón de encendido en el pin 2 (
Previsto (próxima plataforma)
- MCU: ESP32 WROOM (3,3 V, doble núcleo, ~520 KB de SRAM)
- Pantalla: IPS ST7789 de 1,54 pulgadas y 240x240 a través de SPI
- Almacenamiento: juegos en la memoria flash integrada, descargados a través de WiFi
- Más adelante: ESP32-WROVER o ESP32-S3 para disponer de margen de PSRAM superior a 240p
Compilación
Proyecto de PlatformIO, marco de trabajo de Arduino. El proyecto propiamente dicho se encuentra enLys Entertainment System/.
platform = atmelavr
board = megaatmega2560
framework = arduino
lib_deps = marcoschwartz/LiquidCrystal_I2C
Estructura
El código fuente se encuentra en Lys Entertainment System/src/:
main.cpp: punto de entrada: cableado, botón de encendido, bucle principal.system/: el núcleoSystem; gestiona el estado de alimentación, la pantalla LCD y el audio.sounds/: audio, dividido en datos y lógica:notes.h: constantes de tono.songs.{h,cpp}: datos musicales (la estructuraSongy las definiciones de melodías).sounds.{h,cpp}: el motor de melodías sin bloqueo y la API de sonido.audio_manager.{h,cpp}: envoltura orientada a objetos (OO) del motor.
lcd/: utilidades de texto para la pantalla LCD.utils/: utilidades reutilizables (por ejemplo, una funciónwaitno bloqueante).
