USBジョイスティック変換器を作ろう


ジョイコンは変換できないぞ


概要
ファミコン用ジョイスティック/ファイティングパッド6B/サイバースティック/サターン用ジョイパッド及びマルコン/プレステ用ジョイパッドをUSBジョイスティックに変換する変換器の作成。


発端
一昨年くらいに友人より
「ファミコンのジョイスティックをUSBにできるやつねえかなー」
という話を聞き、マイコンを使って作れないかなあと思って調べたところ、 秋月の安価なPICマイコンボードを使えば作れそうなことが分かった。PICの勉強がてら、作ってみることにした。
その後、パソコンソフトやレトロフリークで使っているが、最近はSwitchにも対応でき、なかなか快適だったので作り方を公開することにした。


必要なもの
以下のものを揃えてください。
品名数量回路図上の部品名備考、参考URL
PIC18F14K50使用USB対応超小型マイコンボード1U1http://akizukidenshi.com/catalog/g/gK-05499/
PICkit3、もしくは互換品1-http://akizukidenshi.com/catalog/g/gM-03608/
マイコンボードへのプログラム書き込み用。安い互換品もあるらしい…?
ユニバーサル基板1-
ピンソケット適宜-マイコンボードをユニバーサル基板に取り付けるために使う。1列ピンヘッダ8ピン分x2。1列ピンヘッダの長いものを買って切って使ってもよい
集合抵抗10kΩ 1/4W(8素子9ピン)1RA1http://eleshop.jp/shop/g/g71G13K/
抵抗10kΩ 1/4W1R1無い場合は8k〜12.5kΩのものを使ってもよい
切り替えスイッチ(1回路2接点)1SW13本足のもの。ANALOG/HAT切り替えスイッチに使う
押しボタンスイッチ1SW2RAPID FIREボタンに使う
USBケーブルA-miniB1-A側はパソコンに挿す、miniB側はマイコンボードに挿す
配線材適宜-
ケース1-タカチのケースなど
ジョイスティック接続用コネクタ(持っていないジョイスティックのものは、省略してよい)
Dサブ15ピンコネクタ オス1CN1ファミコン用ジョイスティックの接続用
Dサブ9ピンコネクタ オス2CN2,CN3ファイティングパッド6B、サイバースティックの接続用
セガサターンジョイスティックポートコネクタ1CN4ジャンクのセガサターン本体から取り外すなどして入手する
プレステジョイスティックポートコネクタ1CN5ジャンクのプレステ本体やマルチタップから取り外すなどして入手する
※プレステジョイスティックポートコネクタを使う場合のみ
ダイオード(1S1588もしくは互換品)
2D1,D2https://www.marutsu.co.jp/pc/i/13304/
拡張ボックス(省略してよい)
Dサブ9ピンコネクタ メス1-本体の"ATARI/CYBERSTICK"ポートに接続するため
9芯ケーブル1-好きなだけの長さ
ケース1-タカチのケースなど

この中で手に入れにくいのがサターンのジョイスティックポートコネクタです。
Aliexpressでサターン用ジョイパッド変換器を作っているお店にコンタクトしてみたりしましたが、コネクタ単品では売ってくれないようでした。
貴重すぎてもったいないので、私は仕方なく、他の機器とも共用できる拡張ボックスを作りました。
これを"ATARI/CYBERSTICK"ポートに挿して使っています。


制限事項
いきなりの制限事項です。
マイコンボードの容量の関係上、「プレステジョイパッド読み取り機能」を有効にする場合、「サイバースティック読み取り機能」及び「サターン用ジョイパッド及びマルコン読み取り機能」は使えなくなります。
詳細は後述のソフトウェアの部で説明します。


組み立て
回路図を参考に、部品を組み立てます。
回路図上のGNDとGND、VccとVcc、R0とR0…のように、同じ名前のピン同士を配線してください。
また、持っていないジョイスティック用のコネクタは省いてしまって大丈夫です。

(本体)


(拡張ボックス)


コネクタのピン番号は、正面(ジョイスティックを挿すほう)から見て以下のようになります。
部品面(配線するほう、裏側)からは左右逆になりますので注意してください。

Dサブ15ピンコネクタ オス
1  2  3  4  5  6  7  8
 9 10 11 12 13 14 15

Dサブ9ピンコネクタ オス
1 2 3 4 5
 6 7 8 9

サターンジョイスティックポートコネクタ(本体正面から)
1 2 3 4 5 6 7 8 9

プレステジョイスティックポートコネクタ(本体正面から)
9 8 7  6 5 4  3 2 1


ハードウェア完成図
ケースも良い感じで加工し、インレタ(80年代に流行った。知らない人はお父さんお母さんに聞こう)などで綺麗に仕上げます。

※赤いスイッチは実験用なので無視してください。

この例ではサターン用コネクタ、プレステ用コネクタは省略し、拡張ボックスを使うようにしています。
マイコンボードのプログラム書き込みを行う際は、ケースを開けてマイコンボードのピンを露出させ、接続します。



