11月25日発売 書籍『Arduinoと3Dプリンタでロボットを作ろう』を出させて頂きました!

【電子工作 / ESP32】昔懐かしのレトロアーケードゲームをESP32で動かす!面白いオープンソースプロジェクトです。

マイコンを使ってゲームを動かすオープンソースプロジェクトは多数公開されています。
私もこれまでいろいろと挑戦してきました。

ArduinoやAVRマイコンを使ったものでは、ATtiny85を使った『Tiny Joypad』やArduino LeonardoやPro Microを使った『Arduboy』は手持ちパーツを使ってブレッドボードで簡単に組んで動かすことが出来るのでオススメです!

【電子工作】ミニAVRマイコンATtiny85で動かすミニゲーム機『Tiny Joypad』互換ボードを作ってみました!【JLCPCB】
【電子工作】Arduino Pro Microで動かすArduboy互換機を作ってみる!

ESP系のマイコンを使ったものでは、ESP8266(WeMos D1 Mini)で動かす『ESPboy』は使えるフラッシュメモリの容量も大きく本格的なゲームが楽しめます。

【ESPboy】ESP8266で動かす携帯ゲーム機ESPboy。基板を製作して完成させました!【JLCPCB】

またESP32で動かすNES(ファミコン)エミュレータは、昔遊んだファミコンのゲームがESP32で動かすことが出来るので、こちらもブレッドボードで組んで動かしてみるのは非常に面白いと思います。

【電子工作 / ESP32】ファミコンエミュレータが動く自作NESゲームコンソールの製作!

マイコンを使って動かすこのようなゲームコンソールプロジェクトはこちらでまとめているので、合わせて見て頂ければと思います。

マイコンゲーム機 関連の記事一覧

そして今回はパックマンやドンキーコング、ギャラガといったレトロアーケードゲームがプレイ出来るエミュレーター(Z80)に挑戦してみました。

こちらもESP32開発ボードを使いブレッドボード上で簡単に組むことが出来る面白いプロジェクトです!
プレイ動画を見て懐かしいと感じられる方多いのではないでしょうか?

昔懐かしのレトロアーケードゲームを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プリントパーツで組めるように現在このようなボディーの製作を考えています。

実は夏休みに遊びに来ていた小学生の甥っ子くんがブレッドボードで組んだものを大変気に入り・・・ボディーを作って欲しいというオーダーを受けて製作しています。

【電子工作 / ESP32】ESP32で動かすアーケードゲームエミュレーター『Galagino』。TINY ARCAD風ケースを3Dプリンタで製作しました!

今回は上記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.3V3.3V
GNDGND
CSIO5
RESIO27
DCIO32
SDIIO23
SCKIO18
LEDIO13
SDOIO19
タクトスイッチESP32-DevKitC
UPIO4
DOWNIO15
LEFTIO33
RIGHTIO14
FIREIO12
STARTIO22
COINIO21
オーディオアンプ
(PAM8302)
ESP32-DevKitC
Vin3.3V
GNDGND
IN+(A+)IO25
IN-(A-)GND
LEDストリップ
(WS2812B)
ESP32-DevKitC
5V5V
DINIO16
GNDGND

使用パーツ一覧

ESP32開発ボード

上記接続図ではESP32開発ボードにESP32-DevKitCを使っています。
ESP32-DevKitCは最もポピュラーなESP32開発ボードなので入手性もよく持っている方も多いと思います。

はじめてのESP32開発ボードのおすすめ!『ESP-WROOM-32D開発ボード/ESP32-DevKitC-32D』の基本的な使い方!

ESP32-DevKitCを使う場合、このボードは幅広なボードのため片側6列タイプのブレッドボードを使うと便利です!

CADで設計し3Dプリントパーツでボディーを製作して完成させようと考えていますが、そちらではLolin D32を使う予定です。
ESP32-DevKitCと同じESP-WROOM-32が使われた開発ボードでリポバッテリーからの駆動も可能で充電回路も内蔵されているボードとなります。

ESP32-DevKitCとは端子の位置が異なりますが、上記接続図通りのI/O接続で問題なく動作させることが出来ます。

