суббота, 23 ноября 2013 г.

Разговор с подсознанием

Я не раз встречал в сети описание этой забавной электронной игрушки. Это устройство легко сделать на основе arduino.


Помимо arduino понадобится пара модулей схемы которых приведены на рисунке.


Для устройства удобнее использовать двухцветный светодиод (красный/зеленый). На рисунке показано подключение по схеме с общим катодом.

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

Кнопка:


Эта кнопочка подключается к ардуино согласно нижеуказанным инструкциям.

Key --- Arduino Uno

VCC --- 5V
SW1 --- IO8
GND --- GND

Светодиод (RGB):


У этого светодиодного модуля общим является анод. Подключается к ардуино согласно нижеуказанным инструкциям.

LED RGB --- Arduino Uno

V --- 5V
R --- IO9
B --- NC
G --- IO10

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


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


Работает это устройство следующим образом. Светодиод попеременно мигает зеленым и красным светом. Мигания должны быть заметны, но частота должна быть достаточно велика. Если задать вопрос и нажать на кнопку, то подсознание различит какой свет у светодиода и пошлет сигнал мышцам на сокращение. Когда кнопочка будет нажата, светодиод будет либо зеленым (положительный ответ), либо красным (отрицательный ответ). Осознанное управление невозможно из-за высокой частоты мигания светодиода. Это в теории :-)

Программа для любой платки ардуино.

////////////////////////
//
// Arduino UNO
//
////////////////////////
//
// Sketch: subconscious
//

const unsigned char BUTTON = 8;
const unsigned char LED_R = 9;
const unsigned char LED_G = 10;

unsigned char f = 0;

void setup()
{
    pinMode(BUTTON, INPUT);
    pinMode(LED_R, OUTPUT);
    pinMode(LED_G, OUTPUT);
}

void loop()
{
    if ( f == 0 )
    {
        digitalWrite(LED_R, LOW);
        digitalWrite(LED_G, HIGH);
        f = 1;
    }

    else
    {
        digitalWrite(LED_R, HIGH);
        digitalWrite(LED_G, LOW);
        f = 0;
    }

    do { delay(50); }
    while ( digitalRead(BUTTON) == LOW );
}

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

Программа для Arduino Uno.

////////////////////////
//
// Arduino UNO
//
////////////////////////
//
// Sketch: subconscious
//

// Arduino   ATmega328
//
// IO13 --- Port B Pin 5
// IO12 --- Port B Pin 4
// IO11 --- Port B Pin 3
// IO10 --- Port B Pin 2
// IO9 --- Port B Pin 1
// IO8 --- Port B Pin 0
//
// IO7 --- Port D Pin 7
// IO6 --- Port D Pin 6
// IO5 --- Port D Pin 5
// IO4 --- Port D Pin 4
// IO3 --- Port D Pin 3
// IO2 --- Port D Pin 2
// IO1 --- Port D Pin 1
// IO0 --- Port D Pin 0
//
// AD5 --- Port C Pin 6
// AD4 --- Port C Pin 4
// AD3 --- Port C Pin 3
// AD2 --- Port C Pin 2
// AD1 --- Port C Pin 1
// AD0 --- Port C Pin 0

void setup()
{
    DDRB = 0b00000110;
    PORTB = 0b00000100;
}

void loop()
{
    PORTB ^= 0b00000110;

    do { delay(50); }
    while ( !(PINB & (1 << 0)) );
}

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

В последней программе используется непосредственная работа с портом B микроконтроллера.