注釈

こんにちは、SunFounderのRaspberry Pi & Arduino & ESP32愛好家コミュニティへようこそ!Facebook上でRaspberry Pi、Arduino、ESP32についてもっと深く掘り下げ、他の愛好家と交流しましょう。

参加する理由は?

  • エキスパートサポート:コミュニティやチームの助けを借りて、販売後の問題や技術的な課題を解決します。

  • 学び&共有:ヒントやチュートリアルを交換してスキルを向上させましょう。

  • 独占的なプレビュー:新製品の発表や先行プレビューに早期アクセスしましょう。

  • 特別割引:最新製品の独占割引をお楽しみください。

  • 祭りのプロモーションとギフト:ギフトや祝日のプロモーションに参加しましょう。

👉 私たちと一緒に探索し、創造する準備はできていますか?[ここ]をクリックして今すぐ参加しましょう!

6.5 反応ゲーム

私たちの身体には様々な反応時間があります。例として、聴覚の反応時間、視覚の反応時間、触感の反応時間などがあります。

反応時間は日常生活において多くの影響を及ぼします。例えば、運転中に反応時間が普段より遅いと、重大な結果を招く可能性があります。

このプロジェクトでは、3つのボタンと2つのLEDを使用して、私たちの視覚的な反応時間を計測します。

Arduinoのシリアルモニターは「waiting...」というメッセージを表示します。 Readyボタンを押すと、ランダムな時間が経過した後に2つのLEDのうちの1つがランダムに点灯します。被験者は対応するボタンをできるだけ早く押すことが重要です。 ArduinoはLEDが点灯するタイミングと、人が対応するボタンを押すタイミングとの時間差を記録し、Arduinoのシリアルモニターに計測した反応時間を出力します。

必要な部品

このプロジェクトには以下の部品が必要です。

一式をまとめて購入すると便利です。以下のリンクを参照してください:

名前

このキットのアイテム

リンク

3 in 1 Starter Kit

380+

3 in 1 Starter Kit

以下のリンクから個別に購入することもできます。

コンポーネントの紹介

購入リンク

Arduino Uno R4 Minima

-

ブレッドボード

購入

ジャンパーワイヤー

購入

抵抗器

購入

LED

購入

ボタン

購入

回路図

../_images/wiring_reaction_game.png

配線図

../_images/6.5_reaction_game_bb.png

コード

注釈

  • ファイル 6.5_reaction_time.ino3in1-kit\learning_project\6.5_reversingAid のパスから直接開くことができます。

  • または、このコードをArduino IDEにコピーします。

  • LiquidCrystal_I2C ライブラリを追加していることを確認してください。詳しいチュートリアルは 5.11 外部ライブラリのインストール を参照してください。

どのように動作するのか?

  1. ボタンとLEDを初期化し、2つの割り込みを使用してボタンのステータスを読み取ります。

    void setup()
    {
        ...
        attachInterrupt(digitalPinToInterrupt(buttonPin1), pressed1, FALLING);
        attachInterrupt(digitalPinToInterrupt(buttonPin2), pressed2, FALLING);
        ...
    }
    
  2. rstBtn ボタンが押されると、ゲームが再開します。2msから5msの間のランダムな時間で、LEDのうちの1つを点灯させます。

    void loop()
    {
        if (flag == -1 && digitalRead(rstBtn) == LOW) {
            digitalWrite(ledPin1, LOW);
            digitalWrite(ledPin2, LOW);
            Serial.println("Waiting...");
            int randomTime = random(2000, 5000);
            delay(randomTime);
    
            timer = millis();
            flag = randomTime % 2;
            Serial.println("Light!");
    
            if (flag == 0) {
                digitalWrite(ledPin1, HIGH);
            } else if (flag == 1) {
                digitalWrite(ledPin2, HIGH);
            }
        }
        delay(200);
    }
    
    • flagが-1で rstBtn ボタンが押された場合、 random() 関数を使用して2-5sのランダムな時間を生成します。

    • この時間はLEDの点灯を制御するために使用されます。

    • 2つのLEDの点灯も randomTime % 2 でランダムに生成されます。flagが0ならLED1が点灯、1ならLED2が点灯します。

  3. pressed1() 関数について

    void pressed1() {
        if (flag == -1) {
            return;
        }
        if (flag == 0) {
            int currentTime = millis();
            Serial.print("Correct! You reaction time is :");
            Serial.print(currentTime - timer);
            Serial.println(" ms");
        } else if (flag == 1) {
            Serial.println("Wrong Click!");
        }
        flag = -1;
    }
    

    これはボタン1が押されたときにトリガーされる関数です。ボタン1が押され、その時のflagが0であれば、反応時間が出力されます。それ以外の場合、クリックエラーが表示されます。

  4. pressed2() 関数について

    void pressed2() {
        if (flag == -1) {
            return;
        }
        if (flag == 1) {
            int currentTime = millis();
            Serial.print("Correct! You reaction time is : ");
            Serial.print(currentTime - timer);
            Serial.println(" ms");
        } else if (flag == 0) {
            Serial.println("Wrong Click!");
        }
        flag = -1;
    }
    

    これはボタン2が押されたときにトリガーされる関数です。ボタン2が押され、その時のflagが1であれば、反応時間が出力されます。それ以外の場合、クリックエラーが表示されます。