Тёплый ламповый «кликер»
Путешествуя по просторам интернета я набрел на одну малоинтересную категорию игрушек — «кликеры». Особенно меня «порадовал» Office Clicker. Глупость конечно несусветная, но что-то в этом есть. Можно написать какой-нибудь скрипт, который будет играть вместо меня, но это слишком банально. Я решил сделать хардвэрный «кликер», но не просто хардверный, а теплый-ламповый «кликер»! Интересно? Прошу под кат!
Теплая «ламповая» схемотехника
Схема мне пришла в голову весьма нетривиальная, в основу ее легла автомобильная лампочка дальнего света (которую я далее гордо именую «лампой»):
Номиналы деталей:
- R1 = 10 КОм (многооборотный);
- R2 = 5 Ом (5 Вт);
- R3 = 470 ОМ (0,25 Вт);
- R4 = 100 Ом (0,25 Вт);
- C1 = 47 мкФ (25 В).
Принцип работы схемы следующий:
- «Лампа» остыла (остывает);
- Напряжение U1 < U2;
- Компаратор подает отпирающий сигнал на транзистор T1;
- Транзистор T1 открыт;
- Контакты реле замкнуты;
- Через «лампу» начинает течь ток => она нагревается;
- Сопротивление «лампы» увеличивается;
- Напряжение U1 растет и приближается к U2;
- Когда U1 > U2, компаратор перестает подавать сигнал на T1;
- Транзистор T1 закрыт;
- Контакты реле разомкнуты;
- U1 > U2, но постепенно U1 снижается;
- GOTO 1.
Частота генерируемого сигнала зависит от:
- постоянной времени t=R5*C1;
- времени разогрева (и остывания) «лампы».
Изменяя напряжение U2 мы меняем время разогрева «лампы», соответственно — чем больше U2 тем ниже будет частота.
Резистор R4 и стабилитрон D1 (на напряжение 3.3В) используются для формирования управляющего сигнала для следующего узла — платы Arduino Duo.
Интерфейс
Как вы уже поняли, в качестве интерфейсной платы между «ламповым» реле и компьютером я выбрал плату Arduino Duo.
Принцип работы очень прост:
- когда в схеме «кликера» транзистор V1 закрыт, на Arduino поступает управляющий сигнал 3.3В, когда транзистор открыт — 0В;
- Arduino интерпретирует 3.3В, как руководство к нажатию ЛКМ;
- Arduino интерпретирует 0В, как руководство отпустить ЛКМ.
Вот программа для Arduino, которую я написал по этому поводу:
#define VACUUM_LINE 13
void setup()
{
pinMode(VACUUM_LINE, INPUT_PULLUP);
Mouse.begin();
}
void loop()
{
if (digitalRead(VACUUM_LINE) == HIGH)
{
Mouse.press();
delay(10);
}
if (digitalRead(VACUUM_LINE) == LOW)
{
Mouse.release();
delay(10);
}
}
Тестируем
Вместо тысячи слов, предлагаю посмотреть одно видео:
Спасибо за внимание! Надеюсь моя статья помогла улучшить ваше настроение!