"ИК-пульт волшебная палочка 20-го века".

Пролог

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

Молодому археологу может даже не сразу станет понятно, что это и зачем. Однако можно провести серию простых физических экспериментов. Например, если направить стекляшку себе в глаз и начать нажимать на разные кнопки, то вы ничего не увидите. Однако, если между глазом и артефактом установить мобильный телефон с включенной камерой, то камера запишет вспышки загадочного фиолетового сияния. Обыкновенный листок бумаги полностью преграждает путь пучку. Из этого можно заключить, что брусок источает какие-то загадочные лучи. Им можно даже дать временное название "пультовые лучи". Если между источником и камерой установить поляризатор, то лучи проходят через любой угол поляризатора. Лучи не отклоняются в окрестностях постоянного магнита. Если между камерой телефона и фиолетовой ампулой установить дифракционную решетку, то можно обнаружить, как пультовые лучи множатся на экране ПЗС матрицы смартфона.

Все эти наблюдения позволяют сделать вывод, что загадочное пультовое лучи - это не что иное как электромагнитное излучение. А по расстоянию между максимумами после дифракционной решётки можно заключить, что излучение это в инфракрасном спектре электромагнитных волн.

Продолжая тщательные исследования в выбранном направлении можно попробовать принять это ИК излучение чувствительным к свету P-N переходом IR-приемника и проанализировать сигнал под увеличением во временной области на экране осциллографа. Тогда при каждом воздействии на устройство мы обнаружим поезд из тридцати четырех импульсов разного заполнения.

Очевидно, что древняя цивилизация оставила нам какое-то зашифрованное сообщение. Наша задача расшифровать канувший в лету реликтовый алфавит. И понять, в конце концов, какой же со всего этого может быть для нас овёс?

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

Написать драйвер IR приёмника, который сможет обслуживать одновременно N IR-приемников. Использовать не более одного аппаратного таймера на микроконтроллере. В качестве пульта выступает Samsung BN59-01198R. Протокол IR Samsung

Аппаратная часть

Что надо из оборудования?

Наименование

Пояснение

Пульт Samsung BN59-01198R

Передатчик команд

IR приёмник TSOP22xx

Приемник сигнала

Микроконтроллер

Для разбора принятого сигнала

Макетная плата

Для соединения микроконтроллера и IR приёмника

Перемычки

Для соединения микроконтроллера макетной платы

Как можно заметить, на пульте 49 кнопок.

В качестве ИК приемника подойдет компонент семейства TSOP22. Это очень удобный модуль так как есть два отверстия для крепления на болтах. Плюс присутствует LED на проводе DATA, подтягивающий резистор и конденсатор на питании.

Внутри приемника TSOP22 уже есть целая система: фотодиод, усилитель с подстраиваемым коэффициентом усиления, полосовой фильтр, демодулятор, выход открытый коллектор.

Пульт испускает не просто пакет, а модулированный пакет на несущей частоте порядка 36kHz, однако модуль приёмника TSOP22 выдает уже сигнал снятый с модуляции.

Программная часть

Примем сигнала можно разбить на две фазы: Front-End и Back-End.

Фаза 1: ИК front-end

Суть Front-end обработки в том, чтобы получить сырой цифровой сигнал с приемника в виде массива структур, где в каждой ячейке будет тип события (положительный перепад напряжения или отрицательный перепад напряжения) и его временная отметка ( например в микросекундах). Временную отметку я получаю при помощи непрерывно работающего аппаратного 16-битного таймера, который считает до 160ms. При этом пакет, который мы хотим принять обладает длительностью не более 77 ms.

Тут стоит отметить, что фаза front-end обработки абсолютно одинаковая для всех типов ИК пультов и для любых IR протоколов. Со стороны микроконтроллера IR приёмник выглядит, как последовательность положительных и отрицательных перепадов напряжения на конкретном пине, разнесенных во времени. Можно хоть сигнал SPI, UART или I2C так записывать для последующей программной обработки.

Cырой сигнал от пульта BN59-01198R выглядит приблизительно так

