
Arduino/ESP32を使って作った、ちょっと変わったゲーム機のモックアップです。これは趣味で作ったもので、
実際の製品ではありません。 最終的な構想は、自作の
ゲームを、サウンドとカラーディスプレイで楽しめる小型のハンドヘルド端末です。現時点ではまだその段階には程遠いです。
NESやSNES時代のゲームなら快適に動作するはずです。より高い解像度への対応は、
PSRAMを搭載したボードでの課題となります。
結局のところ、問題はRAMにあります。現在使用しているArduino Mega 2560には、わずか8 KBの
SRAMしか搭載されていません。これではカラーのフレームバッファを保持できないため、このボードではテキスト表示のみに留まっています。
次のプラットフォームはESP32 WROOMで、SRAMは約520 KBに増え、
高速なデュアルコアを搭載しています。これなら240x240のフレームバッファ(約115 KB)を収容でき、その解像度で本格的な
ゲームを動作させることができます。 WROOMにはPSRAMがないため、より高解像度の画面に必要な、はるかに
大きなフレームバッファを保持することはできません。ESP32-WROVERや
ESP32-S3は、数メガバイト級のPSRAMとオンボードストレージを備えており、
240pを超える画面にはこれが必要となります。
現状
開発初期段階であり、未完成です。現時点では、起動し、電源ボタンの入力を検知し、
ノンブロッキングのメロディーエンジンを通じて音楽を再生し、LCDにテキストを表示します。
ゲームはまだ存在しません。
現在は、Arduino Mega上で16x2文字LCDを駆動して動作しており、これが
コードのターゲットとなっています。 次のプラットフォームは決定済みです。ESP32 WROOMがSPI経由で1.54インチ
240x240 IPS ST7789ディスプレイを駆動する構成です。両部品とも3.3 Vで動作し、
現在の5 V LCDとは異なり、レベルシフトなしで組み合わせることができます。 これらの部品は現在発送中で、
到着するまでは移植作業は行われません。
ゲームはlyszt.netでホストされ、Wi-Fi経由でボードにダウンロードされます。
最初のバージョンでは、ゲームデータはESP32のオンボードフラッシュに保存されます。
ハードウェア
- MCU: 現時点では Arduino Mega 2560 (ATmega2560)
- ディスプレイ: 16x2 I2C 文字LCD(アドレス
0x27) - オーディオ: ピン3に接続されたパッシブブザー
- 入力:
- ピン2の電源ボタン (
INPUT_PULLUP、デバウンス処理済み) - 方向キー:上/下/左/右。現時点では単なるボタンであり、
まだ何にも配線されていません - アクションボタン:A / B、こちらも同様で、まだ配線されていません
- ピン2の電源ボタン (
計画中(次のプラットフォーム)
- MCU: ESP32 WROOM(3.3 V、デュアルコア、約520 KB SRAM)
- ディスプレイ: 1.54インチ 240x240 IPS ST7789(SPI経由)
- ストレージ: ゲームはオンボードフラッシュに保存、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)。
