На барахолке к моим пяти пультам прибавился шестой — от Philips-ресивера за двести рублей. Читалка напечатала протокол RC5, четырнадцать бит — и счётчик срабатываний повёл себя странно: короткое нажатие иногда засчитывалось дважды, а выдержка delay не помогала, потому что двойной приём случался через раз. Держать кнопку было тем более забавно: кадры летели потоком, и неизвестный мне flip-бит каждую секунду дёргал лампочку в макетке.
Разобраться хотелось не в одном пульте, а в семействе: Philips за десятилетия выпустил RC5 и его наследника RC6, и оба живут по правилам, которые не имеют ничего общего с NEC-паузами. Если NEC — язык «вспышка и тишина», то у RC5 смысл бита сидит в направлении переключения в середине ячейки.
Здесь разберём 14 бит кадра RC5 и его flip-бит — единственное различие нажатия и удержания, — посмотрим, чем отпочковался RC6, и соберём практический порядок опознания протокола чужого пульта. Первое знакомство с этой компанией уже было в уроке про RC5, Sony и RAW, сегодня копаем глубже — до полубитов и стандартных номеров команд.
Манчестер: полубиты по 889 мкс вместо пауз
Кодирование RC5 зовётся манчестерским, или фазовым. Кадр — цепочка ячеек по 1778 мкс, каждая делится пополам на полубиты по 889 мкс, и значение бита несёт направление перехода в середине: единица и ноль различаются тем, светит ли пульт в первой половине ячейки или во второй. Вспышки и паузы сами по себе ничего не значат — они складываются в рисунок, как штрихи штрихкода. К NEC-битам, где смысл прятался в длине тишины, это не имеет отношения даже отдалённо.
Четырнадцать бит раскладываются так: два стартовых, всегда единицы, один flip, пять бит адреса и шесть бит команды. Пять бит адреса дают 32 класса техники — телевизоры, видеомагнитофоны, ресиверы с каждым своим номером, поэтому пульт от ТВ Philips не дёргает его же ресивер. Шесть бит команды — 64 кнопки, и часть номеров закреплена стандартом десятилетиями: 12 — standby, 13 — беззвучный режим, 16 и 17 — громкость плюс и минус. Честность номеров держится годами: кнопка громкости на плеере 2008 года и на новом ТВ шлёт одну и ту же шестнадцатку. Честность номеров держится годами: кнопка громкости на плеере 2008 года и на новом ТВ шлёт одну и ту же шестнадцатку. Встретив у пульта с надписью Philips именно эти числа в своей таблице, диагноз RC5 можно ставить ещё до того, как протокол напечатает библиотека.
Несущая у RC5 — 36 кГц, не 38, и это тот случай, когда цифра из даташита реально ничего не ломает: полосовой фильтр TSOP прощает соседнюю частоту ценой десятка процентов дальности, мы уже считали это в уроке про несущую. А вот скорость прощать не собирается: кадр RC5 длится около 25 мс, вдвое-втрое короче NEC. Быстрый контроллер пульта успевает отправить два-три кадра за одно короткое нажатие — отсюда двойные срабатывания из вступления.
У второго стартового бита есть двойная жизнь, о которой стоит знать заранее. На классических пультах он всегда единица, а в варианте RC5X этот же бит работает шестым разрядом адреса: классов техники становится 64, и именно поэтому у части Philips-кадров стартовая «единица» на глаз пропадает. Библиотека различает оба случая сама, но когда таблица кодов снимается руками, полезно понимать, почему у соседних пультов одной марки кадры разной длины.
Flip-бит: как пульт различает нажатие и удержание
Flip — ответ Philips на вечный вопрос «держат кнопку или нажали снова». При каждом новом нажатии он переворачивается, при удержании стоит на месте: отдельных кадров-повторов у RC5 нет, удержание — просто повтор того же кадра с тем же flip. Приёмник сравнивает flip последнего кадра с предыдущим: сменился — новое нажатие, тот же — удержание. У NEC для этого отдельный кадр и флаг IS_REPEAT, у Sony — тройная отправка кадра, и три подхода к одной проблеме хорошо показывают, сколько свободы оставляют себе авторы протоколов.
В четвёртой версии IRremote flip добирается из decodedIRData.extra — библиотека отделяет его от команды и не подмешивает в число кнопки. Счётчик нажатий держится на одном сравнении: запомнили прошлый flip, сверили, сработали только при смене. Двойные-тройные приёмы короткого нажатия при этом схлопываются сами: лишние кадры несут тот же flip и остаются без последствий.
Практический нюанс, на котором я потерал вечер: помнить нужно пару «команда плюс flip», а не одну команду. Двойной приём кадра при удержании повторяет и команду, и flip — по паре видно, что нажатие то же. Храните только команду — и удержание неотличимо от серии нажатий, счётчик врёт в обе стороны.
Мне нравится честность этого решения: один бит отделяет нажатие от удержания, и не надо мерить интервалы между кадрами, как у NEC, или глотать тройные дубликаты, как у Sony. У честности есть и цена: сбитый flip приёмник истолкует как новое нажатие, и одна кнопка засчитается дважды. На практике такое видно только на границе дальности — уже знакомой зоне, где кадры доезжают с царапинами.
#include <IRremote.hpp> const int IR_PIN = 2; byte lastFlip = 255; // стартовое значение, которого у flip не бываетint presses = 0; void setup() { Serial.begin(9600); IrReceiver.begin(IR_PIN, ENABLE_LED_FEEDBACK); Serial.println("RC5: schetchik nazhatij po flip");} void loop() { if (IrReceiver.decode()) { byte flip = IrReceiver.decodedIRData.extra; byte cmd = IrReceiver.decodedIRData.command; if (flip != lastFlip) { presses = presses + 1; Serial.print("novoe nazhatie #"); Serial.print(presses); Serial.print(" komanda 0x"); Serial.println(cmd, HEX); } else { Serial.println("uderzhanie: tot zhe flip"); } lastFlip = flip; IrReceiver.resume(); }}| Протокол | Бит в кадре | Как спрятан бит | Несущая |
|---|---|---|---|
| NEC | 32 | длина паузы: 560 против 1690 мкс | 38 кГц |
| RC5 | 14 | переход в середине ячейки, полубит 889 мкс | 36 кГц |
| RC6, режим 0 | 21 с шапкой | тот же манчестер, flip двойной ширины | 36 кГц |
| Sony SIRC | 12 / 15 / 20 | длина вспышки: 600 против 1200 мкс | 40 кГц |
RC6 и опознание протокола за одну минуту
RC6 — это RC5, выросший под цифровую технику. Кодирование то же манчестерское, несущая те же 36 кГц, но шапка длиннее: лидер 2.666 мс, затем стартовый бит, три бита режима и flip, которому отвели двойную ширину — 1778 мкс, чтобы не спутать с соседями. В режиме 0 дальше идут 8 бит адреса и 8 бит команды: 256 значений вместо 64 — как раз под DVD-плееры и приставки. IRremote понимает этот режим под именем RC6, а длинные экзотические варианты — пульты Xbox и компания — честнее держать как RAW: энтузиасты дотягивали декодер до 64-битных кадров RC6 ради той самой приставки, и после этих экспериментов режим 0 выглядит скромным коротышом.
Как опознать протокол чужого пульта? Через паспорт кадра. decodedIRData.protocol даёт номер, getProtocolString() печатает имя, numberOfBits показывает размер: 32 — почти наверняка NEC, 14 — RC5, 12, 15 или 20 — Sony SIRC. Таблица размеров под рукой, и напечатанные биты читаются как штамп в паспорте: одно число — и вероятный протокол уже сужен до двух кандидатов. Таблица размеров под рукой, и напечатанные биты читаются как штамп в паспорте: одно число — и вероятный протокол уже сужен до двух кандидатов. Словарь полей кадра я раскладывал в уроке про decode(), здесь только практика: одно нажатие — и диагноз уже в мониторе.
Чего скетч не скажет никогда, так это несущей: приёмник срезает её до того, как кадр доедет до библиотеки. Так что «36 или 38» узнаётся по бренду, а не по коду. Мой порядок опознания: паспорт кадра, шильдик на батарейном отсеке, затем таблица «бренд — вероятный протокол»: Philips — RC5/RC6, Sony — SIRC, безымянные пульты из наборов — свои вкусы, у климатической техники бывает экзотика вроде протокола из урока про кондиционер Midea. Если пультов в доме несколько и все нужны одновременно, дальше включается фильтрация по адресу и протоколу из урока про несколько пультов.
- 1. Сколько бит в кадре RC5?
- 2. Что означает переход в середине полубита RC5?
- 3. Как в IRremote 4.x добраться до flip-бита RC5?
- 4. Пульт Philips печатается дважды за короткое нажатие. Правильное лечение?
- 5. Чего НЕ вытащить из скетча ни в каком поле decodedIRData?
- RC5: 14 бит — два стартовых, flip, 5 бит адреса, 6 бит команды; стандартные номера: 12 standby, 13 mute, 16/17 громкость
- Манчестер: бит — два полубита по 889 мкс, значение несёт направление перехода в середине ячейки
- Кадр RC5 около 25 мс — короткое нажатие успевает отправить 2-3 кадра; различает их flip, а не delay
- В IRremote 4.x flip живёт в decodedIRData.extra; счётчик нажатий хранит пару «команда плюс flip»
- RC6: тот же манчестер на 36 кГц, лидер 2.666 мс, flip двойной ширины, 8 бит адреса и 8 бит команды в режиме 0
После RC6 пультовый зоопарк складывается сам: NEC экономит эфир паузами, Philips чередует полубиты, Sony страхуется тройной отправкой. Что делать, когда очередной пульт не опознался вовсе — тема следующего урока: сырые интервалы, из которых состоит любой кадр, и пороговый автомат, который читает их без словаря протоколов. А пока посмотрите на шильдики своих пультов: после этого урока бренд на батарейном отсеке скажет про тайминги больше, чем осциллограф. И не ждите помощи от симулятора: виртуальный пульт умеет только NEC, поэтому flip-логику лучше репетировать сразу на живом Philips — у меня это заняло один вечер и один батарейный отсек.
Частые вопросы по теме урока
- Сколько бит в кадре RC5?
- 14 бит: две стартовые единицы, flip-бит, пять бит адреса (32 класса техники) и шесть бит команды (64 кнопки). 14: два стартовых, flip, 5 бит адреса, 6 бит команды
- Что означает переход в середине полубита RC5?
- Манчестерское кодирование: бит — два полубита по 889 мкс, и смысл несёт направление переключения в середине ячейки. значение бита: направление перехода кодирует единицу или ноль
- Как в IRremote 4.x добраться до flip-бита RC5?
- Библиотека отделяет flip от команды и кладёт в decodedIRData.extra. Счётчик нажатий сравнивает его с прошлым значением. decodedIRData.extra
- Пульт Philips печатается дважды за короткое нажатие. Правильное лечение?
- Кадр RC5 короткий — около 25 мс, пульт успевает отправить его 2-3 раза. Лишние кадры имеют тот же flip и отсеиваются сравнением, без delay. сравнение flip: повторные кадры несут тот же бит
- Чего НЕ вытащить из скетча ни в каком поле decodedIRData?
- Полосовой фильтр TSOP демодулирует несущую ещё до библиотеки. «36 или 38 кГц» узнаётся по бренду, а не по коду. несущей — приёмник срезал её до декодера