четверг, 11 февраля 2016 г.

Измерение скорости реакции

Скорость реакции достаточно важная штука. Например, при управлении автомобилем она играет далеко не последнюю роль. Есть масса факторов влияющих на скорость реакции. Сильная усталость и некоторые лекарства вызывают снижение скорости реакции. Вот я и решил сделать устройство, которое позволило бы измерить скорость реакции.


Для начала отвечу на главный вопрос. Зачем делать устройство для измерения скорости реакции? Действительно, скорость реакции можно измерить на некоторых сайтах в интернете. Ещё можно написать программу для компьютера, которая будет решать ту же задачу. Не смотря на сказанное, в изготовлении специального устройства есть смысл. Во-первых, устройство на ардуино может работать без интернета. Во-вторых, сложно оценить погрешность решений реализованных на компьютере. Микроконтроллер в этом случае является более предсказуемым и простым вариантом. В-третьих, реализация такого устройства не требует много времени и ресурсов.

Итак. Железо.

Ардуино нано.


Кнопка.


Светодиод.


Соединение модулей.

arduino --- button
VCC --- VCC
GND --- GND
A0 --- OUT

arduino --- led
VCC --- V
D8 --- R

Схема того, что должно получится.


Скетч.

////////////////////////
//
// Arduino
//
////////////////////////
//
// Sketch:
//

const unsigned char LED = 8; // Digital Pin 8
const unsigned char BUTTON = 14; // Analog Pin 0

unsigned long int time1 = 0;
unsigned long int time2 = 0;

void setup()
{
    // Led initialization
    pinMode(LED, OUTPUT);

    // Button initialization
    pinMode(BUTTON, INPUT);

    // UART initialization
    Serial.begin(9600);

    // Pseudo-random number generator initialization
    digitalWrite(LED, LOW);
    while ( digitalRead(BUTTON) == HIGH ) ;
    randomSeed(micros());
    digitalWrite(LED, HIGH);
}

void loop()
{
    digitalWrite(LED, HIGH);
    delay(random(2000, 5000));
    digitalWrite(LED, LOW);
    time1 = micros();
    while ( digitalRead(BUTTON) == HIGH ) ;
    time2 = micros();
    Serial.println(((time2-time1)/1000000.0), 6);
}

//
// End
//
////////////////////////

Работает устройство следующим образом. После подачи питания загорается светодиод. Своего рода индикация готовности устройства к работе. При нажатии на кнопку светодиод гаснет. В этот момент происходит инициализация генератора псевдослучайных чисел. После задержки, длительность которой определяется генератором псевдослучайных чисел, светодиод загорается снова. Теперь нужно как можно быстрее нажать кнопку. Время прошедшее от включения светодиода и до нажатия кнопки является временем реакции. Результат можно увидеть в мониторе порта ардуино.


Генератор псевдослучайных чисел весьма необходимая в данном проекте вещь. Без него удается довольно неплохо натренироваться нажимать кнопочку в нужное время.

В заключении скажу несколько слов о том, что можно изменить, улучшить. Во-первых, можно повысить точность. Для этого нужно отказаться от использования стандартных библиотек ардуино. Только я немного сомневаюсь в целесообразности всего этого. Лично моя реакция не настолько быстра. Правда и сложностей в модификации программы не много. Если будет большой интерес к устройству - сделаю.

Во-вторых, можно сделать устройство более компактным и мобильным. Ардуино нано легко меняется на ардуино про мини. Вместо вывода данных через UART можно выводить результаты на какой нибудь экранчик. Получится небольшое и самодостаточное устройство.