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

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

マイコンボードを使ってファミコンのゲームを動かすエミュレータとしてオープンソースプロジェクトで公開されているものを先日ご紹介しました。
昔懐かしのファミコンのゲームをESP32を使って動かすというものです。
ブレッドボード上でファミコンのゲームがプレイできる面白いプロジェクトとなります。

マイコンボードを使ってNESエミュレータを動かすオープンソースプロジェクトはいろいろとあるようですが、上記のものは『NESCAT』というESP8266やESP32で動かすことが出来るエミュレータを使いました。

【電子工作】ESP32でファミコンエミュレータを動かすオープンソースプロジェクトに挑戦![NESCAT]

1.3インチ(または1.54インチ)のIPSカラーディスプレイ、ESP32-DevKitC、MAX98357 I2Sオーディオモジュールといった比較的入手しやすいパーツ構成でブレッドボード上で動作するようにカスタムしたものを上記記事でご紹介しています。

ブレッドボード上でファミコンのゲームが遊べるのは非常に面白かったので、自作基板を製作してこのようなゲームコンソール基板として完成させました!

今回はこのNESエミュレータ自作ゲームコンソールを見ていきたいと思います。

ファミコンエミュレータが動く自作ゲームコンソールの製作

NESCAT』はESP8266やESP32で動かすことが出来るファミコン(NES)エミュレータです。

コンポジット出力を使い大きなモニターに表示させたり、PSのBluetoothコントローラーで操作するなど様々な構成で組むことが出来るのですが・・・プログラム初心者の私としては自分が動かしたい構成で動作させるまでには非常に苦労しました!

参考 NCAT/nathalislightGitHub

ブレッドボードで簡単に組んで動かせる構成としてESP32-DevkitC開発ボードを使い、1.3インチ(または1.54インチ)のカラーIPSディスプレイ(ST7789ドライバ使用)、MAX98357 I2Sオーディオモジュールという構成で組んだものを以下記事でご紹介しました。(この構成で動くスケッチもダウンロード出来るようにしています)

ブレッドボードでファミコンのゲームをプレイすることが出来るので非常に面白いと思います。

【電子工作】ESP32でファミコンエミュレータを動かすオープンソースプロジェクトに挑戦![NESCAT]

今回は上記ブレッドボードで組んだものをベースに自作基板として製作し、ファミコン(NES)エミュレーターを動かすことが出来る自作ゲームコンソールとして仕上げてみました。

基板設計

ゲームコンソール基板として仕上げるため片手で収まるサイズ感の基板にしたい・・・ということで、まずFusion360を使い基板外形の設計&ボタン配置などを考えました。

自分の手のサイズ(比較的小さい方です)で押しやすい位置関係でボタンを配置し、この基板サイズで収めることが出来るディスプレイサイズということで1.54インチのIPSカラーディスプレイで動かす構成にしました。(1.3インチディスプレイでも動作します)

基板外形が決まればKiCadを使った基板の設計です。
Fusion360で作った基板外形データ(DXFファイル)はKiCadにインポートして使うことが出来るので便利です!
ここから基板設計を行っていきます。

Fusion360で作った基板外形データ(DXFファイル)をKiCadにインポートして使ってみる!

今回は基板外形をFusion360で作った段階で、トッププレートとボトムプレートの形状も同時に作りました。
アクリルパネルを想定したプレートですが、3Dプリントパーツとして出力して使うことも出来ます。

KiCadでの基板設計後に形状やスイッチの位置など配置が変わるかもしれませんが、KiCad側からDXFファイルを出力させることも出来るのでこれをFusion360に持ってくればトップやボトムプレートの修正もやりやすくなります。

回路構成

ESP32-DevkitCやSDカードモジュール、I2Sオーディオモジュールなどブレッドボードで組んだものをそのままモジュール単位でこのサイズの基板に乗せるにはスペース的に少し無理があるので、回路も1から組むことに・・・!

全体の回路構成はこのようにしました!

