INFINITASコンバーターの話。
まえがき
beatmania IIDX INFINITAS 通称「おうちマニア」
PS2時代のCS作品に馴染みのあるかたは「PS2用のコントローラーをINFINITASでも使いたいなぁ」と思うはず。
INFINITASはサービス開始当初、KONAMI純正のUSBコントローラーと、キーボードの入力しか受け付けていなかった。PS2専コンを市販のUSBコンバーターとJoyToKeyなどを組み合わせて遊ぶ場合、「専コンをUSBコントローラーに変換する」「USBコントローラーをキーボード入力に変換する」と2回の変換を通す都合で判定がブレブレなもんだから、純正コントローラーがないとまともに遊べない…なんて時代がありました。
この記事で取り上げるのは、プレステのコントローラーをArduino Leonardoを使用してキーボードに変換することで、キーボード入力しか受け付けないINFINITASでもIIDX専コンを使えるようにしようぜ、という発想のコンバーター。先行事例多数。
当時はエレコムのコンバーターが高騰してたから、コントローラーを2個繋げるようにして、安価で売って、転売野郎を黙らせてやろうと考えて、量産した。(薄利多売を目指しつつ、薄利の方だけ実現できてるのはここだけの話)
![](https://assets.st-note.com/img/1707036614599-5E82zGBYXh.jpg)
現在ではINFINITAS(ソフトウェア)はキーボード入力だけじゃなくジョイパッド(一般のUSBコントローラー)の入力にも対応しているから、市販のコンバーターを使用して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 to Type-Aのケーブルを買ってくるお客様がいて、大変でした(2敗)
ボタンを4個付けてもまだ余ってるピンがあったから、デバッグピンを3つ設けた。オシロスコープで240Hz出てるのを確認するのに重宝した。オシロスコープは安いのでいいから、持っておきたいね。
開発当初は基板にキーが8個付いてた。でかくて安定感ある。これだけキーがついてると、余ってるボタンにスクショとかも配置できる。
![](https://assets.st-note.com/img/1707036981099-rWT5YCMP8L.jpg?width=1200)
モード切り替えの話
せっかく色んな種類のコントローラーが刺せるんだから、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クロックの分周では作れない時間になってしまう。その辺はうまく処理してるつもり(ノウハウ)。まぁぶっちゃけArduino(互換機)に搭載してるクロックの精度は1%とかなので、マイコン単独で正確に240Hzを作るってのは結局無理な話で、本当にやるならPC側からトリガー掛けたほうが良いだろうね。そこまでリッチなシステムを作るのは技術的に難しいかな…。
コンバーターの先行事例では、タイマーを使わず、可能な限りの最速周期で処理してる例しか見たことがない。手持ちのマイコンでは260Hzくらいだったと思う。すげー上手な人なら判定のブレが見えるかも。
基板設計の話
プレステコントローラーのピンピッチは、実測値で3.93mmっぽい。中途半端すぎて、当初基板試作時は2-3回くらい発注失敗してる。
GNDベタは熱を吸うからハンダが乗りにくいね。
取説
Googleドキュメントにて、お客様説明用の資料を作成。
こういうところとか、あと梱包とか、そういうの含めて「製品」なのかなぁとか考えてる。
開発の歴史
いつごろどんな基板を何枚作ったか、どう進化したかを残したい。
ボタンが6個だった頃……プレステ端子のピッチを間違えてて実装できなかった思い出。
8個にした頃…タイマー不使用でちょっと判定不安定だったかも
4個にした頃…タイマー割り込みを追加した。ここからはずっと4個。
あとアクリル板を発注するようにした。加工がしんどかったから。今なら3Dプリンタで安く上げてもいいかも。
凝ったことやり始めるときりがないけど。
モード切り替えとかいつから追加したんだっけな…
送料のはなし。
ヤマトで発送するとき(boothとかメルカリ)は、厚さ5cmまでの荷物が扱える「宅急便コンパクト」を使用。送料は約540円(地域による)で、専用ボックス70円が別途必要。本当はネコポス(370円)を使いたいけど、梱包すると3cmを超えちゃうので不可。
普通郵便で送ろうとすると、同じく定形郵便(94円)では3cmを超えるため、100gの定形外郵便として発送。送料は140円。
おわりに
INFINTASのアップデートに合わせて、現行ではキーボードではなくジョイパッドとして動くようにしてます。
なんか気づいたら追記します。