私は、さまざまなビデオ ゲーム コンソール (実際のハードウェアであり、エミュレートされていません) をプレイできるアーケード キャビネットに取り組んでいます。内部には、選択メニューを実行するための PC があります。私はそれを自分で書かなければなりません。また、PC とさまざまなコンソールの間でオーディオ/ビデオ/コントロールを切り替えるリレーを制御するなど、さまざまなことを行う PLC をプログラムする必要があります。私が今取り組んでいること。
私が出発点として取り組んでいるのは、コントローラーのエンコーディングと関係があります。基本的に、各プレーヤーのコントロールはいくつかのボタンとジョイスティックで構成されています。これらは、ボタンごとに 1 つ、ジョイスティックの基本方向ごとに 1 つずつ、通常は開いている瞬間的な接点スイッチを使用します。ボタンまたはジョイスティックの方向を押すと、スイッチが閉じます。ボタンの状態は、エンコーダーによってコンソールに伝えられます。
エンコーダには、プルアップ抵抗を介して 5 ボルト (「ハイ」) に接続されている各ボタンとジョイスティック方向の接続があります。ボタンまたは方向を押すと、モーメンタリ スイッチを介してグランドに接続されます。エンコーダーがボタン接続のグラウンド ("low") を読み取ると、ボタンが押されたことを認識し、これをコンソールに伝えます。
私はすでにこれらすべてをさまざまなコンソールで動作させていますが、追加すると便利な機能をいくつか考えました。これが私の現在のタスクの出番です。
最初の機能は、ボタンのリマッピングです。これらのゲームの一部は、コントローラーを念頭に置いて設計されているため、アーケード コントロール パネルで使用すると、一部のボタンが必要な場所にない場合があります。一部のゲームでは、ソフトウェアを介してボタンを再マッピングできますが、そうでないゲームもあります。私の考えは、ジョイスティックとボタンとエンコーダーの間に PLC を追加することです。この PLC を「プリエンコーダー」と呼びます。
プリエンコーダーは、いくつかの入力ピンのボタンの状態を読み取り、これらの状態をいくつかの出力ピンに書き戻し、エンコーダーに中継します。利点は、そのプログラミングが任意の入力ピンを任意の出力ピンに関連付けて、ボタンを効果的に再マッピングできることです。コンピュータのメニューからコンソールを選択すると、特定のゲームに関連付けられたボタン マッピング プロファイルも選択され、プリエンコーダに転送されます。
もちろん、ボタンを読み取り、その状態をエンコーダーに中継するプリエンコーダーのルーチンは、スムーズな制御のために非常に迅速に繰り返す必要があります。これらのゲームは約 50 ~ 60 Hz で実行されます。つまり、16.67 ミリ秒以下ごとに新しいビデオ フレームが生成されます。理想的には、プリエンコーダーがこのルーチンをフレームごとに何度も繰り返して、絶対的な最小入力ラグを確保できるようにします。コードとハードウェアの選択が最適化され、可能な限り高速に実行されるようにしたいと考えています。
2つ目の特徴はターボボタン。一部のゲーム、特にアーケード ゲームでは、弾薬が無制限であっても、銃や船の大砲などを発射するたびに発射ボタンを繰り返し押す必要があります。これは不要なようで、すぐに指が疲れてしまいます。ターボ ボタンは連続して押し続けることができるボタンですが、それをすばやく押したり離したりしているとゲームに伝えられます。これは、PC 上で実行されるソフトウェアや 555 タイマーなどのアナログ ソリューションで実行できますが、ターボ ボタンのタイミングをビデオのリフレッシュ レートと同期させるのが最善の方法です。PC またはビデオ ゲーム コンソールのビデオ出力から PLC に垂直同期パルスを供給することにより、ビデオのフレームがレンダリングされる頻度を正確に知ることができます。ターボボタンのタイミングは、定義することで制御できます。ボタンを押してから放すまでの時間をフレーム数で指定します。ゲーム固有のボタン プロファイルにタイミング情報を含めることもできます。
3 つ目の機能は、スロー ボタンです。実際には、これはジョイスティックにのみ適用される可能性がありますが、基本的な方向のスイッチをボタンと呼んでいます。特定のゲーム (おそらく shmups でのみ使用されます) では、非常に狭いスペースでキャラクター (船/飛行機) を移動する必要がある場合があります。最小限のジョイスティック入力でも反応が速すぎると、行き過ぎてクラッシュする可能性があります。スロー アクティベーション ボタンを押したままにしておくと、ターボ ボタンと同じ方法でジョイスティックをすばやくアクティブ化および非アクティブ化することで、ジョイスティックの反応が鈍くなるという考え方です。
プリエンコーダ自体に垂直同期パルスを監視させたいのか、それとも速度を落としすぎてしまうのかよくわかりません。私の現在の考えでは、別の PLC がキャブ自体の一般的な管理を担当することになります。「オン」ボタンの監視、リレーの切り替え、PC との直接通信、垂直同期パルスの監視など。これにより、プリエンコーダーが解放され、より高速に実行できるようになります。
プリエンコーダーの「コード」の例を次に示します。明らかに、これは私が考えていることの大まかな概要にすぎません。どの言語になるかさえわからないからです。この例では、プリエンコーダとして専用の PLC を使用することを想定しています。別の PLC は、コンピューターからゲーム プロファイルを取得し、その情報の一部をプリエンコーダーに渡すなどの他のタスクに加えて、垂直同期パルスの監視を担当します。その PLC は、ターボおよびスロー機能のフレーム タイミングを認識し、フレームをカウントし、ターボ ボタンを無効にする必要があるフレーム中に、プリエンコーダ PCB のピンにハイを出力し、ターボを無効にするように通知します。ボタン。有効にする必要があるフレームの間、そのピンにローを出力します。スローボタンと同じ考え方。
get info from other PLC (which got it from the computer, from a user-selected game profile):
array containing list of turbo buttons (buttons are identified by what input pin they are connected to)
array containing list of slow buttons (will probably only be the joystick directions, if any)
array containing list of slow activation buttons (should normally be only one button, if any)
array containing list of normal buttons (not turbo or slow)
array containing which output pin to use for each button (this determines remapping)
Begin Loop
if turbo pin is high
for each turbo button
output pin = high
next
else
for each turbo button
output pin = input pin
next
end if
if slow pin is high and slow activation button is pressed
for each slow button
output pin = high
next
else
for each slow button
output pin = input pin
next
end if
for each normal button
output pin = input pin
next
Restart Loop unless stop pin is low
これをすべて読んだ場合は、お時間をいただきありがとうございます。それで(最後に)、ここに私の質問があります:
あなたの全体的な考えは何ですか; 一般的な私のアイデア、実現可能性などについて?
プリエンコーダーにはどのような PLC を使用すればよいですか? 私はもともと Arduino を試すことを考えていましたが、高レベルのプログラミング ライブラリを使用しているため、非常に遅くなることがわかりました。別の PLC を中心に独自のボードを構築することに問題はありません。
PLC のプログラミングにはどの言語を使用すればよいですか? 私は新しい言語を学ぶことを気にしません。このプロジェクトに時間制限はありません。プリエンコーダーをできるだけ速く実行するために必要なものは何でも入れます。
プログラムを PLC にフラッシュするには何が必要ですか?
実行時に、これらの PLC は相互に、また PC とどのように通信する必要がありますか?
私は正しい場所で尋ねていますか?適切なフォーラム、適切なセクションなど? 他にどこか尋ねるべきですか?
心よりお返事をお待ちしております、
-ロブ