工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Manufacturing Technology >> 製造プロセス

Arduino UNOで作る精密反応速度テスター

必要なパーツと用品

パーツ数量備考
タクトスイッチ3Readyボタン×1、LED対応ボタン×2
5mm 赤色LED2刺激提示用
オス-オス ジャンパーワイヤー1式
ブレッドボード1
Arduino UNO1
USBケーブル (A-B)1
抵抗 100Ω2LED電流制限用
抵抗 10kΩ3ボタン用プルダウン

使用アプリ・オンラインサービス

プロジェクト概要

アスリート、スナイパー、クリケット/野球選手などにとって反応時間がいかに重要か、そして一般人の日常生活(運転時のブレーキ反応など)にも大きく影響することを知り、自分の反応時間を測定するデバイスを作りました。

ステップ1:必要なもの

電子工作ホビイストなら手元にあるパーツばかりです。不明な部品は画像で確認してください。

ステップ2:視覚反応時間の測定手順

人には聴覚反応、視覚反応、触覚反応などがありますが、ここでは視覚反応時間を測ります。

  1. シリアルモニタに「Readyボタンを押してください」と表示
  2. 被験者がReadyボタン(ボタン3)を押す
  3. ランダムな待機時間(2〜5秒)後、2つのLEDのどちらか一方がランダムに点灯
  4. 被験者は点灯したLEDに対応するボタンをできるだけ速く押す(LED1→ボタン1、LED2→ボタン2)
  5. ArduinoがLED点灯からボタン押下までの時間差をマイクロ秒単位で測定
  6. シリアルモニタに反応時間を表示

ステップ3:回路組み立て

ステップ4:プログラミングのポイント

添付コードを参考に、自分で書いてみるのがおすすめです。疑問点は動画で解説しています。

ステップ5:テスト対決

友達を呼んで競争!平均値を取って勝者を決定(平均計算もArduinoにやらせると便利)。一般的な視覚反応時間は約250ms。飲酒後でこれ以上なら運転厳禁です。

コード

反応時間測定スケッチ

// ピン定義
const int buttonPin1 = 4;  // LED1対応ボタン
const int buttonPin2 = 2;  // LED2対応ボタン
const int buttonPin3 = 7;  // Readyボタン
const int ledPin1 = 8;     // LED1
const int ledPin2 = 12;    // LED2

// 状態変数
int ledState1 = LOW, ledState2 = LOW;
int buttonState1, buttonState2, buttonState3;
int lastButtonState1 = LOW, lastButtonState2 = LOW, lastButtonState3 = LOW;

unsigned long lastDebounceTime = 0;
long debounceDelay = 20000;  // 20ms デバウンス遅延(μs)
unsigned long randNumber;
unsigned long minRandomNumber = 2000;  // 2秒
unsigned long maxRandomNumber = 5000;  // 5秒
unsigned long time1, time2;
int button3Pressed = LOW;
int printcount = 0;
int takeReading = LOW;
int reading1, reading2, reading3;
int oddNumber, evenNumber;

void setup() {
  pinMode(buttonPin1, INPUT);
  pinMode(buttonPin2, INPUT);
  pinMode(buttonPin3, INPUT);
  pinMode(ledPin1, OUTPUT);
  pinMode(ledPin2, OUTPUT);
  Serial.begin(115200);
  digitalWrite(ledPin1, ledState1);
  digitalWrite(ledPin2, ledState2);
  randomSeed(analogRead(0));  // アナログノイズで乱数シード初期化
}

void loop() {
  if (printcount == 0) {
    Serial.println("press button 3 when you are ready");
    printcount = 1;
    takeReading = LOW;
    oddNumber = LOW;
    evenNumber = LOW;
  }

  if (button3Pressed == HIGH) {
    digitalWrite(ledPin1, LOW);
    digitalWrite(ledPin2, LOW);
    randNumber = random(minRandomNumber, maxRandomNumber);
    delay(randNumber);  // ランダム待機(ms)
    if (randNumber & 1) {  // 奇数ならLED1
      digitalWrite(ledPin1, HIGH);
      digitalWrite(ledPin2, LOW);
      time1 = micros();
      oddNumber = HIGH;
    } else {  // 偶数ならLED2
      digitalWrite(ledPin1, LOW);
      digitalWrite(ledPin2, HIGH);
      time1 = micros();
      evenNumber = HIGH;
    }
    button3Pressed = LOW;
  }

  reading3 = digitalRead(buttonPin3);
  if (takeReading == HIGH) {
    if (oddNumber == HIGH) reading1 = digitalRead(buttonPin1);
    if (evenNumber == HIGH) reading2 = digitalRead(buttonPin2);
  }

  // チャタリング除去:状態変化でタイマーリセット
  if (reading1 != lastButtonState1 || reading2 != lastButtonState2 || reading3 != lastButtonState3) {
    lastDebounceTime = micros();
  }

  // デバウンス遅延経過後、状態を確定
  if ((micros() - lastDebounceTime) > debounceDelay) {
    if (reading1 != buttonState1) {
      buttonState1 = reading1;
      if (buttonState1 == HIGH) {
        Serial.print("Your reaction time is: ");
        Serial.print(lastDebounceTime - time1);
        Serial.println("us");
        Serial.println();
        printcount = 0;
      }
    }
    if (reading2 != buttonState2) {
      buttonState2 = reading2;
      if (buttonState2 == HIGH) {
        Serial.print("Your reaction time is: ");
        Serial.print(lastDebounceTime - time1);
        Serial.println("us");
        Serial.println();
        printcount = 0;
      }
    }
    if (reading3 != buttonState3) {
      buttonState3 = reading3;
      if (buttonState3 == HIGH) {
        Serial.println("READY TO GO");
        button3Pressed = HIGH;
        takeReading = HIGH;
      }
    }
  }

  lastButtonState1 = reading1;
  lastButtonState2 = reading2;
  lastButtonState3 = reading3;
}

回路図

ブレッドボード配線図:記事内画像参照

製造プロセス

  1. スマート渇きアラート植物アラーム – 最適な水やりタイミングを知らせるDIYセンサー
  2. イタリア語ワードクロック自作:Arduino Nano、NeoPixel、LCD、RTCで時刻を文字で表示
  3. アナログ3ピンで4×3キーパッドを接続 - Arduinoピン節約テクニック
  4. Arduino MKR Fox 1200で作る信頼性の高いSigfox kWhメーター
  5. Bluetooth対応温度モニター:Arduino NanoとHC-06でスマホ監視
  6. 非接触ジェスチャー錠: APDS-9960とArduinoでセキュアアクセス
  7. Arduino Nanoコンパニオンキット – 電子工作に必須の部品とツールを搭載した多機能IC型デバイス
  8. Arduino Micro/Leonardo用 USB-MIDIアダプタキット – 完全パーツリストと実装ガイド
  9. Arduino用絶縁アナログ入力回路の設計:LM331 V-F変換+フォトカプラでノイズ耐性を確保
  10. フォークリフトフォーク交換のタイミング:実務者向け実践ガイド
  11. コンプレッサーアップグレードの時期か? 早期に兆候を見極めよう