У пульта от старого музыкального центра, который я вытащил из ящика с батарейками, кнопки были живые, а сам центр давно умер на даче. Навожу пульт на камеру телефона: на экране вспыхивает сиренево-белая точка, меняется с каждым нажатием. Глаз не видит ничего, камера видит вспышку, а Arduino после пары вечеров видела только мусор. Между «есть свет» и «есть команда» лежит целая дисциплина, и на ней спотыкаются все, кто относится к ИК-пульту как к обычному фонарику.
Фонарик бы и не справился. Если бы пульт просто светил диодом, пока нажата кнопка, приёмник путался бы наравне с ним: солнце из окна, лампа на потолке и отражение от белой стены светят в той же инфракрасной части спектра. Поэтому инженеры тридцать лет назад поступили как радиоинженеры: взяли несущую частоту и посадили данные на неё, как радиостанция садится на свою волну. Отсюда главная цифра всего раздела — 38 килогерц.
В этом уроке разбираем сигнал по слоям: чем пачка света отличается от просто света, как внутри пачки прячутся биты и почему пульты от телевизоров разных фирм не понимают друг друга, хотя светят одинаковым светом. Железо пока не трогаем: мигать диодом по расписанию мы учились ещё в первом уроке про маячок, а читалку кодов на готовом приёмнике уже собирали в уроке про приём ИК-кодов — она понадобится вам для опытов в конце.
Несущая 38 кГц: свет, который сидит на волне
Радиостанция не вещает в эфир голым голосом: голос садится на несущую частоту, и настройка приёмника на волну — это и есть выбор несущей. ИК-пульт собран по той же схеме, только волну заменяет свет. Диод пульта не горит постоянно, а мигает 38 000 раз в секунду; один период — 26 микросекунд. Всё, что хочет сказать пульт, ложится поверх этих вспышек, как голос на волну радиостанции. Непрерывное свечение приёмник честно отнёс бы к фону и выбросил — вместе с солнцем и лампами.
Пачку света, соответствующую одному биту, легко посчитать. У NEC бит начинается вспышкой длиной 0.56 миллисекунды — это около 21 периода несущей, 21 вспышка подряд. Внутри пачки диод светит не весь период, а примерно четверть или треть: скважность несущей специально занижают до 25–30 процентов. Причина — нагрев: ИК-диод в пульте рассчитан на импульсный режим, и при непрерывном свечении на полной мощности терял бы дальность и жил недолго. Тот же фокус мы делали, управляя яркостью через analogWrite: быстрые вспышки усредняются, глаз видит среднее. Мигает диод не человек и не скетч — таймер; устройство таймеров ATmega328 мы разбирали отдельно, а в пульте стоит свой крошечный контроллер с тем же принципом.
Число 38 кГц — не магия, а компромисс. Ниже — приёмник начнёт пропускать медленные помехи от дешёвых LED-ламп и импульсных блоков питания; выше — дорожает входная цепь и падает чувствительность. Встречаются пульты на 36 и на 40 кГц, и приёмник, настроенный на 38, прощает соседей. Мнение с границей: пульт на 36 кГц с приёмником на 38 у меня стабильно брал 2–3 метра при паспортных восьми. Это не поломка, так и задумано — не тратьте вечер на поиск неисправности, которой нет.
О дальности тоже стоит сказать числами. Диод пульта в момент вспышки требует от батарейки несколько сотен миллиампер — импульсный ток, который подсевший элемент отдаёт неохотно. Отсюда два следствия. Первое: батарейка режет дальность раньше, чем перестают работать кнопки, — пульт, живой с полуметра, почти всегда виноват в питании, а не в диоде. Второе: экономный импульсный режим оказывается ещё и дальнобойным — короткая пачка позволяет диоду отдать пик мощности без перегрева. Средний ток при нажатой кнопке — единицы миллиампер, поэтому батарейки в пульте живут годами.
Кадр NEC начинается с боевого клича: пачка света длится 9 миллисекунд, затем пауза 4.5 миллисекунды. Данных в ней нет — это сигнал «внимание», по которому приёмник успевает настроить усиление под яркость конкретного пульта и конкретной дистанции. Дальше идут 32 бита, и различает их только пауза после одинаковой пачки в 0.56 мс: пауза 0.56 мс — ноль, пауза 1.68 мс — единица. Один бит живёт 1.125 или 2.25 миллисекунды, весь кадр из 32 бит — около 68 миллисекунд вместе с преамбулой. Заметьте: свет внутри бита всегда одинаковый, информация прячется в паузах.
Если кнопку держат, пульт не пересылает кадр целиком: раз в 108–110 мс уходит короткий кадр-повтор. За секунду удержания — около девяти повторов; этим мы займёмся в симуляторе ниже. А команды удобно записывать в шестнадцатеричном виде: 0x43 и 67 — одно число в двух одеждах, и путаница между записями — классическая ошибка, про которую я писал в уроке про bin, hex и dec.
#include <IRremote.hpp> const int IR_PIN = 2;unsigned long oknoStart = 0;int kadrov = 0; void setup() { Serial.begin(9600); IrReceiver.begin(IR_PIN, ENABLE_LED_FEEDBACK);} void loop() { if (IrReceiver.decode()) { kadrov = kadrov + 1; IrReceiver.resume(); } if (millis() - oknoStart >= 1000) { Serial.print("kadrov_za_sek="); Serial.println(kadrov); kadrov = 0; oknoStart = millis(); }}Три языка на одном свете
Свет у всех пультов один — излучение около 940 нанометров, — а языки разные. NEC прячет различие битов в паузах: пачка всегда 0.56 мс, смысл несёт тишина после неё; такой способ зовут импульсно-позиционной модуляцией, PPM. Sony SIRC делает наоборот: постоянна пауза, а пачка короткая или длинная — широтная модуляция, PWM. RC-5 от Philips кодирует биты Манчестером: уровень гарантированно меняется в середине каждого бита, и ноль отличается от единицы направлением перехода. Три языка на одном свете, и приёмник честно отдаёт библиотеке длительности, а та определяет протокол сама.
Практическая сторона: как библиотека понимает, на каком языке говорит пульт? Она меряет длительности пачек и пауз и сравнивает их с шаблонами десятков протоколов: у NEC свой почерк из 32 бит с инверсиями, у RC-5 — манчестерские переходы в середине бита, у SIRC — короткие 12-битные кадры. Совпадение с шаблоном и есть ответ, поэтому в читалке название протокола печатается без вашей помощи. Если же длительности не похожи ни на один шаблон, библиотека честно скажет UNKNOWN — и это повод смотреть сырые интервалы, а не гадать по кнопкам.
Сведу три самых частых языка в таблицу — она пригодится, когда читалка покажет незнакомое название протокола и захочется понять, чей это пульт и что от него ждать.
| Протокол | Несущая | Как кодируется бит | Кадр | Где встречается |
|---|---|---|---|---|
| NEC | 38 кГц | PPM: пачка одинаковая, смысл — в длине паузы (0.56 или 1.68 мс) | 32 бита, около 68 мс | телевизоры, приставки, пульты из наборов Arduino |
| Sony SIRC | 40 кГц | PWM: пауза одинаковая, смысл — в длине пачки | 12–20 бит | техника Sony, старые ресиверы |
| RC-5 | 36 кГц | Манчестер: переход уровня в середине бита | 14 бит | Philips и старая европейская техника |
История-тупик, на которой я понял, зачем вообще существует отдельная деталь приёмника. Мне понадобился тестер пультов без Arduino, и я вспомнил фоторезистор из урока про ночник: он же реагирует на свет — пусть и ловит пачки. Собрал делитель, понавёл пульт, открыл монитор — числа стояли как вкопанные, ни на один кадр не дрогнули. Я перепроверил делитель, подцепил усилитель, потратил два часа — и получил те же нули.
Причина в скорости. Фоторезистор меняет сопротивление за десятки миллисекунд — это его честный паспорт. Несущая пульта мигает с периодом 26 микросекунд, пачка бита длится 0.56 миллисекунды: деталь в тысячу раз медленнее нужного. Для фоторезистора целый кадр NEC — один чуть заметный взблеск, потерянный в шуме от потолочной лампы. Никаким усилением это не лечится: сначала деталь должна успевать за сигналом.
Всё это решает специализированный приёмник: полосовой фильтр вырезает из спектра ровно 38 кГц, фотодиод быстрый, а автоматика усиления держит порог шума. У AGC есть и оборотная сторона: при яркой фоновой засветке приёмник задирает порог, и дальность падает с восьми метров до полуметра при внешне живой схеме. Порог подстраивается не мгновенно: первые пачки кадра приёмник усиливает по максимуму, поэтому длинная 9-миллисекундная преамбула NEC — не украшение, а время на настройку. Мораль моей истории: деталь выбирают по быстродействию, а не по признаку «там же свет». Практический бонус — библиотека IRremote различает протоколы из таблицы сама, вручную разбирать кадры не придётся.
- Пульт сидит на несущей 38 кГц, как радиостанция на волне: период 26 мкс, скважность внутри пачки 25–30 процентов
- Бит NEC — пачка 0.56 мс и пауза: 0.56 мс у нуля, 1.68 мс у единицы; свет одинаковый, смысл в паузах (PPM)
- Кадр NEC — преамбула 9 мс плюс 32 бита, суммарно около 68 мс; удержание шлёт кадр-повтор каждые 108–110 мс
- NEC, Sony SIRC и RC-5 различаются несущей (38/40/36 кГц) и кодированием: паузы, длина пачки или Манчестер
- Фоторезистор несущую не видит в принципе — нужен приёмник с полосовым фильтром 38 кГц и AGC
- 1. Почему диод пульта мигает несущей, а не светит сплошь, пока нажата кнопка?
- 2. Сколько длится один период несущей 38 кГц?
- 3. Чем у NEC отличается ноль от единицы?
- 4. Пульт Sony светит на 40 кГц, приёмник настроен на 38. Что будет?
- 5. Почему фоторезистор не годится для приёма ИК-кодов?
Слои сигнала разложены: несущая, пачки, паузы, три языка на одном свете. Счётчик кадров из этого урока — готовый эталон: девять повторов в секунду при удержании, и если ваш пульт показывает их, он здоров. Дальше — железо: в следующем уроке подключаем приёмник VS1838B, находим его ноги и выгоняем помехи из питания. А следом — библиотека IRremote четвёртой версии, где вся эта теория сжимается в три вызова: begin, decode, resume.
Частые вопросы по теме урока
- Почему диод пульта мигает несущей, а не светит сплошь, пока нажата кнопка?
- Полосовой фильтр приёмника вырезает пульсации около 38 кГц; непрерывный свет от солнца и ламп мимо него не проходит. Экономия батарейки тут ни при чём: скважность внутри пачки — отдельная история про нагрев диода. Чтобы приёмник отфильтровал постоянные источники света по частоте 38 кГц
- Сколько длится один период несущей 38 кГц?
- Одна секунда минус 38 000 периодов: 1/38000 — это 26.3 микросекунды на вспышку. За пачку бита в 0.56 мс успевает около 21 такой вспышки. Около 26 микросекунд
- Чем у NEC отличается ноль от единицы?
- NEC — PPM: пачка всегда 0.56 мс, а пауза после неё — 0.56 мс у нуля и 1.68 мс у единицы. Длиной паузы после одинаковой пачки
- Пульт Sony светит на 40 кГц, приёмник настроен на 38. Что будет?
- Соседние частоты приёмник прощает: связка 36 и 38 кГц у меня держала 2–3 метра вместо паспортных восьми. Обычно работает, но дальность падает
- Почему фоторезистор не годится для приёма ИК-кодов?
- Фоторезистор меняет сопротивление за десятки миллисекунд — в тысячу раз медленнее пачки бита; сигнал превращается в невидимый взблеск. Слишком медленный: десятки миллисекунд против 26 микросекунд периода несущей