「連射装置を作る①」に訂正を追記(09/11)

連射装置を作る①

連射装置を作る

少しずつ基板遊びに役立つ装置を作っていくことにします。
まずはシューティングゲームなどでよく見かける連射装置です。
連射装置には以下の2つがあります。

  1. ボリューム連射
  2. ⇒ ボタンのON/OFFは装置側のタイミングで行います。
    ゲーム側とタイミングが合わないこともあるため連射装置につけたボリュームで調整します。

  3. シンクロ連射
  4. ⇒ V-SYNC(垂直同期信号)に同期してボタンをON/OFFさせます。

今回はシンクロ連射装置を作ってみることにします。

V-SYNCってなんだ!?という方はまずはこちらをざっとご覧ください

速度可変のシンクロ連射装置を作る

せっかくなので連射速度は可変のタイプにしたいのです。よくバトルガレッガについているやつですね。

また柔軟に改良していけるものにしたいので、ソフト側で作りこめるものが向いていると感じました。
人気のRaspberryPIをはじめ数種類のマイコンを検討した結果、Arduinoを使用してみることにしたのでした。

Arduinoを使うメリット
  1. +5Vを出力できる
  2. OSがあるわけではないため使いやすそう
  3. V-SYNC(垂直同期)を扱いやすい
  4. オープンハードなので価格が安価
  5. 電子工作が苦手でも敷居を低く始められる

ボタンを入力するということは・・・

マイコンで自動化するにあたりテスターをつなげてボタンを押したり離したりしてみました。

ボタンを離したとき
何もしていない時は0Vでした。

ボタンを押したとき
約+5Vになりました。

ボタンやレバーはスイッチのようなものなのですね。入力すると電圧が+5Vに上がり電流が流れると。
連射装置やコマンドコントローラーのようにボタン・レバーの入力を自動化するには、適切なタイミングで+5V/0Vを切り替える装置があれば良さそうです。
ArduinoのGPIOは+5Vを出力できるのでとても都合がよいですね。

訂正(2018/09/11)
すみません、上に書いたのはおそらく計測誤りです。
5枚ほど計測し直してみたのですが、ボタン離したときに+5V/ボタン押したときに0Vでした。
JAMMA基板の入力は負論理と聞いていたのでおかしいなーと思っていたのですが、、、。
確かMSXやX68000のジョイスティックも負論理でしたよね。

V-SYNC割り込み

前提
V-SYNC(垂直同期信号)を取り出せていること。
C-Sync Cleaner等を付けていない場合は、同期分離回路を自作する必要があります。

なんだそれは?という方はこちらをご覧ください。

ちょうど接続されていたセガmodel3基板の同期信号をオシロに入力してみました。
黄色がV-SYNC(垂直同期信号)、水色がH-SYNC(水平同期信号)の波形です。
V-SYNCは垂直表示期間が上側の線(電圧が高い)、垂直帰線期間が下側の線(電圧が低い)になっています。

オシロで見たところV-SYNCは垂直帰線期間がくると電圧が下がることがわかったため、FALLING(下降するタイミング)で割り込みをかけ連射処理のサブルーチンを実行するようにします。

当初、V-SYNCはアナログRGBの1つの信号なので、A/Dコンバーター(Arduinoならアナログ入力)経由で入力させ「ある閾値を越えたらHIGH、それ以外はLOW」等と処理しなくてはならないと思っていました。
ところがどっこい拍子抜け。
int.0に入力するだけで割り込み処理させることができました。
これは便利!!

チャタリング防止

こちらのサイトの情報(ソース)をもとにチャタリング防止のコードを入れています。
このサイトのソースでは、前回の割り込み発生から20ms以上経ったときだけON/OFFの判定をするようになっていました。

シンクロ連射の場合、最短だと1F単位でボタン入力のON/OFFをしなければなりません。
1Fあたりの時間は秒間60フレームのゲームで約16.7msです。
チャタリングがその半分の時間続くことはないでしょうから、前回の割り込みから8ms以上経った時だけ連射処理するようにしています。

適当ソース(テスト版)

動作確認

テストモードのINPUT TESTでボタン入力のON/OFFを確認しつつ、オシロスコープで波形を確認してみました。

黄色がV-SYNC(垂直同期信号)、水色がボタン入力です。

秒間30発

1Fごとにボタン入力がON/OFF切り替わっていることがわかります。

秒間20発

1F-ON、2F-OFFを繰り返しています。

秒間15発

1F-ON、3F-OFFを繰り返しています。

秒間12発

1F-ON、4F-OFFを繰り返しています。

秒間10発

1F-ON、5F-OFFを繰り返しています。

まとめ

思ったよりもあっさりできてしまいました。
Arduinoは素晴らしいですね!

あとはロータリースイッチに抵抗をつなげてArduinoと接続し、スイッチ位置ごとの電圧変化によって連射速度を切り替えるコードを書けば一段落の予定です。
想定通りに行くかはわかりませんが、今のところ順調にできているのでとても楽しみです。

これでバトルガレッガの基板を買っても大丈夫!!(あまりに高くて買う予定はないのですが・・・)

コメントを残す

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