Открываем дверь при помощи голосового ассистента

Всем привет!
Сегодня у меня статья про то, как при помощи Яндекс-колонки Алиса и Ардуино, можно открыть дверь, подключенную к домофону. Если Вам это интересно, то прошу под кат.
Часто бывает так, что кто-то звонит в домофон, а ты в этот момент чем-то занят или просто лень подходить для того, чтобы открыть дверь. Знакомая ситуация, не правда ли?
А мой домофон так вообще без поднятия трубки не открывает дверь и если в течении 30 секунд после вызова не поднять трубку, то кнопка открывания двери перестанет быть активной до того момента, пока не поступит новый вызов. Так как домофон не из дешёвых (на тот момент) меня жаба душила менять его на другой. И я решил с этим бороться.

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

Второй проект был реализован на роутере TL-MR3020 с прошивкой CyberWRT и программным СИП телефоном BareSIP. При нажатии на кнопку вызывной панели, роутер параллельно с вызовом интеркома звонил на мобильный телефон и можно было даже находясь в другом городе разговаривать с человеком, стоящим около двери твоей квартиры, но программный телефон или сам роутер, работали крайне нестабильно и пришлось от него отказаться.
Но тут к моему счастью в прошлом году на день рождения мне подарили голосового ассистента Алису и у меня появилась новая идея — отрывать дверь голосом, через Яндекс колонку.
И сегодня настал тот день, когда я взялся реализовать свою задумку.

Немного о том, как работает вызывная панель видео-домофона.


Вызывная панель соединена с монитором домофона при помощи 4-х проводов GND, +12 В, аудио и видео.
Если на вызывной панели, провод Audio замкнуть через резистор 100 Ом на GND, то раздастся сигнал вызова. А если на провод Audio подать напряжение +12 В, то сработает реле открытия электромагнитного замка.

На изображении ниже показана схема соединения вызывной панели с домофоном.

rpidqiqhhqgqijh_8mem46epixy.png

Если для подключения вызывной панели к монитору, у Вас используется специальный домофонный кабель, то он подключается как правило по следующей инструкции:

GND — экранирующая оплетка
+12 В — красный провод
Аудио — синий провод
Видео — центральная жила коаксиального кабеля

9mmjaocnfsychaquzuworgm2yn8.jpeg

Схема


Из схемы видно, что для подключения устройства на Ардуино к домофону, потребуется подсоединить всего 2 провода. Для коммутации этих проводов я использовал то, что у меня было под рукой. Вместо реле можно использовать ключ на N-P-N транзисторе или оптроне PC817.

ИК приемник я применил, первый попавшийся мне на глаза, который я когда-то выпаял из старого телевизора и который пролежал у меня на полке в хламе очень много лет.
lm5tkw2unoneb0jeiupx2n62v_m.jpeg

Используемые компоненты


Ардуино Нано
Модуль реле
ИК приемник 38 кГц
Провода Dupont

Вместо Arduino nano можно применить любой другой микроконтроллер из линейки ардуино. Я же использовал Ардуино нано потому, что у меня их достаточно много.

Исходник для Arduino


Код достаточно простой и понятный.
Для получения и сохранения кода нажатой кнопки, нужно перевести контроллер Ардуино в режим добавления кнопки пульта. Потребуется установить перемычку на выводы D2 и GND и нажать кнопку сброса на Arduino, после чего на плате контроллера засветится системный светодиод и контроллер будет ожидать нажатия кнопки на пульте.

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

Можно нажимать кнопки сколько угодно, но Arduino запомнит только последнее нажатие. Чтобы выйти из режима запоминания кода, достаточно удалить перемычку и нажать на микроконтроллере кнопку «Reset».

Код для Ардуино
#include
#include

//#define TOLERANCE 35 // процент допустимого отклонения принимаемого сигнала
#define IR_RECEIVE_PIN 11 // Вход для подключения ИК приемника
#define RELAY_PIN 12 // Выход для управления реле
#define SET_PIN 2 // Вход для перевода в режим программирования пульта

IRrecv irrecv (IR_RECEIVE_PIN);
decode_results results;

