Пульт с протоколом NEC передаёт не сигнал постоянного уровня, а пачки несущей 38 кГц: информация заложена в паузах между ними. Vishay называет NEC, наряду с RC5, одним из двух распространённых форматов ИК-пультов.
Кадр NEC
| Часть кадра | Длительность | Что передаётся |
|---|---|---|
| Начальная пачка | 9 мс | несущая 38 кГц |
| Пауза | 4,5 мс | — |
| Адрес | 8 бит | младшим битом вперёд |
| Инверсия адреса | 8 бит | в расширенном NEC — старший байт адреса |
| Команда | 8 бит | младшим битом вперёд |
| Инверсия команды | 8 бит | для проверки |
| Завершающая пачка | 562,5 мкс | конец последнего бита |
Каждая пачка бита длится 562,5 мкс, а следующая начинается через 1,125 мс для «0» и через 2,25 мс для «1». Байт и его инверсия вместе всегда содержат восемь единиц, поэтому кадр обычного NEC имеет постоянную длину — 16 нулей и 16 единиц:
до начала завершающей пачки, как на рисунке в документе Vishay. Все длительности кратны 562,5 мкс: начальная пачка — 16 таких единиц, пауза — 8, пауза кода повтора — 4; ядро Linux округляет единицу до 563 мкс.
Порядок бит и два вида кода
Байты идут младшим битом вперёд. Поэтому 32 бита кадра можно записать двумя способами: первый принятый бит — младший (так хранят код IRremote и ядро Linux) или старший (так записаны коды во многих старых скетчах и таблицах). Для адреса 0x04 и команды 0x08 это 0xF708FB04 и 0x20DF10EF — один и тот же кадр. Калькулятор показывает оба вида, а в режиме разбора нужно выбрать, как записан исходный код: если инверсия команды не сходится, скорее всего, выбран не тот порядок.
Как отправить код
Передатчик — ИК-светодиод, который включают пачками на частоте 38 кГц. Ток светодиода задаёт резистор — его считает калькулятор резистора для светодиода, а при большом токе светодиод включают через транзисторный ключ. Несущую можно получить от таймера микроконтроллера — частоту и делители подбирает калькулятор таймера. Библиотека IRremote делает всё это сама: IrSender.sendNEC(адрес, команда, повторы) отправляет кадр, а sendRaw — массив длительностей из калькулятора.
Частые вопросы
Почему у одной кнопки пульта два разных кода?
Это один и тот же кадр, записанный в разном порядке бит. Пульт передаёт каждый байт младшим битом вперёд, и IRremote с ядром Linux так и хранят код: первый принятый бит становится нулевым. Старые скетчи и таблицы записывали те же 32 бита в обратном порядке. Поэтому 0x20DF10EF и 0xF708FB04 — один и тот же кадр с адресом 0x04 и командой 0x08.
Что передаёт пульт NEC, пока кнопка удерживается?
Полный кадр уходит один раз, а дальше каждые 108 мс — короткий код повтора: пачка 9 мс, пауза 2,25 мс и одна пачка. IRremote распознаёт его как повтор, а не как новое нажатие. Бывают пульты, которые вместо этого повторяют весь кадр.
Какой ИК-приёмник нужен для NEC?
Модуль на 38 кГц. По Vishay с форматом NEC работают все её приёмники, а лучшее подавление помех дают модули с AGC4, например TSOP34438 и TSOP75438, и с AGC6 в серии Cyllene.
Чем расширенный NEC отличается от обычного?
Второй байт кадра в нём — не инверсия адреса, а старший байт 16-битного адреса: адресов становится 65 536 вместо 256. Команда по-прежнему идёт с инверсией. Отличить варианты на приёме можно только по содержимому: если второй байт случайно оказался инверсией первого, IRremote считает адрес 8-битным.
Источники
- Vishay Semiconductors. Data Formats for IR Remote Control (Document Number 80071, Rev. 2.3, 26-Jun-2024) — RC5 и NEC — два распространённых формата; NEC: несущая 38 кГц, начальная пачка 9 мс и пауза 4,5 мс, «0» — расстояние между пачками 1,125 мс, «1» — 2,25 мс, 8 бит адреса и 8 бит команды, за каждым словом — его инверсия; пример: адрес 00110111 и команда 00011010 передаются как 00110111'11001000'00011010'11100101 (эталон тестов); кадр 67,5 мс, при удержании — начальная пачка и один бит в каждом интервале 108 мс; для NEC подходят все приёмники Vishay, лучшее подавление помех — AGC4 (TSOP34438, TSOP75438 и др.) и AGC6 в серии Cyllene
- Linux kernel. drivers/media/rc/ir-nec-decoder.c — единица 563 мкс: начальная пачка 16 единиц, пауза 8, пауза кода повтора 4, пачка бита 1, пауза «0» — 1, «1» — 3 единицы; байты принимаются младшим битом вперёд (bitrev8); кодирование ir_nec_scancode_to_raw: инверсия команды, команда, инверсия адреса, адрес — от старшего байта к младшему (эталон тестов); расширенный NEC с 16-битным адресом и NEC32
- Arduino-IRremote: README, пример SendDemo и TinyIRSender.hpp — NEC — 8 бит адреса и 8 бит команды с инверсиями; расширенный NEC занимает байт инверсии адреса под 16-битный адрес, и если второй байт оказался инверсией первого, декодер считает адрес 8-битным; поток бит читается младшим битом вперёд; при удержании NEC шлёт особый короткий кадр повтора; IrSender.begin(вывод), IrSender.sendNEC(адрес, команда, повторы), sendRaw(массив мкс, длина, кГц), sendNECMSB() для старых кодов; пример длительностей адреса 0x04 и команды 0x08
Встроить калькулятор на свой сайт
Скопируйте код и вставьте его в HTML страницы, статьи или вики. Виджет бесплатный, без рекламы, счётчиков и cookie. Условие одно — ссылка на GAW под рамкой остаётся на месте. Подробнее о виджетах
<iframe src="https://gaw.ru/embed/ir-nec/" title="Калькулятор ИК-кода NEC" width="100%" height="640" style="border:1px solid #e3e5e9;border-radius:8px" loading="lazy" allow="clipboard-write"></iframe>
<p style="margin:6px 0 0;font-size:14px">Калькулятор: <a href="https://gaw.ru/tools/ir-nec/">Калькулятор ИК-кода NEC</a> — GAW.ru</p>Автоподстройка высоты рамки
Если сайт разрешает скрипты, добавьте этот код один раз в любом месте страницы: рамка будет менять высоту вместе с результатом расчёта.
<script>window.addEventListener("message",function(e){if(e.origin!=="https://gaw.ru"||!e.data||e.data.type!=="gaw:embed-height")return;var f=document.querySelectorAll('iframe[src^="https://gaw.ru/embed/"]');for(var i=0;i<f.length;i++)if(f[i].contentWindow===e.source)f[i].style.height=e.data.height+"px"})</script>Обновлено .
Нашли ошибку в расчёте?