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

【電子工作 / PCB】ファミコンのコントローラーをUSBゲームパッド化する基板を作ってみました!

以前製作を考えていた、本物のファミコンコントローラーをUSBゲームパッド化する基板が完成しました!

【電子工作 / PCB】ファミコンのコントローラーを使ったUSBゲームパッド化基板を作っています! まずはPro Micro(Arduino Leonardo)を使ったブレッドボードでのテストから!

ファミコン世代からは少し離れているのですが、最近電子工作でESP32などのマイコンボードを使ったゲームエミュレーター関連のものを製作していたことからファミリーコンピューター(NES)のゲームをプレイして遊ぶことが多くなりました。

「スーパーマリオブラザーズ」や「ドンキーコング」、「ツインビー」といった当時流行ったゲームは今プレイしてみても懐かしくて面白いですよね!

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

マイコンを使いエミュレーターにより動かすことが出来る当時のゲームですが、PC用のエミュレーターを使うと大きな画面でより楽しむことが出来ると思います。
電子工作的にはマイコンを使いゲームエミュレーターを動かす方が面白いとは思いますが・・・

PC用のエミュレーターを使って遊ぶ場合キーボードでも操作することは出来ますが、やはりゲームパッドを使うと操作はしやすくなります。

USBゲームパッドは様々なものが販売されています。
あまりゲームには詳しくない私としては自作したものを使ってプレイしたい・・・普段電子工作を趣味として楽しんでいる身としては、そんな事を考えてしまいます。

そんな事から以前スーパーファミコンのコントローラーの内部基板の形状をトレースして基板を自作し、USBゲームパッドに改造させました。
実物のスーファミコントローラーを使っているので、ゲームをプレイする際もなんだかテンションも上がってきます。

【電子工作 / PCB】スーパーファミコンのコントローラーをUSBゲームパッドに改造する基板を作ってみました!

基板が余っているので2コン用にもう1台製作しようかと考えていたのですが・・・
どうせならと今回は同様な手順でファミコンのコントローラーをUSBゲームパッド化させる基板を製作してみました!

ファミコンのコントローラーをUSBゲームパッド化させる自作基板の製作!

こちらが今回製作した本物のファミリーコンピューターのコントローラー(1コン)内部の基板と入れ替えUSBゲームパッド化させる基板です。

ファミコンのコントローラー実物を使っているので、当時のゲームをエミュレーターでプレイする際に雰囲気も出て面白いと思います。

コントローラー内部の基板形状のトレース

最近では程度の良いファミコンコントローラーの入手って難しいのでしょうかね?

オークションで外観が綺麗だったものを500円ほどで入手する事ができラッキーだったのですが・・・
中を開けてみると結構な汚れ具合、もうかなり年代物ですからね!

基板を入れ替えるだけでスイッチ類は全て使い回す予定なのでIPA等を使い洗浄・・・綺麗になりました!
ここから基板外形をトレースしていきます。

以前製作したスーファミコントローラーをUSBゲームパッド化させる基板では、既存製品の内部基板を上手くトレースして基板外形を作ることが出来ると何か面白いことに使えそう?
といった事から模索しながら製作しました。

【電子工作 / PCB】スーパーファミコンのコントローラーをUSBゲームパッドに改造する基板を作ってみました!

例えば100均に売っているミニゲーム機の内部基板の型を取り自作基板に入れ替えると、単なるドット表示のテトリスみたいなゲーム機をファミコンのゲームが動くものに改造(作り変える)することも出来そうで面白そうですよね!

今回もまずファミコンのコントローラー内部の基板形状を型取る作業から入りました。
Fusion360を使い基板外形・ビス穴・固定穴などをトレースしていきます。

前回スーファミコントローラーのUSBゲームパッド化基板を製作した時と同様な作業手順となりますが、ファミコンのコントローラー(今回1コン基板を製作)の上蓋・下蓋には基板固定などの目的で用意されている突起部分がいくつかあります。

