Arduino UNOで作る精密反応速度テスター
必要なパーツと用品
| パーツ | 数量 | 備考 |
|---|---|---|
| タクトスイッチ | 3 | Readyボタン×1、LED対応ボタン×2 |
| 5mm 赤色LED | 2 | 刺激提示用 |
| オス-オス ジャンパーワイヤー | 1式 | |
| ブレッドボード | 1 | |
| Arduino UNO | 1 | |
| USBケーブル (A-B) | 1 | |
| 抵抗 100Ω | 2 | LED電流制限用 |
| 抵抗 10kΩ | 3 | ボタン用プルダウン |
使用アプリ・オンラインサービス
- Arduino IDE
プロジェクト概要
アスリート、スナイパー、クリケット/野球選手などにとって反応時間がいかに重要か、そして一般人の日常生活(運転時のブレーキ反応など)にも大きく影響することを知り、自分の反応時間を測定するデバイスを作りました。
ステップ1:必要なもの
電子工作ホビイストなら手元にあるパーツばかりです。不明な部品は画像で確認してください。
ステップ2:視覚反応時間の測定手順
人には聴覚反応、視覚反応、触覚反応などがありますが、ここでは視覚反応時間を測ります。
- シリアルモニタに「Readyボタンを押してください」と表示
- 被験者がReadyボタン(ボタン3)を押す
- ランダムな待機時間(2〜5秒)後、2つのLEDのどちらか一方がランダムに点灯
- 被験者は点灯したLEDに対応するボタンをできるだけ速く押す(LED1→ボタン1、LED2→ボタン2)
- ArduinoがLED点灯からボタン押下までの時間差をマイクロ秒単位で測定
- シリアルモニタに反応時間を表示
ステップ3:回路組み立て
- Arduinoの5V/GNDをブレッドボードの電源レールへ
- LEDカソード側に100Ω抵抗を直列接続、アノードをピン8(LED1)とピン12(LED2)へ
- タクトスイッチ:片側を5V、もう片側を10kΩプルダウン抵抗経由でGND、かつArduino入力ピンへ(ピン4=ボタン1、ピン2=ボタン2、ピン7=ボタン3/Ready)
- ※ピン番号は好みで変更可
ステップ4:プログラミングのポイント
- ボタンのチャタリング除去(デバウンス)処理を実装
- マイクロ秒単位(
micros())で高精度測定 - シリアルモニタをデバッグ兼ユーザーインターフェースとして活用
添付コードを参考に、自分で書いてみるのがおすすめです。疑問点は動画で解説しています。
ステップ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;
}
回路図
ブレッドボード配線図:記事内画像参照
製造プロセス
- スマート渇きアラート植物アラーム – 最適な水やりタイミングを知らせるDIYセンサー
- イタリア語ワードクロック自作:Arduino Nano、NeoPixel、LCD、RTCで時刻を文字で表示
- アナログ3ピンで4×3キーパッドを接続 - Arduinoピン節約テクニック
- Arduino MKR Fox 1200で作る信頼性の高いSigfox kWhメーター
- Bluetooth対応温度モニター:Arduino NanoとHC-06でスマホ監視
- 非接触ジェスチャー錠: APDS-9960とArduinoでセキュアアクセス
- Arduino Nanoコンパニオンキット – 電子工作に必須の部品とツールを搭載した多機能IC型デバイス
- Arduino Micro/Leonardo用 USB-MIDIアダプタキット – 完全パーツリストと実装ガイド
- Arduino用絶縁アナログ入力回路の設計:LM331 V-F変換+フォトカプラでノイズ耐性を確保
- フォークリフトフォーク交換のタイミング:実務者向け実践ガイド
- コンプレッサーアップグレードの時期か? 早期に兆候を見極めよう