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に関しては実機でのテストを実施しておりませんでしたので存じ上げませんでした。
お話を聞く限りではゲーム側の仕様の可能性が高いと思われます。
既にアサイン変更を実施されたということで早速ご対応いただきありがとうございます。
今後の知見にさせていただきます。
購入を検討しているのですが、IIDXモードで「Fnキーを押しながら皿を回すと1曲分動く」みたいな選曲向けの設定にすることって可能でしょうか。
Fn+1or3でキーボードの↑↓になるのは理解しているのですが、皿で選曲できないかな…と思いまして。
ご検討ありがとうございます。
IIDXの皿はコントローラー側の仕様でどんなに小さく動かしても一定時間(230ms程)信号が出続けてしまうので、コンバーター側で制御するのは中々難しい範囲です。
(少し動かしても0.2秒以上の長押しになってしまう)
「こういう処理を施せば実現できる」という案があれば実装してみたいとは思うのですが…。
なるほど…コントローラーの基盤上でもう一定時間入力するって処理がされてるので、コンバーター側での対処は難しそうですね
近日中に購入させていただきます!ご回答ありがとうございました!
こんにちわ。IIDXはAC3rdから始めたおっさんです。コナステiidx、ポップンを始めたのですが家に転がってるps2弐寺コン、ポプコン1を使いたくなるべく遅延の少ないものを求めてたどり着きました。下記質問です
•まだ制作予定ありますか?(入荷知らせは登録済みです)
•この商品は上記わたくしが求めているもの、の認識で大丈夫ですよね?
ご検討ありがとうございます。
製作予定はまだあります。現在パーツのストックが尽きているため新たな発注を行っています。来週あたりに入荷の予定です。
最新の情報についてはXでも告知していますが、入荷通知を登録頂いていればお知らせが届くので問題ないかと思います。
また、機能に関しては十分に満たせているかと思います。
通常のPSコントローラーのコンバーターとして動作するほかに、「スタート+セレクト+↑」操作でステータスランプを赤色にすることでコナステモードになります。
弐寺コンやポプコンを認識し自動でボタン配置や機能が切り替わります。(機能は減りますがコナステモードではなく通常モードでプレイして頂いても構いません)
遅延に関しても既存のものに比べ十分に小さいため快適に使用頂けると思います。
先日購入をさせていただいたのですが、うまく動作しません。
動作をwindowsのコントローラーのプロパティから確認をしているのですが、以下のように動作となっています。
常に起きている点: Select(9番)が常に押されている,3鍵を押すと1,3鍵(1,3番)の同時押し
POVモード: 7鍵を押すと7,POVの同時押し
ボタンモード: 7鍵を押すと7,15番の同時押し
エレコムのコンバータを使用したところ正常に動作をしたのですが、上記のようになってしまいます。
原因としてはどのようなことが考えられるのでしょうか。
ご購入ありがとうございます。ご迷惑をおかけし申し訳ございません。
使用しているコントローラーはIIDX専用コントローラーでしょうか。
現在一部のIIDX専用コントローラーで誤動作する不具合が確認されております。
症状としてはデュアルショックやポプコン、5鍵コントローラーでは正常に動くが、IIDX専用コントローラーの一部でのみ押したボタン以外が反応したり連打になるというものです。
恐らく回路の設計による相性問題が発生しているものと考えられております。
PSコネクターの1ピン(基板側が四角形になっている方)と5ピンに、1kΩ~10kΩの抵抗を繋ぐことで安定化させられることが確認できております。
もしもお手元に抵抗器があるようでございましたらお試し頂ければ幸いです。
難しい場合は、現在この不具合への対応を検討しておりますのでアナウンスをお待ちください。
先日購入をさせていただいたのですが、うまく動作しません。
USBポートに差したところドライバのインストールなどされません。
その為Windowsに認識されていないようでコンバーターにコントローラー繋いだ状態でもディバイス上に表示されません。
モード切替のLEDランプが変わるは確認出来ていますのでUSBケーブルの問題ではなさそうです。
OSの標準機能で動作するためドライバーのインストールはありません。
モード切り替えは通電さえしていれば動作するため、USBポートの相性や充電専用ケーブルを使用している可能性があります。
(PCと通信できずに電力の供給のみされており、コンバーターだけが単品で動作している状態)
通信が可能なケーブルを使用し、他のUSBポートに繋ぎかえるなどで状況が変化するかお試しください。
またコントローラーの確認にはWindowsの検索窓にjoy.cplと入力して出る画面がお勧めです。
すぐに対応していただき有難うございます。
USBケーブルを交換するとドライバーが自動インストールされ、Windowsに認識されました。
手元にあったTYPE-Cが充電専用ケーブルだったみたいです。
使用した感想は想像以上の商品で友人などにも自信を持っておすすめ出来る物でした。
こちらの手違いでご迷惑おかけして申し訳ありません。
無事に動いたようで何よりです。
また何かお気づきの点がございましたらお知らせください。
先日リニューアル版を購入させていただきました。無事動作しています。ありがとうございます。
私もDDRコントローラをコナステで使うために、以前のコメントを参考にキーアサインを変更しようとしたのですがうまく行きません。
Verifyにも成功しUploadもできていそうなのですが、Upload後にUSB機能がコントローラ・シリアルポートともに切断された状態になってしまいます。USBを抜き差ししてリセットすれば元通り動作するのですが、動作は変わっておらず書き換えがうまく行っていないようです。(書き換えがうまく行ってないことはキーアサインの変更が反映されない、CHECK_LED を true にしても動作が買わないことからそう考えました)
リニューアル後もSparkFun Pro Microや3.3Vを選択することも含めて手順は変わっていないと考えてよいでしょうか?
ご購入ありがとうございます。
調査したところ一部のロット(確認されている限りでは基板のバージョンがv2.2.0のうちの一部)にてUSBでの書き換えに必要なプログラム(ブートローダー)が正しく書き込まれていない可能性があることが分かりました。
恐らくこちらの現象に該当しているために、USB経由での書き換えができなくなっているものと推察されます。ご迷惑をおかけし申し訳ございません。
ArduinoISP、あるいはArduino as ISP化したArduinoデバイスなどの設備があればお手元で修正ができるのですが、難しい場合はこちらで対応させていただきます。
購入時のシステム(ストアへの問合せなど)でご連絡ください。
個別に対応していただき、無事プログラムを書き換えることができました。ありがとうございました。