+-----+------+--------+--------+
|  i  |event |  time  |  diff  |
+-----+------+--------+--------+
|   0 | Fall |   6837 |   6837 |
|   1 | Rise |  11277 |   4440 |
|   2 | Fall |  15813 |   4536 |
|   3 | Rise |  16341 |    528 |
|   4 | Fall |  18021 |   1680 |
|   5 | Rise |  18573 |    552 |
|   6 | Fall |  20250 |   1677 |
|   7 | Rise |  20853 |    603 |
|   8 | Fall |  22482 |   1629 |
|   9 | Rise |  23034 |    552 |
......
|  63 | Rise | 103560 |    501 |
|  64 | Fall | 105267 |   1707 |
|  65 | Rise | 105840 |    573 |
|  66 | Fall | 107520 |   1680 |
|  67 | Rise | 108072 |    552 |
+-----+------+--------+--------+

Входы front-end автомата предварительной обработки получаются такие.

Входы

1

поступил перепад с 0 в 3.3В

2

поступил перепад с 3.3В в 0

3

таймаут бездействия на проводе превысил 5ms

При срабатывании таймаута надо обнулить индекс ожизаемого события. При поступлении бита (нуля или единицы) его надо ассоциировать с up_time, записать по индексу в массив событий и увеличить на 1 счетчик (индекс) событий. В настройках экземпляра IR front-end есть параметр ожидаемого количества событий для данного конкретного IR протокола (например для Samsung это 68 событий). Как только МК обнаружил ожидаемое количество событий , сигнал передается на вторую фазу обработки: ИК back-end.

Фаза 2: ИК back-end

На фазе back-end уже производится выделения payload для конкретного протокола из того самого массива событий, который нам дает ИК- front end. Тут уже всё зависит от выбранного протокола, коих великое множество.

Прежде всего из сырого массива событий надо выделать биты. В случае с Samsung протоколом можно даже игнорировать события отрицательного перепада и сосредоточить своё внимание на событиях положительного перепада. Элементы пакета формируются по следующему правилу

время между положительными перепадами

событие

5000us < T

start

1730us < T < 5000us

1

1000us < T < 1730us

0

Как обычно, для синтаксического разбора IR сигнала воспользуемся конечным автоматом. В случае Samsung протокола есть четыре входа: принят бит 0, принят бит 1, принят start и счетчик битов досчитал до 32-х. Состояний только три: ожидание, обнаружена преамбула, выделение битов полезной нагрузки.

По сути надо принять именно 32битное число (dword) и только потом проверять его на валидность. Валидный пакет это когда принято два одинаковых адреса, код команды в прямом виде и в инверсном. В случае принятия валидного пакета можно мигнуть LED-ом на PCB. Это потом поможет для проверки дальнобойности IR связи. Вот так отличаются бинарные коды кнопки 1 от кнопки 9.

1 Start 11100000 11100000 00100000 11011111
9 Start 11100000 11100000 01110000 10001111

После обработки сигнала надо обнулить память принятого front-end сигнала, чтобы случайно не обработать повторно ту же самую команду.

В результате обратного инжиниринга удалось сформировать полный список всей системы команд, которые источает пульт BN59-01198R. Вот они перед вами.

