【家庭用】バーチャ2練習ツールを作る②

マイコンはArduino Due。
アケコン基板はXBOX360用コントローラー:Fighting Stick VXの基板を使用することにしました。+3.3V(負論理)です。
必然的に使用するゲーム機はXBOX360となります。

割り込みについて

アーケード基板用のコマンドコントローラーは、V-SYNCごとに割り込みでレバー・ボタンの入力を変えるようにしていました。
1Fごとに入力させるためにはどのようにタイミングをとっていくか決める必要があります。

案① V-SYNCで割り込みをかける

まずはアーケード基板用と同じようにV-SYNCに同期すればよいのではないかと考えました。コード修正も最小限で済みますし。

そこに大きな壁が立ちはだかります。

HDMIではV-SYNC/H-SYNCはTMDS Channel 0として送信されます。単純に取り出すことができないんですね。

んー、困ったぞ、と頭をひねり、まずは単純にHDMI⇒VGA変換ケーブルから取り出す方向で実験してみました。

アナログRGB15ピンはピン配置がわかっているので、V-SYNCを取り出すだけであれば簡単です。

取り出したV-SYNCを見てみるとこのようになっていました。

HDMI⇒RGBケーブルで取り出したV-SYNC

これは以前SEGA model3基板のV-SYNCを見たときと山が逆になっています。

model3基板のV-SYNC/H-SYNC

コーディングの割り込み条件をFALLINGからRISINGに変えれば大丈夫だと思いますが、せっかくなので同じようにしてみます。

74HC04(インバータ)を使用してNOTをとった波形
74HC14(シュミットトリガ インバータ)を使用してNOTをとった波形
注意

ロジックICを使用する場合は必ずパスコン(バイパスコンデンサ)を付けましょう。
オシロで見ると波形が綺麗になるのがハッキリとわかります。

シュミットトリガについては例えばWikipediaにはこのように記載されています。

チャタリングのような揺らぎを吸収してくれるようです。
周期に影響があるとコマンドコントローラーの入力タイミングに影響が出るかもしれないと思ったのですが、幸い周期に変化はありませんでした。
マイコンソフトさんのアップスキャンコンバーターにも74HC14が使われていたようですので問題はなさそうです。

①にも載せた千本パンチを行っている際のオシロの映像です。

上から、
V-SYNC(垂直同期信号)
ガード
パンチ
キック
です。
ちゃんと1F単位の入力ができているように見えますし、コーディングでも誤っている箇所はないように感じます。でもしばらく放っておくとタイミングがずれてくるのです。(74HC04/74HC14の両方で試して同じ結果になりました)

オシロで周期を見ていると、59.7Hz~60.2Hzくらいで時折周期が変動しているのに気づきました。HDMI⇒アナログRGB変換の精度が良くないのかもしれません。
モニターで映す際には影響がないとしても、割り込みのトリガーとして使用する場合には影響が出てくるのかもしれませんね。

感覚的にも、ゲームプログラムの処理タイミングに間に合っているケースと、間に合わずに遅れているケースがあるように感じました。(現に、タイミングがずれてくると素早いPKキャンセル⇒遅いPKキャンセル(あるいはキャンセル失敗)を交互に繰り返すようになります)

XBOX360の1080pは60Hzとしか記載がないようですが、PS3/PS4はメーカーサイトに59.94Hzと記載があります。確かにHDMIの規格的には秒間60FでもOKそうですが、実際には秒間59.94Fのハードが多いようですね。

それでは59.94Hz一定周期で割り込みをかければコマンドコントローラーが安定動作するのか試してみたくなります。

確かに、今回千本パンチに成功したのはV-SYNC 59.7Hzの時だけで、60Hzを超えた時は確か一度も成功していません。59.7Hzの時でもだんだんずれてくるため、60Hz未満で微調整する必要があるような気がします。

オシレーターを使うなど回路を組む方法を考えていたのですが、マイコンでV-SYNC相当の波形を生成してあげればタイミング調整も楽なのではないかと思いつきました。
そしてしばらくして自分の馬鹿さ加減に呆れました。
V-SYNC波形を生成してそれで割り込みをかけるくらいなら、単純にタイマー割り込みすればいいですよね。。

案② タイマー割り込みを使用する

タイマー割り込みをかけるにあたり気になる記載を見つけました。
Arduino Due互換機には32kHzの水晶振動子が載っていないものがあるというのです(うちにあるのもこのタイプのものです)。
32kHzの水晶振動子がないとRTCを用いた処理ができなかったりするとのこと。タイマー割り込みにも影響するかもしれません。これは心配です。

そこで以下のサイトの情報通り、Arduino Dueでのタイマー割り込みのサンプルPGMをテストしてみました。

結果はOK!
問題なくタイマー割り込みが動作することが確認できました。

タイマー割り込みを使用したアプローチはまだ検証できていないので今後テストを進めていくことにします。
安定してくれるといいのですが・・・。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です