Реализация ИК протокола NEC на ATmega / Geektimes Данный протокол уже много где описан. Я хочу показать и подробно описать свою реализацию на конкретном микроконтроллере. Мне было необходимо принимать сигнал с пульта RGB — такого, как на картинке. Его система команд приведена внизу статьи. Краткий экскурс. Каждый пакет протокола NEC состоит из стартовой последовательности – импульса длиной 9 мс и паузы длиной 4,5 мс. Дабы не грузить вас теоретическими рисунками, покажу реальные скриншоты с логического анализатора.
- Изображение большего размера. Hx1838 приемник кода NEC инфракрасный модуль дистанционного управления ИК-пульт. От:pwypr 2016-06-12 05:13:14.
- Пульт ДУ (ПДУ, пульт дистанционного управления; RCU, англ. Более полный список протоколов: NEC (repetitive pulse), NEC ( repetitive data), RC5, RC6, RCMM, RECS-80, R-2000 (33 kHz), Thomson RCA ( 56.7.
- Если ваш пульт работает по протоколу NEC (а их по-моему большинство) https://github.com/adafruit/Adafruit- NEC - remote-control -library.
Сам протокол основан для кодировании нулей и единиц длиной паузы. Начало каждого бита определяется импульсом длиной 5.
Длина следующей за импульсом паузы определяет логическое значение бита. Так, суммарная длина логического нуля получается 1.
Алпайн использует NEC Infrared Transmission Protocol. Единицы и нули кодируются длительностью импульса с использованием логической инверсии с.
Соответственно в реальной ситуации значения немного разнятся. Пакет состоит из стартовой последовательности, адреса и команды.
NEC Infrared Transmission Protocol · Описание протокола NEC (кодирование длиной паузы) · NEC Protocol IR ( Infrared) Remote Control.
В стандартной версии протокола пакет всегда имеет фиксированную длительность, так как адрес и команда передаются как в прямом, так и в инверсном виде. При удержании кнопки посылка повторно не передаётся. Вместо этого каждые 1.
Программа. Я не принимал адрес, так как он мне не нужен. В случае необходимости, вы легко сможете доработать программу. В качестве микроконтроллера была выбрана ATmega. МГц кварцем. Следовательно, все временные интервалы рассчитаны для 1. Мгц. Для реализации протокола нам понадобится таймер для отсчета времени и внешнее прерывание по ниспадающему фронту. Таймер настроен с делителем 1.
МГц = 6. 4мкс, прерывание по переполнению 6. Переполнение в 1. Здесь у меня возник один нюанс, объяснение которого я не знаю. При пуске таймера сразу (само собой после обработки прерывания INT0) срабатывало прерывание по переполнению таймера. Возможно, это был какой- то индивидуальный косяк, ибо общая программа на тот момент уже была не маленькая, но я решил первое прерывание не обрабатывать, а обрабатывать второе, т. TIMER0. Тут считаем биты и анализируем время, пройденное с последнего прерывания.
По величине таймера TCNT0 легко понять, какой это был бит. В конце обработчика таймер обнуляем, чтобы начать отсчет сначала.#pragma vector=INT0. Command. 1 & = ~(1< < (i- 1)); //запись бита в прямую. Command . 2,5. 6 мс). Command. 1 . 1. 1,8 мс). C = 1; //повтор команды.
Ну и дальнейшая обработка команды. У меня есть точно такой же пульт, достался мне от какого- то покупного контроллера RGB, так там система команд весьма отличается. Считывайте и смотрите сами. Я, например, принимал команду и скидывал ее по UART'у на комп. Алгоритм сам по себе не сложный, надеюсь кому- то пригодится. У меня уже сделано не одно устройство на основе пульта с таким протоколом, все работает хорошо. В следующей статье расскажу про реализацию протокола светодиодов ws.