この突起部分に基板上のパーツが干渉してしまうとケースを閉じることが困難(少し浮いてしまう)となるので、前回は位置を何度か確認しながら現物と合わせて微調整するといった作業で製作していました。

今回の基板も回路設計的にはそれほどパーツ点数は多くないのでその方法でもよかったのですが、パーツの配置を設計時に何度も微調整したりと結構面倒だったので、今回は基板表裏に干渉するコントローラーの上蓋・下蓋にある突起部分もFusion360を使い正確にトレースしたものをKiCadにインポートして行いました。

基板発注の際には使用しないレイヤーにそれぞれの干渉位置が分かるDXFファイルを読み込ませて基板設計を開始するというものです。

基板外形やビス穴、基板固定穴などは当然基板外形に反映される[Edges.Cuts]に読み込ませるのですが、基板発注の際には使用しない、例えば[User1レイヤー]に上蓋の突起位置、[User2レイヤー]に下蓋の突起位置を読み込ませておく・・・

これで基板設計時に全ての干渉位置の確認がKiCad内で出来るので非常に作業効率良く出来ました!

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

既存製品の内部基板を入れ替えて改造する・・・もともとやりたいと考えていたこのようなプロジェクトにも応用して使えそうですね!

回路構成

USB接続したPCのキー操作を行うわけですが、その制御で使うマイコンチップはATmega32U4を使いました。
Arduino LeonardoやPro Microで使われているMCUです。

回路構成は非常に簡単です!
前回製作したスーファミコントローラーのUSBゲームパッド化基板とスイッチの数が違うだけでほぼ同じ構成です。

基板設計

基板形状&回路が組めたら基板設計です。
使用するパーツ点数はさほど多くなく、干渉部分の確認もKiCadで行えたので基板設計は非常にスムーズに進みました。

前回の設計で少し不安だったメンブレンスイッチも上手く機能してくれたので、今回は特に大きな不安材料もなくCADでの設計を進めることが出来ました。

JLCPCB に基板発注

基板発注は今回もJLCPCBに発注しました。

今回製作した基板サイズは113mm×43mmとなります。
PCB製造メーカーの標準サイズとなる100mmを超えるサイズの基板製造では各社基板製作料金が一気に高くなってしまいますが、JLCPCB では標準サイズを超える基板でも他社と比べ製作料金が安く、また送料区分もOCSを選択することが出来るのでトータルコストを大きく抑えることが出来るのでオススメです!

今回の基板では1200円ほど(送料込み/5枚)で製作することが出来ました。(オプション項目なし)

基板データ(ガーバーファイル)をダウンロード出来るようにしておきます。
ファミコンコントローラーの基板形状など、何かの参考になればと思います。

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

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

今回製作した基板では、メンブレンスイッチのためのパットを作っています。

このようなパット部分がむき出しになったものでは、時間の経過とともに酸化や腐食等によりボタンの反応が悪くなる可能性があるようですね。
そのため発注時のオプション項目にあるENIG(無電解金メッキ)による表面処理をするのが望ましいようです!

前回のスーファミコントローラのUSBゲームパッド化基板ではノーマル発注して時間の経過によりそのような症状が出たら追記するよ!なんて書いていたのですが・・・半年ほどでは特に問題にならないようですね!
結構なオプション料金がかかってしまう加工項目となるので、今回も通常発注しました!

一応参考までに!
ENIG(無電解金メッキ処理)のオプション項目は、JLCPCBでは発注項目のこの部分です。
オプション項目となる表面処理となるので追加料金が発生します。

MEMO
ENIG(無電解金メッキ処理)
表面処理の一つで表面を薄く金メッキして銅箔の酸化を防ぐ処理。(参考:JLCPCB )

パーツの実装

送料区分はOCS Expressを選択して9日で到着しました!
ほんと到着が早いですね、JLCPCB。
トータルコストが他社よりも安く製造する事ができ、到着も早くて毎回助かっています!

0805サイズのパーツをベースとしているので実装はそれほど難しくないと思います。
手はんだでも可能ですが、パーツ実装はMHP30というリフロー装置を使いました。

