Lys Entertainment System
C++

Lys Entertainment System

Странная имитация консольной системы, созданная с помощью Arduino/ESP8266

GitHub|
image

Странная имитация консольной системы, созданная с помощью Arduino/ESP32. Это хобби-проект,
а не настоящий продукт. Конечная идея — небольшой карманный прибор, на котором можно играть в мои собственные
игры, с звуком и цветным дисплеем. Пока до этого ещё далеко. Он должен
безотказно запускать игры эпохи NES и SNES. Переход на более высокие разрешения — это то, что
ожидает нас на плате с PSRAM.

Всё сводится к объёму оперативной памяти. Arduino Mega 2560, на котором проект работает сегодня, имеет всего 8 КБ
SRAM. Этого недостаточно для цветового фреймбуфера, поэтому на этой плате он остаётся только текстовым.
Следующая платформа — ESP32 WROOM, которая предлагает около 520 КБ SRAM и
быстрый двухъядерный процессор. Этого достаточно для фреймбуфера 240x240 (примерно 115 КБ) и запуска настоящих
игр с таким разрешением. У WROOM нет PSRAM, поэтому он не может вместить гораздо
более объёмные фреймбуферы, необходимые для экрана с более высоким разрешением. ESP32-WROVER или
ESP32-S3 решают эту проблему благодаря PSRAM объёмом в несколько мегабайт и встроенной памяти, что
и потребуется для экрана с разрешением выше 240p.

Состояние

Ранняя и незавершённая версия. На данный момент устройство загружается, реагирует на нажатие кнопки питания, воспроизводит музыку
через неблокирующий движок мелодий и отображает текст на ЖК-дисплее. Игр пока
нет.

Сегодня система работает на Arduino Mega с 16x2-символьным ЖК-дисплеем, на который и
ориентирован код. Следующая платформа уже выбрана: ESP32 WROOM, управляющий 1,54-дюймовым
дисплеем IPS ST7789 с разрешением 240x240 через SPI. Обе детали работают при напряжении 3,3 В и соединяются без
изменения уровня сигнала, в отличие от текущего 5-вольтового ЖК-дисплея. Эти компоненты уже в пути, и
пока они не прибудут, никакой перенос кода не будет производиться.

Игры будут размещены на lyszt.net и загружаться на плату через Wi-Fi. В
первой версии они будут храниться во встроенной флэш-памяти ESP32.

Аппаратное обеспечение

  • Микроконтроллер: Arduino Mega 2560 (ATmega2560) на данный момент
  • Дисплей: 16x2 символьный ЖК-дисплей по интерфейсу I2C (адрес 0x27)
  • Аудио: пассивный зуммер на выводе 3
  • Входы:
    • кнопка питания на выводе 2 (INPUT_PULLUP, с подавлением дребезга)
    • кнопки направления: вверх / вниз / влево / вправо, пока что просто кнопки,
      ещё ни к чему не подключены
    • кнопки действий: A / B, то же самое, пока не подключены

В планах (следующая платформа)

  • Микроконтроллер: ESP32 WROOM (3,3 В, двухъядерный, ~520 КБ SRAM)
  • Дисплей: 1,54 дюйма, 240x240, IPS ST7789 через SPI
  • Хранение: игры в встроенной флэш-памяти, загружаемые через Wi-Fi
  • Позже: ESP32-WROVER или ESP32-S3 для увеличения объёма PSRAM сверх 240p

Сборка

Проект на PlatformIO, фреймворк Arduino. Сам проект находится в папке
Lys Entertainment System/.

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

Структура кода

Исходный код находится в папке Lys Entertainment System/src/:

  • main.cpp — точка входа: подключение, кнопка питания, основной цикл.
  • system/ — ядро System; управляет состоянием питания, ЖК-дисплеем и аудио.
  • sounds/ — аудио, разделенное на данные и логику:
    • notes.h — константы высоты звука.
    • songs.{h,cpp} — музыкальные данные (структура Song и определения мелодий).
    • sounds.{h,cpp} — неблокирующий движок мелодий и API звука.
    • audio_manager.{h,cpp} — объектно-ориентированная оболочка движка.
  • lcd/ — вспомогательные функции для работы с текстом на ЖК-дисплее.
  • utils/ — многократно используемые вспомогательные функции (например, неблокирующая функция wait).