Сначала расскажу, как организована связь между устройствами в моём варианте умного дома. Все устройства соединены в одну сеть по 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 лет и сильно облегчает жизнь, когда не надо бежать через всю квартиру до выключателя, а достаточно попросить Алису выключить свет.
ссылка на оригинал статьи https://habr.com/ru/articles/1061072/