コンパクトで作業スペースの邪魔にもなりにくく、非常に便利なミニリフロー装置で毎回愛用しています。

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

今回製作した基板は横方法に少し長いサイズとなっています。
MHP30を使ったリフローを行う場合、このような治具があると大きなサイズの基板にも対応出来るので便利です!

【電子工作】『Miniware MHP30』で大きな基板のリフローに対応出来るように治具基板を作ってみました!

使用パーツ一覧

今回使用したパーツ一覧です。

パーツ定数入手先
抵抗(0805)R1/R2 10kΩAmazon / AliExpress
R3/R4 22Ω
コンデンサ(0805)C1/C4/C5/C10 0.1μFAmazon / AliExpress
C2/C3 22pF
C6/C7 1μF
C8/C9 15pF
C11 10μF
ポリフューズF1 500mA(1812)AliExpress
MCUU1 Atmega32U4-AUAliExpress / 秋月電子
クリスタルY1 16MHzAmazon / AliExpress / 秋月電子
USBケーブルーーーーーー

プログラムの書き込み

パーツの実装が出来たらプログラムの書き込みです。
ATmega32U4は生チップを使っているのでプログラムの書き込みにはまずブートローダーの書き込みを行い、続いてゲームパッドとして動作するスケッチの書き込みが必要となります。

ブートローダーの書き込み

ブートローダーの書き込みにはAVRライタが必要となりますが、こちらではArduino経由で書き込みを行っていきます。

書き込みで使うArduino(こちらではUnoを使いました)に、Arduino IDEの[スケッチ例]の中にある[ArduinoISP]スケッチを書き込みます。
これでこのArduinoを経由して本基板にブートローダーの書き込みが行なえます。

次に接続です。
製作した基板にはブートローダーを書き込む際に使用するICSP端子を用意しています。
一時的にピンヘッダーを取り付けたり、直接ワイヤーをはんだ付けして書き込み装置として使うArduinoと接続します。

スルーホールで作っているので、このようなテストワイヤーがあるとそのまま差し込むだけで使えるので便利です!

今回ポゴピンを使い接続しました。
これ便利ですね!

ブートローダーを書き込む際のArduinoと本基板との接続はこのようになります。

Arduino Unoゲームパッド基板
5V5V
GNDGND
D10RESET
D11MOSI
D12MISO
D13SCK

Arduino IDEのボード設定は[Arduino Leonardo]、シリアルポートは接続しているArduino Unoのポートを選択します。
書き込み装置を[Arduino as ISP]に設定し、[ブートローダを書き込む]から書き込みを行います。

[ブートローダの書き込みが完了しました。]と表示されればOKです。

MEMO
ブートローダーの書き込みが完了したら、仮で取り付けたピンヘッダーはケースを閉じる際に邪魔になるので取り外して下さい!

スケッチの書き込み

次にゲームパッドとして機能するスケッチの書き込みです!
先程マイコンチップATmega32U4にブートローダーを書き込んだので、スケッチの書き込みはPCと接続したUSBケーブルを経由して行うことが出来ます。

まずUSBケーブルの接続です。
USBケーブルは手持ちで余っているものなどをカットして使えばいいと思います。
今回手元にあったType-A – Type-Cケーブルをカットしたものを使いました。

USBケーブル内部の4本のケーブルは、赤(VBUS)/黒(GND)/緑(D+)/白(D-)となっているのが一般的です。

MEMO
データ線(D+/D-)の色が上記とは異なっている場合もあるので、その際は確認して下さい!

基板の[USB Cable]と書かれたパッドの対応した部分にそれぞれケーブルをはんだ付けします。

配線が完了したらスケッチを書き込みます。
USBゲームパッドとして動作するスケッチです。
こちらからダウンロード出来るので使って下さい!

このスケッチは[ArduinoJoystickLibrary]というライブラリを使っています。
コンパイル&スケッチを書き込む際に必要となるので、以下GitHubサイトからライブラリをダウンロードしてArduino IDEにインストールしておく必要があります。

