INFINITASコンバーターの話。

まえがき

beatmania IIDX INFINITAS 通称「おうちマニア」
PS2時代のCS作品に馴染みのあるかたは「PS2用のコントローラーをINFINITASでも使いたいなぁ」と思うはず。

INFINITASはサービス開始当初、KONAMI純正のUSBコントローラーと、キーボードの入力しか受け付けていなかった。PS2専コンを市販のUSBコンバーターとJoyToKeyなどを組み合わせて遊ぶ場合、変換を2回通す都合で判定がブレブレなもんだから、結局USBコントローラーがないと快適に遊べない…なんて時代がありました。

この記事で取り上げるのは、プレステのコントローラーをArduino Leonardoを使用してキーボードに変換することで、キーボード入力しか受け付けないINFINITASでもIIDX専コンを使えるようにしようぜ、という発想のコンバーター。先行事例多数。
ついでに当時エレコムのコンバーターが高騰してたから、2個繋げるようにして、安価で売って、転売野郎を黙らせてやろうと考えて制作。

INFINITAS用コンバーター。メルカリとかboothで売っているときもある。

現在ではINFINITAS(ソフトウェア)はキーボード入力だけじゃなくジョイパッド入力にも対応しているから、市販のコンバーターを使用してINFINITASを遊ぶことも可能だけど、このコンバーターのメリットとして、①判定が安定していること、②追加のボタンで専コンだけではできないINFINITASの操作が可能であること の2点が挙げられる。

この記事では、INFINITASコンバーターの特徴を、技術的な観点で紹介する。

ハードウェア/ソフトウェア的に頑張ったところとか

  • マイコンの未使用ピンがもったいないから青軸キーボードを追加して、専コンだけではINFINITASの操作に不足するボタン入力を可能にした

  • マイコンのタイマ割り込みを使用することで、240Hz動作が可能で、120Hzモニターを使っている状態でも判定は安定している(はず)

  • 既存のライブラリ(psx.h)では、コントローラー2個刺しの場合、120Hzが限界。2個同時に刺しても240Hz出せるよう、コントローラー周りについてはライブラリを使用せずイチからソースを書いた。https://kaele.com/~kashima/games/ps_jpn.txt 神様のような文献です。

  • 基板を2枚取り可能なサイズに調整した結果ボタン4個になった。

  • DAOコンはUSBコネクタを繋がないと皿センサーが動かないので、USB-A端子を追加。USB-A端子は、DAOコンの給電専用。これをちゃんと書かないでいたせいで、どこからかType-A同士のケーブルを買ってくるお客様がいて大変でした(2敗)

ボタンを4個付けてもまだ余ってるピンがあったから、デバッグピンを3つ設けた。オシロスコープで240Hz出てるのを確認するのに重宝した。オシロスコープは安いのでいいから、持っておきたいね。

開発当初は基板にキーが8個付いてた。でかくて安定感ある。これだけキーがついてると、余ってるボタンにスクショとかも配置できる。

ボタンが8個付いてる初期バージョンの基板。

モード切り替えの話

せっかく色んな種類のコントローラーが刺せるんだから、Lively用の変換とかも出来たほうがいいよね、と考えてモード切り替えを実装。

$$
\begin{array}{|l|l|l|} \hline
1 & INFINITASモード & IIDX専コン用のボタン配置 基本的にJOYPADとして振る舞う \\ \hline
2 & BMSモード & BMS用のボタン配置 LR2でJOYPADがうまく認識できなかったので、キーボードとして振る舞う \\ \hline
3 & Livelyモード & Lively用のボタン配置 1-9のボタンはJOYPADで、スタートセレクト等はキーボードとして振る舞う \\ \hline
4 & JOYPADモード & JOYPADとして振る舞う \\ \hline
\end{array}
$$

十字キーの入力は、JOYPADの押しボタンとして認識するようにした。一般的なコンバーターはハットスイッチを設けることが多いが、ハットスイッチの場合上下とか左右の同時押しを受け付けられないため。

なぜ240Hzなのか

INFINTASが120Hzで動いてるならその倍の周期でコントローラー信号をPCに送ってやれれば判定のブレとかは感じないはずだよね、という発想。

240Hzを作るには

一定周期で何か関数を実行したい場合、AVR(もしくはArduino)では、タイマ割り込みを使用する。CPUのクロックをカウントして、所定の回数になったら、所定の関数を呼び出すことが可能。
前節の通り、INFINITASは120Hz駆動で、その倍の240Hzを目標値と設定した。マイコンのクロック16MHzであり、一方で240Hzというのは3の倍数だから、逆数を取って実時間に戻したとき、16MHzクロックの分周では作れない時間になってしまう。その辺はうまく処理してる(ノウハウ)。まぁぶっちゃけクロックの精度が1%とかだったらマイコン単独で240Hzを作るってのは結局無理で、本当にやるならPC側からトリガー掛けたほうが良いだろうね。そこまでリッチなシステムを作るのは流石にキツいと思うけど。

ちなみに先行事例ではタイマーを使わず、可能な限りの最速周期で処理してる例しか見たことがない。手持ちのマイコンでは260Hzくらいだったと思う。すげー上手な人なら判定のブレも見えるかも。

基板設計の話

  • プレステコントローラーのピンピッチは、実測値で3.93mmっぽい。中途半端すぎて、当初基板試作時は2-3回くらい発注失敗してる。

  • GNDベタは熱を吸うからハンダが乗りにくいね。

取説

Googleドキュメントにて、お客様説明用の資料を作成。
こういうところとか、あと梱包とか、そういうの含めて「製品」なのかなぁとか考えてる。


開発の歴史

いつごろどんな基板を何枚作ったか、どう進化したかを残したい。
ボタンが6個だった頃……プレステ端子のピッチを間違えてて実装できなかった思い出。
8個にした頃…タイマー不使用でちょっと判定不安定だったかも
4個にした頃…タイマー割り込みを追加した。ここからはずっと4個。
あとアクリル板を発注するようにした。加工がしんどかったから。今なら3Dプリンタで安く上げてもいいかも。
凝ったことやり始めるときりがないけど。
モード切り替えとかいつから追加したんだっけな…

おわりに

INFINTASのアップデートに合わせて、現行ではキーボードではなくジョイパッドとして動くようにしてます。

なんか気づいたら追記します。

この記事が気に入ったらサポートをしてみませんか?