Lys Entertainment System
C++

Lys Entertainment System

使用 Arduino/ESP8266 制作的一款奇特的游戏主机模拟器

GitHub|
图片

一个用 Arduino/ESP32 制作的奇特游戏主机原型。这只是个业余项目,
并非真正的产品。 最终的构想是一款能够运行我自制
游戏的小型掌机,配备音效和彩色显示屏。目前距离这个目标还差得很远。它应该
能够流畅运行NES和SNES时代的游戏。要实现更高的分辨率,
还需要配备PSRAM的开发板。

关键在于内存。目前运行该项目的Arduino Mega 2560仅有8 KB的
SRAM。这无法容纳彩色帧缓冲区,因此该开发板仅支持纯文本显示。
下一代平台是 ESP32 WROOM,其 SRAM 容量跃升至约 520 KB,并配备
高速双核处理器。这足以容纳 240x240 的帧缓冲区(约 115 KB),并能以该分辨率
运行真正的游戏。 WROOM 没有 PSRAM,因此无法容纳
更高分辨率屏幕所需的更大帧缓冲区。ESP32-WROVER 或
ESP32-S3 后续将通过数兆字节的 PSRAM 和板载存储来解决这一问题,
这也是超过 240p 分辨率屏幕所必需的。

现状

尚处于早期开发阶段且未完成。目前系统可以启动,检测电源按钮,通过
非阻塞式旋律引擎播放音乐,并在LCD上显示文本。目前尚无
游戏。

目前该系统运行在搭载16x2字符LCD的Arduino Mega上,这也是
代码的目标平台。 下一代平台已确定:采用ESP32 WROOM通过SPI接口驱动一块1.54英寸
240x240 IPS ST7789显示屏。这两个部件均工作在3.3 V电压下,无需
电平转换即可配对,这与当前的5 V LCD不同。 这些部件正在运输途中,
在它们到达之前不会进行任何移植工作。

游戏将托管在 lyszt.net 上,并通过 Wi-Fi 下载到开发板上。在
第一个版本中,游戏将存储在 ESP32 的板载闪存中。

硬件

  • 微控制器: 目前使用 Arduino Mega 2560 (ATmega2560)
  • 显示屏: 16x2 I2C 字符 LCD(地址 0x27
  • 音频: 引脚 3 上的被动蜂鸣器
  • 输入:
    • 电源按钮位于第 2 引脚(INPUT_PULLUP,已去抖动)
    • 方向键:上/下/左/右,目前仅为普通按钮,
      尚未连接至任何电路
    • 动作按钮:A / B,同样尚未连接

计划中(下一代平台)

  • 微控制器: ESP32 WROOM(3.3 V,双核,约520 KB SRAM)
  • 显示屏: 1.54 英寸 240x240 IPS ST7789,通过 SPI 接口连接
  • 存储: 游戏存储在板载闪存中,通过 Wi-Fi 下载
  • 后续计划: 采用 ESP32-WROVER 或 ESP32-S3,以获得超过 240p 分辨率所需的 PSRAM 余量

构建

PlatformIO 项目,基于 Arduino 框架。实际项目位于
Lys Entertainment System/ 目录下。

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

布局

源代码位于 Lys Entertainment System/src/ 目录下:

  • main.cpp — 入口点:接线配置、电源按钮、主循环。
  • system/System 核心;负责电源状态、LCD 显示屏和音频。
  • sounds/ — 音频模块,分为数据和逻辑两部分:
    • notes.h — 音高常量。
    • songs.{h,cpp} — 音乐数据(Song 结构体和旋律定义)。
    • sounds.{h,cpp} — 非阻塞式旋律引擎和声音 API。
    • audio_manager.{h,cpp} — 引擎的面向对象封装。
  • lcd/ — LCD 文本辅助函数。
  • utils/ — 可复用的辅助函数(例如非阻塞的 wait)。