オープンソースでハードウェアの構成やプログラムなどが公開されている面白いプロジェクトはいくつもあります。
電子工作で試してみるのは面白く、そしていろんな知識も身に付くと思います。
個人的にハマっているのが、マイコンを使ったゲームコンソールを作るというオープンソースプロジェクトです。
ArduinoやESP8266/ESP32などのマイコンを使ってレトロゲームやゲームエミュレータを動かすといったオープンソースプロジェクトは多くの方が挑戦され楽しまれているのではないでしょうか?
私もその内の一人で、これまでいくつかオープンソースのゲームコンソールプロジェクトに挑戦してきました。
少しご紹介しておきます。
簡単なものではATtiny85という小さなAVRマイコンを使った『Tiny Joypad』というミニゲームコンソールがあります。
Tiny Joypad用に作られた多数のミニゲームを楽しむことが出来ます。
また『Arduboy』は結構有名ですね!
ArduboyはコアにATmega32U4を使ったゲームコンソールでいくつかのモデルが市販されています。
ATmega32U4はArduino LeonardoやPro Microで使われているMCUなので、これらボードを使えば簡単に試すことが出来ます。
本格的なゲームがプレイできるものでは『ESPboy』も有名です!
ESPboyはWeMos D1 MiniというESP8266開発ボードが使われているので、使えるフラッシュメモリの容量も大きく本格的なゲームが楽しめ、Wi-Fi経由でゲームデータをダウンロードしたり、拡張端子を使ってゲーム以外のガジェットとして楽しむことも出来ます。
この投稿をInstagramで見る
これらは全てオープンソースのプロジェクトなので、回路図やプログラムなどの詳細な情報が公開されています。
ブレッドボード上に組んで試してみたり遊ぶことが可能で、また構成等をアレンジしてオリジナルの基板として仕上げるなど、また別の楽しみ方も出来ると思います。
そして今回は、昔懐かしのファミコンのゲームエミュレータをESP32で動かすプロジェクトに挑戦してみました!
ESP32でファミコン(NES)エミュレータを動かすオープンソースプロジェクトはいくつかありますが、今回NESCATを使い小型なカラーIPSディスプレイ(1.3インチ or 1.5インチ)とI2Sオーディオ(MAX98357)で動く構成にアレンジして製作してみました。
ブレッドボードでのテストを経て最終的にこのような自作基板を製作して完成させることが出来ました!
この投稿をInstagramで見る
もちろんこのプロジェクトもESP32開発ボードを使いディスプレイやスイッチ、アンプなど必要なパーツを用意すればブレッドボードで組んで楽しむことが出来ます!
目次
【NESCAT】ESP32でファミコンエミュレータを動かす!
NESCATとは?
冒頭でご紹介したようにマイコンを使いファミコン(NES)エミュレータを動かすオープンソースプロジェクトはいくつかあります。
今回ESP32やESP8266などのマイコン上でファミコンエミュレータを動かす『NESCAT』というプロジェクトを利用させて頂きました。
以下GitHubサイトでNESCATが動作するハードウェアの紹介やエミュレータ本体のプログラムが公開されています。
参考 nathalislight / NCATGitHubNESCAT(または他のプロジェクト)を使ってESP32上でファミコンエミュレータを動かす試みは多くの方が挑戦されているみたいで、ブログやYou Tubeなどで多数紹介されていますが・・・
いろいろと試してみたのですが私の環境ではどれもコンパイルをうまく通すことが出来ず、ブレッドボードで動作させるまでに数ヶ月かかってしまいました。
NESCATは上記GitHubのものが本家?となりそこから派生したプロジェクトが多数あるようです!
小さなディスプレイではなくコンポジット出力を使い大きなモニターに出力させたり、PSのBluetoothコントローラーを使って操作したり、音を出すアンプなど様々な構成で組むことが出来るのですが・・・プログラム初心者の私としては自分が作りたい構成のもので動作させるのは非常に大変でした。
この投稿をInstagramで見る
ブレッドボードで動かすなら1.5インチくらいまでのディスプレイサイスとミニスピーカーで音を鳴らすことが出来る構成・・・といったものが最適だと思います。
こちらの方が作られている構成に近いので参考にさせて頂きました!
参考 HOMEMADE NES CONSOLE ELECTRONOOBS構成 & 使用パーツ
ディスプレイサイズやESP32ボードなど構成を変えていくつかテストしてみましたが、ブレッドボード上で動かすのであれば1.3インチまたは1.5インチくらいのディスプレイサイズが最適だと思います。(2インチまでいくとブレッドボードでは大きすぎるかな?)
ブレッドボードでの動作確認後、面白かったので自作基板として完成させたのですがその関係もあってESP32開発ボードはESP32-DevKitCを使い、1.3インチ(または1.54インチ)サイズのIPSディスプレイ、SDカードモジュール、MAX98357 I2Sオーディオアンプモジュールを使った構成で組んだものを見ていきます。
ESP32開発ボード
まずESP32開発ボードはESP32-DevKitCを使っています。
他のボードでの動作も確認していますが、多くのI/O端子を必要とするのでブレッドボードで組む場合はESP32-DevKitCを使うのが適していると思います。
ESP32-DevKitCは幅広なボードなので、ブレッドボードを上手く連結したり6列タイプのボードを使うと便利です!
ディスプレイ
ディスプレイはST7789ドライバを使ったSPI接続のIPSカラーディスプレイ(240×240)を使っています。
1.3インチ(7ピン)、または1.54インチ(8ピン)のもので動作します。
他のディスプレイを使用される場合は、使用するディスプレイに搭載されているドライバチップに適したライブラリや解像度の変更等が必要になってくるので注意して下さい!
microSDカードモジュール
microSDカードモジュールは手元にあったこちらを使いました。
SDカードモジュールはどれを使っても問題ないはずですが、こちらのモジュールでは電源入力が5Vとなっているタイプのものです。
ESP32-DevKitCには5V端子があるので使用には問題ありません!
I2Sアンプモジュール
アンプモジュールはI2S接続のMAX98357モジュールを使いました。
ゲインの調整も出来ますが、下記接続ではGAIN端子は開放で使用しデフォルトの9dBで使用しています。
自作基板の方では半固定抵抗を使い簡易的にボリューム調整出来るようにしました。
ブレッドボードでのテストで音が大きすぎるようであれば(特に問題ないと思いますが)、出力端子に抵抗を挟むか、GAIN端子に規定値の抵抗を接続することにより調整して下さい。(参照)
スピーカー
スピーカーは手持ちであったこちらを使いました。
アンプモジュールMAX98357はゲイン調整等はせずにデフォルト設定で使っています。
データシート上、出力電力は8Ωで最大1.8Wなので8Ω 1Wのこのスピーカーでは少し定格をオーバーしているかな?といったところですが、特に問題なさそうなので自作基板の方でもこのスピーカーを使用しました。
タクトスイッチ
ゲーム操作で使用する[↑][→][↓][←][A][B][SELECT][START]の6つのスイッチが必要となります。
ブレッドボードでのテストでは6mm角の小さなスイッチが配置しやすいと思います。
抵抗
各スイッチのプルダウン抵抗として10kΩの抵抗が必要です。
以上が必要なパーツです。
私の環境で動作させることが出来た上記構成で動くプログラムもダウンロード出来るようにしておきます。(後述します)
接続
各I/O端子はこのように割り振りました。
全く同じ接続および構成で基板化させましたが、SDカードのやり取りにGPIO12をSPIで使っておりこの端子をプルアップさせていたことにより書き込めないというトラブルがありました。
GPIO12は起動時の内部電圧を決定するピンでもあるのですが、今回ブレッドボードで組む構成および上記SDカードモジュールを使う場合は特に問題にはならないのでこの接続で進めていきます。
スイッチ | GPIO端子 |
UP | 2 |
DOWN | 15 |
LEFT | 39 |
RIGHT | 34 |
A | 21 |
B | 26 |
SELECT | 17 |
START | 4 |
ディスプレイ | GPIO端子 |
DC | 5 |
RST | 19 |
MOSI | 23 |
SCK | 18 |
microSDカードモジュール | GPIO端子 |
MOSI | 12 |
MISO | 13 |
SCK | 14 |
CS | 22 |
I2Sオーディオアンプ | GPIO端子 |
BCK | 27 |
LCK | 32 |
DIN | 25 |
これらの割り振りを踏まえた全体の接続はこのようになります。
基板製作のため何度もテスト動作をさせていたので配線が超汚いのですが・・・ブレッドボードを2枚連結してこのサイズにまとめることが出来ました!
6列タイプのブレッドボードを使って分割した方が操作はしやすいかもしれませんね!
スケッチ(エミュレータ)の書き込み
接続ができたらESP32にNESエミュレータ本体のスケッチを書き込みます。
こちらではArduino IDEを使って行っていきます。
Arduino IDEでESP系のボードを扱う場合、対応したボードパッケージのインストールが必要となってきます。
初めてESP32への書き込みを行うという方は、以下記事を参考にESP32に対応したボードパッケージのインストールを行って下さい。
ライブラリのインストール
必要なライブラリがいくつかあります。(抜けてたらごめんなさい!)
Arduino IDEはバージョン2.1.1を使っています。
必要となる以下ライブラリのインストールをまず行って下さい!
ライブラリのインストールは、[スケッチ]→[ライブラリをインクルード]→[ライブラリを管理]から検索すると見つかるので、以下3つのライブラリのインストールが必要です。
ESP32ボードパッケージやライブラリのバージョンの組み合わせ等によりコンパイルエラーが出る場合がありスケッチやライブラリの修正等大変なので、今回使用しているバージョンも一応明記しておきます。
IDE / ボードパッケージ / ライブラリ | バージョン |
Arduino IDE | 2.1.1 |
esp32 by Espressif Systems (ボードパッケージ) | 2.0.11 |
Adafruit GFX Library by Adafruit (ライブラリ) | 1.11.5 |
Adafruit ST7735 and ST7789 Library by Adafruit (ライブラリ) | 1.10.0 |
SdFat by Bill Greiman (ライブラリ) | 1.0.5 |
スケッチの書き込み
ライブラリのインストールが完了したらNESCATスケッチをESP32に書き込みます。
上記構成で私の環境で動作したスケッチをダウンロード出来るようにしておきます。
NesCat Emulator(Sketch)
ESP32-DevKitCを使っているので書き込み時の[ボード設定]は[ESP32 Dev Module]を選択し、他の項目はデフォルト設定で問題ありません。
無事スケッチの書き込みが完了したら、ディスプレイに[SD card initialization failed!]というエラーメッセージが表示されます。
このエラーメッセージが表示されれば成功です。
ゲームROMデータを追加する
NESCATはSDカード内のゲームROMデータをESP32のメモリ内に読み込み実行させています。
ゲームROM配布サイトはいろいろとあるようですが、参考として以下サイトのリンクを貼っておきます。
参考 GamesThe NES Files 参考 Nintendo (NES) ROMsEmulatorGames.netROMデータをダウンロードしてSDカード内に[NES]フォルダを作りこの中にコピーします。(複数ROMデータを入れることも出来ます)
SDカードを装着し起動させると、NESフォルダ内のゲームROM名がリスト表示されます。
あとはプレイしたいゲームを選択すればROMデータが読み込まれ遊ぶことが出来ます。
この投稿をInstagramで見る
使用するゲームROMによりESP32の処理速度が合ってなかったりすることもあるようです!
エミュレータに関しては全然詳しくないのですが、同じゲームでも配布されているサイトのROMデータによって処理速度が微妙に違ってたりする事があるようですが・・・あとは検証等して頂ければと思います。
最後に!
今回ご紹介したESP32で動かすNESエミュレータは、プログラム初心者の私としてはブレッドボードで組めるこのような構成で動作させるまで非常に時間がかかりました!
比較的入手しやすいパーツ構成で作っているのでブレッドボードで組んで試すことができ、ファミコンのゲームがブレッドボード上でプレイできるのは非常に面白いと思います。
ゲームプレイに関してはさすがにブレッドボードで組んだものでは操作性のこともあるので、私は自作基板でゲームコンソール基板として仕上げました。
こちらもまた別記事でご紹介できればと思います。
この投稿をInstagramで見る
nescat 0.5を使えばゲームの動作が軽くなりますよ
このブログを電子工作の参考にいつもさせていただいています。
色々な情報、ノウハウの公開ありがとうございます。
こちらのNESCATプロジェクトですが最初コンパイルエラーが出てうまく行きませんでした。
そこで色々調べてSdFatライブラリのSdFatConfig.hの79行目のマクロ定義を0から1に変更しました。
#define ENABLE_SOFTWARE_SPI_CLASS 1
これでコンパイルが通るようになりSDカードの読み込みができるようになりました。
いえいえ、とんでもないです。
とても役に立っています。
GalaginoやTinyTVは実現できましたよ。
自分なりにプログラムはアレンジしつつ楽しく制作できました。
ご返事ありがとうございました。
シリアルモニタのInserting cattridge.まで行きましたが、画面の表示をしません。
あきらめます。
実はこのNESCATを本記事の構成で動かせるようにコンパイルし動作出来るまでに半年ほど私はかかってまして!
ようやく動かすことが出来るようになったので、ブログで紹介させてもらったのですが・・・・
お役に立てず申し訳ございませんm(_ _)m
Lolin D32でも動作可能なのでしょうか?
どうにもうまく行きません。
SDカードの読込みがうまく行っていない模様です。
Sdfatライブラリのバージョンは合わせているのですけど。。。