SHIROのIchigoJam日記

マイコン「IchigoJam」(イチゴジャム)の電子工作とプログラミングをメインに

早押し対決ゲーム

ロジックIC(論理回路フリップフロップ)を使った早押し対決ゲームを作りました。
フリップフロップを使った早押しボタンはネット上にいろいろ作例もあって、キットも市販されているのですが、ちゃんと2人で対決して遊べるゲームとして開発しました。
紹介動画はこちら。

www.youtube.com


電源は単4電池×3本です。

遊び方

  • 電源スイッチを入れてスタートボタンを押します。数秒経つとスタートLEDが光るので、その瞬間に2人でAとBのボタンを押してください。早く押した方のLEDが光って、勝ちとなります。
  • スタートLEDが光る前にボタンを押してしまうと、フライングの反則で相手の勝ちになってしまいます。
  • リプレイするには、スタートボタンを押してください。

回路図


スタートLED制御

NANDゲートの真理値表。
2本の入力が共にLだと出力がH、入力が共にHだと出力がLになるので、
インバーターと同様に反転出力になる。

 コンデンサの充電回路とIC・7400のNANDゲート2個を使って、スタートLEDを制御しています。スタートボタンを押すとコンデンサC2が一度放電され、その後R1・R2・フォトトランジスタを通して充電されます。充電が進んでC2の+側の電圧が上がると、7400Cゲートの入力がL→Hに変わり、7400Cゲートの出力=7400Dゲートの入力がH→Lに、7400Dゲートの出力がL→Hに変わって、スタートLEDが点灯します。
 NANDゲートでLとHを反転して、また反転して…と2回反転しているのがムダに見えますが、C2の+側にLEDを直接つなぐと「だんだん明るくなって光る」動きになってしまいます。今回のゲームではパッと瞬間的に点灯させたいので、ゲートで変換してデジタルな出力にしています。また、途中の反転出力をフライング判定(後述)に使っています。
 コンデンサC2へ充電する電流の一部はフォトトランジスタを通しているので、周囲の明るさによってスタートLED点灯までの時間が変わります。明るい場所だと3~4秒、暗いと7~8秒かかります。ちょっとした光の具合で変化するので、「いつ光るのか?」とハラハラさせてゲームを面白くしています。

早押し判定

Dフリップフロップ・7474の真理値表

 ボタンの早押し判定は、Dフリップフロップが2個入ったIC・7474を使っています。
 回路図上側のフリップフロップAを例に取ると、最初の出力は「Q=L・Q=H」の状態から始まり、LED-Aは光りません。
 時間が経ってスタートLEDが点灯すると、D入力がHになります。ここでボタンAが押されると、CLK入力がL→Hに立ち上がり、出力が「Q=H・Q=L」に切り替わって、LED-Aが光ります。同時にQ出力がつながった先のフリップフロップBのCLR端子がLになるので、フリップフロップBはクリアされて「Q=L・Q=H」で固定されます。後からボタンBを押しても入力を受け付けません。
 フリップフロップBに注目するとこの逆になるので、A・Bのどちらか早く押した方のLEDが光ることになります。
 リプレイするためにスタートボタンを押すと、2つのフリップフロップCLR端子がダイオードD2・D3を通じてLに落とされるので、フリップフロップがクリアされて最初の状態に戻ります。

フライング防止

 このままだとスタートLEDが光る前からボタンを連打していれば勝ててしまうので、7400のNANDゲートA,Bでフライング防止回路を組んでいます。
 スタート信号の反転信号と、ボタン入力信号の2本をNANDゲートへ入力すると、「スタートLEDが光る前(H)、かつ、ボタンが押された(H)」時だけ、ゲートの出力がLになります。このL出力を相手のフリップフロップPRE入力へつないでいるので、フリップフロップがプリセットされて「Q=H・Q=L」で固定され、相手のLEDが光ります。一方で自分のフリップフロップは、(相手が勝利した時と同様に)CLR端子がLになってクリア状態「Q=L・Q=H」で固定されるので、ボタン入力を受け付けなくなります。これでフライングの反則となって相手の勝ちになります。
 Dフリップフロップの入力が、CLKよりもCLRPREが優先されることを利用して、勝利やフライング時のインターロックをしています。

最後に

NORゲートをたすき掛けにしたRSフリップフロップ
R(リセット入力)やS(セット入力)が一瞬でもHになると出力が切り替わり、
入力がLに戻ってもその出力を保持する。

 NORゲートやNANDゲートをたすき掛けにした「RSフリップフロップ」を使った早押しボタンは、本にもネット上にも多数の作例が出ています。フリップフロップの基本を学ぶにはいいのですが、早押し対決ゲームにすると以下の問題があります。

  • ヨーイドン!の合図は誰がやる?(2人のどちらかが合図するのは不公平)
  • 合図の前にボタンを押してしまうフライングをどう防ぐ?

 そのため、Dフリップフロップ・7474の真理値表を見ながら「ここをこうつないだらできるか?」と頭を悩ませて、今回の回路を考えました。
 結果としてICが2個だけのシンプルな回路にできたので、子ども向け工作教室のネタにもいいと思います。

基板データ

*同じ基板を2枚配置しています。
*いわゆる「C基板」のサイズで設計しています。C基板用のケースやパネルが使えます。
*この基板データは、CC BYライセンスとします。どうぞご利用ください。

(C) 2022 Shiro Saito (https://www.ichigoaman.jp)

材料

だいたい以下の順番ではんだ付けすると作りやすいです。

IchigoJamプログラム版


IchigoJamのプログラムだと、20行ほどで同様の早押し対決ゲームが実現できてしまいます。やっぱりコンピュータってスゴイですね。

遊び方

  • プログラムを実行すると、画面中央上に丸いLEDが表示されます。数秒待つとLEDが点灯するので、2人でそれぞれキーボードの「A」と「B」を押してください。どちらか早かった方が「WIN!」と表示されます。
  • LEDが点灯する前にキーを押してしまうと、フライングの反則で相手の勝ちになってしまいます。
  • リプレイするには、再び「RUN」またはF5キーを押してください。
10 '*PUSH FIRST
20 CLV:VIDEO 3:CLS
30 A=ASC("A"):B=ASC("B")
40 LC 2,5:?CHR$(A)
50 LC 12,5:?CHR$(B)
60 LC 7,0:?CHR$(232)
70 T=RND(180)+180:CLT
80 P=30
90 @TLOOP
100 K=INKEY()
110 IF K=A W=B:GOTO @OVER
120 IF K=B W=A:GOTO @OVER
130 IF TICK()<T GOTO @TLOOP
140 LC 7,0:?CHR$(233)
150 P=10
160 @KLOOP
170 K=INKEY()
180 IF K=A W=A:GOTO @OVER
190 IF K=B W=B:GOTO @OVER
200 GOTO @KLOOP
210 @OVER
220 BEEP P,30
230 IF W=A LC 1,6:?"WIN!"
240 IF W=B LC 11,6:?"WIN!"

(追記)ブレッドボード版

ブレッドボードで組むこともできます。
部品が多くてちょっと面倒ですが、基板無し・はんだ付け無しで作れます。