
Una strana prototipazione di una console realizzata con Arduino/ESP32. Si tratta di un progetto amatoriale,
non di un prodotto vero e proprio. L’idea finale è quella di un piccolo dispositivo portatile in grado di riprodurre i miei
giochi, con audio e display a colori. Per ora siamo ancora molto lontani da questo obiettivo. Dovrebbe
essere in grado di eseguire senza problemi i giochi dell’era NES e SNES. Il passaggio a risoluzioni più elevate è ciò che
ci si aspetta da una scheda dotata di PSRAM.
Tutto dipende dalla RAM. L’Arduino Mega 2560 su cui gira oggi ha solo 8 KB di
SRAM. Non è sufficiente per gestire un framebuffer a colori, quindi su quella scheda rimane solo testo.
La piattaforma successiva è un ESP32 WROOM, che arriva a circa 520 KB di SRAM e un
veloce dual core. Questo permette di gestire un framebuffer da 240x240 (circa 115 KB) e di far funzionare veri e propri
giochi a quella risoluzione. Il WROOM non ha PSRAM, quindi non può contenere i
framebuffer molto più grandi che sarebbero necessari per uno schermo a risoluzione più alta. Un ESP32-WROVER o
un ESP32-S3 risolveranno questo problema in seguito grazie a PSRAM da diversi megabyte e memoria integrata, che
è ciò di cui avrà bisogno uno schermo con risoluzione superiore a 240p.
Stato
In fase iniziale e incompleta. Al momento si avvia, rileva il pulsante di accensione, riproduce musica
tramite un motore melodico non bloccante e visualizza testo sul display LCD. Non esistono ancora
giochi.
Attualmente funziona su un Arduino Mega con un display LCD a caratteri 16x2, che è ciò a cui il
codice è destinato. La piattaforma successiva è stata scelta: un ESP32 WROOM che pilota un display IPS ST7789 da 1,54 pollici
a 240x240 tramite SPI. Entrambi i componenti funzionano a 3,3 V e si accoppiano senza
bisogno di level-shifting, a differenza dell’attuale LCD a 5 V. Questi componenti sono in arrivo e
non verrà effettuato alcun porting fino al loro arrivo.
I giochi saranno ospitati su lyszt.net e scaricati sulla scheda tramite Wi-Fi. Per la
prima versione risiederanno nella memoria flash integrata dell’ESP32.
Hardware
- MCU: Arduino Mega 2560 (ATmega2560) per ora
- Display: LCD a caratteri 16x2 I2C (indirizzo
0x27) - Audio: cicalino passivo sul pin 3
- Ingressi:
- pulsante di accensione sul pin 2 (
INPUT_PULLUP, con antirimbalzo) - pulsanti direzionali: su / giù / sinistra / destra, per ora sono semplici pulsanti,
non ancora collegati a nulla - pulsanti di azione: A / B, stessa situazione, non ancora collegati
- pulsante di accensione sul pin 2 (
In programma (prossima piattaforma)
- MCU: ESP32 WROOM (3,3 V, dual core, ~520 KB di SRAM)
- Display: IPS ST7789 da 1,54 pollici, 240x240, tramite SPI
- Memoria: giochi nella memoria flash integrata, scaricabili tramite Wi-Fi
- In seguito: ESP32-WROVER o ESP32-S3 per avere margine di PSRAM oltre i 240p
Compilazione
Progetto PlatformIO, framework Arduino. Il progetto vero e proprio si trova nella cartellaLys Entertainment System/.
platform = atmelavr
board = megaatmega2560
framework = arduino
lib_deps = marcoschwartz/LiquidCrystal_I2C
Layout
Il codice sorgente si trova in Lys Entertainment System/src/:
main.cpp— punto di ingresso: cablaggio, pulsante di accensione, ciclo principale.system/— il nucleoSystem; gestisce lo stato di alimentazione, il display LCD e l’audio.sounds/— audio, suddiviso in dati e logica:notes.h— costanti di altezza tonale.songs.{h,cpp}— dati musicali (la strutturaSonge le definizioni delle melodie).sounds.{h,cpp}— il motore delle melodie non bloccante e l’API audio.audio_manager.{h,cpp}— wrapper OO attorno al motore.
lcd/— funzioni di supporto per il testo sul display LCD.utils/— funzioni di supporto riutilizzabili (ad es. unwaitnon bloccante).
