Lys Entertainment System
C++

Lys Entertainment System

Une simulation farfelue d'une console de jeux réalisée avec Arduino/ESP8266

GitHub|
image

Une maquette un peu farfelue d’une console de jeux réalisée avec Arduino/ESP32. Il s’agit d’un projet de loisir,
et non d’un véritable produit. L'idée finale est de créer une petite console portable capable de faire tourner mes propres
jeux, avec du son et un écran couleur. On en est encore loin. Elle devrait
pouvoir faire tourner sans problème les jeux de l'époque de la NES et de la SNES. Passer à des résolutions plus élevées, c'est ce qui
attend une carte équipée de PSRAM.

Tout est une question de RAM. L’Arduino Mega 2560 sur lequel il tourne aujourd’hui ne dispose que de 8 Ko de
SRAM. Cela ne suffit pas pour gérer un framebuffer couleur, donc sur cette carte, l’affichage reste en mode texte uniquement.
La plateforme suivante est un ESP32 WROOM, qui passe à environ 520 Ko de SRAM et dispose d’un
double cœur rapide. Cela permet d’accueillir un tampon graphique de 240x240 (environ 115 Ko) et de faire tourner de vrais
jeux à cette résolution. Le WROOM ne dispose pas de PSRAM ; il ne peut donc pas contenir les
buffers d’image bien plus volumineux qu’exigerait un écran à plus haute résolution. Un ESP32-WROVER ou
un ESP32-S3 comblera cette lacune ultérieurement grâce à plusieurs mégaoctets de PSRAM et à une mémoire intégrée, ce qui
est indispensable pour un écran dépassant la résolution 240p.

État d’avancement

En phase précoce et inachevé. Pour l’instant, il démarre, détecte l’activation du bouton d’alimentation, lit de la musique
via un moteur de mélodies non bloquant et affiche du texte sur l’écran LCD. Il n’existe pas encore
de jeux.

Aujourd’hui, il fonctionne sur un Arduino Mega avec un écran LCD 16x2 caractères, ce qui correspond à la
cible du code. La prochaine plateforme est choisie : un ESP32 WROOM pilotant un écran IPS ST7789 de 1,54 pouce
en 240x240 via SPI. Les deux composants fonctionnent à 3,3 V et s’associent sans
conversion de niveau, contrairement à l’écran LCD actuel de 5 V. Ces composants sont en cours d’acheminement, et
aucun portage ne sera effectué avant leur arrivée.

Les jeux seront hébergés sur lyszt.net et téléchargés sur la carte via Wi-Fi. Pour la
première version, ils résideront dans la mémoire flash intégrée de l’ESP32.

Matériel

  • Microcontrôleur : Arduino Mega 2560 (ATmega2560) pour l’instant
  • Écran : écran LCD à caractères 16x2 via I2C (adresse 0x27)
  • Audio : buzzer passif sur la broche 3
  • Entrées :
    • bouton d'alimentation sur la broche 2 (INPUT_PULLUP, anti-rebond)
    • boutons directionnels : haut / bas / gauche / droite, pour l'instant de simples boutons,
      pas encore connectés à quoi que ce soit
    • boutons d’action : A / B, même chose, pas encore connectés

Prévu (prochaine plateforme)

  • Microcontrôleur : ESP32 WROOM (3,3 V, double cœur, ~520 Ko de SRAM)
  • Écran : IPS ST7789 de 1,54 pouces, 240x240, via SPI
  • Stockage : jeux dans la mémoire flash intégrée, téléchargés via Wi-Fi
  • Plus tard : ESP32-WROVER ou ESP32-S3 pour une marge de PSRAM supérieure à 240p

Compilation

Projet PlatformIO, framework Arduino. Le projet proprement dit se trouve dans le répertoire
Lys Entertainment System/.

platform  = atmelavr
board     = megaatmega2560
framework = arduino
lib_deps  = marcoschwartz/LiquidCrystal_I2C

Structure

Le code source se trouve dans Lys Entertainment System/src/ :

  • main.cpp — point d’entrée : câblage, bouton d’alimentation, boucle principale.
  • system/ — le cœur System ; gère l’état d’alimentation, l’écran LCD et l’audio.
  • sounds/ — audio, divisé en données et logique :
    • notes.h — constantes de hauteur.
    • songs.{h,cpp} — données musicales (la structure Song et les définitions de mélodies).
    • sounds.{h,cpp} — le moteur de mélodies non bloquant et l’API audio.
    • audio_manager.{h,cpp} — enveloppe orientée objet autour du moteur.
  • lcd/ — utilitaires pour le texte sur l’écran LCD.
  • utils/ — utilitaires réutilisables (par exemple, une fonction wait non bloquante).