ゲームの操作をパソコンで行うコマンドコントローラを作成しました。
以前、バーチャファイターのフレーム解析で話題となったサイト「1/60sec」でキャラ操作のコンピュータ制御に
感銘を受けて以来、自分もやってみたいと思っていました。
「1/60sec」で管理人のカズ結城氏は制御システムの構成要素や仕組みの詳細を掲載されていて、
今回の作成に際し参考にさせていただきました。
○ 概要
PS1のコントローラに手を加え、当方が所持しているPS2のゲームを操作します。
PS1のコントローラにしたのはシンプルな作りで改造に適している上、中古で安く手に入れることができるからです。
また、変換機が普及しており他のゲーム機やPCにも使用することができ汎用性に富むのもメリットです。

操作の流れですが、コンピュータ上のソフトでコマンドを指定し、それをUSB・パラレル変換チップを介して
コントローラの各ボタンに1/60[s](ゲームの一般的な入力受付時間間隔)間隔で送信します。
ボタンに送ったLow・High信号でボタンのON・OFF状態を作り出し操作を行います。

ボタンON・OFFの方法について説明します。
通常はボタンが押されていないときは3.3[V](Highレベル)の状態を維持し、押されるとボタンの+側は
GNDに繋がり0[V](Lowレベル)に引き下げられます。
本体はこの状態を入力受付間隔毎にチェックすることでボタンが押されているかどうかを判別しています。
このことを利用し、ボタンの+側をパソコンからの信号でLowやHighに変化させてやることでボタンの
「押す」・「離す」状態をつくり出してやるわけです。
○ 製作過程
今回の中核となるUSB・パラレル変換チップFT245BMを搭載したモジュールUMO2-FIFO/Dです。
FT245BMは開発しやすいUSBインターフェイスチップとして定評があります。
西日本常盤商行の通販で購入しました。
価格は1つ1980円です。
このモジュールは出力が8つです。
1つのコントローラにつき上下左右とボタン4つは欲しいので、1つのモジュールにつき1コントローラ、
1P、2P、2つのコントローラを同時に操作したいので、2つ購入しました。
なお、FT245BMはBit-Bangモードで動作させます。
作成する回路の回路図です。
チップの駆動電圧はUSBのバスパワーで供給します。
電解コンデンサ(33[μF]、25[V])はリップル除去のためにつけます。
「D0」〜「D7」は信号出力ポートで、コントローラの各ボタンの+側に繋ぎます。
PS1のコントローラは3.6[V]で駆動し損失等でボタンの+側では3.3[V]になりますので、出力ポートの
Highレベル電圧を決める「VCCIO」に「3.3VOUT」から3.3[V]を与えます。
この回路を1コン用と2コン用に2つ組みます。
回路作成にあたってはMYCOMジャーナルの記事を参考にしました。
上記の回路図にしたがって回路を組んでいきます。
まずは片側を作成。
信号が送れるかLEDでチェックします。
ポート「D0」と「D1」から交互にHighレベルを出力してやります。
無事交互に光りました。
オシロでもチェックしましたが、ちゃんと3.3[V]のTTL信号になっていました。
回路に問題はないようです。
この調子でもう片方も組みます。
基板の脚も取り付けます。
再びLEDチェック。
今度はそれぞれの「D0」出力から交互にHighレベルを出力してやります。
回路に問題はなく、最終的にはちゃんと交互に光りましたが、最初は2つのモジュールを扱うのに手間取ってしまいました。
2つのモジュールをOpenするにはそれぞれのシリアルナンバーが必要ですが、それを自分で書き込む処理を別途しなければ
ならないことになかなか気付かず、シリアルナンバーを引き出す関数で知ろうとしても出てこないことに困ってしまいました。
シリアルナンバーの書き込みは西日本常盤商行のサイトで落とせる「E2PROM WRITER ユーティリティ」で行えます。
出力がうまくいくことが分かりましたので、次は各ポートをコントローラのボタンに繋ぎます。
PS1のコントローラは、1つは中古で300円のものを購入しました。
もう1つは以前、「コントローラ改造 無線パッド編2」が失敗したときの保険として買っておいたものです。
同じくらいの値段でした。
ハンダ付けの際は、ハンダが乗りやすくなるようにボタンの黒い部分を下の金属が剥き出しになるまでヤスリで削ります。
なお、GNDの接続は片側のコントローラだけでいいです。

ハードウェア部分はこれで完成です。
次にソフトの作成を行いました。
ボタンマークの下にあるボタンは、そのマークのボタンに対応します。
ゲームのメニュー操作やキャラの位置調整などはこれで行います。
チェックボックスのチェックは、左の数字のフレームのときに上のボタン入力が行われることを意味します。
チェックで作成したコマンドは「送信」ボタンでコントローラに送信されます。
送信はチェックがある最後のフレームまで行われます。
「リセット」ボタンを押すとチェックが全て外れ、デバイスのリセット処理が行われます。

 コマンドコントローラ
  commacon.exe

 ソース
  commacon.zip

 更新履歴
  ver.0.1 2006/7/11

デバイスのシリアルナンバーは「FT000001」、「FT000002」としています。
コンパイルにはFTD2XX.H、FTD2XX.dll、FTD2XX.libが必要です。
西日本常盤商行のサイトまたはFTDIのサイトで入手してください。

 このプログラムはフリーソフトウェアです。
 このプログラムの使用によって何らかの障害が発生した場合でも作者は一切の責任を負わないものとします。

これでハードウェアとソフトウェアが揃いました。
次は動作の検証を行います。
○ 動作検証
コマコンを接続した状態です。
コマコン基板をモニタ付属のUSBハブに、コントローラをPS2に接続します。
PS2の映像出力はPCのキャプチャボードに接続し、写真のモニタ左下のようにゲーム画面を表示します。
ゲーム画面の上にあるのはコマコンのソフトです。
PCのOSはWindowsXP、CPUはPentium4 1.8A[GHz]です。
ゲームソフトはバーチャファイター4エボリューションを使用します。
トレーニングモードでは画面のように入力したコマンドとその入力間隔フレームを表示できるので、
これで動作検証を行います。
左のように技のコマンドを指定し送信してみます。
(「○」は「K(キック)」、「×」と「△」は「P(パンチ)」、「□」は「G(ガード)」に対応します)
右のように正しく入力されました。
動画
しかし、長いコマンドを送信してみると時々入力間隔にばらつきが見られます。
動画は、1フレーム間隔で←↓→↑を繰り返すコマンドを約7秒間行ったものです。
1フレーム間隔の指定はSleep()関数で行っていますが、これの精度に問題があるようです。
そこで、精度が高いQueryPerformanceCounter()関数を使った間隔指定に変更してみます。
動画
するとズレなく正確に入力できるようになりました。
その他微調整を行い、ソフトによるチューニングが完了しました。
より確実な方法としてPS1のコントローラのクロック信号を受信して同期を取ることが考えられます。
ただ、入力ポートのためにモジュールを買い足さなくてはなりませんし、当方は現状で十分と感じたので、
ここまでにします。
動画
他のコマンドで遊んでみます。
これはバイアグステップと呼ばれる、手入力では非常に難しい動きです。
動画
ステージの端から端までバイアグステップ。
動画
素早いステップ。
Top