Я есть универсальный ИК-пульт с голосовым управлением Алексой…
Так мог бы сказать персонаж фильма “Стражи Галактики” — Грут, если бы у него были дополнительные настройки :) А у Raspberry Pi и операционной системы Raspbian их бесчисленное множество. И, как вы догадались по названию инструкции, одна их них — реализация системы универсального ИК-пульта для управления устройствами ‘Умного дома’ на базе голосового помощника Алекса в сочетании с домашним сервером. Алекса у меня располагается в комнате с LED-телевизором, домашним кинотеатром и приставкой KODI и у всех этих девайсов есть свой ИК-пульт. Я решил автоматизировать процесс включения/выключения данных устройств, тем более, что телевидение я смотрю с приставки KODI, которая берет видеопоток с моего домашнего ТВ-сервера и чтобы посмотреть телевизор, мне сначала нужно включить KODI с одного пульта (который в свою очередь по шине CEC включит сам телевизор), а затем включить домашний кинотеатр для передачи звука через его акустическую систему. Такая схема появилась из-за того, что в моем телевизоре отсутствует ТВ-тюнер стандарта DVB-T2, и мне пришлось купить два портативных USB ТВ-тюнера данного стандарта и сделать свой собственный ТВ-сервер на Linux.
Данная инструкция является дополнением, к моей ранее опубликованной инструкции “Голосовой помощник Alexa на Raspberry Pi”, и там рассказывается про установку операционной системы Raspbian Buster Lite на карточку micro SD. Про установку ИК-приёмника Вы можете прочитать в инструкции “Управление громкостью на Raspberry Pi c ИК-пульта дистанционного управления”.
Что вам понадобится:
- Raspberry Pi 3b (далее RPi) – 1шт.
- Карточка micro SD на 8Gb, класс скорости 10 – 1шт.
- ИК-светодиод TSAL6200 – 1шт.
- Биполярный транзистор 2N2222 NPN – 1шт.
- Резистор 36Ом, 0.25Вт – 1шт.
- Резистор 680Ом, 0.25Вт – 1шт.
- Резистор 10кОм, 0.25Вт – 1шт.
- Макетная плата
- Соединительные провода с клеммами Female Jumper Wire
- Паяльник
- Припой
- Термоусадка
- Паяльный фен
- Клеевой пистолет
Шаг 1 : Собираем схему для ИК-светодиода
ИК-светодиод TSAL6200 может непрерывно пропускать ток в 100мА. Максимальный ток, который вы можете брать от одного выхода GPIO составляет 16мА и не более 50мА от всех выходов. Напрямую запитать ИК-светодиод не получиться, т.к. 16мА будет слишком мало для его нормальной работы. Вместо этого мы соберём небольшую плату для усиления силы тока.
Собираем макетную плату согласно приведённой схеме:
Макетную плату такого маленького размера я вырезал с помощью отрезного диска мини-дрели Dremel от макетной платы большего размера. В процессе пайки, обратите особое внимание на расположение “эмиттера” вашего транзистора и не перепутайте его положение при его впаивании в плату.
R1 — это понижающий резистор, обеспечивающий нахождение ИК-светодиода в выключенном состоянии, когда операционная система RPi выключена или загружается. На практике значение такого резистора всегда 10кОм. Хотя ИК-приёмники бытовой электроники получают сигналы в закодированном виде и шансы, что RPi находясь в выключенном состоянии отправит такой сигнал крайне малы, но лучше подстраховаться и установить такой резистор.
R2 — резистор ограничения тока на “базе” транзистора. Вам необходимо рассчитать его значение в соответствии с используем транзистором 2N2222. Открываем его даташит и видим, что у него усиление постоянного тока (DC Current Gain) от 35 до 100 в зависимости от тока и напряжения. Я выбрал самый минимум и использовал для расчёта усиление 35. Мне нужно, чтобы управляющий ток “базы” позволял течь току более чем 100мА от “коллектора” к “эмиттеру”.
Чтобы рассчитать ток “базы”, нам нужно разделить требуемый ток на коэффициент усиления постоянного тока: 100мА / 35 = 2,9мА. Я округлил до 4мА для запаса, который позволит течь току до 140мА.
Напряжение на выходах GPIO 3.3В. Также необходимо учитывать падение напряжения от “базы” транзистора к его “эмиттеру”. Падение напряжения (Base-Emitter Saturation Voltage) на источнике напряжения составляет 0.6В в соответствии с даташитом. Поэтому для расчёта резистора, необходимого для ограничения тока на GPIO до 4 мА, используем закон Ома: V / I = R или (3.3В – 0.6В) / 4мА = 675 Ом. Ближайшее значение нужного резистора CF-25 составляет 680Ом.
Нам также нужно рассчитать мощность резистора R2. Формула мощности P = V * I или (3.3В – 0.6В) * 4мА = 0.011Вт. Я выбрал 0.25Вт, как как это было наименьшее значение из предложенных резисторов в магазине Чип и Дип.
R3 ограничивает ток, проходящий через ИК-светодиод. Питание светодиода будет осуществляться от разъёма GPIO 5V, который напрямую подключён к питанию USB 5В. Это означает, что максимальный ток, который вы можете получить от разъёма 5V, будет максимальный ток источника питания за вычетом тока, который потребляет сама RPi.
Прямое напряжение (forward voltage) TSAL6200 составляет 1.35В и на нашем транзисторе будет незначительное падение напряжения (Collector-Emitter Saturation Voltage) от “коллектора” к “эмиттеру” в 0.3В (согласно даташиту). Тогда значение для R3 рассчитываем так: (5В – 1.35В – 0.3В) / 100мА = 33.5Ом. Ближайшее значение резистора CF-25 было 36Ом, что соответствует 93мА.
Наконец, нам нужно рассчитать мощность R3. Формула мощности P = V * I или (5В – 1.35В – 0.3В) * 93мА = 0,312Вт. Это означает, что нам нужен резистор 1/2 Вт для R3. Но так как это мощность при постоянном включении ИК-светодиода, мы можем пренебречь этим значением. На практике ИК-светодиоды работают доли секунды с пульсацией в 38кГц, поэтому вы подаёте напряжение только ограниченное время, а не постоянно. Значит для R3 можно использовать резистор меньшей мощности в 0.25Вт, а не 0.5Вт.
Итак, паяем мини-плату и затем места входа проводов укрепляем термоклеем. Саму мини-плату также приклеиваем к крышке корпуса RPi с помощью термоклея.
Жёлтый провод соединяем с выходом GPIO 23, синий провод с GROUND, а фиолетовый спаиваем с катодом на ИК-светодиоде, предварительно установив термоусадку. Катод на светодиоде это самый короткий контакт.
Согласно даташиту, температура пайки (soldering temperature) не должна превышать 260 градусов Цельсия с течение 5 секунд. Анод ИК-светодиода спаиваем с проводом (предварительно установив термоусадку), который в свою очередь соединяем с выходом 5V на RPi. Далее, устанавливаем термоусадку на место пайки, берём паяльный фен, выставляем температуру около 120 градусов и сажаем термоусадку.
В боковой решётке моего корпуса RPi я просверлил отверстие в 5мм, вставил туда ИК-светодиод, а с обратной стороны закрепил его термоклеем.
Все, сборка “железа” закончена, можно приступать к программной части.
Шаг 2 : Настройка LIRC для работы с ИК-светодиодом
На данном этапе вы уже должны иметь коды кнопок используемых пультов, и они должны быть прописаны в конфигурации LIRC. Как это сделать можно прочитать в инструкции “Управление громкостью на Raspberry Pi c ИК-пульта дистанционного управления”. Данная конфигурация LIRC выполнена для совместного использования ИК-приёмника и ИК-светодиода на RPi, причём каждый из них будет использовать отдельный lircd процесс, lirc-rx для ИК-приёмника и lirc-tx для ИК-светодиода.
Включаем RPi и заходим на неё через SSH.
Заходим в /boot/config.txt и задаём выход GPIO для ИК-светодиода:
sudo nano /boot/config.txt
В файле должно быть две строки, одна для ИК-приёмника и для ИК-светодиода:
dtoverlay=gpio-ir,gpio_pin=17 dtoverlay=gpio-ir-tx,gpio_pin=23
Создаем файл /etc/udev/rules.d/71-lirc.rules:
sudo nano /etc/udev/rules.d/71-lirc.rules
и вставляем в него следующие строки:
ACTION=="add", SUBSYSTEM=="lirc", DRIVERS=="gpio_ir_recv", SYMLINK+="lirc-rx" ACTION=="add", SUBSYSTEM=="lirc", DRIVERS=="gpio-ir-tx", SYMLINK+="lirc-tx" ACTION=="add", SUBSYSTEM=="lirc", DRIVERS=="pwm-ir-tx", SYMLINK+="lirc-tx"
Далее, открываем файл /etc/lirc/lirc_options.conf:
sudo nano /etc/lirc/lirc_options.conf
И меняем /div/lirc0 на /div/lirc-rx:
device = /dev/lirc-rx
Копируем lirc_options.conf в lirc_tx_options.conf:
sudo cp /etc/lirc/lirc_options.conf /etc/lirc/lirc_tx_options.conf
и открываем скопированный файл:
sudo nano /etc/lirc/lirc_tx_options.conf
и меняем следующие строки:
device = /dev/lirc-tx output = /var/run/lirc/lircd-tx pidfile = /var/run/lirc/lircd-tx.pid
Далее, создаём файл /etc/systemd/system/lircd-tx.service:
sudo nano /etc/systemd/system/lircd-tx.service
и вставляем в него содержимое из вывода команды:
systemctl cat lircd
Редактируем его, чтобы получилось вот так:
[Unit] Documentation=man:lircd(8) Documentation=http://lirc.org/html/configure.html Description=Second lircd, the transmitter Wants=lircd-setup.service After=network.target lircd-setup.service lircd.service [Service] Type=simple ExecStart=/usr/sbin/lircd --nodaemon --options-file /etc/lirc/lirc_tx_options.conf ; User=lirc ; Group=lirc ; Hardening opts, see systemd.exec(5). Doesn't add much unless ; not running as root. ; ; # Required for dropping privileges in --effective-user. ; CapabilityBoundingSet=CAP_SETEUID ; MemoryDenyWriteExecute=true ; NoNewPrivileges=true ; PrivateTmp=true ; ProtectHome=true ; ProtectSystem=full [Install] WantedBy=multi-user.target
Далее, создаём файл /etc/systemd/system/lircd-tx.socket:
sudo nano /etc/systemd/system/lircd-tx.socket
и вставляем в него содержимое из вывода команды:
systemctl cat lircd.socket
и редактируем его, чтобы получилось вот так:
[Socket] ListenStream=/run/lirc/lircd-tx [Install] WantedBy=sockets.target Also=lircd-tx.service
Перезапускаем конфигурацию менеджера systemd:
sudo systemctl daemon-reload
Запукаем процесс lirc-tx:
sudo systemctl start lircd-tx
Делаем загрузку lirc-tx при старте системы:
sudo systemctl enable lircd-tx
Далее, создаем файл /usr/local/bin/irsend:
sudo nano /usr/local/bin/irsend
и вставляем в него следующие строки:
#! /bin/sh exec /usr/bin/irsend --device=/var/run/lirc/lircd-tx "$@"
Сохраняем файл и делаем его исполняемым:
sudo chmod +x . /usr/local/bin/irsend
Для надёжности перезапустим RPi:
sudo reboot
Далее, заходим в RPi через SSH и пробуем отправить сигнал с ИК-светодиода для включения, например, телевизора:
irsend --count=2 SEND_ONCE sony_tv KEY_POWER
Телевизор должен включиться.
В моем случае, чтобы включить телевизор мне нужно непрерывно отправить сигнал 2-а раза, за это отвечает параметр —count=2. В вашем случае это может не потребоваться.
Для того, чтобы убедиться, что ваш ИК-светодиод действительно испускает инфракрасное излучение, можно сделать так. Откройте фотокамеру на вашем смартфоне и наведите её на светодиод, в этот же момент запустите с терминала вышеприведённую команду и вы должны увидеть короткое свечение светодиода на экране смартфона. Если этого не происходит, нужно смотреть логи LIRC, а также проверить схему подключения.
Шаг 3 : Интеграция ИК-светодиода с голосовым управлением Алексой
Настраивать данный функционал будем через цепочку: Алекса – сервис IFTTT – веб-сервер Apache c PHP на RPi – выполнение терминальной команды через shell_exec.
Также у вас должен быть фиксированный IP-адрес вашего роутера и проброшены порты 80 или 443 на локальный IP-адрес вашей RPi.
Устанавливаем Apache и PHP:
sudo apt install apache2 && sudo apt install php libapache2-mod-php
В папке /var/www/html/ вашего веб-сервера создаём файл home_control.php и вставляем в него следующий код:
<?php if (isset($_POST['code'])) $code = $_POST['code']; else $code = ""; $code_sony_tv = "WVO4RZRi"; $cmd_sony_tv = "irsend SEND_ONCE sony_tv KEY_POWER"; if ($code == $code_sony_tv) shell_exec($cmd_sony_tv); ?>
Данный код является демонстрационным и не учитывает безопасность ваших активационных кодов на сервере. Для большей безопасности вы можете сложить hash-значения ваших кодов в базу данных и брать их оттуда для сравнения.
Далее, регистрируемся на сервисе IFTTT и создаём личный апплет (Personal Applet). В поле Trigger выбираем Amazon Alexa, в поле ниже выбираем Say a specific phrase. В поле Value блока What phrase? вводим tv on. Активационная фраза на Алексе будет тогда звучать так: «Alexa, trigger tv on».
Затем в блоке Actions, выбираем Webhooks и в поле ниже выбираем Make a web request. В поле Value блока URL вводим URL-адрес (вместо доменного имени можно использовать IP-адрес роутера) до вашего PHP-скрипта на RPi.
Затем в блоке Method в выпадающем меню Value выбираем POST, а в следующем блоке Content Type выбираем application/x-www-form-urlencoded.
В последнем блоке Body в поле Value указываем активационный код, который будет передаваться PHP-скрипту. В Applet title и Applet description можно указать также – tv on.
Сохраняем данный апплет и активируем его.
После этого, проверяем работоспособность через голосового помощника с Алексой. Если все сделано правильно, после активационной фразы Алекса включит ваш телевизор! Аналогичный апплет можно сделать на отключение телевизора и назначить фразу на выключение — tv off.
Единственный минус такого управления в том, что код кнопки пульта на включение/выключение один и тот же и система не знает состояние вашего телевизора в данный момент. Поэтому, если телевизор будет выключенным и вы спросите Алексу: «Alexa, trigger tv off», он наоборот включится. Но я думаю, что удобство управления вашими девайсами в доме с помощью голоса перекроют данный минус.
Понравилась инструкция? Тогда поделитесь ей со своими друзьями или попробуйте написать свою собственную!