マイコンを使ってゲームを動かすオープンソースプロジェクトは多数公開されています。
私もこれまでいろいろと挑戦してきました。
ArduinoやAVRマイコンを使ったものでは、ATtiny85を使った『Tiny Joypad』やArduino LeonardoやPro Microを使った『Arduboy』は手持ちパーツを使ってブレッドボードで簡単に組んで動かすことが出来るのでオススメです!
ESP系のマイコンを使ったものでは、ESP8266(WeMos D1 Mini)で動かす『ESPboy』は使えるフラッシュメモリの容量も大きく本格的なゲームが楽しめます。
またESP32で動かすNES(ファミコン)エミュレータは、昔遊んだファミコンのゲームがESP32で動かすことが出来るので、こちらもブレッドボードで組んで動かしてみるのは非常に面白いと思います。
この投稿をInstagramで見る
マイコンを使って動かすこのようなゲームコンソールプロジェクトはこちらでまとめているので、合わせて見て頂ければと思います。
そして今回はパックマンやドンキーコング、ギャラガといったレトロアーケードゲームがプレイ出来るエミュレーター(Z80)に挑戦してみました。
こちらもESP32開発ボードを使いブレッドボード上で簡単に組むことが出来る面白いプロジェクトです!
プレイ動画を見て懐かしいと感じられる方多いのではないでしょうか?
この投稿をInstagramで見る
目次
昔懐かしのレトロアーケードゲームをESP32で動かす!
初期のレトロアーケードゲームの代表作と言えば、『パックマン』や『スペースインベーダー』、『ギャラガ』『ディグダグ』などが挙げられると思います。
リアルタイムな世代ではない私でも名前くらいは聞いたことがあります。
80年代初頭に流行ったこれら代表的なアーケードゲームをプレイ出来るものの一つに『TINY ARCAD(タイニーアーケード)』という当時のアーケードゲームの形状を模したミニサイズのゲーム機は結構有名かもしれませんね!
TINY ARCADは個別でゲームが収録されているようで、全6種類が販売されています。
これら昔懐かしのレトロアーケードゲームをESP32でエミュレーションして動かすことが出来る面白いプロジェクトがGitHubに公開されていました。
Till Harbaum氏による『Galagino – ESP32 Arcade Emulator』と呼ばれるプロジェクトで、80年代に流行った代表的なこれらアーケードゲームをESP32で動かしプレイすることが出来ます。
『パックマン』『スペースインベーダー』『ドンキーコング』『ギャラガ』『ディグダグ』『1942』の6つのレトロアーケードゲームが遊べます。
参考 Galagino - ESP32 Arcade EmulatorGitHub上記プロジェクトではレーザーカッターを使いTINY ARCADのようなアーケードゲーム機の形状を模したボディーを作り完成させているようです。
ハードウェア的には、ESP32開発ボードを使いTFTディスプレイやI2Sオーディオモジュール、タクトスイッチといったパーツで構成されているのでブレッドボードで組んで動かし楽しむことが出来ます。
エミュレーションの再現性が高くよく出来たプロジェクトで、ブレッドボードで実際に組んでプレイしてみると非常に面白かったので私も3Dプリントパーツで組めるように現在このようなボディーの製作を考えています。
実は夏休みに遊びに来ていた小学生の甥っ子くんがブレッドボードで組んだものを大変気に入り・・・ボディーを作って欲しいというオーダーを受けて製作しています。
この投稿をInstagramで見る
今回は上記GitHubのデータをお借りして、ブレッドボードで組める構成のものを見ていきます。
全体構成 & 接続
『Galagino – ESP32 Arcade Emulator』は汎用性の高いパーツ構成で作れるので、手持ちのパーツを使い簡単にブレッドボードで組むことが出来ると思います。
Galaginoの全体構成は、ESP32開発ボードにSPI TFTディスプレイ、タクトスイッチ、I2Sオーディオモジュール&スピーカーといった簡単な構成で動かすことが出来ます。
またWS2812Bで制御するLEDストリップを接続すれば、ゲームによって色やパターンを変えて点灯させることも出来ます。
私が組んだものはESP32開発ボードにLolin D32を使いました。
ボディーをCADで設計し完成させようとしていますが、その際にリポバッテリーからの駆動や充電回路が内蔵されているLolin D32は最適です。
ブレッドボードで組むだけなら、入手性がよいESP32-DevKitCでも問題なく動作させることは出来るので下記接続図ではそちらで記述しておきます。
全体接続はこのようになります。(LEDストリップは必要なければ接続しなくても問題ありません)
TFTディスプレイ (SPI ILI9341) | ESP32-DevKitC |
3.3V | 3.3V |
GND | GND |
CS | IO5 |
RES | IO27 |
DC | IO32 |
SDI | IO23 |
SCK | IO18 |
LED | IO13 |
SDO | IO19 |
タクトスイッチ | ESP32-DevKitC |
UP | IO4 |
DOWN | IO15 |
LEFT | IO33 |
RIGHT | IO14 |
FIRE | IO12 |
START | IO22 |
COIN | IO21 |
オーディオアンプ (PAM8302) | ESP32-DevKitC |
Vin | 3.3V |
GND | GND |
IN+(A+) | IO25 |
IN-(A-) | GND |
LEDストリップ (WS2812B) | ESP32-DevKitC |
5V | 5V |
DIN | IO16 |
GND | GND |
使用パーツ一覧
ESP32開発ボード
上記接続図ではESP32開発ボードにESP32-DevKitCを使っています。
ESP32-DevKitCは最もポピュラーなESP32開発ボードなので入手性もよく持っている方も多いと思います。
ESP32-DevKitCを使う場合、このボードは幅広なボードのため片側6列タイプのブレッドボードを使うと便利です!
CADで設計し3Dプリントパーツでボディーを製作して完成させようと考えていますが、そちらではLolin D32を使う予定です。
ESP32-DevKitCと同じESP-WROOM-32が使われた開発ボードでリポバッテリーからの駆動も可能で充電回路も内蔵されているボードとなります。
ESP32-DevKitCとは端子の位置が異なりますが、上記接続図通りのI/O接続で問題なく動作させることが出来ます。
ディスプレイ
ディスプレイは2.2インチサイズのTFTディスプレイ(240×320)を使いました。
よく見かけるSDカードスロットルが裏面に付いたタイプのものです。(SDカードは使いませんが!)
SPI接続で制御ドライバチップにILI9341が使われ解像度が240×320のものならサイズが変わっても使えるはずです。
I2Sオーディオアンプ & スピーカー
I2SオーディオアンプはPAM8302モジュールを使います。
シングルチャンネルのD級パワーアンプモジュールです。
最大2.5Wまでの出力が可能なので接続するスピーカーの選択肢は広いと思います。
動画でのブレッドボードのテストでは1Wミニスピーカーを使っていますが、ボディーを製作して使うものにはこちらの2Wのものを使う予定です。
かなり音質が良くなりました!
タクトスイッチ
このレトロアーケードゲームには、[UP][DOWN][LEFT][RIGHT][START][FIRE][COIN]の7つのスイッチが必要となります。
アーケードゲームのROMデータを使っているので当時のプログラムとしてはコイン(お金)を入れてプレイするわけですが、これは[COIN]スイッチに置き換えられています。
6mm角(6mm×6mm)の小さなタクトスイッチがブレッドボードでは配置や配線がしやすいと思います。
LEDストリップ
これはブレッドボードで組む場合は必要ないかもしれませんが、プレイするゲームによって点灯パターンや色などが変わり取り付けると面白いと思います。
WS2812Bチップを使ったLEDストリップに対応しています。
デフォルトでは7個のLEDを制御するようになっていますが、スケッチを修正し数を変えることも可能です。
以上がブレッドボードで組む際に必要なパーツ一覧となります。
入手しやすいパーツばかりなので問題ないかと思います。
ゲームエミュレーターの書き込み手順
GitHubからGalagino本体のファイルをダウンロードします。
まだ必要なファイルが足りないので、ESP32に書き込みを行うには以下いくつかの手順が必要となってきます!
ダウンロードしたファイルの中の[README.md]に詳しい手順が書かれていますが、少し面倒な作業となるので簡単に見ておきます。
- ESP32ボードパッケージのインストール
- Z80エミュレータおよびゲームROMデータのダウンロード
- Pythonスクリプトを使いエミュレータおよびROMデータの変換
- コンパイル&書き込み
①ESP32ボードパッケージのインストール
コンパイル&書き込みにはArduino IDEを使うことが推奨されています。
Arduino IDEを使いESP32ボードへの書き込みを行う場合、[esp32 by Espressif Systems]というボードパッケージのインストールが必要となります。
普段ESP32開発ボードをArduino IDEで使われている方は問題ないと思いますが、初めてという方はまずこちらの記事を参考にArduino IDEにESP32に対応したボードパッケージのインストールを行って下さい。
ESP32ボードパッケージはI2Sオーディオの関係で、V2.0.9以降のバージョンが推奨されています。(2023.08現在最新のV2.0.11を使いました)
②Z80エミュレーターおよびゲームROMデータのダウンロード
GitHubからダウンロードしたメインファイルにはZ80エミュレーターと各ゲームROMデータは含まれていません。
またそれらデータの変換作業も必要となってきます。
まず必要となるこれらデータをダウンロードします。
ゲームROMにはアーケード版やファミコン版、またUS版やJapan版など種類が多いためROMデータを探すのも結構手間がかかったので(ROMデータが違うと当然コンパイルが通りません)、以下リンク先のゲームROMではコンパイル&動作が確認できたので貼っておきます。
Z80エミュレーター
ゲームROMデータ
Z80エミュレーターと6つのゲームROMはzip形式の圧縮ファイルとなっています。
Z80エミュレーターのzipファイル(Z80-081707.zip)は解凍せずにそのまま[galagino-main]フォルダ内の[roms]フォルダの中に入れます。
6つのゲームROMの方は解凍して出来たファイルを全て[roms]フォルダの中に入れます。(かなりの数あります)
③Pythonスクリプトを使いエミュレーターおよびROMデータの変換
ここから少し面倒なんですが、上記ダウンロードしたデータの変換作業が必要となります。
手動で変換することも出来ますが、GitHubからダウンロードしたgalaginoファイルにはこれらを一括で変換できるスクリプトが用意されています。
製作者の方に感謝ですね!
付属するPythonスクリプトを使いROMデータとエミュレーターコードにパッチを適応しESP32でコンパイル&動作出来る状態にします。
一括で行えるシェルスクリプトは[galagino-main] –>> [romconv]フォルダ内にある[conv.sh]ファイルがこれにあたります。
ターミナルからこの一括変換を行うシェルスクリプを実行します。
ターミナルを立ち上げ、cdコマンドでディレクトリを[romconv]に移します。
cd(スペース)を打ち込み[romconv]フォルダをドラッグすると簡単です。
そしてスクリプト(conv.sh)の実行です。
bashコマンドを使い実行します。
bash conv.sh
と打ち込みリターンを押すと実行されます。
こんな感じです!
この投稿をInstagramで見る
エラーがなければこのような表示になるかと思います。
これで必要なファイルがメインとなる[galagino]フォルダ内に生成されます。(トータル85ファイルになりました)
これでESP32ボードにコンパイル&書き込みが行えます。
④コンパイル&書き込み
それでは書き込みです。
Arduino IDEで[galagino]フォルダ内の[galagino.ino]ファイルを開きます。
先程生成されたファイルが全て読み込まれます。
LED点灯用のFastLEDライブラリが必要となるのでこれをまずインストールします。
ライブラリのインストールが完了したら書き込みです。
今回ESP32-DevKitCを使っているので[ボード]は[ESP32 Dev Module]を選択します。
デフォルト設定から変更する必要はありませんが、Galaginoはコア0を使用するためArduinoの値は1(デフォルト設定)である必要があります!
この設定がデフォルト値ですが変更されていたため、ゲームプレイ中に頻繁に再起動を繰り返すというトラブルがありました。
ゲームロゴ選択画面が表示されれば成功です。
お疲れ様でした!
ゲームロゴを上下に動かして選択する、おしゃれですね!
この投稿をInstagramで見る
この投稿をInstagramで見る
この投稿をInstagramで見る
【追記】ESP32で動かすMini RetroTVを製作しました!
TINYシリーズにはレトロな動画を再生するTinyTV(タイニーTV)があります。
こちらもESP32を使いMini RetroTVとして製作してみました。
興味ある方はこちらの記事も合わせて見て頂ければと思います。
最後に!
市販されているTINY ARCADでは個別ゲームしかプレイできませんが(実は3つのゲームROMが内蔵されているようです)、比較的入手しやすいパーツ構成で人気のレトロアーケードゲームを複数プレイ出来る・・・非常に面白いプロジェクトですね!
ほんと製作者さまに感謝です!
このようなオープンソースのゲームコンソールプロジェクトはたくさんあり、プログラム初心者の私としては毎回コンパイルを通し動作させるまでに非常に時間がかかるのですが、少しでも簡単に動作させることが出来るようにまとめてみました。
参考になればと思います。
またこのようなマイコンを使って動かすゲームコンソールに関してはこちらでまとめているので、興味ある方は他のプロジェクトも合わせて見て頂ければと思います。
東京バードさん
自作記事を多数掲載され有り難いです。
記事を参照させて頂きまして、ESP32のgalaginoを製作する事ができました。
分かりやすい記事で助かりました。
時々覗かせて頂くと思います。