参考 ArduinoJoystickLibraryGitHub

ダウンロードしたライブラリのZIPファイルをArduino IDEにインストールします。

ライブラリのインストールが完了したらスケッチの書き込みです。
USBケーブルをPCと接続し認識されるシリアルポートを選択、Arduino Leonardoとして通常の手順でスケッチを書き込みます。

無事スケッチの書き込みが出来たら完了です!

元基板以外のスイッチ類は全て使いまわしています。

製作した基板に入れ替えケースを取り付けてUSBゲームパッドとして完成です!

動作テスト

正常にボタン動作が行われているかのテストです。

PCと接続しArduino IDEのシリアルモニタを立ち上げます。(ボーレート115200bps)
各ボタンを押し動作に問題がないか確認して下さい!
押されたボタンが0→1に変化します。

ゲームエミュレーターで使ってみる!

Mac環境で使えるゲームエミュレーターを使ってUSBゲームパットを使ってプレイしてみたいと思います。
こちらではOpenEmuで使う方法を簡単に見ていきます。
OpenEmuはこちらからダウンロードできます。

参考 OpenEmuトップページOpenEmu

ゲームエミュレーターに関してはあまり詳しくないのですが、一例としてゲームROM配布サイトのリンクも貼っておきます。

参考 GamesThe NES Files

ダウンロードしたゲームROMデータをOpenEmuにドラッグ&ドロップして格納します。
単品ゲームROMや複数セットになったものなどいくつか入れてみました。

お好みのゲームを立ち上げます。
設定項目の中にある[コントローラーを編集]からボタンを割り当てていきます。

コントローラは[Famicom]を選択し[入力]の項目はデフォルトでは[キーボード]に設定されていますが、製作したゲームパッドをPCに接続すると[Arduino Leonardo]を選択することが出来ます。

あとは対応したボタンをキー割り当てしていきます。

本物のファミコンコントローラーを使いファミコンのゲームをプレイすることが出来ました!
大成功です!

今回製作したUSBゲームパッドは、Arduino LeonardoやPro Microがあればブレッドボードで組んで動かすことも出来ます。

簡単に組むことができこれだけでも電子工作としては面白いので、興味ある方は試してみてはいかがでしょうか?

【電子工作 / PCB】ファミコンのコントローラーを使ったUSBゲームパッド化基板を作っています! まずはPro Micro(Arduino Leonardo)を使ったブレッドボードでのテストから!

【追記】ATmega32U4を使ったシンプルな1キーキーボードを製作しました!

ATmega32U4を使った1キーのみのシンプルな自作キーボード(1Key Keyboard)を製作しました!

今回製作したファミコンコントローラーをUSBゲームパッド化する基板と構成はほぼ同じなので、ArduinoでUSB機能を使う参考等になればと思います。

【電子工作/ PCB】1キーのみの可愛い自作キーボード(1Key Keyboard)の製作!

最後に!

普段よく使っているArduiono(Pro Micro / Leonardo)でこのようなUSBゲームパッドを作ることが出来るので、電子工作的には面白いですよね!

ファミコンコントローラーの内部基板の形状も上手く取れ機能してくれたので、次はこれを無線化などさせてみたいなとも考えています。
実は私の中ではこちらの方が本命?なんですが!

無線ファミコンコントローラーで自作ロボットを動かす・・・何かこちらも楽しそうですよね!

今回ATmega32U4を使ったUSBゲームパッドを製作したのですが、USB操作出来るチップは他にもあります。
自作キーボード製作ではATmega32U4やRaspberry Pi Picoで使われているRP2040を使うのがメジャーなようですね。
CH552Gといったチップを使ったものもよく見かけます。

これらチップを使って(まだMCUに何を使うか決まっていませんが)1キータイプの小さなキーボードの製作も考えています。
なんか可愛いですよね!
こちらもまた詳しくご紹介出来ればと思います・・・。

コメントを残す