суббота, 28 января 2017 г.

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

Устройство описываемое в этой статье является модификацией ранее представленного. Почитать про первую версию можно на 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
//
////////////////////////

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

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

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

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

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