Перейти к содержанию

Калькулятор ИК-кода NEC

NEC — один из самых распространённых форматов ИК-пультов. Калькулятор переводит адрес и команду в 32-битный код и обратно, показывает байты кадра в порядке передачи, длительности пачек и пауз и готовый код для Arduino с библиотекой IRremote.

Исходные данные

Расчёт

0–255; больше 255 — расширенный 16-битный

0–255, можно 0x…

Результат

Код старшим битом вперёд
0x20DF10EF
так коды записаны в старых скетчах и таблицах
Код младшим битом вперёд
0xF708FB04первый переданный бит — нулевой: так хранят код IRremote и ядро Linux
Байты в порядке передачи
04 FB 08 F7адрес, инверсия адреса, команда, инверсия команды
Биты в порядке передачи
00100000 11011111 00010000 11101111у каждого байта младший бит идёт первым
Длительность кадра
68,06 мсначальная пачка 9 мс и пауза 4,5 мс, 32 бита и завершающая пачка; несущая 38 кГц
Код повтора при удержании
11,81 мспачка 9 мс, пауза 2,25 мс и одна пачка — каждые 108 мс

Длительности и код для Arduino

#include <IRremote.hpp>

void setup() {
    IrSender.begin(3);  // IR LED pin
}

void loop() {
    IrSender.sendNEC(0x04, 0x08, 0);  // address, command, repeats
    delay(1000);
}

/* The same frame as exact durations: IrSender.sendRaw(nec_raw, 67, 38); */
/* NEC frame: 67 durations in microseconds, mark first, 38 kHz carrier */
const uint16_t nec_raw[67] = {
    9000, 4500, 563, 563, 563, 563, 563, 1688, 563, 563,
    563, 563, 563, 563, 563, 563, 563, 563, 563, 1688,
    563, 1688, 563, 563, 563, 1688, 563, 1688, 563, 1688,
    563, 1688, 563, 1688, 563, 563, 563, 563, 563, 563,
    563, 1688, 563, 563, 563, 563, 563, 563, 563, 563,
    563, 1688, 563, 1688, 563, 1688, 563, 563, 563, 1688,
    563, 1688, 563, 1688, 563, 1688, 563
};

Расчёт выполнен по формулам и данным из источников, приведённых на этой странице, и не заменяет проверку: параметры компонентов у разных производителей и даже партий различаются. Перед применением сверяйте результат с документацией на конкретные детали.

Пульт с протоколом 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 единиц:

T=13,5+16⋅1,125+16⋅2,25=67,5 мсT = 13{,}5 + 16 \cdot 1{,}125 + 16 \cdot 2{,}25 = 67{,}5\ \text{мс}

до начала завершающей пачки, как на рисунке в документе 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-битным.

Источники

  1. 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
  2. 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
  3. 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>

Обновлено .

Нашли ошибку в расчёте?