Lys Entertainment System
C++

Lys Entertainment System

Arduino/ESP8266로 만든 기묘한 콘솔 시스템 모형

GitHub|
이미지

Arduino/ESP32로 만든 기묘한 콘솔 시스템 모형입니다. 이건 취미로 만든 것이며,
실제 제품이 아닙니다. 궁극적인 목표는 사운드와 컬러 디스플레이를 갖춘, 제가 직접 만든
게임을 실행할 수 있는 소형 핸드헬드 기기입니다. 아직 그 수준에는 한참 못 미치지만,
NES와 SNES 시대의 게임은 무리 없이 구동할 수 있을 것입니다. 더 높은 해상도를 구현하는 것은
PSRAM이 탑재된 보드에서 가능해질 것입니다.

핵심은 RAM입니다. 현재 이 프로젝트가 구동되는 아두이노 메가 2560은 SRAM이
8KB밖에 되지 않습니다. 이 용량으로는 컬러 프레임버퍼를 저장할 수 없기 때문에, 해당 보드에서는 텍스트만 표시됩니다.
다음 플랫폼은 ESP32 WROOM으로, SRAM 용량이 약 520KB로 늘어나고
빠른 듀얼 코어를 탑재하고 있습니다. 이 보드는 240x240 프레임버퍼(약 115KB)를 수용할 수 있으며, 해당 해상도에서 실제
게임을 구동할 수 있습니다. WROOM에는 PSRAM이 없어, 더 높은 해상도의 화면에 필요한 훨씬
더 큰 프레임버퍼를 저장할 수 없습니다. ESP32-WROVER나
ESP32-S3는 수 메가바이트 규모의 PSRAM과 온보드 저장 장치를 갖추고 있어,
240p를 초과하는 화면에 필요한 요건을 충족합니다.

현황

초기 단계이며 아직 완성되지 않았습니다. 현재 부팅이 가능하고, 전원 버튼 입력을 인식하며,
비차단 멜로디 엔진을 통해 음악을 재생하고, LCD에 텍스트를 표시합니다. 아직 게임은
없습니다.

현재는 코드가 대상으로 하는 16x2 문자 LCD가 장착된 Arduino Mega에서
구동됩니다. 다음 플랫폼은 이미 결정되었습니다. ESP32 WROOM이 SPI를 통해 1.54인치
240x240 IPS ST7789 디스플레이를 구동하는 방식입니다. 두 부품 모두 3.3V로 작동하며,
현재 사용 중인 5V LCD와 달리 레벨 변환 없이도 연동됩니다. 해당 부품들은 배송 중이며,
도착할 때까지는 어떤 것도 이식하지 않을 예정입니다.

게임은 lyszt.net에 호스팅되어 Wi-Fi를 통해 보드로 다운로드될 예정입니다.
첫 번째 버전에서는 게임이 ESP32의 내장 플래시에 저장됩니다.

하드웨어

  • MCU: 당분간 Arduino Mega 2560 (ATmega2560) 사용
  • 디스플레이: 16x2 I2C 문자 LCD (주소 0x27)
  • 오디오: 3번 핀에 연결된 패시브 부저
  • 입력:
    • 핀 2의 전원 버튼 (INPUT_PULLUP, 바운스 제거 처리됨)
    • 방향 버튼: 위 / 아래 / 왼쪽 / 오른쪽, 현재는 단순한 버튼 형태이며,
      아직 어떤 회로에도 연결되지 않음
    • 액션 버튼: A / B, 마찬가지로 아직 배선되지 않음

계획 중 (다음 플랫폼)

  • MCU: ESP32 WROOM (3.3 V, 듀얼 코어, ~520 KB SRAM)
  • 디스플레이: SPI를 통한 1.54인치 240x240 IPS ST7789
  • 저장소: 온보드 플래시에 게임 저장, Wi-Fi를 통해 다운로드
  • 추후: 240p 이상의 PSRAM 여유 공간을 확보하기 위해 ESP32-WROVER 또는 ESP32-S3 사용

빌드

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).