Партнерка на США и Канаду по недвижимости, выплаты в крипто

  • 30% recurring commission
  • Выплаты в USDT
  • Вывод каждую неделю
  • Комиссия до 5 лет за каждого referral


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

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


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

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

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

Кнопка.

Светодиод.

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

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 можно выводить результаты на какой нибудь экранчик. Получится небольшое и самодостаточное устройство.

Сравнение скорости реакции

Устройство описываемое в этой статье является модификацией ранее представленного. Почитать про первую версию можно на http://justforduino. blogspot. ru/2016/02/blog-post. html

Устройство не новое. Поэтому начну сразу со схемы.


Всё просто. Ардуино нано. Индикаторный светодиод. Токоограничительный резистор на 220 ом. Две кнопочки.

Кнопок может быть от одной до шести. Подключаются к аналоговым пинам ардуино.

Скетч для плат ардуино с контроллером ATmega328 / ATmega168.

////////////////////////

//

// Arduino

//

////////////////////////

//

// Sketch:

//

// LED --- Digital Pin 8

// BUTTON 1 --- Analog Pin 0

// BUTTON 2 --- Analog Pin 1

// BUTTON 3 --- Analog Pin 2

// BUTTON 4 --- Analog Pin 3

// BUTTON 5 --- Analog Pin 4

// BUTTON 6 --- Analog Pin 5

unsigned char cheater = 0;

unsigned char button = 0;

unsigned long int time1 = 0;

unsigned long int time2 = 0;

void setup()

{

  // Led initialization

  DDRB = 0b00000001;

  PORTB = 0b00000001;

  // Buttons initialization

  DDRC = 0b00000000;

  PORTC = 0b00111111;

  // UART initialization

  Serial. begin(9600);

  // Pseudo-random number generator initialization

  cheater = ~PINC;

  PORTB = 0b00000000; // LED ON

  do { button = (PINC | cheater) & 0b00111111; }

  while ( button == 0b00111111 );

  randomSeed(micros());

  PORTB = 0b00000001; // LED OFF

}

void loop()

{

  Serial. println("round");

  PORTB = 0b00000001; // LED OFF

  delay(random(2000, 5000)); // wait

  cheater = ~PINC;

  PORTB = 0b00000000; // LED ON

  time1 = micros();

  do { button = (PINC | cheater) & 0b00111111; }

  while ( button == 0b00111111 );

  time2 = micros();

  if ( (cheater & 0b00000001) != 0 )

  Serial. println("1 cheater");

  if ( (cheater & 0b00000010) != 0 )

  Serial. println("2 cheater");

  if ( (cheater & 0b00000100) != 0 )

  Serial. println("3 cheater");

  if ( (cheater & 0b00001000) != 0 )

  Serial. println("4 cheater");

  if ( (cheater & 0b00010000) != 0 )

  Serial. println("5 cheater");

  if ( (cheater & 0b00100000) != 0 )

  Serial. println("6 cheater");

  if ( (cheater & 0b00000001) == 0 && (button & 0b00000001) == 0 )

  Serial. print("1 ");

  if ( (cheater & 0b00000010) == 0 && (button & 0b00000010) == 0 )

  Serial. print("2 ");

  if ( (cheater & 0b00000100) == 0 && (button & 0b00000100) == 0 )

  Serial. print("3 ");

  if ( (cheater & 0b00001000) == 0 && (button & 0b00001000) == 0 )

  Serial. print("4 ");

  if ( (cheater & 0b00010000) == 0 && (button & 0b00010000) == 0 )

  Serial. print("5 ");

  if ( (cheater & 0b00100000) == 0 && (button & 0b00100000) == 0 )

  Serial. print("6 ");

  Serial. println(((time2-time1)/1000000.0), 6);

}

//

// End

//

////////////////////////


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

Результаты можно посмотреть в мониторе порта ардуино.

В программе частично реализована борьба с читерством. Если нажать и не отпускать кнопку, то в мониторе порта появится соответствующая надпись.

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

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