PS1 / PS2のコントローラーをUSBに変換するコンバーターをArduinoで作ってみました!
音ゲー専コン向けの専用機能も搭載!
- 一般的なPSコントローラー→USB変換が可能
- Arduinoマイコンにより既存の市販品より低遅延
- ハットスイッチ(POV)未対応ゲーム向けモードあり
- ポップンミュージック専コンモードあり
- 「右黄色問題」対策済
- Lively用クイックリトライ機能搭載
- beatmania IIDX専コンモードあり
- INFINITAS用にファンクションキーE1~E4使用可能
- 選曲画面や、SUD+調整でターンテーブルが動きすぎる問題の対策あり
概要
USBコンバーターは日本製が終売、中華の怪しいやつは信頼性不明という状況の中、偉大なる先人がArduinoを使ったコンバーターの作例を色々と上げてくれているので、参考にしつつ独自機能を追加した基板を作成。
またコナミ音ゲーの専コンの場合、既存の変換器だと痒いところに手が届かなくて結局JoytoKeyとか使うハメになることがあるらしいので、コナステ専用モードも搭載。
モードセレクト
「スタート+セレクト+↑」を同時押しすることでモード切り替えをできるようにしました。
(専コンの場合は、IIDXはスクラッチ時計回りが↑、ポプコンは右黄色が↑です。)
「スタート+セレクト」だけを押すと、現在の設定をLED点灯で示します。
以下の3モードを切り替え可能です。
選んだモードは保存されるので次回使用時も同じモードから始まります。
- POVモード(LED青点灯)
いわゆる普通のコンバーターの動作。
デュアルショックの全てのボタン・スティックが割り当てたコントローラーとして認識します。
方向キーはPOV(ハットスイッチ)として認識します。
また、方向キーを左スティック・右スティックへ割り当て変更も可能です。(※試作段階)
POVモードの状態で、
「スタート+セレクト+←」でPOVモード(LED青点灯)
「スタート+セレクト+↓」で左スティック割当(LED水色点灯)
「スタート+セレクト+→」で右スティック割当(LED紫色点灯)
になります。
初期出荷モデルには割り当て変更のプログラムが入っていないので、ご入り用の場合は下記の書き換え手順に従って最新のプログラムに書き換えてください。 - ボタンモード(LED緑点灯)
方向キー以外はPOVモードと同じ動作。
方向キーはPOVではなく、それぞれボタンとして認識します。
左右や上下の同時押しをすることがあるDDRコントローラーや、POVに対応していないゲーム向けのモードです。 - コナステモード(LED赤点灯)
beatmania IIDX INFINITASや、pop’n music Livelyに専コンを繋ぐ専用モードです。
詳細は後述します。
コナステモード
プレステ時代の専用コントローラーで、beatmania IIDX INFINITASやpop’n music Livelyをプレイする時に使用します。(BMSやPMSにももちろん使用可能)
ポップンコントローラーを自動認識するので、ポップンモードとIIDXモードは自動で切り替わります。
ポップンモード
専コンボタン | 割り当てボタン |
---|---|
1鍵~9鍵 | ボタン1~ボタン9 |
セレクト | BackSpaceキー |
スタート | Escキー |
セレクト+スタート | F1キー |
Livelyのゲーム内キーコンフィグには1~9しか設定できないので、スタート・セレクトは対応するキーボードのキーを割り当てました。
クイックリトライ用にF1キーもあったほうが便利なので、「セレクト+スタート」の同時押しで対応するようにしました。(プレミアムモデルもこれ対応してほしい…)
IIDXモード
専コンボタン | 割り当てボタン |
---|---|
1鍵~7鍵 | ボタン1~ボタン7 |
スクラッチ↑ | 左スティック↑ |
スクラッチ↓ | 左スティック↓ |
セレクト | 割り当てなし |
スタート | ボタン10 (E1) |
セレクト+2鍵 | ボタン11 (E2) |
セレクト+4鍵 | ボタン12 (E3) |
セレクト+6鍵 | ボタン13 (E4) |
セレクト+1鍵 | キーボード↑ |
セレクト+3鍵 | キーボード↓ |
セレクト+5鍵 | キーボード← |
セレクト+7鍵 | キーボード→ |
特筆すべきはセレクトボタンをファンクションキーとしているところ。
「セレクト+2,4,6鍵」にはゲームプレイとは別のボタンを割り当てているのでE2~E4を割り当てると便利かなと。
「セレクト+1,3鍵」にはキーボードの上下を割り当てています。
選曲画面でターンテーブルを使うと専コン特有の入力持続ですっ飛んでしまうのでちょこちょこ選びたいとき用に。
同様に「セレクト+5,7鍵」にはキーボードの左右を割り当てています。詳細オプションの左右移動などに。
「セレクト+スタート」をE2+E3のショートカットにしているので、強制終了・クイックリトライが片手でできて便利。
SUD+を皿で調整しようとすると持続入力のせいで吹っ飛んでしまうので、やっぱりセレクト+スタート+キーボード↑↓で操作できるように、強制終了ショートカットは廃止しました。
強制終了は「セレクト+2+4」でご対応ください。セレクトボタンに近いので以外と入れやすかった。
用意する物
配線とかはググれば先人の記事がたくさん出るのでとりあえず省略。需要と暇があればちゃんと書く。
- Pro micro 3.3V/8MHz (Arduino Leonardo互換機)
PSコントローラーが3.3V付近の駆動なので、一般的な5V品より3.3V品が望ましい。 - PSコントローラー端子メス
PSコントローラー用の延長ケーブルをちょん切って使用。
うちのはXHコネクタをつけたりなんかしてますがそこはお好みで。 - プルアップ抵抗
コントローラーのCMD線とDAT線が不安定な時があるので対策に。4.7kΩとか10kΩを適当に。
PSコントローラーの3.3V/GNDをArduinoのVCC/GNDに接続、CMD/DAT/CLK/ATT線をArduinoの好きなピンに繋いでスケッチ側のピン番号を合わせたら完成。モーター電源とACK線は無視してOK。
プログラム書き換え手順・ソースコード
Arduino IDE導入手順
概要のみで、詳細は割愛します。(ググれば分かりやすい記事がたくさん出てくるので)
※2023/10/06追記。沸騰さん、ありりさんに不足手順の補足をしていただきました。ありがとうございます。
IDEインストール
Arduino IDE (https://www.arduino.cc/en/software)をダウンロードしてインストールします。
お好みでUIを日本語に変更する。
「File」→「Preferences」→「Language」を English から 日本語 に変更。
ボード追加・指定
Pro microを利用する場合は「SparkFun AVR Boards」の導入が必要です。
※Arduino Leonardoの場合は不要。
基板情報の一覧を登録する。
「ファイル」→「基本設定」→「追加のボードマネージャのURL」の右のボタンを押し、https://raw.githubusercontent.com/sparkfun/Arduino_Boards/master/IDE_Board_Manager/package_sparkfun_index.json
を追加。
基板情報をIDEにインストールする。
ボードマネージャ(左の基板アイコン)から「SparkFun AVR Boards」を検索しインストール。
使用するボードを選択する。
「ツール」→「ボード」→「SparkFun AVR Boards」→「SparkFun Pro Micro」を選択。
同じく「ツール」→「ポート」からそれらしいCOMポートを選択。(USBを抜き差しして消えるやつがそれです)
「ツール」→「Processor」から電圧の選択にも注意。コンバーターには3.3V版を使用します。(通常デフォルト選択されているはず)
※ここで3.3Vを選択したからといって5V版のマイコンが3.3Vになるわけではありません。マイコンボードは実際に3.3V/8MHz版を購入してください。
ライブラリインストール
PsxNewLibとHID-Projectのインストールが必要です。
左の本棚マーク?でライブラリマネージャーを開き、「PsxNewLib」を検索してインストールします。
依存関係のメッセージが出たら「全てをインストール」を選択します。
「HID-Project」も同様にインストールします。
スケッチ内設定
JOY_DEADZONEを変更すると中心からどれくらいまでを中心と見なすかを変更することができます。
通常は8192/32768の25%をデッドゾーンとしています。0にすれば無効になります。
ALWAYS_LEDをtrueにするとモード表示LEDが選択時のみだけでなく常時点灯になります。眩しいです。
CHECK_LEDをfalseにするとSTART+SELECTでモード表示LEDを点灯する機能を消せます。今どのモードなのか、モード変更したとき以外分からなくなります。
DUPE_ASSIGNをfalseにすると方向キーをスティックにアサインした場合、アサインされた側は無効になります。trueの場合はアサインされた側も操作可能です。(入力は方向キー優先)
通常のボタンの割り当ては// Set button state
の後の行で行っています。お好みのボタン配列がある場合はこちらで割り当て変更が可能です。
スケッチ
Githubに移しました。
コメント
PS1のアーケードコントローラー(アケコン)にも対応していますか?
ラグの少ないBrook製コンバーターが販売終了となってしまったので、購入したいと考えています!
当方では初代RAPにてSF6のプレイを確認しております。
XInputには非対応ですがSteam経由であればSteamのコントローラー機能で自由なアサインが可能です。
あるいはモード切り替えができない代わりにXInput対応ファームウェアに差替えることも可能です。
返信ありがとうございます。早速購入します!
PS1or2→USBコンバータを色々試したのですが、ラグが多くて使い物にならない物ばかりで困り果てていた所なのでここまでたどり着けて良かったです!
購入後色々自分で頑張ってみますが、情弱なので質問させて頂く事になるかもしれません。。
発送ありがとうございました!
早速のご質問なのですが、ArduinoIDEでXInput対応ファームウェアに差替える方法を教えて頂けますか?
SparkFunAVRBoards、PsxNewLib、HID-Projectのインストールまで完了しています。
XInput版の要望が初回だったので、手順の用意がありませんでした…。
取り急ぎ手順を記載しますので以下をお試し下さい。
通常の手順と同様に「追加のボードマネージャのURL」を開き、新しい行に
https://raw.githubusercontent.com/dmadison/ArduinoXInput_Boards/master/package_dmadison_xinput_index.json
を追記。
ボードマネージャを開き、「XInput AVR Boards」と「XInput SparkFun Boards」を両方追加。
途中管理者権限を求められた場合は許可して続行。
「ツール」→「ボード」→「XInput SparkFun Boards」→「SparkFun Pro Micro w/ XInput」を選択。
ライブラリマネージャーから「XInput」を検索しインストール。
スケッチは以下に掲載しています。
あとは通常の手順と同様に書き込みを行います。
https://github.com/Lay31415/PS2XInput/blob/main/PS2XInput.ino
元に戻したい場合はブログの手順で通常のボードを選択し通常のスケッチを書き込んでください。
※書き込み後、再書き込みを行いたい場合にボードが認識しない場合は以下の手順を実施してください。
認識していない状態でArduino IDEの書き込みを実行。
コンパイル中にリセットボタンを2回押す。(リセットボタンは蓋を開けると基板上に配置してあります)
ボードが認識されるのでポートがズレている場合は一致させる。
コンパイルが完了し、書き込みが始まったらもう一度リセットボタンを押す。
問題なくXInput切替えできました。購入後もサポートして頂きありがとうございます!
自分は鉄拳7で使用していますがラグを一切感じる事がなく、これまで10種類程コンバーターを買い漁ってきましたが歴代最高のコンバーターです。
PS
下記についてもし思い当たる節があれば教えて下さい。
当インバーターを、HORI製PS1アケコン「コマンドスティックPSカスタム」というマクロ登録と再生機能が付いたアケコンに繋いでPCで使用しています。
アケコン本体の液晶でマクロを設定する特殊なアケコンなのですが、これまでのコンバーターと比較して、液晶のドット点滅速度やマクロの再生速度が5倍程早くなる症状が発生しています。
電圧の設定なのか、信号の間隔の設定なのか、私には知識がないのでもし思い当たる節があれば教えて頂きたいです。
※レバー、ボタンの手動入力に関してはラグも誤作動もないので、コンバーターの性能に問題はありません。
当該コントローラーを使ったことがないため推測になりますが、遅延を減らすためコントローラーへの問い合わせを可能な限り頻繁に実施しているため、信号の頻度に合わせて動いているマクロ機能もつられて早く動いているのかもしれません。
プレステ本体と異なる以上完全な再現は難しいですが、試しにスケッチの最後のdelay(1)を(16)に変えた場合に動作が変わるか試してみることは可能かと思います。(コントローラーのレスポンスは少し遅くなる可能性があります)
これで変わらない場合は使用しているコントローラー値取得用ライブラリの実装によるものと思われますので、かなり大規模に改造しないと修正、再現は難しそうです。
と思いましたが、設定が反映されてdelay(1)を(16)にしたら見事解決しました!流石製作者ご本人。
丁度いいdelayの数値を検証していきたいと思います!(なんで16なんだろう。16bitとかいうやつなのか・・?16進数とか言うやつなのか・・?)
とは言え、一度エラーが出たという事で精神衛生上宜しくないので新品をもう一台購入させて頂きます。(下蓋を外すときに樹脂製のネジを回すのかと思って回したらネジ頭をねじ切ってしまった事はナイショ)
プレステ本体は60fpsで動いており、コントローラーへの問い合わせも1秒間に60回行っています。
そのため1/60=16.666…ミリ秒に1回問い合わせるのが本来の動作です。
コンバーターでは遅延を極力減らすため1msに1回問い合わせ(1秒に1000回)を行っています。
delayコマンドはミリ秒単位で処理を待つコマンドなので16、または17が最適になるかと思います。
より細かく設定したい場合はマイクロ秒単位で指定できるdelayMicroseconds(667);を併記することで16ミリ秒+667マイクロ秒=16.667ミリ秒の待機を実現できると思います。
先日購入させていただきました。
とても反応が良くありがたく使用させていただいています。
コナステ版のDDR GRAND PRIXで使用する際に気づきがあったのでシェアさせていただきます。
ボタンモードだと十字キーが13-16にアサインされておりますが、
DDR GP側が15番のボタンまでしか認識できないのか自分のPC環境の問題なのか右キーの16番のみ反応がなくアサインできませんでした。
L3,R3を15,16に移動して十字キーを11-14へ書き換えたところ問題なく使用できております。
ご報告ありがとうございます。
DDR GPに関しては実機でのテストを実施しておりませんでしたので存じ上げませんでした。
お話を聞く限りではゲーム側の仕様の可能性が高いと思われます。
既にアサイン変更を実施されたということで早速ご対応いただきありがとうございます。
今後の知見にさせていただきます。