-->isc
+----+------+------+--------------+
| N  |RevCm | Cmd  |    Button    |
+----+------+------+--------------+
|  1 | 0x06 | 0x60 |           Up |
|  2 | 0x08 | 0x10 |       Prog - |
|  3 | 0x0a | 0x50 |    back play |
|  4 | 0x10 | 0x08 |            4 |
|  5 | 0x12 | 0x48 | forward play |
|  6 | 0x14 | 0x28 |      PICTURE |
|  7 | 0x16 | 0x68 |        Enter |
|  8 | 0x1a | 0x58 |       return |
|  9 | 0x1d | 0xb8 |       sports |
| 10 | 0x20 | 0x04 |            1 |
| 11 | 0xa2 | 0x45 |     backPlay |
| 12 | 0x30 | 0x0c |            7 |
| 13 | 0x36 | 0x6c |            A |
| 14 | 0x28 | 0x14 |            B |
| 15 | 0x26 | 0x64 |            B |
| 16 | 0xa8 | 0x15 |            C |
| 17 | 0x68 | 0x16 |           D  |
| 18 | 0x40 | 0x02 |        Power |
| 19 | 0x46 | 0x62 |        Right |
| 20 | 0x48 | 0x12 |       Prog + |
| 21 | 0x50 | 0x0a |            6 |
| 22 | 0x52 | 0x4a |        pause |
| 23 | 0x58 | 0x1a |         Menu |
| 24 | 0x60 | 0x06 |            3 |
| 25 | 0x62 | 0x46 |         stop |
| 26 | 0x70 | 0x0e |            9 |
| 27 | 0x7c | 0x3e |     PIC SIZE |
| 28 | 0x80 | 0x01 |       source |
| 29 | 0x86 | 0x61 |         Down |
| 30 | 0x88 | 0x11 |            0 |
| 31 | 0x90 | 0x09 |            5 |
| 32 | 0x92 | 0x49 |       record |
| 33 | 0x9e | 0x79 |    smart hub |
| 34 | 0xa0 | 0x05 |            2 |
| 35 | 0xa4 | 0x25 |      AD/SUBT |
| 36 | 0xa6 | 0x65 |         Left |
| 37 | 0xb0 | 0x0d |            8 |
| 38 | 0xb4 | 0x2d |         Exit |
| 39 | 0xce | 0x73 |       SEARCH |
| 40 | 0xd0 | 0x0b |        Vol - |
| 41 | 0xd2 | 0x4b |        tools |
| 42 | 0xd6 | 0x6b |      ch list |
| 43 | 0xe0 | 0x07 |        Vol + |
| 44 | 0xe2 | 0x47 |         play |
| 45 | 0xf0 | 0x0f |         mute |
| 46 | 0xf2 | 0x4f |        guide |
| 47 | 0xf5 | 0xaf |        EXTRA |
| 48 | 0xf8 | 0x1f |         info |
| 49 | 0xfc | 0x3f |       MANUAL |
| 50 | 0xc8 | 0x13 |       PRE-CH |
| 51 | 0x34 | 0x2c |      TTX/MIX |
+----+------+------+--------------+

Формально можно добавить и другие команды, например для кондиционера или светильников. Микроконтроллерная прошивка успешно принимает и узнает сигналы с пульта и декодирует их.

Уличные эксперименты показали, что IR сигнал от пульта проходит на расстоянии до двадцати трех - двадцати пяти шагов (около 12 метров).

Недостатки IR Samsung протокола и пульта в целом

1--Если одновременно нажать две кнопки, то пульт ничего не будет отправлять
2--Между кнопками со временем накапливается грязь
3--В пакете нет номера пакета. Если пакет потеряется, то приемник про это не узнает.
4--Связь только в одну сторону. Нет контроля передачи команды.
5--Нельзя задать адрес пульта. Он всегда посылает свой постоянный адрес 0x07.
6--В пакете нет контрольной суммы.
7--Нет шифрования
8--Нет адреса получателя.
9--Так как все пульты работают на одной несущей 36kHz, то не получится одновременно управлять сразу двумя пультами. Один пульт будет просто глушить сигналы второго. Если вы захотите, условно, устроить гоночный турнир по дистанционно управляемым машинкам с ИК управлением, то в IR эфире наступит такая какофония, что ни одна машинка не получит свой командный сигнал на фоне тотального шума. Всё встанет.

Достоинства IR Samsung протокола

1++Есть элементы контроля приема. Команда передается как в бинарном коде так и в инвертированном. Адрес отправителя передается два раза.
2++Простота реализации как передатчика так и приемника.
3++Дешевизна в реализации беспроводной связи
4++Работает пере-отражение сигнала от стен и потолка. В помещении не нужна прямая видимость

Идеи проектов с инфракрасным управлением

1++Клавиатура с IR передатчиком.
2++Игрушечные машинки с управлением по IR командам с обыкновенного TV пульта.
3++Управление кондиционером.
4++Управление столом с подъёмной столешницей.
5++Управление светильниками.
6++Поиск потерянных предметов по брелоку с IR приёмником и звуко-излучателем.
7++Можно установить IR приемник в audio jack и распознавать IR пакет аудиокодеком.
8++Можно сделать глушилку ИК сигналов. Просто непрерывно посылать DWORD 0x55555555 во все стороны. Прийти в кафе. Включить свой любимый канал и активировать ИК глушилку.