void setup ()
{
irrecv.enableIRIn (); //запустить ожидание нажатия кнопки на пульте
pinMode (RELAY_PIN, OUTPUT);
digitalWrite (RELAY_PIN, LOW);
pinMode (SET_PIN, INPUT_PULLUP); //D10 конфигурируем на вход, для режима «запоминания кода»
pinMode (LED_BUILTIN, OUTPUT);
digitalWrite (LED_BUILTIN, LOW);
// Serial.begin (115200);

while (! digitalRead (SET_PIN)) //если пины D2 и GND замкнуты то заходим в режим запоминания ИК кода
{
set_command ();
}
}

void loop ()
{
if (irrecv.decode (&results)) //если был принят код с пульта
{
if (LoadEEPROM ()==results.value) //если код совпадает с сохраненным (ir_command==results.value)LoadEEPROM ();
{
digitalWrite (RELAY_PIN, HIGH); //включить реле
digitalWrite (LED_BUILTIN, HIGH);
delay (500);
digitalWrite (LED_BUILTIN, LOW);
digitalWrite (RELAY_PIN, LOW); //Выключить реле
}
irrecv.resume (); //запустить ожидание нажатия кнопки на пульте
}
}

void set_command () //режим запоминания кода пульта ДУ
{
digitalWrite (LED_BUILTIN, HIGH);
if (irrecv.decode (&results))
{
digitalWrite (LED_BUILTIN, LOW);
SaveEEPROM (results.value); //сохраняем полученый код кнопки ПДУ в EEPROM
irrecv.resume (); //запустить ожидание нажатия с пульта
}
delay (100);
}

void SaveEEPROM (unsigned long ir_code) // записываем полученый код кнопки ПДУ в EEPROM
{
EEPROM.write (0, ir_code & 0xFF);
EEPROM.write (1, (ir_code & 0xFF00) >> 8);
EEPROM.write (2, (ir_code & 0xFF0000) >> 16);
EEPROM.write (3, (ir_code & 0xFF000000) >> 24);
}

unsigned long LoadEEPROM () // считываем код кнопки ПДУ из EEPROM
{
byte val = EEPROM.read (3);
unsigned long ir_code=val;
val = EEPROM.read (2);
ir_code= (ir_code << 8) | val;
val = EEPROM.read (1);
ir_code= (ir_code << 8) | val;
val = EEPROM.read (0);
ir_code= (ir_code << 8) | val;
return ir_code;
}


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

Подключение к Яндекс.Станции Алиса


Для подключения к умной колонке понадобится Умный пульт Яндекс.
z1vhgq6cvk9k849jimq7mji7du8.jpeg
Не обязательно его покупать у Российского поисковика и партнеров, пульт можно купить на Алиэкспресс немного дешевле. Но разница не настолько большая, чтобы играть в лотерею, покупая пульт у китайцев. Рассказывать, как подключить пульт к станции, я не буду, так как в интернете очень много подробных инструкций на эту тему, Вы без труда сможете их найти у того же Яндекса. Я только расскажу как настроить взаимодействие Яндекс.Станции с Ардуино открывалкой.
Для этого нужно зайти приложение Яндекс.Браузер — Все сервисы — Устройства — Управление устройствами — Пульт — Добавить устройство — Настроить вручную — вводим название «Дверь» — Добавить команду — вводим название голосовой команды «Открой» — берем пульт от любой бытовой техники, направляем его на Яндекс.пульт и нажимаем требуемую кнопку. После того, как синий светодиод на Я.пульте погас — колонка готова к выполнению этой команды. Теперь можно проверять, произносим фразу «Алиса открой дверь», она, немного подумав, выполнит Ваш приказ.

Заключение


Использование Яндекс пульта в умном доме позволит Вам управлять любой бытовой техникой, в состав которой входит ПДУ. А так же достаточно легко, собрав простейшую схему на Arduino интегрировать управление любыми другими устройствами, не имеющих ПДУ. Это просто, надежно и не требует подключения этих устройств к интернету.

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

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

© Habrahabr.ru