ソフトウェアのインストール
  1. PICkit3同梱、もしくはMicrochip社から開発環境のMPLAB Xをダウンロードし、お使いのPCにインストールしてください。
    またそれを使ってマイコンボードをプログラムできるよう、環境の準備を行ってください。
    この辺はPICの書籍などを参考にしてください。

  2. MPLAB Xの環境が整ったら、以下のプロジェクトをダウンロードして展開後、MPLAB Xで開いてください。
    NiseKabutoEZ_sw_20180923.zip

  3. プロジェクトを開いた後、必要があればソースを修正します。
    プレステパッドを変換して使用したい場合(デフォルトは非対応)、ソースの

    プロジェクトトップ>Header Files>app>joystick.h の8行目

    の、

    //#define Enable_PS

    の行の先頭の//を削除し、ファイルを保存してください。

  4. USBケーブルとPICKIT3とをマイコンボードに接続し、プロジェクトを右クリックして「Make and Program Device」を選択するなどして、マイコンボードにプログラムを書き込みます。
    書き込み後、USBケーブルを挿し直しするとプログラムが動き始めます。
    Windows10であれば、コンパネ>すべてのコントロールパネル項目>デバイスとプリンター>のデバイスのところに、ジョイパッドマークのアイコンが増えていれば成功です。
    そのアイコンを右クリック>ゲームコントローラーの設定>プロパティで、ジョイスティックの入力テスト画面を表示することもできますので、確認してください。

重要!
上記で公開しているソフトをインストールした変換器は、パソコンやプレステ3等では普通に使えると思いますが、Switchでは認識されません。
公開しているソース内に記述したUSB VID及びPIDが『(株)HORIのポッ拳コントローラー』を示すVID、PIDでないためです。
Switchは、接続可能なUSBジョイスティックかどうかを、

・特定のUSB VID、PIDである(ポッ拳コントローラー以外にもあるのかも?)
・USBディスクリプタが所定の書式である(?)

で判定しているようで、この両者を満たさないと、Switchに接続しても認識されません。
今回のソフトウェア公開にあたり、勝手に法人が持っているUSB VIDをかたるのはまずかろう(USB VIDは、USB.orgから各社に割り当てられる)と思われたので、公開版のVID、PIDはV-USBのものをお借りして公開することにしました。使い方が間違ってたらごめんなさい…
なお、ソース内でUSB VID、PIDを設定している個所は、MPLAB Xで辿ると以下の個所です。

プロジェクトトップ>Source Files>app>usb_descriptors.c の174行目近辺


使い方
  1. 変換器にお好みのジョイパッド/ジョイスティックを接続してください。
    注意!!同時に接続するジョイパッド/ジョイスティックは1つのみにしてください。

  2. 変換器をPCやSwitchに接続してください。変換器は接続されたジョイパッド/ジョイスティックを自動判定(※)して動作を開始します。
    この際、正しくパッド操作が行えないようなら、再度接続しなおしてください。

    (※)ファミコンのジョイスティックだけは、接続後にAボタンかBボタンを何回か押してください。

  3. 変換器の「ANALOG/HAT切り替えスイッチ」を正しく設定します。
    USBジョイスティックを使えるゲームの中には、方向操作に、アナログスティックかハットスイッチ(4方向のデジタルスイッチ)の、いずれかにしか対応していない物があります。
    本変換機ではこのスイッチで、入力側に接続されたファミコン用ジョイカードやファイティングパッド6Bの方向キーの操作を、アナログスティックとハットスイッチのいずれかとして送れるように作ってあります。
    方向キーの操作がおかしいと思ったら、このスイッチを切り替えてみてください。

  4. 変換器の「RAPID FIRE」ボタンを押しながらジョイパッド上の任意のボタンを押すと、そのボタンで連射が有効になります。もう一度同じ操作で連射は解除されます。
    超連射68Kを遊んでいるとき「ああ〜連射めんどうだな〜」と思ったので付けました。


ボタン対応表
入力側と出力側のボタンの対応を示します。
入力側出力側
ファミコンSS
ノーマルパッド
SSマルコン
(デジタル/アナログ)
サイバースティックファイティング
パッド6B
プレステパッドPCプレステ3Switch
SELECT+B AAC A1Y
B BBB B×2×B
A CCA C3A
SELECT+A XXD+B X4X
SELECT+左YYE1 YL15L1L
SELECT+右ZZE2 ZR16R1R
SELECT+上LLD+E1 MODE+YL27L2ZL
SELECT+下 RD+E2 MODE+ZR28R2ZR
SELECT R SELECT MODESELECT9SELECT-
START STARTSTARTSTART STARTSTART10START+
D+A L311L3Lスティック
押し込み
D+C R312R3Rスティック
押し込み
SELECT+STARTA+B+C+L+StartA+B+C+L+StartD+START MODE+STARTSELECT+START13PSボタンHome
MODE+Z 14 Capture
15
16


その他
作成時に気づいた事などを書きます。

