Tes Waktu Reaksi Presisi Menggunakan Arduino UNO
Komponen dan Perlengkapan
- Push buttons: 3 buah
- LED 5 mm (Merah): 2 buah
- Kabel Jumper Male/Male: 1 set
- Breadboard (generik): 1 buah
- Arduino UNO: 1 buah
- Kabel USB-A ke B: 1 buah
- Resistor 100 ohm: 2 buah
- Resistor 10k ohm: 3 buah
Aplikasi dan layanan online: Arduino IDE
Tentang Proyek Ini
Saya pernah membaca artikel di mana penulis mencoba menggambarkan pengaruh waktu reaksi terhadap kehidupan atlet, penembak sniper, pemain kriket, dan pemain baseball. Akhirnya, penulis menyimpulkan bahwa waktu reaksi juga memiliki banyak implikasi dalam kehidupan orang biasa. Saya terkesan menyadari bahwa waktu reaksi sangat relevan dalam aktivitas sehari-hari.
Misalnya, waktu reaksi yang lebih lambat dari biasanya saat mengemudi dapat menghasilkan konsekuensi yang serius.
Saya berpikir, bagaimana cara saya bisa mengukur waktu reaksi saya sendiri?
Berikut adalah hasilnya.
Langkah 1: Kebutuhan yang Diperlukan
Berikut adalah daftar hal yang dibutuhkan untuk mengukur waktu reaksi.
Hardware:
Komponen di atas biasanya tersedia di lemari hobi elektronik. Jika Anda ragu tentang komponen apa pun, silakan lihat gambar yang tersedia.
Software:
Langkah 2: Prosedur Mengukur Waktu Reaksi (RT)
Ada banyak jenis waktu reaksi yang terkait dengan tubuh manusia, seperti Audio RT, Visual RT, Touch RT, dan masih banyak lagi. Dalam tutorial ini, kita akan mengukur Waktu Reaksi Visual.
Prosedur Mengukur Waktu Reaksi Visual:
- Tampilkan pesan pada serial monitor Arduino: "press ready button when you are ready"
- Ketika orang yang diuji menekan tombol siap, setelah jeda waktu acak, salah satu dari dua LED akan menyala secara acak.
- Orang yang diuji harus menekan tombol yang sesuai secepat mungkin.
- Arduino akan mencatat selisih waktu antara LED menyala dan orang menekan tombol yang sesuai.
- Tampilkan pesan waktu reaksi yang diukur pada serial monitor Arduino.
Untuk mengklarifikasi, dari daftar komponen hardware yang disebutkan, dari 3 tombol, satu tombol akan berfungsi sebagai tombol siap, dan dua tombol yang tersisa akan sesuai dengan dua LED, yaitu LED1→BUTTON1 dan LED2→BUTTON2. Artinya, jika LED1 menyala, orang yang diuji harus menekan BUTTON1, begitu pula sebaliknya untuk LED2.
Langkah 3: Menggabungkan Semua Komponen
Pada gambar di atas, Anda dapat melihat rangkaian sirkuit. Berikut beberapa poin yang perlu diperhatikan:
- Sambungkan 5V dan GND dari papan Arduino ke breadboard Anda.
- Sambungkan katoda kedua LED melalui resistor pembatas arus 100 Ohm.
- Sambungkan anoda LED1 dan LED2 ke pin nomor 8 dan 12 secara berturut-turut.
- Pasang push button seperti yang ditunjukkan pada gambar. (Pada push button, ketika tombol terbuka, kaki di sisi yang sama disambungkan; ketika tombol ditekan, kaki diagonal disambungkan)
- Sambungkan resistor 10K Ohm seperti yang ditunjukkan pada gambar; ini bertindak sebagai resistor pull-down.
- Sambungkan kaki lainnya ke rel 5V pada breadboard.
- Terakhir, sambungkan tombol ke pin nomor 2, 4, dan 7 pada papan Arduino.
Catatan: Nomor pin yang disebutkan di atas dapat bervariasi sesuai keinginan Anda; saya hanya menyebutkan preferensi saya.
Langkah 4: Mari Koding
Saya melampirkan kode Arduino untuk tutorial ini, yang dapat Anda unduh dan coba, tetapi saya menyarankan Anda untuk menulis kode sendiri. Berikut beberapa poin yang perlu diingat saat menulis kode Anda:
- Perhatikan debounce (denouncing) pada push button.
- Pastikan kode menyediakan resolusi yang baik dalam mengukur waktu reaksi.
- Gunakan serial monitor untuk debugging serta antarmuka pengguna.
Jika Anda memiliki keraguan tentang salah satu langkah di atas, silakan tonton video yang dilampirkan.
Langkah 5: Waktu Pengujian
Semua siap, panggil teman-teman Anda dan lihat siapa yang paling cepat. Buat tabel dan hitung rata-rata (lebih baik biarkan Arduino yang melakukannya) dan tentukan pemenang. Saya melampirkan video demo saya; silakan tonton. Rata-rata waktu reaksi visual kami sekitar 250 ms.
PS: jika lebih dari ini setelah minum, jangan mengemudi.
Kode
Berikut adalah kode Arduino untuk mengukur waktu reaksi Anda. Cukup jalankan kode dan buka serial monitor.
// set pin numbers:
const int buttonPin1 = 4; // the number of the pushbutton1 pin
const int buttonPin2 = 2; // the number of the pushbutton2 pin
const int buttonPin3 = 7; // the number of the pushbutton3 pin
const int ledPin1 = 8; // the number of the LED1 anode(+) pin
const int ledPin2 = 12; // the number of the LED2 anode(+) pin
// Variables will change:
int ledState1 = LOW; // the current state of the LED1
int ledState2 = LOW; // the current state of the LED2
int buttonState1; // the current reading from the input pin1
int buttonState2; // the current reading from the input pin2
int buttonState3; // the current reading from the input pin3
int lastButtonState1 = LOW; // the previous reading from the input pin1
int lastButtonState2 = LOW; // the previous reading from the input pin2
int lastButtonState3 = LOW; // the previous reading from the input pin3
// the following variables are long's because the time, measured in microseconds,
// will quickly become a bigger number than can be stored in an int.
unsigned long lastDebounceTime = 0; // the last time the output pin was toggled
long debounceDelay = 20000; // the debounce time in micro second
unsigned long randNumber; // Generated random number
unsigned long minRandomNumber = 2000; // minimum number used to specify the range of random number
unsigned long maxRandomNumber = 5000; // maximum number used to specify the range of random number
unsigned long time1, time2;
int button3Pressed = LOW;
int printcount = 0;
int takeReading = LOW; // following variable help in reading buttons pins
int reading1;
int reading2;
int reading3;
// following variable help in reading button corresponding to particular led i.e LED1 --> BUTTON1 and LED2 --> BUTTON2
int oddNumber;
int evenNumber;
void setup() {
pinMode(buttonPin1, INPUT);
pinMode(buttonPin2, INPUT);
pinMode(buttonPin3, INPUT);
pinMode(ledPin1, OUTPUT);
pinMode(ledPin2, OUTPUT);
// enabling serial communication
Serial.begin(115200);
// set initial LED state
digitalWrite(ledPin1, ledState1);
digitalWrite(ledPin2, ledState2);
// if analog input pin 0 is unconnected, random analog noise will cause the call to randomSeed() to generate different seed numbers each time the sketch runs.
randomSeed(analogRead(0));
}
void loop() {
if (printcount == 0) {
Serial.println("press button 3 when you are ready");
printcount = 1;
takeReading = LOW; // not to read button number 1 and 2
oddNumber = LOW;
evenNumber = LOW;
}
if (button3Pressed == HIGH) {
digitalWrite(ledPin1, LOW);
digitalWrite(ledPin2, LOW);
randNumber = random(minRandomNumber, maxRandomNumber);
delay(randNumber);
if (randNumber & 1 == 1) {
digitalWrite(ledPin1, HIGH);
digitalWrite(ledPin2, LOW);
time1 = micros();
oddNumber = HIGH;
} else {
digitalWrite(ledPin1, LOW);
digitalWrite(ledPin2, HIGH);
time1 = micros();
evenNumber = HIGH;
}
button3Pressed = LOW;
}
reading3 = digitalRead(buttonPin3); // read button3
if (takeReading == HIGH) {
if (oddNumber == HIGH) reading1 = digitalRead(buttonPin1);
if (evenNumber == HIGH) reading2 = digitalRead(buttonPin2);
}
// If the switch changed, due to noise or pressing:
if (reading1 != lastButtonState1 || reading2 != lastButtonState2 || reading3 != lastButtonState3) {
// reset the debouncing timer
lastDebounceTime = micros();
}
if ((micros() - lastDebounceTime) > debounceDelay) {
// whatever the reading is at, it's been there for longer than the debounce delay, so take it as the actual current state:
// if the button state has changed:
if (reading1 != buttonState1) {
buttonState1 = reading1;
// only toggle the LED if the new button state is HIGH
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;
}
}
}
// save the reading. Next time through the loop, it'll be the lastButtonState:
lastButtonState1 = reading1;
lastButtonState2 = reading2;
lastButtonState3 = reading3;
}
Skematik
Gambar skematik tersedia di bagian bawah proyek.