Урок 5. Работа с ИК-пультом

Урок 5. Работа с ИК-пультом

Привет всем.

Наш новый урок посвящен обработке сигналов ИК-пульта. Для этого мы применим очень интересную функцию таймера – захват.

При помощи этой функции таймера становится возможным измерения длительности сигнала на входе микроконтроллера. Часто ее применяют для измерения ШИМ сигнала, но мы применим ее для декодирования данных с ИК-пульта.

Сначала давайте разберемся, что же из себя представляют эти данные.

Существует огромное количество ИК-пультов и огромное количество этих пультов использует протокол NEC.

В нашем примере мы будем использовать вот такие пульты. Пока условно их отметим как «пульт 1» 

и «пульт 2»

Нам это пригодится. Далее поймете почему.

И еще нам понадобится вот такой ИК-приемник от Ардуино.

Мы думаем, что у вас наверняка уже есть и то, и другое.

Особенность протокола NEC в том, что он несет в себе 32 бита данных. 

https://www.snrelectronicsblog.com/wp-content/uploads/2016/01/NEC-Protocol.png

Сначала идет стартовый бит обозначая начало передачи. Потом первые 8 бит – адрес получателя (TV/DVD/CD и т.д.), следующие 8 бит – инверсное значение поля адреса, потом 8 бит – команда и 8 бит инверсного значения команды. Значение каждого бита считывается от начала импульса до конца паузы между импульсами. Инверсные значения позволяют нам проверить правильность принятых данных.

Нужно помнить, что в реальности сигнал с ИК-приемника будет выглядеть инверсно. Вот как это выглядит на осциллографе.

Давайте рассмотрим сигнал поближе.

Тут хорошо видно форму стартового бита и форму битов «0» и «1». Обратите внимание, что длительность стартового бита без паузы чуть более 9 миллисекунд. В этом виновата внутренняя схема ИК-приемника. В документации на него можно найти упоминания об этом. 

Протокол NEC предусматривает небольшие колебания длительности импульсов. Значит нам нужно учитывать это при детектировании.

Давайте соберем вот такую схему.

На восьми нижних светодиодах мы будем отображать шкалу, которая будет управляться кнопками «Громкость+» и «Громкость-» (Volume+ and Volume-).

На четырех верхних светодиодах мы будем выдавать номер «канала». Управлять будем кнопками «Канал+», «Канал-» и цифровыми кнопками от «0» до «9».

Вот такой стенд у нас получился.

Перейдем к программе.

Для начала определим тип нашего пульта. В этом примере выбран «пульт 1»

Потом объявим длительности импульсов и пауз, по которым мы и будем детектировать данные.

И наконец коды кнопок ИК-пульта. Коды являются 16-и битными. В старшей части кода содержится адрес ИК-приемника, а в младшей части код кнопки. Мы не будем полностью соблюдать порядок бит в полном соответствии со стандартом протокола т.к. это не повлияет на работу.

Нам необходимо настроить таймер на работу в режиме захвата. Сделаем это вот так.

Поясним по порядку.

Режим захвата по переднему и заднему фронту импульса (both edges), вход захвата CCIxA, режим синхронного захвата, режим захвата, разрешить прерывание по событию захвата, таймаут 500 тактов опорного генератора (примерно 12 миллисекунд) для определения ошибки при детектировании, разрешить прерывание по достижению таймаута, выбираем опорный генератор 32768 Гц, непрерывный счет таймера, разрешаем прерывания от таймера и отключаем предделитель (divider) для опорного генератора.

Таймер настроен, но как им пользоваться?

Ответ прост – прерывание!

Создадим обработчик прерывания для таймера и в нем будем проводить декодирование данных.

Вот как это будет выглядеть.

Предлагаем вам самостоятельно изучить алгоритм работы обработчика прерывания. Не забывайте, что он будет выполняться с каждым переходом с «0» в «1» и с «1» в «0».

В результате, в переменной IRready мы будем иметь 3 значения:

IRNONE – данные не приняты

IRDONE – данные приняты

IRREPEAT – повтор данных при длительном нажатии на кнопку

Все хорошо, но мы еще не объяснили ядру MSP430 на каком выводе (pin) у нас подключен фотоприемник. И светодиоды.

Для этого в основном теле программы мы настроим порты ввода вывода и применим уникальным механизм ядра MSP430 – переназначение портов (port mapping).

С этого момента порт P2.0 является входом захвата для таймера.

Осталось совсем немного – запустить таймер и обработать результаты детектирования и включить нужные светодиоды.

Сделаем это так.

Кнопки «Громкость+» и «Громкость-» (Volume+ and Volume-) обрабатываются с учетом повтора при длительном нажатии, а остальные без определения повтора.

Давайте соберем и запустим наш проект.

Поздравляем! Вы научились применять важную функцию таймера – захват, научились измерять длительность импульсов, детектировать и применять сигналы с ИК-пульта.