買ってきたPICkit3が正常動作しない
秋月電子で買ってきた当初、マイコンボードをうまく認識できず、プログラムが書き込めなくて焦りました。
調査したところ、PICkit3内のファームウェアが古いことが原因でした。しかし、そのファームウェア更新が可能なMPLABは、 当時使っていたWindows8.1(だったかな?)で動く最新版ではなく、少し古いMPLABでなければダメらしく…結局、家にあったWindowsXPに古いMPLABを入れて、やっとPICkit3のファームウェアを更新できました。
そんなもんわかるかよ…。しかしこれは2016年の頃のことですので、最近のPICkit3では解消しているといいですね。

プレステ3対応版からSwitch対応版への変更
本変換器は当初、PICのUSBジョイスティックサンプルを元に作成しました。その際、mbedマイコンのUSBディスクリプタを移植したことでプレステ3でも使用可能になり、しばらくはPC+プレステ3で使っていました。
しかし、SwitchでサンダーフォースIVが出るということで、Switchにも対応させました。
対応版を作成するにあたっては、Switch-FightstickのUSBディスクリプタ部を参考に…というか、ほぼそのまま移植させてもらいました。
その際、副作用として、プレステ3に接続したとき、PSボタン(USBジョイスティックのボタン13)を送れなくなってしまいました。 どうやらプレステ3は適切なUSBディスクリプタを持つジョイスティックからでないと、PSボタン押下を受け付けないらしいです。ただし、その他のボタンは正常に動作します。
一応、プレステ3にPSボタンを送れるバージョンも上げておきました。うまくすればプレステ3/Switch両対応版も作れるかもしれませんが、今回のバージョンではSwitchのみ対応としています。

Switchでうまく動作しない?
Switchのいくつかのゲームでは、本体上の「順番」を「1」にしないと正常にゲームで使えない場合があるようです。(スターフォース、Bloodstained: Curse of the Moonなど)
ホーム画面>コントローラー>持ち方/順番を変える、で、順番を1に設定してください。
持ってないんですけど、多分プロコンも同じような設定が必要なんですよね?

〇〇パッドをつないだ時、○○ボタンが××ボタンになってしまう!ボタンの対応付けがおかしいぞ!
あくまでも自分が遊んでみて便利な組み合わせにしたもので…それにレトロフリークや最新のゲーム機では、ソフト側で柔軟にボタンが変更できますので、それほど困らないと思います。ただし古いPCゲームなどは困ることがあるかもしれませんね。
ボタンの対応付けを変えたい場合は、ソースのread_〇〇〇〇.c(〇〇〇〇の部分は6BやSS)が各ジョイパッドの読み込みを行っている部分です。この中のボタン変換を行っている部分を変えてみてください。

(Windows)Steamの〇〇のゲームで使えない!?
どうもSteamや新しめのWindowsではXinput対応のジョイスティックしか対応していないものもあるようです。
この変換器はXinputには対応しておらず、DirectInput対応のゲームまでしか操作できません。
このようなゲームでは別途、ジョイスティック入力をキーボード入力に変換するようなソフトも併用してください。

Switchのエムツー製ゲーム(サンダーフォースIV、ファミコレ シュタインズ・ゲート)がうまく動かない。上が入りっぱなしになる
発見したときはたまげました・・・。原因は、本ソフトウェアで、アナログスティックの中立値(上下、左右のちょうど真ん中)を、0x7fとしていたことでした。
本ソフトウェアの元となったmbed版ジョイスティック変換器を作った当時、プレステ3のアナログスティック中立値が0x7fで、それに合わせて実装したままになっていました。
その後そのままSwitch対応版にしましたが、アーケードアーカイブスのスターフォースやBloodstained: Curse of the Moonでも特に問題はありませんでした。
しかし、2018/9/20にリリースされたエムツー製の2つのゲームは、いずれも開始すると「上が入りっぱなしになってしまう」現象が発生してしまいました。
調査の結果、アナログスティックの中間値を0x7fでなく、0x80とすることでいずれのゲームも正常に操作できるようになりました。
ちょっと問題があるような気もしますが・・・例えば今後、アナログスティックのへたったジョイコンが、中立状態で0x7fを返すようになったら正常に操作できなくなるんじゃ・・・?
スターフォースやBloodstainedは、おそらく中立値付近に遊びを設けてあるのでこの現象は出ていないと思われますが、現象の出るゲームでは『0x7fは上入力!0x80は中立!』という際どい判定をしているみたいですね。
また、プレステ3も、最近のバージョンでは中立値を0x80にしても問題ないみたいです。
今回リリースしたNiseKabutoEZ_sw_20180923.zipでは中立値を0x80に修正しました。他のゲームで影響が出たら、ゴメンね!
なお、定義はjoystick.h:138のANALOG_NEUTRALのdefineですので、これを0x7fに戻せば、今まで通りに戻せます。


(2018/06/25)初版
(2018/09/23)エムツー対応版NiseKabutoEZ_sw_20180923.zipをリリース。



トップへ戻る