Arduino (Pro Micro互換ボード)を使用して、スーパーファミコン(SFC/SNES)のコントローラをXInput対応のUSBコントローラーとしてPCで使用できるコンバータを作成しました。
動機
- 右手を痛めたのでSFC用の片手コントローラー*1をPCで使いたい
- どうせならXInput対応のコンバーターが欲しい*2
- XInput対応の既製品の入手性が微妙*3だが、少し調べたところ安価なPro Microで作れそう
モチベーションはざっくりこんな感じです。
仕組みとか
ざっくりした仕組みとしては以下になります:
- ArduinoのGPIOとSFCコントローラーのコネクタピンを接続
- SFCコントローラーの入力状態をArduinoで解析
- 読み取った入力状態に従ってXInputのボタンのON/OFFを切り替える
割とシンプル。
『SFCコントローラーの入力状態をArduinoで解析』については既に実行されている方が何人もいらっしゃいました。私が直接参考にさせていただいたのは以下の記事です。
こちらの記事中で、Pro MicroをSFCのパッドを読み込みArduinoJoystickLibraryというライブラリ(https://github.com/MHeironimus/ArduinoJoystickLibrary)を使って標準HIDゲームパッド(≒DirectInput対応)として動作させるスケッチも公開されいたのでそれを流用させていただくことにしました。
また Pro MicroのXInputデバイス化は以下のライブラリを使用することで実現できました。
先人の成果物に完全におんぶにだっこ状態です(とてもありがたい)。
部材
以下の部材を使用しました。もともと手元にあったものやジャンクからはぎ取ったりしたもの等なので価格記載しません。
- SFCコントローラー用コネクタ(ジャンクのSFC本体から取得)
- Pro Micro互換ボード
- USB MicroBケーブル(100均モノ)
- ケース(100均モノ)
- 配線材料(適量)
- 固定用のネジ等
プログラム(ソースコード)
スケッチはこちらで公開しています。手元のPro Microで試しています。 github.com
参考というよりべースにさせていただいた snes_gamepad_arduino/snes_gamepad_arduino.ino at main · ka-zuu/snes_gamepad_arduino · GitHub から私が書き方ところを中心に説明すると、以下のような感じです
- AdruinoJoystickLibrary使用箇所をArduinoXInputに変更
- ほどんと機械的に置き換えるだけのレベルの変更
- 使用するGPIOピンを5,6,7 → 7,8,9に変更
- ボードの端から使う方が配線しやすいという程度の理由
- SERIALを読み取るポートで内部プルアップ抵抗を有効にするようにした
pinMode (DATA_SERIAL, INPUT_PULLUP);
のところ- コネクタにSFCパッドを接続していないときに状態を安定させるため
ArduinoXInput利用時の注意点
ArduinoXInputを利用する場合、Arduino IDEでボードに書き込む際に以下の注意が必要です。
- XInput USB Core for Arduino AVR が必要
- ボード選択に「x/XInput」のものを選択
- 2度目以降の書き込みではリセット操作が必要
- Pro MiroのGNDとRSTピンを2回、ショートさせる
接続と検証
まずは一旦ブレッドボードを使って配線して動作確認しました。
ゲームパッドとしての動作確認には Gamepad Tester のサイトが便利です。 hardwaretester.com
XInputの場合はXBOX 360 コントローラーとして表示されます。
ケースへの組み込みと配線
最終的に100均のカードケースに組み込みました。 配線は5本だけなので特に基板などは介さず直結しています。またUSBケーブルはあまり抜き差しするとArduinoを痛めるので(実際この実験中にも一つ壊した)、100均のケーブルを指したままにする形で組み込みました。
動画
今回、実験的に作業を動画にしてYoutubeにアップしてみました。