Возвращаем пульт к "жизни"
Всем привет. История такова: в 2014 году купили телевизор, уже через 2 года пульт перестал работать. Разобрал, почистил, собрал - результата 0. Еще попробовал найти пульт в приложении Mi Remote, но увы - его там не было. Отложил до лучших времен - и вот, время настало. С помощью камеры смартфона увидел, что при нажатии любой кнопки пульта ИК светодиод загорается и горит все время. Решил проверить какие посылки отправляет пульт при этом. Результат удивил - команд куча, все разные, при чем даже адрес разный. Большинство пультов работает на NEC протоколе, как оказалось и этот тоже. Мне очень повезло(как я сперва подумал), так как на обратной стороне платы пульта были расписаны коды каждой кнопки (в шестнадцатеричном формате) и даже сам адрес - фото ниже.
Нашел программу для смартфона, куда можно импортировать свои команды (irplus remote).
Затем нашел инструкцию как это сделать: https://irplus-remote.github.io/#learning
Нам понадобится пример LIRC файла с командами и временными интервалами отсюда: http://lirc.sourceforge.net/remotes/
Пример файла для пульта от телевизора LG:
name LG_AKB69680403
bits 16
flags SPACE_ENC|CONST_LENGTH
eps 30
aeps 100
header 9044 4436
one 606 1632
zero 606 517
ptrail 598
repeat 9029 2210
pre_data_bits 16
pre_data 0x20DF
gap 107878
toggle_bit_mask 0x0
begin codes
input 0xD02F
energy_saving 0xA956
KEY_POWER 0x10EF
tvradio 0x0FF0
av_mode 0x0CF3
pre_data - это адрес, для моего пульта он будет таким: 0x00BF (как я думал).
Затем переходим по ссылке, где расположен удобный конвертер, который преобразует LIRC в выходной xml файл для приложения: https://irplus-remote.github.io/converter/lirc.html
Команда включения - выключения на моем пульте имеет формат 03 в шестнадцатеричном виде (см. фото выше). Но как можно увидеть выше, количество битов, передающихся после адреса равно 16 (вторая строка примера LIRC файла). В описании NEC протокола указано, что после передачи команды (8 бит) за ней должна идти та же команда, но полностью инверсная, получаем команду вида 0x03FC. Выходит сначала передаем 16 бит адреса, затем 16 бит команды.
Попробовал прописать кнопку включения, конвертировал LIRC в xml, вот что получилось:
<irplus>
<device manufacturer="MANUFACTURER" model="MODEL" columns="12" format="WINLIRC_SPACEENC" bits="16" pre-bits="16" toggle-bit-pos="0" gap-pulse="598" gap-space="107878" one-pulse="606" one-space="1632" zero-pulse="606" zero-space="517" header-pulse="9044" header-space="4436">
<button label="" alt="POWER" span="4">0x00BF 0x03FC</button>
</device>
</irplus>
Сохранил на компьютере с расширением .xml , скормил файл приложению. Попробовал включить телевизор - но эффекта 0. Полез искать даташит на микруху, которая стоит на плате пульта. Нашел, но только на китайском. Нашел аналог моего пульта в интернет магазине, в описании была указана другая микруха, но адрес и команда включения совпадали. Нашел даташит на эту микруху, давай читать. Обратил внимание всего на одну строчку: Codes are transmitted from the LSB - передача начинается с МЛАДШЕГО бита. Значит нашу команду в двоичном виде нужно перевернуть вверх ногами. 03 - 00000011 в двоичном виде, первые 4 нуля - это старшие биты, то есть после переворачивания должно получится 11000000 - 0xC0. Добавим еще инверсную часть команды и получим 0xC03F. Данную процедуру проделываем для остальных команд аналогично. Тоже самое проделываем с адресом - получаем адрес 0x00FD.
После того, как все команды записаны, конвертируем LIRC в XML и кормим xml приложению. Проверил - все кнопки рабочие. Результат: