Анализатор пультов (IR сигналов)

Как было сказано на одном сайте «вместо дорогого устройства управления можно купить недорогой контроллер, который будет управлять кондиционером, достаточно знать систему команд»

Самое простое решение, записать нужные сигналы и транслировать их контроллером. Обычно это работает, но может глючить, так пульт выдает не идеальный сигнал, приемник так же имеет погрешность. В результате «паспортный» сигнал в 560мкс на деле колеблется от 500 до 600, а будучи ретранслирован, погрешность увеличится и не факт что устройство распознает команду.

Это можно решить, записав сигнал раз 10, вычислить по среднему, и полученный «выровненный» отправлять контроллером не один, а три раза подряд.

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

Скачать IR-decoder.ino

Для работы с пультами сделал декодер. Работает под ESP транслируя результаты в браузер, где их намного удобнее изучать.

Аппаратная часть элементарна, голая ESP с подключенным на цифровой вход IR приемником. Примерно так:

Настройка скетча элементарная:

const char *ssid = "CCCP";
const char *password = "";
IPAddress ip(192, 168, 88, 55);
IPAddress gateway(192, 168, 88, 1);
IPAddress subnet(255, 255, 255, 0);
#define IRpin 14 //Номер входа (у меня D5)

Меняете сетевые настройки, указываете пин куда подключен приемник, запускаете, открываете в браузере тот IP который указали в скетче, и ничего не меняя, отправляете пультом сигнал на подключенный к контроллеру ИК приемник.

Скрипт сам распознает формат передачи данных, отличая распространенный NECовский от старого RC5, автоматом определяет значения соответствующие единицам, нулям, и пропускам-разделителям, при этом с каждым нажатием на пульт «обучается» выравнивая средний этих показателей.

Переключаете опцию Show: с RAW DATA на BIN CODE, и снова нажав кнопку на пульте, получаете вот такую картинку, при этом если дважды на пульте нажали «+», а данные не изменились, значит пульт «тупой» и никаких настроек внутри себя не хранит.

Такой пульт нет смысла анализировать, переключаете Show в режим «C++ array» и можно смело копипастить в свой скетч.

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

Если попался пульт работающий на CR5 то картинка будет немного иная. И все вышеописанные 3 шага будут выглядеть вот так:

Единственный в наличие у меня пульт, работающий по CR5 — это пульт от старого кассетного магнитофона Sony. Сигнал он отправляет повторяя от 4 до 10 раз, поэтому в скетче придется либо в цикл поставить отправку, либо раскопипастить значения массива. Проверить не могу, так как магнитофон давно выброшен.

Если автоматический режим распознавания протокола и сигналов не справился с задачей, можно MODE переключить в режиме MANUAL и вручную выставлять параметры для анализа. С протоколом понятно. DigitalSignal задает где «живут данные» UP в сигналах, DOWN в затуханиях, Separator это время разделителя сигнала, One это время единицы, Zero соответственно нуля. Время понятное дело в микросекундах.

Важный момент: если пробуете анализировать разные пульты, то при каждой смене пульта в автоматическом режиме анализа нужно нажать кнопочку «RESET» чтобы в нули слетели все ранее проанализированные автоматом параметры.

Умные пульты

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

Нажав 4 раза подряд кнопку «вкл-выкл» в бинарном режиме видим изменения данных:

То есть в моем случае включение — это единица на 20-ом бите, и её зеркальное значение в виде нуля на 28ом, при выключении, картина обратная, 20-ый зануляется, 28ой единица.

Если присмотреться, то в приведенном примере 48 бит информации на самом деле 3 пакета по 8 бит, после каждого из которых идет инверсия его самого. Это нормальная практика и это менее ресурсоёмко, нежели сначала пульту формировать контрольную сумму, а потом устройству её проверять, хотя теоретически могут попасться пульты с контрольной суммой, и там придется «взламывать» её алгоритм.

С «вкл-выкл» всё просто, переходим к варианту температуры, подняв пультом последовательно температуру с 18 до 30 градусов, получаем следующую картинку:

Видно что температура задается 16-19 и 24-27 битами. При этом на 16-19ом очевидно указаны значения от 1 до 13 в двоичной системе.

Чтобы выставить 25С, нужно в десятичном из 25 вычесть базовые 17, и полученные 1000 биты записать в 16-19 как «0001», не забыв их инверсию записать в 24-27ой как «1110».

Надеюсь кому-нибудь будет полезно 🙂

UPD. Пример скетча, написанного на основе данных.

Дисклеймер!

  1. Штука представлена as is и не гарантирует 100% работоспособности, особенно учитывая, что для тестов у меня было всего 3 пульта;
  2. Претензии и стебалова мегасишников по части кода не принимаются, так как C++ исторически не родной для меня язык, да и писалось не для конкурса красоты С++шного кода;
  3. Без интернета на компьютере где открыт браузер работать не будет, так как используется библиотека jquery запрашиваемая с хранилища google.