Итог

Удалось научиться декодировать сигнал с ИК пульта. Это позволяет использовать существующую инфраструктуру для управления микроконтроллерными прошивками без необходимости покупать вспомогательное оборудование.

Словарь

Акроним

Расшифровка

IR (ИК)

infrared

DWORD

Double Word

TV

TeleVision

LSB

least significant bit

MSB

most significant bit

Ссылки

Вопросы
--Как доказать, что TV пульт излучает именно инфракрасный (ИК) сигнал, а не ультрафиолет (УФ)? Надо пропустить луч через дифракционную решетку. ИК отклоняются сильнее чем УФ.

Подсказка


--На каком максимальном расстоянии работает ИК пульт? 15метров +-2 метра

Комментарии (9)


  1. VBDUnit
    30.09.2025 20:32

    Спасибо, очень вкусный материал. Сами протоколы пультов тема полезная, чтобы когда надо чем‑то рулить с контроллера не бездумно повторять запись, а системно понимать, что там закодировано.

    Доводилось реверсинжинирить пульт от сервопривода монитора, чтобы можно было с компа с клавиатуры управлять мониторами через ардуино (комп → ардуино → ик диоды).

    Поначалу пробовал записывать мерцание диода пульта на видео с телефона с 960 к/c и по количеству кадров определять сколько длится вкл/выкл, после чего руками кодить интервалы. ВНЕЗАПНО, это работало, но очень плохо — где то 1 из 5 раз кронштейн понимал чего от него хотят. Пришлось мерить ширину импульсов по-человечески - и вот тогда всё получилось.

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


    1. BSOZ
      30.09.2025 20:32

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


  1. aabzel Автор
    30.09.2025 20:32

    Так как все пульты работают на одной несущей то не получится одновременно управлять сразу двумя пультами. Один будет просто глушить сигналы второго.


  1. CitizenOfDreams
    30.09.2025 20:32

    выход открытый коллектор

    Если в приемнике есть неотключаемый резистор подтяжки, как на схеме, то это уже не открытый коллектор, а просто sinking output, строго говоря.


  1. randomsimplenumber
    30.09.2025 20:32

    На мобильном - ужасно.


  1. barseek
    30.09.2025 20:32

    Мне в начале 1990-х отдали телевизор Fujitsu, у которого собака сгрызла пульт и владелец (американец) купил программируемый пульт. У этого пульта был режим записи для любой кнопки сигнала с пульта-источника. Этот пульт был неприлично дорогой и мне его дали только на время. Я тогда подцепился логическим анализатором к светодиоду и считал временные диаграммы импульсов, а потом написал на ассемблере программу эмуляции пульта, которую запускал на XT/8088 с выводом на ИК светодиод через пин на порту LPT. Планировалось переписать это на 8051, но пропал интерес, а телевизор использовался как монитор для видика.


  1. smart_pic
    30.09.2025 20:32

    В теме ИК управления очень давно. Много чего было сделано. На полке стоит коробка с разными пультами , в том числе есть и обучаемые и универсальные. Статья на тему ИК https://habr.com/ru/articles/950764/

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

    Отличная замена дорогого оборудования Global Cash отечественного разработчика и производителя https://www.cvg.ru/catalog/diga/ambicore/


  1. CodeNameHawk
    30.09.2025 20:32

    Все новое хорошо забытое старое.

    Скрытый текст


  1. Antohin
    30.09.2025 20:32

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

    Вот так вот вы взяли и назвали мой телевизор "дремучей археологией" :)

    Сидел разглядывал картинку пульта с мыслью - "какие раньше интересные пульты были". Хмм... А чем-то на мой похож... В смысле у меня такой же только черный!?! :) А так-то да, телевизору около 10 лет, причем на тот момент он уже был на исходе выпуска и поэтому с весьма вкусными скидками