コアにESP-WROOM-32を使い、プログラム書き込み用のUSB-シリアルチップはFT232RL、ディスプレイはST7789ドライバチップを使った1.54インチ(240×240)TFTカラーディスプレイ、microSDカードスロット、MAX98357チップを使ったI2Sオーディオといったほぼブレッドボードで組んだものと同じ構成です。

500~1000mAh程度のリポバッテリーで動かすことを想定し、バッテリーの充電にTP4054チップを使った充電回路を追加しています。

基板表面にある2つのLEDは、電源ランプ[PWR]とバッテリー充電ランプ[CHARGE]となります。
[CHARGE]ランプはUSBケーブル接続時に自動的にリポバッテリーの充電が開始され点灯します。
リポバッテリーが規定電圧(4.2V)まで充電されると消灯します!

また、Instagramで[SELECT][START]スイッチの位置が左右逆なんじゃないか?
というコメントをいくつか頂きましたが、これは私が左利きということもあり決定ボタンとなる[START]スイッチが左側にあった方が操作しやすいということでこのような配置にしています。

そして本構成で何度もブレッドボードで組んでテスト動作させていたのですが・・・上記全体回路図で問題になる箇所がいくつかあり、スケッチが書き込めないといったトラブルがありました!

回路上の不具合ポイント

ESP-WROOM-32の起動時のモード決定を行うピン

大きなミスはGPIO12にプルアップ抵抗が繋がれているところです。
SDカードの読み取りにはSDカードとESP32をSPIモードで接続して読み取りを行うわけですが、そのSPIピンの一つにGPIO12を使っていてプルアップさせていました。
回路図ではこの部分です。

GPIO12はESP32の起動時のモードを決定するピンの一つであるため、GPIO12がプルアップされた状態で起動すると内部電圧が1.8Vとなりスケッチの書き込みが出来ないというものです。

分かってはいたのですが・・・ブレッドボードで組んだものもほぼ同じ接続で使っていて、その際に使ったmicroSDカードモジュールにはレベルシフトを行うチップが入っていたためか動作に問題が出ずに気付きませんでした。

GPIO12に接続されている10kΩのプルアップ抵抗R17をカットすれば正常に動作するので助かりましたが・・・基板化する時は全く同じ構成でテスト回路を組むべきだなという教訓になりました。

悔しかったのでESP32(ESP-WROOM-32)の起動時のモードを決定する他の端子を含めた5つの端子(GPIO0/GPIO2/GPIO5/GPIO12/GPIO15)について別記事でまとめました。
こちらも合わせて読んで頂ければと思います。

【電子工作】ESP32(ESP-WROOM-32)の基本的な使い方!モジュール単体で動かしてみる!

FT232RLのインジケータLED(TX/RX)について

もう一つはFT232RLチップに接続したLEDです。
スケッチの書き込み時に点灯するインジケーターLED(TX/RX)で特に実装する必要はなかったのですが、パーツ実装時の動作テストの際にうまく動作しなければ問題切り分け等にも使うことが出来るので残しておいたものです。

USBケーブル接続時のスケッチ書き込みなどでは問題ないのですが、リポバッテリーからの実稼働時にはこのLEDが常に点滅状態になってしまいます。
特に動作には問題ないのですが・・・LEDが点滅するのは意図しない動作なので書いておきます。

FT232RLのTX/RX用のインジケーターLEDの接続で使える[CBUS0][CBUS1]端子はオープンドレインとなっているので、LEDをVCCに接続してこれら端子がGNDに落ちることにより点灯します。

FT232RLはUSB端子からのVBUS(5V)から電源供給していて(ロジックレベルは3.3Vです)USBケーブルが接続されていない通常のリポバッテリーからの駆動でプレイしている時は消費電力を抑えるため電源供給を行わない想定で上記回路図のような接続にしているのですが、3.3Vラインと繋げているLEDは点滅するという挙動を見せるようです。

