Товары из Китая

ESP32 декодирует команды от ИК пульта и управляет KODI JSON запросами


ESP32 декодирует команды от ИК пульта и управляет KODI JSON запросами

Описание проблемы

Я смотрю фильмы на большом ЖК телевизоре. Информация подается через HDMI кабель c компьютера, который домашние называют «сервер». Это строго говоря не сервер, а более-менее стандартный компьютер под управлением Windows 10, с большими дисками для хранения общесемейной информации, в том числе – фильмов, оптимизированный под минимальный акустический шум.

Для воспроизведения фильмов используется программа KODI (Open Source Home Theater Software).

Обычный сценарий использования KODI таков: программируемым ИК пультом телевизор переключается в режим HDMI входа, затем в руки берется Bluetooth пульт и им включается нужный медиа-файл на воспроизведение. Фото пульта показано на рис. 1.

ESP32 декодирует команды от ИК пульта и управляет KODI JSON запросами

Рис 1. Mini wireless touchpad and keyboard

Пульт может работать в двух режимах: как тачпад и как клавиатура. Питается пульт от литиевого аккумулятора, который требует зарядки примерно раз в месяц.

Чаще всего выполняемая операция на таком пульте – пауза и отмена паузы, обычно для ответа на звонок телефона или на поговорить с домашними. В моем случае есть еще одна проблема – верхние соседи делают ремонт в режиме «до основания и затем» и внезапный грохот отбойника над головой сильно мешает восприятию фильма.

Bluetooth пультом надо выполнить несколько операций: нажать кнопку для активации и повозить пальцем по тачпаду. Использовать надо обе руки — одной держать его, второй управлять.

Рядом так же лежит ИК программируемый пульт, купленный в Ашане за небольшие деньги и оказавшийся вполне вменяемым и удобным. Марка пульта GAL LM-S005L. Возможности пульта стандартны: он имеет 8 наборов команд, каждый из которых может быть либо закодирован на выполнение стандартного набора кодов конкретного устройства из списка, либо запомнить команду родного пульта и присвоить ее какой-либо кнопке. Есть кнопка DIY, которая позволяет создать макрокоманду. Есть ограничение по суммарному количеству программируемых кнопок, я с этим ограничением не столкнулся. Внешний вид пульта показан на рис.2.

ESP32 декодирует команды от ИК пульта и управляет KODI JSON запросами

Рис 2. Программируемый пульт GAL LM-S005L

Постановка задачи

Подавать команды KODI таким пультом было бы здорово – нажать одну кнопку удобнее операций с тачпадом.

Изучение проблемы

Поиск информации по управлению KODI показал, что управлять KODI можно добавив в систему ИК приемник с драйвером и набор программ, реагирующих на данные от ИК приемника и транслирующих их в KODI.

USB ИК приемник я нашел на балконе, он оказался рабочим. Однако при попытке установить его на сервер оказалось, что драйверов для 64 бит Windows 10 машины нет. Быстрый поиск по магазинам и Авито показал, что купить ИК приемник невозможно – их нет в продаже от слова совсем.

Этот путь оказался тупиковым.

Есть еще один путь внешнего управления KODI: это JSON команды по адресу KODI WWW сервера.

В моем случае KODI WWW server уже был настроен, что позволяло с любой домашней машины заходить на этот сервер и управлять KODI.

Среди JSON команд есть команды «Пауза», «Стоп», «Следующий файл», «Предыдущий файл».

Подробное описание JSON команд тут https://kodi.wiki/view/JSON-RPC_API/v12

Техническое задание

Требуется сделать устройство, способное принимать ИК команды и вырабатывать JSON посылки для KODI.

Выполнение ТЗ

Для определения частоты несущей команд от ИК пульта я воспользовался самодельным прибором, способным измерить параметры ИК потока и показать спектр измеренного сигнала. Мой пульт излучает на частоте 38 КГц. Фото экрана показано на рис 3.

ESP32 декодирует команды от ИК пульта и управляет KODI JSON запросами

Рис 3. Фото экрана прибора с отображением FFT для определения несущей пульта

Для приема ИК команд нужен модуль приема ИК команд. Такие модули выпускаются Vishay, например, TSOP1738 или TL1838 от HK Shanhai Group.

ИК приемника у меня не было в тот момент. Впоследствии оказалось, что таки был! Купил года четыре назад в Чипе и Дипе для одного из своих проектов, но применил в итоге другое решение и напрочь забыл о купленном. Плюшкин, да :).

Ехать в Чип не хотелось, поэтому я вырезал Дремелем ИК приемник вместе с обвязкой из неисправного DVB-С/T2 приемника. Рассмотрев устройство под микроскопом, я считал его название и нашел мануал. Тип ИК приемника TL1838. То, что надо на 38 Кгц. Обвязка приемника была сделана не совсем по мануалу, отсутствовал резистор фильтра по питанию номиналом 51 Ом. Его я припаял прямо на разъем, в свою очередь прикрепленный к вырезанной платке. Фото получившегося безобразия представлено на рис 4.

ESP32 декодирует команды от ИК пульта и управляет KODI JSON запросами

Рис 4. Приемник ИК излучения TL1838 с обвязкой

Модули ESP8266 и ESP32 уже имелись, были куплены на Али давно.

