Коновалов Дмитрий Александрович

ИК пульт вместо кнопок

Если посмотреть на тенденцию развития управления бытовой техникой, то легко заметить, что на смену россыпи кнопок на передних панелях пришли пульты дистанционного управления (ДУ) и сенсорные экраны. Сейчас можно встретить устройства (например, медиа плееры), у которых осталась только одна кнопка – Reset.

Введение

Если посмотреть на тенденцию развития управления бытовой техникой, то легко заметить, что на смену россыпи кнопок на передних панелях пришли пульты дистанционного управления (ДУ) и сенсорные экраны. Сейчас можно встретить устройства (например, медиа плееры), у которых осталась только одна кнопка – Reset. И это не случайно.

Экономическая предпосылка. Cтоимость одного интегрального фотоприёмник типа TSOP сравнима со стоимостью всего двух кнопок для печатного монтажа (типа DTS).

Схемотехническая предпосылка. Поскольку интерфейс канала ДУ является последовательным, то для его подключения к микроконтроллеру требуется всего один вход. При этом никакой дополнительной обвески не нужно.

Программно-алгоритмическая предпосылка. При создании алгоритма управления устройством всегда хочется, чтобы он был «красивым» и понятным. Однако разработчик по различным причинам обычно стремиться уменьшить количество органов управления (кнопок) необходимым минимумом. Это вынуждает его придумывать изощрённые алгоритмы управления различными режимами устройства с помощью «пары кнопок», когда функции этих кнопок всё время меняются в зависимости от длительности нажатия и от текущего режима работы устройства. Применение канала ДУ позволяет использовать для управления устройством привычные всем кнопки (стрелки, цифры и т.д.), а алгоритм опроса кнопок сводится всего к одному циклу опроса переменной с кодом ДУ. Дальнейшее ветвление программы осуществляется с помощью простой и понятной структуры «CASE». Конечно, за такое удобство приходится платить местом в программной памяти. 

Эргономическая предпосылка. Практически никто не будет оспаривать, что нажимать на кнопки пульта ДУ гораздо удобнее, чем тыкать в кнопки на панели устройства. Особенно, если это устройство миниатюрное.

Выбор протокола ДУ

Перейдём к практической реализации. Во-первых, нам нужен пульт ДУ. С этим проблем быть не должно, так как за прошедшие годы почти в каждой квартире этих пультов накопилось с десяток. Во-вторых, надо определить какой протокол ДУ является самым распространённым. Если читать журнал «Радио», то может сложиться впечатление, что самый распространённый протокол ДУ – это RC5. Может быть так и было 20 лет назад, но сейчас это не так.

С помощью простой тестовой прошивки я проверил все пульты, которые попались мне под руку. У брендовых пультов (Sony, Panasonic, LG, Hitachi и др.) свои протоколы, а вот вся остальная масса использует один и тот же протокол. Благодаря китайским товарищам самым распространённым протоколом оказался протокол NEC. Пульты, которые я проверил:


Рис. 1

Протокол NEC

