Lys Entertainment System
C++

Lys Entertainment System

Dziwna imitacja konsoli stworzona przy użyciu Arduino/ESP8266

GitHub|
obraz

Dziwna makieta konsoli stworzona przy użyciu Arduino/ESP32. To projekt hobbystyczny,
a nie prawdziwy produkt. Ostatecznym zamysłem jest małe urządzenie przenośne, na którym można grać w moje własne
gry, z dźwiękiem i kolorowym wyświetlaczem. Na razie daleko mi do tego. Powinno
bez problemu obsługiwać gry z epoki NES i SNES. Przejście na wyższe rozdzielczości to coś, co
czeka na płytce z pamięcią PSRAM.

Wszystko sprowadza się do pamięci RAM. Arduino Mega 2560, na którym obecnie działa, ma tylko 8 KB
pamięci SRAM. Nie wystarcza to na kolorowy bufor ramki, więc na tej płytce pozostaje tryb wyłącznie tekstowy.
Kolejną platformą jest ESP32 WROOM, który oferuje około 520 KB pamięci SRAM oraz
szybki dwurdzeniowy procesor. To wystarcza na bufor ramki o rozdzielczości 240x240 (około 115 KB) i pozwala uruchamiać prawdziwe
gry w tej rozdzielczości. WROOM nie posiada pamięci PSRAM, więc nie jest w stanie pomieścić znacznie
większych buforów ramki, których wymagałby ekran o wyższej rozdzielczości. ESP32-WROVER lub
ESP32-S3 rozwiązują ten problem dzięki wielomegabajtowej pamięci PSRAM i wbudowanej pamięci, co
jest niezbędne dla ekranów o rozdzielczości powyżej 240p.

Stan

Wczesna i niedokończona wersja. Obecnie urządzenie uruchamia się, odczytuje sygnał z przycisku zasilania, odtwarza muzykę
za pomocą nieblokującego silnika melodii oraz wyświetla tekst na ekranie LCD. Nie ma jeszcze
żadnych gier.

Obecnie działa na Arduino Mega z 16x2-znakowym wyświetlaczem LCD, do którego
dostosowany jest kod. Wybrano już kolejną platformę: ESP32 WROOM sterujący 1,54-calowym
wyświetlaczem IPS ST7789 o rozdzielczości 240x240 poprzez interfejs SPI. Oba elementy działają przy napięciu 3,3 V i współpracują bez
konieczności zmiany poziomu napięcia, w przeciwieństwie do obecnego wyświetlacza LCD 5 V. Komponenty te są już w drodze i
do czasu ich dostarczenia nie będzie przeprowadzane żadne przenoszenie kodu.

Gry będą hostowane na lyszt.net i pobierane na płytkę przez Wi-Fi. W
pierwszej wersji będą one przechowywane w wbudowanej pamięci flash modułu ESP32.

Sprzęt

  • Mikrokontroler: na razie Arduino Mega 2560 (ATmega2560)
  • Wyświetlacz: 16x2 znakowy wyświetlacz LCD z interfejsem I2C (adres 0x27)
  • Dźwięk: bierny brzęczyk na pinie 3
  • Wejścia:
    • przycisk zasilania na pinie 2 (INPUT_PULLUP, z eliminacją odbicia)
    • przyciski kierunkowe: w górę / w dół / w lewo / w prawo, na razie to zwykłe przyciski,
      jeszcze niepodłączone do niczego
    • przyciski akcji: A / B, podobnie, jeszcze niepodłączone

Planowane (kolejna platforma)

  • Mikrokontroler: ESP32 WROOM (3,3 V, dwurdzeniowy, ~520 KB pamięci SRAM)
  • Wyświetlacz: 1,54 cala, 240x240 IPS ST7789 przez SPI
  • Pamięć: gry w wbudowanej pamięci flash, pobierane przez Wi-Fi
  • Później: ESP32-WROVER lub ESP32-S3, aby uzyskać więcej pamięci PSRAM niż 240p

Kompilacja

Projekt na PlatformIO, framework Arduino. Sam projekt znajduje się w katalogu
Lys Entertainment System/.

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

Układ

Kod źródłowy znajduje się w katalogu Lys Entertainment System/src/:

  • main.cpp — punkt wejścia: okablowanie, przycisk zasilania, pętla główna.
  • system/ — rdzeń System; odpowiada za stan zasilania, wyświetlacz LCD i dźwięk.
  • sounds/ — dźwięk, podzielony na dane i logikę:
    • notes.h — stałe wysokości dźwięków.
    • songs.{h,cpp} — dane muzyczne (struktura Song i definicje melodii).
    • sounds.{h,cpp} — nieblokujący silnik melodii i interfejs API dźwięku.
    • audio_manager.{h,cpp} — obiektowa otoczka silnika.
  • lcd/ — pomocnicze funkcje do obsługi tekstu na wyświetlaczu LCD.
  • utils/ — funkcje pomocnicze wielokrotnego użytku (np. nieblokująca funkcja wait).