痛いOTAKUのポエム

地雷多すぎ人間の愚痴

特殊なコントローラを使ってArduinoによるPS1/2→USBの変換の遅延を測るぞ

なにこれ

ArduinoArduino Leonardo)を使ったPS1、PS2のコントローラをUSBコントローラとして使える変換アダプタを貰いました。
これを使ってStepManiaDDR GPを遊びたいわけですが、変換によってどれくらい遅延するのかが気になりました。
なのでそれを調べました。

使用するスケッチ

下記のサイトで配布されている『Playsation2 controller interface library for Arduino.』を使用したスケッチです。
(GPSXと言った方がいいのか知りませんが)
pspunch.com

これのGPSX.hのファイル内にある<wiring.h>を<Arduino.h>に書き換えて動作させています。

(貰った変換アダプタの設定を書き換えようとして、貰ったコードがコンパイルできないの図)

実際に使用したスケッチに関しては貰い物で、ボタン設定だけ自分で変更したものです。

調べ方

私が普段から使用している踏みゲーパネルを使用します。
1入力でreviveUSBによるUSBコントローラ出力と、PS1のDDRマットの基板によるPSコントローラ出力の両方が行えるコントローラです。
sha10n.hatenablog.com

これのreviveUSBによるUSBコントローラ出力を1P側、PSコントローラ出力をArduinoによる変換アダプタで変換したものを2P側として、StepManiaでバーサスプレー状態にします。
現在のStepManiaではリザルト画面に入力誤差のヒストグラムが表示できるので、そのヒストグラムを比較します。


画像右側にある、正規分布を圧縮してみましたみたいなグラフが入力誤差のヒストグラムです。
これはただの例であって、今回の検証とは直接関係しません。

結果

おおよそ1.5Fの遅延

もっと、1P側のグラフをただ平行移動させただけみたいな図になるかと思っていましたが、実際にはそうではありませんでした。
理由はよく分かりません。
reviveUSB側はポーリングレート1000でやってるけど、Arduino側は125Hzだったりするのかもしれないし、PS1・2のコントローラ基板がそんな高頻度のポーリングレートしていないのかもしれません。
そのあたりは詳しい人が教えてください。

とにかく、1フレームくらいは遅延しているようです。

おわりに

スケッチの改善案などがあって、もっと遅延が減らせるよという方は教えていただけると幸いです。