подбор ir кодов протокол nec
Описание ИК-протокола NEC (кодирование длиной паузы)
В ИК-пультах фирмы NEC для передачи данных используется протокол, основанный на кодировании нулей и единиц длиной паузы:
Начало каждого бита определяется импульсом длиной 560 мкс (одновременно этот импульс сигнализирует о конце предыдущего бита). Длина следующей за импульсом паузы определяет логическое значение бита.
Для определения конца последнего бита, после него также отправляется импульс длиной 560 мкс.
Команды передаются пакетами. Каждый пакет начинается со стартовой последовательности — импульса длиной 9 мс и паузы длиной 4,5 мс. Пакет имеет размер 4 байта (32 бита), содержащие адрес устройства и команду. Каждый байт пакета передаётся младшим битом вперёд.
Существуют две версии протокола NEC: стандартная и расширенная. В стандартной версии адрес и команда имеют длину 8 бит. Пакет при этом состоит из адреса устройства, инвертированного адреса, команды, инвертированной команды, и имеет следующий вид:
В стандартной версии протокола пакет всегда имеет одинаковую длительность, поскольку и адрес и команда передаются как в прямом, так и в инверсном виде.
В расширенной версии используется 16-ти битный адрес и 8-ми битная команда. Пакет при этом состоит из младшего байта адреса, старшего байта адреса, команды, инвертированной команды, и имеет следующий вид:
В расширенной версии протокола длительность пакета различна и зависит от кода адреса.
При удержании кнопки посылка повторно не передаётся. Вместо этого каждые 110 мс передаётся специальный код повтора (рисунок слева).
Для передачи высокого уровня сигнала пульт посылает пачку импульсов на частоте несущей (обычно со скважностью 3 или 4), длительность пачки соответствует времени, в течении которого должен передаваться высокий уровень. При передаче низкого уровня сигнала пульт ничего не передаёт. В качестве несущей обычно используется частота 38 кГц.
При приёме сигнала от пульта необходимо учитывать, что фотоприёмники зачастую имеют выходы подтянутые к питанию и при отсутствии сигнала на входе (когда пульт ничего не передаёт) у них на выходе висит высокий уровень, а при наличии импульсов на частоте несущей (когда пульт передаёт высокий уровень) у них на выходе устанавливается низкий уровень. В этом случае принятый сигнал получается инвертированным.
Схемы самодельных ИК-пультов, приёмников сигналов дистанционного управления, а также программы для приёма и передачи сигналов по протоколу NEC можно найти по тегу «ИК»
Реализация ИК протокола NEC на ATmega
Данный протокол уже много где описан. Я хочу показать и подробно описать свою реализацию на конкретном микроконтроллере. Мне было необходимо принимать сигнал с пульта RGB — такого, как на картинке. Его система команд приведена внизу статьи.
Краткий экскурс
Каждый пакет протокола NEC состоит из стартовой последовательности – импульса длиной 9 мс и паузы длиной 4,5 мс. Дабы не грузить вас теоретическими рисунками, покажу реальные скриншоты с логического анализатора.
Сам протокол основан для кодировании нулей и единиц длиной паузы. Начало каждого бита определяется импульсом длиной 560 мкс (одновременно этот импульс сигнализирует о конце предыдущего бита). Длина следующей за импульсом паузы определяет логическое значение бита. Так, суммарная длина логического нуля получается 1.12мс, а логической единицы 2.25мс. Соответственно в реальной ситуации значения немного разнятся.
Пакет состоит из стартовой последовательности, адреса и команды. В стандартной версии протокола пакет всегда имеет фиксированную длительность, так как адрес и команда передаются как в прямом, так и в инверсном виде.
При удержании кнопки посылка повторно не передаётся. Вместо этого каждые 110 мс передаётся специальный код повтора длительностью 11,25 мс.
Программа
Я не принимал адрес, так как он мне не нужен. В случае необходимости, вы легко сможете доработать программу. В качестве микроконтроллера была выбрана ATmega32 с 16МГц кварцем. Следовательно, все временные интервалы рассчитаны для 16Мгц. Для реализации протокола нам понадобится таймер для отсчета времени и внешнее прерывание по ниспадающему фронту. Таймер настроен с делителем 1024, один такт 1024/16МГц = 64мкс, прерывание по переполнению 64мкс * 256 = 16мс (что заведомо больше любого из битов в пакете, это нам пригодится).
Начальная инициализация и макросы старт/стоп таймера выглядят так:
Код написан в среде IAR, но легко переносится в другую среду, путем замены заголовков прерываний.
Прерывание по переполнению таймера нужно только для “завершения” приема. Переполнение в 16мс больше любой составляющей пакета, будь то преамбула или бит, так что такое прерывание можно считать окончанием приема пакета и подготовиться к приему следующего.
Здесь у меня возник один нюанс, объяснение которого я не знаю. При пуске таймера сразу (само собой после обработки прерывания INT0) срабатывало прерывание по переполнению таймера. Как? Зачем? Возможно, это был какой-то индивидуальный косяк, ибо общая программа на тот момент уже была не маленькая, но я решил первое прерывание не обрабатывать, а обрабатывать второе, т.е уже после 32мс.
Прерывание по ниспадающему фронту INT0. Тут считаем биты и анализируем время, пройденное с последнего прерывания. По величине таймера TCNT0 легко понять, какой это был бит. В конце обработчика таймер обнуляем, чтобы начать отсчет сначала.
В основной программе анализируем флаг newC, не забыв обнулить его. Ну и дальнейшая обработка команды.
Система команд
А вот и сама система команд для пульта ED618 (покупаю их на dx.com):
Для других таких же RGB пультов система команд может быть другая. У меня есть точно такой же пульт, достался мне от какого-то покупного контроллера RGB, так там система команд весьма отличается. Считывайте и смотрите сами. Я, например, принимал команду и скидывал ее по UART’у на комп.
Алгоритм сам по себе не сложный, надеюсь кому-то пригодится. У меня уже сделано не одно устройство на основе пульта с таким протоколом, все работает хорошо. В следующей статье расскажу про реализацию протокола светодиодов ws2812b.
Подбор ir кодов протокол nec
NEC Frame Format | |||
Address | Complement of Address | Command | Complement of Command |
LSB-MSB(0-7) | LSB-MSB(8-15) | LSB-MSB(16-23) | LSB-MSB(24-31) |
Each bit is transmitted using the pulse distance as shown in the image.
Logical ‘0’: A 562.5µs pulse burst followed by a 562.5µs space, with a total transmit time of 1.125ms
Logical ‘0’: A 562.5µs pulse burst followed by a 1.6875ms space, with a total transmit time of 2.25ms
When a key is pressed on the remote controller, the message transmitted consists of the following, in order:
The four bytes of data bits are each sent least significant bit first. Below image illustrates the format of an NEC IR transmission frame, for an address of 00h (00000000b) and a command of ADh (10101101b).
A total of 67.5ms is required to transmit a message frame. It needs 27ms to transmit the 16 bits of address (address + inverse) and the 16 bits of command (command + inverse).
IR Key Codes
Below table gives the complete list of Codes for NEC IR Remote.
Key | Encoded Value |
CH- | 0xFFA25D |
CH | 0xFF629D |
CH+ | 0xFFE21D |
PREV | 0xFF22DD |
NEXT | 0xFF02FD |
PLAY/PAUSE | 0xFFC23D |
VOL- | 0xFFE01F |
VOL+ | 0xFFA857 |
EQ | 0xFF906F |
0 | 0xFF6897 |
100+ | 0xFF9867 |
200+ | 0xFFB04F |
1 | 0xFF30CF |
2 | 0xFF18E7 |
3 | 0xFF7A85 |
4 | 0xFF10EF |
5 | 0xFF38C7 |
6 | 0xFF5AA5 |
7 | 0xFF42BD |
8 | 0xFF4AB5 |
9 | 0xFF52AD |
Sample Code
Below is the sample code to decode the key pressed on IR remote control and send on UART. We need an External interrupt to detect the pulses and timer to measure these pulse widths.
First two transitions will be ignored as they will mark SOF(Start of the frame). After this continuously 32-bit information will be captured in a variable. If the pulse width is greater than 2ms then it will be considered as LOGIC-1 else as LOGIC-0. If the pulse width is greater than 50ms then it will be considered as SOF(Start of the frame).
1ms Delay Calculation:
Using IR Remote Library
Downloads
Download the complete project folder from this link: Examples and Code Library
- С чем сделать пюре если нет молока
- 0x80248007 код ошибки в windows 10 как исправить