【電子工作】技適取得済みESP32開発ボード『Lolin D32』を使ってみる!

ディスプレイ

ディスプレイは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]に詳しい手順が書かれていますが、少し面倒な作業となるので簡単に見ておきます。

書き込みに必要な手順
  1. ESP32ボードパッケージのインストール
  2. Z80エミュレータおよびゲームROMデータのダウンロード
  3. Pythonスクリプトを使いエミュレータおよびROMデータの変換
  4. コンパイル&書き込み

①ESP32ボードパッケージのインストール

コンパイル&書き込みにはArduino IDEを使うことが推奨されています。
Arduino IDEを使いESP32ボードへの書き込みを行う場合、[esp32 by Espressif Systems]というボードパッケージのインストールが必要となります。

普段ESP32開発ボードをArduino IDEで使われている方は問題ないと思いますが、初めてという方はまずこちらの記事を参考にArduino IDEにESP32に対応したボードパッケージのインストールを行って下さい。

Arduino IDEでESP32やESP8266を使う時の環境設定を行う手順!

ESP32ボードパッケージはI2Sオーディオの関係で、V2.0.9以降のバージョンが推奨されています。(2023.08現在最新のV2.0.11を使いました)

②Z80エミュレーターおよびゲームROMデータのダウンロード

GitHubからダウンロードしたメインファイルにはZ80エミュレーターと各ゲームROMデータは含まれていません。
またそれらデータの変換作業も必要となってきます。

まず必要となるこれらデータをダウンロードします。
ゲームROMにはアーケード版やファミコン版、またUS版やJapan版など種類が多いためROMデータを探すのも結構手間がかかったので(ROMデータが違うと当然コンパイルが通りません)、以下リンク先のゲームROMではコンパイル&動作が確認できたので貼っておきます。

Z80エミュレーター

Z80エミュレーター(by Marat Fayzullin)

ゲーム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

と打ち込みリターンを押すと実行されます。
こんな感じです!

エラーがなければこのような表示になるかと思います。

これで必要なファイルがメインとなる[galagino]フォルダ内に生成されます。(トータル85ファイルになりました)

これでESP32ボードにコンパイル&書き込みが行えます。

④コンパイル&書き込み

それでは書き込みです。
Arduino IDEで[galagino]フォルダ内の[galagino.ino]ファイルを開きます。
先程生成されたファイルが全て読み込まれます。

LED点灯用のFastLEDライブラリが必要となるのでこれをまずインストールします。

MEMO
LEDライトを使わない場合でもスケッチ修正が面倒となるのでインストールしておく方が簡単だと思います!

ライブラリのインストールが完了したら書き込みです。
今回ESP32-DevKitCを使っているので[ボード]は[ESP32 Dev Module]を選択します。

デフォルト設定から変更する必要はありませんが、Galaginoはコア0を使用するためArduinoの値は1(デフォルト設定)である必要があります!
この設定がデフォルト値ですが変更されていたため、ゲームプレイ中に頻繁に再起動を繰り返すというトラブルがありました。

ゲームロゴ選択画面が表示されれば成功です。
お疲れ様でした!

ゲームロゴを上下に動かして選択する、おしゃれですね!

MEMO
ゲームプレイ中にゲーム選択画面に戻りたい場合は、[COIN]キーを長押しすれば戻ることが出来ます!

最後に!

市販されているTINY ARCADでは個別ゲームしかプレイできませんが(実は3つのゲームROMが内蔵されているようです)、比較的入手しやすいパーツ構成で人気のレトロアーケードゲームを複数プレイ出来る・・・非常に面白いプロジェクトですね!
ほんと製作者さまに感謝です!

このようなオープンソースのゲームコンソールプロジェクトはたくさんあり、プログラム初心者の私としては毎回コンパイルを通し動作させるまでに非常に時間がかかるのですが、少しでも簡単に動作させることが出来るようにまとめてみました。
参考になればと思います。

またこのようなマイコンを使って動かすゲームコンソールに関してはこちらでまとめているので、興味ある方は他のプロジェクトも合わせて見て頂ければと思います。

マイコンゲーム機 関連の記事一覧

コメントを残す