・ 掲載開始日 2012年06月08日
・ 最終更新日 2012年06月08日
 以前作成したコマンドコントローラは基板剥き出しで通常の手動入力を犠牲にし、自動入力に特化した作りとなっていました。
 それに対し今回はコントローラの体裁を維持し、手動入力と自動入力が共存したコマンドコントローラを作成します。
 これにより、キャラクタ選択やオプション設定がやり易くなるほか、手動入力によるキャラの微妙な位置合わせと自動入力による正確無比な入力を
組み合わせた検証が容易になるので検証できる現象の幅が広がります。
配線
プログラム
自動入力実行ロジック
非同期クロック問題
使用例
 自動コマンドを実行するのはFPGAボード「AES-S6MB-LX9-G」。
 小型で、使えるI/Oが多く、仕事で使い慣れているXilinxのFPGAを搭載していることが決め手となりました。
 改造するコントローラはHORIの「リアルアーケードPro.V3 SA」。
 手動入力の観点では、普段ゲームセンターで使い慣れている三和電子製のレバー、ボタンが搭載されていること、
自動入力の観点では、本体の容積が大きくFPGAボードや2P側基板を格納し易そうであることが決め手となりました。
 改造対象は上図に示した部分。
 操作対象ゲームはバーチャファイター5で、1P側の×、□、△をそれぞれ1P側のガード、パンチ、キックに割り当てます。
 1P側は元の配線はそのままで、FPGAボードからの配線を並列接続するかたちでハックします。
 2P側はキャラクター選択など最低限の操作を手動入力できるよう、空いているボタンを借用します。
 上、右、○のみボタンとFPGAボードに並列に接続、それ以外のレバー、ボタンはFPGAボードにのみ接続します。
 自動入力実行ボタンも空いているボタンを借り、FPGAボードに接続します。
 このボタンが押されたら、それをFPGAが検知し、自動入力コマンドを各ボタンに順次出力します。
 裏蓋を開けました。
 入力パーツの電圧は4.6V。
 FPGAボードのI/Oは3.3Vですが、出力側<入力側なので、変換を介さずそのまま接続してOKです。
 FPGAボードからこれをLowに落としてやると、入力されたとコントローラ基板に判断されます。
 まずはレバー部の配線。
 「COM」部から共通GNDを引っ張ります。
 あとは上下左右それぞれの「ON」部から信号線を引っ張ります。
 
 ハックする1P側ボタンは元の接続部に引っ掛けて接続できるので半田要らずで楽チン。
 外れないようビニールテープを巻いておきます。
 自動入力実行ボタンは元の配線を外し半田で接続。
 ここまでの配線をFPGAボードのI/Oに接続。
 1P側の接続が完了したので、うまく動くかプログラムをテスト。
 ちゃんと自動入力できてます。
 続いて2P側の配線。
 基板を取り出します。
 PSボタン等がある基板からのケーブルが接続されてるコネクタが接着剤で固められていますが、
カッターで切ってコネクタを引っ張り上げたら取れました。
 2P側は基板から直接信号を引っ張ってきます。
 FPGAボードのI/Oに接続。
 手動入力対象となる一部の信号線は1P側の空いているボタンに接続。

 すべての接続が完了したので動作をテストしてみたところ、2P側レバー入力に対する挙動がおかしいことが判明。
 調査の結果、2P側メイン基板に元々接続されていた別基板上にあったスティック機能切替スイッチが関係していることが分かり、
上の写真のように関連するピンを短絡することで正常に動作するようになりました。
 
 空いているスペースにFPGAボード、2P側基板、配線を押し込んで蓋をします。
 FPGAボードのUSBケーブルをPCに、コントローラのUSBケーブルをPS3にそれぞれ接続してハードウェアの準備は完了です。

  Excelで自動入力したいコマンドを編集します。
  1行1フレームで、1列目が1P側、2列目が2P側に対応します。

  ここでは晶の白虎双掌打のコマンドを例として記入しています。

  CSV出力します。
  テキストエディタで直接編集してもOKです。

  CmdCSVToCmdROMでコマンドCSVをVHDLのROMに変換します。
  このプログラムは同階層にあるCmdROM_form.vhd(ROM記述の雛形)に、
 選択されたコマンドCSVに書かれたコマンドを加えることでCmdROM.vhdを生成します。

  変換されたROMはFPGA内部のブロックRAMにマッピングされます。

  XilinxFPGAの統合開発環境であるISEで
 FPGAに書き込むプログラムファイルを合成します。

  プロジェクトファイルはこちら

  プロジェクトに登録されているCmdROM.vhdと同階層に
 CmdCSVToCmdROM(CmdROM_form.vhdもセットで)を置いておけば、
 生成したCmdROMはすぐにISEのプロジェクトに反映されます。

  iMPACTを立ち上げ、合成したプログラムファイルをFPGAに書き込みます。

  これで、自動入力実行ボタンを押せばコマンドが走ります。
 FPGAにプログラムを書き込み、コントローラを操作していると、手入力している最中に勝手に自動入力が実行されるという現象が起こりました。
 裏蓋を開けて調べてみたところ、自動入力実行ボタンの配線を握ったりするだけで実行されることがありました。
 どうもノイズが発生して誤認識してしまっているようでした。
 FPGAのクロックは100MHzを利用しており、この頻度で1クロックでもLow/Highが変化するとボタンが押されたと判断するように
プログラムしていたのがまずかったです。
 そこで、1フレーム(1668337クロック)の間ボタンが押されたら実行するように変更しました。
 これで誤動作しなくなりました。
 1フレーム毎に実行フラグを確認し、フラグが立っていればコマンドROMのアドレスを先頭に初期化。
 以降、1フレーム毎にアドレスを終端までインクリメントします。
 アドレスのインクリメントに応じてROMからコマンドが順次出力されます。
 ROM出力は反転してLowActiveで各ボタンに送出します。
 自動入力コマンド送信のタイミングはFPGAボード上の水晶をもとに生成される100MHzを分周して作っています。
 つまり、PS3側のクロックとは非同期で、信号が変化する瞬間をサンプリングして不定な値を取ってしまう
セットアップ/ホールド違反が発生することがあります。
 コントローラチップのクロックを引っ張ってきて同期させようかと思いましたが、それらしき信号は外に出ていないようでしたし、
そもそもコントローラ基板上の水晶をもとにクロックを生成しているので、どのみちPS3本体とは非同期です。
 このような理由から、止む無くFPGA側クロックでコマンド送信のタイミングを計っています。

 FPGAで入力サンプリング周波数(59.94Hz)を生成するのですが、非同期故にPS3側とは微妙なズレが生じます。
 わずかな差のある周波数同士が重なることで生じる低周波、所謂うなりのような現象が発生し、
正常に入力される期間と正常に入力されない期間とが周期的に繰り返されます。
 分周度合と正常入力期間の関係は上のグラフのようになりました。
 横軸が分周のためのカウント数、縦軸が正常入力期間(秒単位)です。
 調べた中では分周カウント1668337時(59.93992・・・[Hz])の90分が最長の正常入力期間となりました。
 FPGAのコンフィグ完了時点での位相関係によっては非正常入力期間に位置してしまいますが、
そのときは正常入力期間になるまでコンフィグし直します。
 一度正常入力期間になれば長期間の正常入力が期待できます。

 このような手順を要すること、そしていつかは非正常入力期間になってしまうことが
このコマンドコントローラの欠点です。
Top