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

Странная имитация консольной системы, созданная с помощью 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, то же самое, пока не подключены
- кнопка питания на выводе 2 (
В планах (следующая платформа)
- Микроконтроллер: 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).
