INFINITAS専用コントローラを自作してみました
INFINITAS専用コントローラを自作してみました
何番煎じかわかりませんが、キーボード入力しか受け付けないINFINITASをDAOコンで遊ぶために Arduino Micro を使ってコンバータを作ってみました。下記の記事と動画を参考にさせて頂きました。
- Arduino LeonardoでINFINITAS用の変換器を作る
- 【IIDX_INFINITAS】キーボードとJoyAdapterの差を検証してみた
- 【IIDX_INFINITAS】Arduinoを使って2つの方法で専コンを接続してみた
先に結論を述べますと、自分の環境では それほど効果がありませんでした! 正確にはDAOコンとJoyAdapterで十分に許容範囲内だったということになりました。元々遅延はほとんど無かったようです。 JoyAdapterに感謝。
遅延がなくなって万歳というより、DAOコンの信頼性の確認と、どこで遅延が発生しうるのかが解ったのかが成果だと思います。あくまで個人の感想と個人の環境に基づく結果ですが参考になれば嬉しいです。
以下検証環境です。
- DAOコン PEE 2013 (2014出荷:スクラッチがマウスにならない旧モデル)
- Arduino Micro
- 方式: スイッチ直取り (PS2コントローラ端子は使用していません)
- 比較環境
- USB接続: JoyAdapter 1ms
- PS2接続: SANWA JY-PSUAD1, ELECOM JC-PS101UBK
USBのポーリングレートは弄ってないはずですが、マウス(Logicool G700)はレート1000でつながっています。この設定がDAOコンやPS2-USBコンバータにも効いているのかは不明です。
回路図
最初は他の方のようにPS2端子をUSBキーボードとして認識できるようなコンバータを作成していました。しかし PS/PS2コントローラのライブラリ(PSX Library, PlayStation 2 Controller Arduino Library v1.0)がうまく動かなかったり誤動作するのでライブラリをいじり始めたあたりで方針変更。どうせなら遅延を極限まで小さくしようとスイッチから直接取ることにしました。
結果、回路図はこんな感じになりました。要するに全スイッチからVCCをArduinoのデジタルINに一つずつつないでいくだけです。GNDをあわせないといけない気もしますがそのあたりは適当です。この通り配線してどうなっても自己責任でお願いします。

実際にはDAOコンに内蔵したかったので一つのブレッドボードでやってます。ひどい空中配線になりました。

