Сначала расскажу, как организована связь между устройствами в моём варианте умного дома. Все устройства соединены в одну сеть по UART. Некоторые через преобразователи интерфейса UART-RS485, а некоторые через удлинитель интерфейса по радиоканалу. В общую линию данных достаточно послать команду, начинающуюся с адреса устройства, и она будет выполнена.
Можно было использовать ESP32 или Raspberry Pi в качестве шлюза, но хотелось сделать максимально простое устройство без подключения к интернету и сторонних сервисов.
У Яндекса есть обучаемый инфракрасный пульт, связанный с Алисой. Он может запоминать команды любого инфракрасного пульта управления и воспроизводить эти команды по запросу от Алисы. Сейчас у них есть уже три версии ИК-пульта. В моей статье речь идёт именно про старый пульт YNDX‑0006.
Исходя из этого я разработал простое устройство, которое может обучать пульт от Яндекса и передавать в общую сеть необходимые команды, при получении сигнала от пульта.

В моём случае плата питается от 9 В, которые понижаются LDO-стабилизатором до 5 В. Микроконтроллер использовал Atmega48, в 2017 году он стоил копейки и для моей задачи подходил с запасом. Кварцевый резонатор подобран специально для работы UART, чтобы не было погрешности в таймингах при передаче данных.
Светодиод HL1 - инфракрасный светодиод, для передачи данных на пульт Алисы. Он подключен на выход таймера, для генерации ШИМ-сигнала. Приёмопередатчик интерфейса RS485 взял ST485EB. Он полудуплексный, что облегчает написание кода.
В качестве приёмника инфракрасного сигнала использовал TSOP4838. Он и ему подобные приёмники воспринимают только переменный инфракрасный сигнал, обычно в районе 38 кГц, для устранения паразитных засветок, например от солнечного света. В пульте от Яндекса стоит подобный приёмник, поэтому и данные на него передаются с помощью ШИМ-сигнала.
Плату изготовил одностороннюю. А так как задачи экономить место не стояло, все резисторы и конденсаторы подобраны в удобных для пайки корпусах.


К сожалению, с шелкографией у меня периодически бывают проблемы и не все надписи нормально закрепились на плате.
Описание работы устройства.
Контроллер всё время находится в спящем режиме и ожидает входящие команды по UART или передачу данных по ИК-каналу от пульта.
Приём байтов от приёмопередатчика происходит прямо в прерывании UART и игнорирует пакеты меньше четырёх байт, удаляя их по превышению межбайтового интервала. Как только получены все четыре байта команды через UART, приёмопередатчик переводится в режим передачи данных и отвечает в соответствии с принятой командой. Если команда предназначается не ему, то она игнорируется.
Я намеренно не стал добавлять проверку контрольной суммы пакета данных. Было интересно посмотреть много ли будет потеряно пакетов, при работе кучи устройств в общей сети. Но с 2017 года каких-то заметных проблем так и не выявил.
Микроконтроллер Atmega48 обладает маленьким EEPROM на 256 байт, но в моём случае туда можно записать до 63 команд по четыре байта. Этот объём легко расширить, если использовать внешнюю микросхему памяти.
Для быстроты общения с пультом по ИК-каналу от него передаётся только номер команды для воспроизведения, то есть всего один байт данных. Для исключения ложных срабатываний я дополнил этот байт его инверсией. При получении сигнала от ИК-приёмника эти байты сравниваются и, если совпали, программа воспроизводит по UART ранее записанную в память команду.
В коде заложены следующие команды, принятые по UART: пинг устройства, смена собственного адреса, воспроизведения команды из памяти, обучения ИК-пульта и запись следующей команды по UART в память.
Данные для обучения пульта передаются с помощью ШИМ-сигнала на инфракрасный светодиод. ШИМ таймера 0 настроен на частоту 28,8 кГц с заполнением 50%. Это максимальная частота ШИМ для данной конфигурации микроконтроллера.
Для корректной работы устройства и гарантированного обучения ИК-пульта, их лучше расположить на расстоянии 15-30 см друг от друга.
По итогу вся связка работает следующим образом: Я даю команду Алисе «Включи свет на кухне». Станция отправляет команду на ИК-пульт. Пульт передаёт номер команды по инфракрасному каналу связи. Моя плата ловит этот сигнал, расшифровывает номер команды и отправляет пакет данных по UART в общую сеть. Устройство с нужным адресом выполняет требуемое действие.
Проблемы с пультом Яндекса.
И если с моей платой проблем не возникло, то с ИК-пультом от Яндекса пришлось повозиться. Я не знаю какой конкретно ИК-приёмник стоял на плате пульта YNDX‑0006, но он явно работал некорректно. И у меня ушло много времени, чтобы это понять, потому что некоторые байты данных от моей платы пульт запоминал и воспроизводил хорошо, а некоторые нет. Например, байты 0x11 и 0x13 обрабатывались без ошибок, а байты 0x14, 0x15 не работали ни в какую. Возможно чувствительность ИК-приёмника TSOP4838 выше, и он нормально воспринимает ШИМ с частотой 28,8 кГц.
В итоге пришлось вскрывать корпус пульта и смотреть, что именно идёт не по плану.

На рисунке выше представлена передача байта и его инвертированной копии 0х11 (слева) и 0х15 (справа). Красный график – сигнал на ИК-светодиоде (ШИМ с частотой 28,8 кГц). Синий график – сигнал на ИК-приёмнике. Тут в качестве ИК-приёмника использован TSOP4838. Видно, что все биты передаются корректно и ошибки отсутствуют.
ИК-приёмник на плате пульта YNDX‑0006 байт 0х11 воспринимал без ошибок, а вот байт 0х15 с ошибками. Ниже представлены осциллограммы с примерами ошибок в передаче.


Видно, что приёмник пропускает некоторые биты и передаёт обратно на мою плату искажённый сигнал, который она не понимает. Пришлось заменить ИК-приёмник на рабочий и проблема исчезла. Так что, если у кого-то этот ИК-пульт YNDX‑0006 работает некорректно, то возможно причина именно в ИК-приёмнике.
Заключение.
В итоге получилось вполне работоспособная связка с Яндекс-станцией на древних ИК-технологиях. Работает без сбоев уже почти 10 лет и сильно облегчает жизнь, когда не надо бежать через всю квартиру до выключателя, а достаточно попросить Алису выключить свет.
safari2012
Я эту шайбу Алисовскую года два назад купил, полгода работала, как надо. Потом начала глючить, терять сеть, терять Алису, терять питание. Сдал по гарантии, взамен купил broadlink rm4 mini. Вот уже полтора года работает, как часы, с УДЯ дружит.