注釈
こんにちは、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+ |
以下のリンクから個別に購入することもできます。
コンポーネントの紹介 |
購入リンク |
|---|---|
- |
|
回路図
配線図
コード
注釈
ファイル
6.5_reaction_time.inoを3in1-kit\learning_project\6.5_reversingAidのパスから直接開くことができます。または、このコードをArduino IDEにコピーします。
LiquidCrystal_I2Cライブラリを追加していることを確認してください。詳しいチュートリアルは 5.11 外部ライブラリのインストール を参照してください。
どのように動作するのか?
ボタンとLEDを初期化し、2つの割り込みを使用してボタンのステータスを読み取ります。
void setup() { ... attachInterrupt(digitalPinToInterrupt(buttonPin1), pressed1, FALLING); attachInterrupt(digitalPinToInterrupt(buttonPin2), pressed2, FALLING); ... }
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が点灯します。
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であれば、反応時間が出力されます。それ以外の場合、クリックエラーが表示されます。
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であれば、反応時間が出力されます。それ以外の場合、クリックエラーが表示されます。