ソースコード
ソースもかなり適当です。キーを送信するライブラリはHID-Projectと標準ライブラリの両方を試しました。Keyboard.h
では同時押しが6個までのようですが、修飾キーを入れると10個以上大丈夫なことが解ったので、適当に3鍵を左ALTにしています。
//#define DEBUG //#define ENABLE_NKRO #ifdef ENABLE_NKRO #include <HID-Project.h> #else #include <Keyboard.h> #endif #define SCR1 KEY_LEFT_CTRL #define SCR2 KEY_LEFT_SHIFT #define KEY1 'z' #define KEY2 's' #define KEY3 KEY_LEFT_ALT #define KEY4 'd' #define KEY5 'c' #define KEY6 'f' #define KEY7 'v' bool SCR1_state = false; bool SCR2_state = false; bool KEY1_state = false; bool KEY2_state = false; bool KEY3_state = false; bool KEY4_state = false; bool KEY5_state = false; bool KEY6_state = false; bool KEY7_state = false; void setup() { #ifdef DEBUG Serial.begin(9600); #endif #ifndef ENABLE_NKRO Keyboard.begin(); #endif } void loop() { #ifdef DEBUG if (digitalRead(12) == LOW) Serial.println("SCR UP"); if (digitalRead(11) == LOW) Serial.println("SCR DOWN"); if (digitalRead(10) == LOW) Serial.println("KEY1"); if (digitalRead(9) == LOW) Serial.println("KEY2"); if (digitalRead(8) == LOW) Serial.println("KEY3"); if (digitalRead(7) == LOW) Serial.println("KEY4"); if (digitalRead(6) == LOW) Serial.println("KEY5"); if (digitalRead(5) == LOW) Serial.println("KEY6"); if (digitalRead(4) == LOW) Serial.println("KEY7"); #endif #ifdef ENABLE_NKRO if (digitalRead(12) == LOW) NKROKeyboard.add(SCR1); else NKROKeyboard.remove(SCR1); if (digitalRead(11) == LOW) NKROKeyboard.add(SCR2); else NKROKeyboard.remove(SCR2); if (digitalRead(10) == LOW) NKROKeyboard.add(KEY1); else NKROKeyboard.remove(KEY1); if (digitalRead(9) == LOW) NKROKeyboard.add(KEY2); else NKROKeyboard.remove(KEY2); if (digitalRead(8) == LOW) NKROKeyboard.add(KEY3); else NKROKeyboard.remove(KEY3); if (digitalRead(7) == LOW) NKROKeyboard.add(KEY4); else NKROKeyboard.remove(KEY4); if (digitalRead(6) == LOW) NKROKeyboard.add(KEY5); else NKROKeyboard.remove(KEY5); if (digitalRead(5) == LOW) NKROKeyboard.add(KEY6); else NKROKeyboard.remove(KEY6); if (digitalRead(4) == LOW) NKROKeyboard.add(KEY7); else NKROKeyboard.remove(KEY7); NKROKeyboard.send(); #else if (SCR1_state == false && digitalRead(12) == LOW) { Keyboard.press(SCR1); SCR1_state = true; } else if (SCR1_state == true && digitalRead(12) == HIGH) { Keyboard.release(SCR1); SCR1_state = false; } if (SCR2_state == false && digitalRead(11) == LOW) { Keyboard.press(SCR2); SCR2_state = true; } else if (SCR2_state == true && digitalRead(11) == HIGH) { Keyboard.release(SCR2); SCR2_state = false; } if (KEY1_state == false && digitalRead(10) == LOW) { Keyboard.press(KEY1); KEY1_state = true; } else if (KEY1_state == true && digitalRead(10) == HIGH) { Keyboard.release(KEY1); KEY1_state = false; } if (KEY2_state == false && digitalRead(9) == LOW) { Keyboard.press(KEY2); KEY2_state = true; } else if (KEY2_state == true && digitalRead(9) == HIGH) { Keyboard.release(KEY2); KEY2_state = false; } if (KEY3_state == false && digitalRead(8) == LOW) { Keyboard.press(KEY3); KEY3_state = true; } else if (KEY3_state == true && digitalRead(8) == HIGH) { Keyboard.release(KEY3); KEY3_state = false; } if (KEY4_state == false && digitalRead(7) == LOW) { Keyboard.press(KEY4); KEY4_state = true; } else if (KEY4_state == true && digitalRead(7) == HIGH) { Keyboard.release(KEY4); KEY4_state = false; } if (KEY5_state == false && digitalRead(6) == LOW) { Keyboard.press(KEY5); KEY5_state = true; } else if (KEY5_state == true && digitalRead(6) == HIGH) { Keyboard.release(KEY5); KEY5_state = false; } if (KEY6_state == false && digitalRead(5) == LOW) { Keyboard.press(KEY6); KEY6_state = true; } else if (KEY6_state == true && digitalRead(5) == HIGH) { Keyboard.release(KEY6); KEY6_state = false; } if (KEY7_state == false && digitalRead(4) == LOW) { Keyboard.press(KEY7); KEY7_state = true; } else if (KEY7_state == true && digitalRead(4) == HIGH) { Keyboard.release(KEY7); KEY7_state = false; } #endif }
結果
他の方々がされているように、Double Battle Auto Scratchで 1Pを自作コンバータ経由、2PをUSB接続またはPS2-USBコンバータ接続にJoyAdapterで変換した場合でFAST/SLOWを見てみました。
これに加え、使用するライブラリの違いとPS2-USBコンバータの違いで遅延傾向に差違があるかも見てみました。
1P:自作コンバータ, 2P:USBジョイスティック接続
Keyboard.h
を使用した場合HID-Project.h
を使用した場合
はい。期待してたような結果にはなりませんでした。前者ではわずかに自作コンバータ経由の方が遅延が少ないのですが、後者ではJoyAdapterを使った方が良いという結果になってます。どちらにしろ体感できるようなフレーム単位の差があるとはいえそうにありません。前者で1ms~くらいなのではないでしょうか。適当ですけどJoyAdapterの設定値も1msですし。
無茶なことをしてArduinoが壊れたのかと思いました。
1P:自作コンバータ(Keyboard.h
), 2P:PS2-USBコンバータ接続
- SANWA JY-PSUAD1 を使用した場合
- ELECOM JC-PS101UBK を使用した場合
今度は明確な差違が見られました。Arduinoは壊れてなかったようです。見ての通りPS2-USBコンバータ経由ではかなり遅延していることが解ります。明らかに判定の中央がPGREATどころかGREAT~GOODまで移動してしまいました。これは数フレーム遅延していると言ってしまって良いのではと思います。
SANWAとELECOMで性能の違いも見れると良いと思ったのですが、大きな差は無いように思えます。そもそも全く同じように叩けるわけ無いのでよく解りませんでした。
USB接続とPS2-USBコンバータ接続でこれほどの違いが出てしまったと言うことは、INFINITASの 主要な入力遅延はPS2-USBコンバータまたはPS2コントローラ端子にある ということがわかりました。
まとめ
というわけで折角作ったのにあまり意味が無い結果になりました。しかし下記のことがわかりました。
- DAOコンのUSB接続はとっても優秀
- JoyAdapterは素晴らしい
- PS2コントローラ端子+USBコンバータは数フレーム遅延する
DAOコンはPS2のオフィシャル製品ではないはずなので、専コンまたはアケコンではまた違った結果になるかもしれません。しかしDAOコンを持っている人はわざわざ自作コンバータを作らなくてもJoyAdapterで十分なプレイ感覚が得られるのでは無いかと思われます。
PS2コントローラの遅延がコントローラそのものかUSBコンバータにあるのかについては気になるところではありますが、もうDAOコンで良いと思ってしまったのでこの辺りで終わっておきます。
4 Notes/ Hide
ltzz reblogged this from elice-shiyou
elice-shiyou liked this
elice-shiyou reblogged this from t-ribbit