【親子で作る自由研究】初心者キットで作る「連打スピードゲーム」|何回押せるか競う対戦装置

親子で連打勝負! 連打スピードゲーム

10秒間でボタンを何回押せるか、親子で勝負しよう

親子で盛り上がる電子工作って何かない?

「連打スピードゲーム」はどうだろう? 10秒間にボタンを何回押せるかを数える装置。子どもと父さん、絶対盛り上がるよ。

今回は、親子で対戦できる電子工作を作りたい方に向けて、初心者キットだけで作れる「連打スピードゲーム」を紹介します。

スタートボタンを押すと10秒のカウントダウン開始、その間に連打ボタンを何回押せるかをカウントする装置です。家族の年齢差、男女差、利き手差などを比較できる、自由研究としても優秀なテーマです。

この記事で作るもの
  1. スタートボタンを押すと開始
  2. 10秒間で連打ボタンを連打
  3. 10秒経つと自動で終了
  4. シリアルモニタに連打回数を表示

使う部品

部品役割個数
Arduino UNO R3頭脳1
タクトスイッチスタート+連打2
LED計測中の表示1
抵抗330ΩLED保護1
パッシブブザー開始・終了の合図1
ブレッドボード配線1
ジャンパーワイヤーつなぐ9本前後

配線図

        a b c d e
       +─────────+
[-]rail| . . . . . | ← GND
       +─────────+
row 3  | X . . . . | ← スタートSW (D2)
row 5  | X . . . . | ← スタート反対 ([-])
row 8  | X . . . . | ← 連打SW (D3)
row 10 | X . . . . | ← 連打反対 ([-])
row 13 | X . . . . | ← 330Ω 上 (D7)
row 14 | X . . . . | ← 330Ω 下+LED+
row 16 | X . . . . | ← LED- ([-])
row 19 | X . . . . | ← ブザー+ (D8)
row 20 | X . . . . | ← ブザー- ([-])
       +─────────+

プログラム

#define START_BTN 2
#define TAP_BTN 3
#define LED 7
#define BUZZER 8
#define DURATION_MS 10000

bool playing = false;
unsigned long startTime = 0;
int tapCount = 0;
int lastTapState = HIGH;
unsigned long lastDebounceTime = 0;
const int DEBOUNCE_MS = 30;

void setup() {
  Serial.begin(9600);
  pinMode(START_BTN, INPUT_PULLUP);
  pinMode(TAP_BTN, INPUT_PULLUP);
  pinMode(LED, OUTPUT);
  pinMode(BUZZER, OUTPUT);
  Serial.println("連打スピードゲーム 準備完了!");
  Serial.println("※ INPUT_PULLUP なのでボタンを押した瞬間は LOW になります");
}

void loop() {
  if (!playing && digitalRead(START_BTN) == LOW) {
    playing = true;
    startTime = millis();
    tapCount = 0;
    digitalWrite(LED, HIGH);
    tone(BUZZER, 2000, 200);
    Serial.println("スタート!");
    delay(300);
  }

  if (playing) {
    int currentTap = digitalRead(TAP_BTN);
    if (lastTapState == HIGH && currentTap == LOW &&
        (millis() - lastDebounceTime) > DEBOUNCE_MS) {
      tapCount++;
      lastDebounceTime = millis();
    }
    lastTapState = currentTap;

    if (millis() - startTime >= DURATION_MS) {
      playing = false;
      digitalWrite(LED, LOW);
      tone(BUZZER, 800, 500);
      Serial.print("結果: ");
      Serial.print(tapCount);
      Serial.println("回!");
    }
  }
}

プログラムの動き

flowchart TD A[起動] --> B{"スタート
押された?"} B -->|Yes| C["LED点灯
音で合図
計測開始"] B -->|No| B C --> D[連打を数える] D --> E{"10秒
経過?"} E -->|No| D E -->|Yes| F["終了音
結果表示"] F --> B

親子の遊び方

対戦の流れ
  1. 1人ずつ順番にチャレンジ
  2. スタートボタンを押したら全力連打
  3. 10秒経ったら自動で結果表示
  4. 1人3回ずつやって最高得点で勝負
大人と子ども、どっちが速いの?

実際に測ってみると、手の大きさや押し方の違いで差が出るんだ。後半で疲れて落ちる人もいるから、3回連続で測って傾向を見ると面白い研究になるよ。

レポートの書き方

レポート構成
  1. 研究のきっかけ
  2. 家族の連打回数データ表
  3. 年齢、利き手、男女の差を分析
  4. 3回試した時の疲労による低下
  5. 感想

改造のアイデア

発展アイデア
  1. 計測時間を5秒、30秒も選べるようにする
  2. ハイスコアをEEPROMに保存する
  3. LCDに連打回数をリアルタイム表示
  4. 左手と右手でボタンを2つ用意

まとめ

今回は、親子で対戦できる「連打スピードゲーム」を紹介しました。シンプルな部品で作れて、家族で盛り上がる、自由研究にもなる作品です。

大切なのは、家族みんなの記録を同じ条件で集めることです。年齢や利き手で違いが出れば、それだけで研究になります。

他にも初心者キットだけで作れる作例を別の記事で紹介しているので、興味があれば見てみてね。