Вкратце рассмотрим что из себя представляет протокол NEC (информация и картинки взяты с англоязычного сайта http://www.sbprojects.com/knowledge/ir/index.php):

  • 8 бит адрес и 8 бит команда (байтная организация, что удобно для программирования)

  • Адрес и команда передаются дважды (для надёжности)

  • Биты кодируются длительностью импульса:


Рис. 2

  • Вот так выглядит посылка:
Рис. 3

Первым идёт стартовый импульс длительностью 9 ms, после которого следует пауза длительностью 4.5 ms. Затем передаются 32 значащих бита (4 байта) младшим битом вперёд. Первый байт – адрес, второй байт – инвертированный адрес, третий байт – код команды, четвёртый байт – инвертированный код команды.

  • Существует расширенный протокол NEC, у которого адрес кодируется 16 битами. В этом случае вторым байтом передаётся старший байт адреса без инверсии.

  • Код команды передаётся только один раз при нажатии на кнопку пульта. Пока кнопка удерживается, каждые 110 ms передаётся код повтора, представляющий из себя последовательность: импульс длительностью 9 ms, пауза – 2.5 ms, импульс – 560 us:

Рис. 4

Схемотехническая реализация


Рис. 5

На этом стенде я отрабатывал решения, позволяющие «экономить» выводы микроконтроллера. Поэтому дисплей подключён по «однопроводному» интерфейсу. Кнопка SB1 подключена параллельно выходу TSOP тоже «для экономии».

Программная реализация

(вложение AVR_ TIC5231_1W_TSOP-TEST.zip)

RC-TSOP-TIC5231_1W.alp – тестовая программа. Инициализирует таймер, прерывания, запоминает 10 команд конкретного ДУ, присваивает им номера с 0 по 9, сохраняет их в EEPROM, считывает сохранённые коды из EEPROM при включении, ожидает посылки ДУ, при приёме отображает номер команды, адрес пульта и код команды.

TSOP_NEC.alg - приём и декодирование команд ДУ по протоколу NEC.

TIC5231_1W.alg – драйвер LCD c «однопроводным» интерфейсом.

TIC5231_TSOP.alg – процедуры вывода на LCD специфичные для тестовой программы.

Измерение длительностей импульсов и пауз производится с помощью 8-битного таймера TIMER0. Самый большой измеряемый интервал – 9 ms (стартовый импульс). Мы должны измерить его достаточно точно и при этом не вызвать переполнения TCNT0. Подсчитаем: 9 ms / 255 = 0,035 ms. Следовательно, период такта таймера не должен быть меньше 35 микросекунд. В данном примере частота процессора 4.8 МГц, таймер тактируется частотой CK/256, что соответствует периоду 53,3 мкс. Константы _1_ms... _9_ms заданы именно для такой конфигурации.

Процедура приёма команды ДУ инициируется прерыванием Pin_Change. В процессе приёма используется глобальная 32-битная переменная RC_Cod, расположенная в области «неудобных» (<r16) регистров. Если переместить её в область «удобных» (>r15) регистров, то можно сэкономить 2 слова. Каждый принятый бит помещается в 0 бит RC_Cod и сдвигается влево. В результате после приёма кода:

RC_Cod3 = Адрес,

RC_Cod2 = ^Адрес,

RC_Cod1 = 0,

RC_Cod0 = Код команды.

Далее проверяется глобальная байтовая переменная RC_Address. Если она равна нулю, то считается, что адрес не задан и происходит нормальный выход из прерывания. Если она не равна нулю, то происходит её сравнение с байтом RC_Cod2. Если они равны, то происходит нормальный выход из прерывания. Иначе считается, что это команда не нашего пульта и перед выходом из прерывания RC_Cod0 обнуляется. 

После приёма каждого «кода повтора» RC_Cod0 копируется в RC_Cod1. Такой простой приём позволяем реализовать нам два режима опроса канала ДУ. Дело в том, что даже короткое нажатие на кнопку пульта сопровождается несколькими «кодами повтора» (с периодом 110 ms). Для того чтобы не загромождать программу процедурами типа «подавление дребезга контактов» в тех случаях, когда нам нужно зафиксировать только сам факт нажатия на кнопку, используется переменная RC_Cod0. В общем виде алгоритм опроса канала ДУ выглядит следующим образом:

Рис. 6

В данном примере переменная RC_Cod0 примет значение отличное от нуля только один раз – при нажатии на кнопку пульта. Если в алгоритме на рис.6 заменить RC_Cod0 на RC_Cod1, то переменная RC_Cod1 будет принимать значение отличное от нуля каждые 110 ms, пока нажата кнопка пульта.

Для чего нужна кнопка SB1. Если удерживать эту кнопку во время включения, то принудительно запустится процесс обучения для нового пульта ДУ (или переобучения для старого).


Возврат к списку