・・・なるほど、FT232RLチップに電源供給を行っていない状態でも別ラインの電源を繋ぐと何かしらの挙動を見せるわけですね!
正解を書くなら、このインジケーター用のLEDの電源は3.3VラインではなくVBUSラインから取るのが正解でしたね!

特に点滅していても動作には問題ないので付けた状態で使っていますが、スケッチの書き込みや動作確認が出来ればもう必要ないLEDなので外してしまってもいいかもしれません。

FT232RLチップは今後使うことも多いと思い以前データシートを読みブレッドボード上で何度も動作テストをしたのですが・・・あらためて勉強になりました。

FT232RLに関してはこちらの記事も参考にして下さい!

【電子工作 / PCB】FTDI FT232RLを使ったUSB-シリアル変換モジュールを自作してみました

その他のトラブル

パーツ実装後、プログラムを書き込みましたが音が出ないというトラブルもありました。
ある程度想定は出来ていたのですが・・・

I2SオーディオチップMAX98357の[SD_MODE]端子に接続する抵抗値ですが、(L+R)/2というステレオ平均値を出力させるようにこの端子に680k~1MΩあたりの抵抗値を接続する計算なのですが・・・

片チャンネル(モノラル)にしないと、どうも音がうまく出てくれないようです!
ブレッドボードでのテストでは問題はなく、ファミコンでモノラル出力となるのでどちらでも音が出るはずなんですが・・・上記回路図でR23は680kΩの抵抗値にしていますが、100kΩに変更することにより無事音も出力されこれは解決しました。(データシート参照)

JLCPCBでの基板発注

基板の発注は今回もJLCPCBさんにお願いしました。
100mm以内に収まる基板サイズなので、基板料金は送料と合わせて500円程度で製作する事が出来ます。

JLCPCBでの基板発注に関しては、こちらの記事で詳しく解説しているので合わせて読んで頂ければと思います。

【電子工作】はじめての基板製作!JLCPCBさんに基板を発注してみました。ユーザー登録・データ納品・基板到着までの一連の流れをご紹介!

またパーツ点数が多くMAX98357やUMH3Nといった非常にピッチが狭いチップをいくつか使っているため、今回はステンシルも一緒に発注しました。

JLCPCBでのステンシルの発注方法に関してはこちらの記事も参考にして下さい!

【JLCPCB】初めてステンシルを使ったリフローを行ってみました。JLCPCBでステンシルを発注する手順などを紹介!

ステンシルとPCBの同時発注でしたが1週間ほどで手元に届きました。
JLCPCBさんは基板製造料金がお安く、そして送料区分にOCSが使えるので他社と比べトータルコストを大きく抑えることが出来るので毎回助かっています!

一応今回製作したこの基板のデータ(ガーバーファイル)をダウンロードできるようにしておきます。
何かの参考になればと思います!

パーツの実装

実装するパーツの数が多い場合やピッチの狭いICチップなどがある場合、最適な量のはんだペーストをパットに乗せることが出来るのでステンシルがあると便利ですね!

手作業ではんだペーストを乗せるより格段にリフロー後のブリッジ等の修正箇所が少なくなります。

パーツの実装はMHP30というミニリフロー装置を使いました。
毎回愛用していますが、非常に便利なリフロー装置です。

【電子工作】コンパクトボディーで安全設計!ミニリフロー装置『Miniware MHP30』を使ってみる!

またMHP30は小型でリフロー出来る範囲が狭いため、このような治具基板を自作すると大きな基板にも対応する事が出来るので非常に便利となります。

【電子工作】『Miniware MHP30』で大きな基板のリフローに対応出来るように治具基板を作ってみました!
MEMO
先述のように、スケッチの書き込みが出来なくなるのでR17の10kΩのプルアップ抵抗はカットして下さい!
また動作確認後、点滅状態となるLED1/LED2が・・・という方はこのLEDまたはそれに繋がる抵抗(R7/R8)もカットしても問題ありません!

スケッチの書き込み