Для приема и расшифровки команд от ИК пультов я использовал библиотеку IRRemoteEsp8266 из репозитория Arduino.

Схему подключения не привожу из-за очевидной простоты, ИК приемник был подключен тремя проводами в соответствии с указаниями в использованной программе для обработки ИК команд. Выход приемника подключен на вывод D15 ESP32 (он же GPIO15), расположенный рядом с выводами +3.3 вольта и общий, для питания приемника.

Эксперименты с ESP32 и ESP8266 показали, что ESP32 работает с данной программой лучше. ESP32 и был использован.

Запустив демо из выше упомянутой библиотеки (IRreceivedemo) я обнаружил, что программируемый пульт генерирует команды несколько своеобразно. Так, некоторые команды декодируются по-разному при каждом нажатии кнопки: Например, при нажатии кнопки пульта STOP будет принята 32-х битная посылка, в которой младшая группа будет всегда одинакова (0x273F), а старшая меняются между 0x0000 и 0x0001 строго через раз. Т.е. первое нажатие даст код 0x0000273F, а второе 0x0001273F и т.д.

Некоторые клавиши генерируют код команды (всегда один и тот же), но дополнительно сопровождают их некоторым количеством (4-5) посылок типа 0xFFFFFFFF. Т.е. на одно нажатие прилетает много команд.

Эти глюки отсутствует при использовании родного пульта от ТВ, который был использован для обучения.

Я попробовал переобучить пульт, но успеха не достиг – клавиши с повторами так и остались с ними, клавиши, генерирующие два кода через раз, тоже остались.

Предположительно, глюки в программе распознавания иили генерации посылок в программируемом пульте.

К счастью, младшая группа всегда давала один и тот же результат, и я остановился на выделении этой младшей группы и дальнейшем ее использовании в группе операторов IF.

Я использовал эту программу IRreceivedemo в качестве основы для своей. Я добавил модуль обработки принятого кода и подпрограмму kodi.

Модуль обработки принятого IR кода выделяет постоянную часть и проверяет его на принадлежность к одному их правильных кодов. Если обнаружен один из кодов управления KODI, то происходит вызов подпрограммы kodi.

В подпрограмме kodi формируется нужная JSON строка, открывается канал к серверу, посылается запрос и ожидается ответ от сервера.

В процессе отладки обнаружилось, что записать в переменную типа String JSON запрос, в котором внутри используются двойные кавычки " невозможно. Компилятор преобразует такую строку в число.

Исправил ситуацию заменой двойных кавычек на одинарные в тексте запроса и выполняя затем контекстную замену символа одинарной кавычки на двойную.

Это делалось в процессе отладки сбоящей программы. Сервер возвращал ответ «ошибка 415», которая означает, что он меня не понял.

Поначалу я думал, что проблема в одинарных кавычках, поэтому и применил замену одинарных кавычек на двойные.

Проблема же оказалась в неверном заголовке посылки: надо «Content-Type», «application/json», а у меня было «text/json».

Проверять, работает ли JSON запрос с одинарными кавычками мне было лень и я оставил программу as is.

Делать корпус для устройства я не стал, просто повесил ESP32 c ИК приемником коротким кабелем на ресивер от МТС, благо в нем 2 USB порта. Железяка подключенный ESP32 не распознала и просто подает +5 вольт на него, что мне и было надо. Внешний вид готового устройства, подключенного к ресиверу МТС, показан на рис. 5

ESP32 декодирует команды от ИК пульта и управляет KODI JSON запросами

Рис 5. Генератор JSON команд, подключенный к МТС ресиверу.

Через несколько дней эксплуатации устройства мне пришла в голову очередная мысль для неувеличения энтропии Вселенной 🙂

У меня дома использованы выключатели Livolo для управления светом. Эти выключатели могут управляться сенсорной панелью и дистанционно радиокомандой на частоте 433 МГц. Для дистанционного управления имеется родной пультик от Livolo, а также модуль на Ардуино Нано, который управляет передатчиком на частоте 433 МГц и умеет генерировать команды для всех выключателей в квартире. Ардуино Нано подключен к безвентиляторной управляющей машине, на которой поднят IIS, который умеет принимать команды по HTTP и транслировать их в команды в Ардуино Нано, а тот уже генерирует радиокоманды, которыми управляются выключатели Livolo. Идея заключалась в добавлении дополнительной функциональности для управления светом от ИК пульта. Т.е. если хочется спать – то можно остановить проигрывание медиа в KODI, выключить телевизор и выключить свет как в комнате, так и вообще везде и сделать это все нажатием трех кнопок на ИК пульте.

Для реализации этой функциональности я добавил распознавание еще четырех кнопок ИК пульта: красной, зеленой, желтой и синей. По нажатию одной из этих кнопок управление передается подпрограмме svet(). Эта подпрограмма выполняет вызов соответствующего URL, что и приводит к изменению состояния соответствующего выключателя.

Заключение

Поставленная задача «управлять KODI» ИК пультом выполнена, команды отрабатываются беспроблемно, пользоваться пультом удобнее, чем тачпадом. Попутно реализована дополнительная функциональность управления светом.

Программу можно скачать здесь https://github.com/Winnie0The0Pooh/ESP32_IR_to_KODI_JSON/


СМОТРИ ТАКЖЕ

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *