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

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

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

Очевидно, что древняя цивилизация оставила нам какое-то зашифрованное сообщение. Наша задача расшифровать канувший в лету реликтовый алфавит. И понять в конце концов какой же со всего этого может быть для нас овёс?
Постановка задачи
Написать драйвер 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
В результате обратного инжиниринга удалось сформировать полный список всей системы команд, которые источает пульт 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 сигнал от пульта проходит на расстоянии до 23х шагов (12 метров).
Недостатки IR Samsung протокола и пульта в целом
1--Если одновременно нажать две кнопки, то пульт ничего не будет отправлять
2--Между кнопками со временем накапливается грязь
3--В пакете нет номера пакета. Если пакет потеряется, то приемник про это не узнает.
4--Связь только в одну сторону. Нет контроля передачи команды.
5--Нельзя задать адрес пульта. Он всегда посылает свой постоянный адрес 0x07.
6--В пакете нет контрольной суммы.
7--Нет шифрования
8--Нет адреса получателя.
Достоинства IR Samsung протокола
1++Есть элементы контроля приема. Команда передается как в бинарном коде так и в инвертированном. Адрес отправителя передается два раза.
2++Простота реализации как передатчика так и приемника.
3++Дешевизна в реализации беспроводной связи
4++Работает пере-отражение сигнала от стен и потолка. В помещении не нужна прямая видимость
Идеи проектов с инфракрасным управлением
1++Клавиатура с IR передатчиком.
2++Игрушечные машинки с управлением по IR командам с обыкновенного TV пульта.
3++Управление кондиционером.
4++Управление столом с подъёмной столешницей.
5++Управление светильниками.
6++Поиск потерянных предметов по брелоку с IR приёмником и звуко-излучателем.
7++Можно установить IR приемник в audio jack и распознавать IR пакет аудиокодеком.
Итог
Удалось научиться декодировать сигнал с ИК пульта. Это позволяет использовать существующую инфраструктуру для управления микроконтроллерными прошивками без необходимости покупать вспомогательное оборудование.
Словарь
Акроним |
Расшифровка |
IR (ИК) |
infrared |
TV |
Television |
LSB |
least significant bit |
MSB |
most significant bit |
Ссылки
Название |
URL |
Формат ИК пульта телевизора Samsung |
|
Как влияют помехи на ИК приемник |
|
Инфракрасный хакинг: взламываем пульт от телевизора Samsung |
|
Как работает инфракрасный пульт? Поясняем |
https://vc.ru/tech/868613-kak-rabotaet-infrakrasnyi-pult-poyasnyaem |
Пульт BN59-01198R, коды команд |
https://docs.google.com/spreadsheets/d/1UBqjQyQtThp5Cu46GW5F4Df08w-WW214QDSGjOWLIac/edit?gid=0#gid=0 |
Декодирование сигналов инфракрасного пульта дистанционного управления |
|
Тележка управляемая по ИК (IR) от стандартного пульта ДУ |
learning-fpga/IR_RC_Cart.md at main · pointcheck/learning-fpga · GitHub |
Infrared Room Control (with Samsung IR protocol) |
https://rusticengineering.wordpress.com/2011/02/09/infrared-room-control-with-samsung-ir-protocol/ |
Вопросы
--Как доказать, что TV пульт излучает именно ИК, а не УФ?
--На каком расстоянии работает ИК пульт?
Комментарии (3)
aabzel Автор
30.09.2025 20:32Так как все пульты работают на одной несущей то не получится одновременно управлять сразу двумя пультами. Один будет просто глушить сигналы второго.
VBDUnit
Спасибо, очень вкусный материал. Сами протоколы пультов тема полезная, чтобы когда надо чем‑то рулить с контроллера не бездумно повторять запись, а системно понимать, что там закодировано.
Доводилось реверсинжинирить пульт от сервопривода монитора, чтобы можно было с компа с клавиатуры управлять мониторами через ардуино (комп → ардуино → ик диоды).
Поначалу пробовал записывать мерцание диода пульта на видео с телефона с 960 к/c и по количеству кадров определять сколько длится вкл/выкл, после чего руками кодить интервалы. ВНЕЗАПНО, это работало, но очень плохо — где то 1 из 5 раз кронштейн понимал чего от него хотят. Пришлось мерить ширину импульсов по-человечески - и вот тогда всё получилось.
Остаётся загадкой, почему на сигналы, сделанные по видео, привод то реагировал, то нет. По идее, если время неправильное, оно должно либо не работать, либо работать.
BSOZ
Синхронизация. Переходы где-то перестают попадать в период дискретизации и бит данных принимается неверно. Примерно как дюймовой линейкой измерять миллиметры: где-то что-то даже получится измерить, а какие-то величины окажутся "слишком между" делений.