パーツの実装が出来たらエミュレータの書き込みです。
本構成で動くスケッチは以下記事でダウンロード出来るようにしています。

hy6bjlん。dcfrgtv64スケッチ書込み後、microSDカードにゲームROMを入れ起動するとゲームをプレイする事が出来ます。
書き込み方法等含めこちらの記事を参考にして下さい。

【電子工作】ESP32でファミコンエミュレータを動かすオープンソースプロジェクトに挑戦![NESCAT]

パーツ一覧

必要なパーツ一覧も明記しておきます。
基板データを使って製作される方や自作で同様なゲームコンソール基板を作ろうとお考えの方は参考にして下さい。

パーツ定数入手先
コンデンサ
(0805)
C1/C3/C7/C9/C11/C13 10μF
C2/C4/C5/C6/C12/C14 0.1μF
C8/C10 1μF
C15/C16 470pF
Amazon
AliExpress
ダイオードD1 1N5819W(SOD-123)AliExpress
フューズ
(0805)
F1 500mAAliExpress
コネクタ等J1 Type-C端子AliExpress
秋月電子
J2 PH2.0端子(SMD)AliExpress
J3 microSDカードスロットAliExpress
インダクタ
(0805)
L1/L2 33μHAliExpress
LED
(0805)
LED1/LED2/LED3/LED4Amazon
AliExpress
MOSFETQ1 CJ2301AliExpress
抵抗R1-2/R5-6/R9/R11-12/R18-22 10kΩ
R3/R4 5.1kΩ
R7/R8/R10/R13 1kΩ
R14/R15 100kΩ
R16 2kΩ
R23 680kΩ(→100kΩ)
Amazon
AliExpress
半固定抵抗RV1 200ΩAliExpress
タクトスイッチ
(SMD 6mm×6mm)
SW1/SW2/SW3/SW5/SW6/SW7AliExpress
タクトスイッチ
(SMD 3mm×6mm)
SW9/SW10AliExpress
タクトスイッチ
(SMD 4mm×4mm)
SW4AliExpress
スライドスイッチ
(SMD)
SW8AliExpress
ICチップU1 FT232RL
(USB-シリアル)
AliExpress
秋月電子
U2 ESP-WROOM-32
(コア)
秋月電子
U3 ME6211C33
(3.3Vレギュレータ)
AliExpress
U4 TP4054
(リポ充電)
AliExpress
U5 UMH3N
(オートフラッシュ)
AliExpress
U6 MAX98357
(I2Sオーディオ)
AliExpress
ディスプレイ1.54インチTFT(240×240)
※ST7789ドライバ
Amazon
AliExpress
リポバッテリー基板サイズ(100mm×60mm)に収まるもの

【追記】透明レジンでプレートを製作しました!

JLCPCBの3Dプリントサービスを利用し、透明レジンを使ったトップとボトムプレートを製作しました。

操作性がアップし、非常にカッコいい仕上がりになったと思います。

【電子工作 / JLC3DP】JLCPCBの3Dプリントサービスを試す。透明レジンでPCBのパネルを製作してみました!

最後に!

ブレッドボードで組んで動かしたものが面白かったので、今回NESエミュレータが動きファミコンのゲームをプレイできる自作NESエミュレータコンソール基板として完成させました!

基板として仕上げると操作性など非常に良くなりプレイしやすいのですが、パーツの入手や基板設計など大変なので興味ある方はまずブレッドボードで組んで動かしてみるのがいいかと思います。
比較的入手しやすいパーツ構成で作れるのでオススメです!

またこのようなマイコンを使って動かすゲームコンソールのオープンソースプロジェクトはまだまだたくさんあります。
私がこれまで挑戦したものでは「ESPboy」や「Arduboy」「Tiny Joypad」などがあります。

これらもオープンソースプロジェクトなので回路図等の詳細な情報が公開されています。
ブレッドボードで組んで動かしてみるだけでも大変面白いので、興味ある方はこちらも見て頂ければと思います。

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

コメントを残す