Декодер инфракрасных сигналов на микроконтроллере PIC и TSOP


Инфракрасная связь (infrared, IR) – это один из самых простых и дешевых способов беспроводной передачи данных. Дальность связи при этом невелика, но ее вполне хватает для различных проектов автоматизации дома, управления телевизорами и т.д. В данной статье мы рассмотрим создание декодера инфракрасных сигналов под управлением микроконтроллера PIC. Поскольку готовых библиотек для решения этой задачи практически не существует, то автор данного проекта (ссылка на оригинал приведена в конце статьи) разработал для этой цели свою собственную библиотеку.

Внешний вид декодера инфракрасных сигналов на микроконтроллере PIC

Ранее на нашем сайте мы рассматривали и другие проекты с применением инфракрасной связи:

Необходимые компоненты

  1. Микроконтроллер PIC16F886 (купить на AliExpress).
  2. Инфракрасный приемник (IR Receiver) TSOP1838 (купить на AliExpress).
  3. Программатор PICkit 3 (купить на AliExpress).
  4. Резистор 4,7 кОм (купить на AliExpress).
  5. Модуль FTDI UART.
  6. Пульт ДУ (автор использовал NEC).
  7. Макетная плата.
  8. Соединительные провода.

Внешний вид компонентов, необходимых для нашего проекта, приведен на следующем рисунке.

Внешний вид компонентов, необходимых для нашего проекта

Различные типы протоколов инфракрасной связи и способы их декодирования

Существуют различные типы протоколов инфракрасной связи (IR protocols), но наиболее популярными среди них являются NEC Remote Protocol и RC5 Remote Protocol. В данном проекте мы будем рассматривать протокол NEC. Для предотвращения помех данный протокол использует несущую частоту 38 кГц, которая модулируется цифровыми сигналами. Данный процесс более наглядно представлен на следующем рисунке.

Принцип модуляции сигналов в протоколе NEC инфракрасной связи

А на экране осциллографа это выглядит следующим образом:

Вид сигнала инфракрасной связи на экране осциллографа

Когда вы нажимаете какую либо кнопку на пульте ДУ (дистанционного управления) инфракрасный генератор (IR Blaster) передает поток данных, который принимается и обрабатывается приемником, который представляет собой специальную микросхему, осуществляющую демодуляцию сигнала (то есть снимается закон модуляции несущей) и дальнейшее его декодирование. Внешний вид принимаемого приемником сигнала выглядит следующим образом:

Внешний вид принимаемого инфракрасным приемником сигнала в протоколе NEC

Как можно видеть из представленного рисунка, инфракрасный сигнал в протоколе NEC начинается со стартового импульса длительностью 9 мс, за которым следует инвертированный импульс длительностью 4,5 мс. Приняв эти два импульса мы можем быть уверенными в том, что следом за ними будут передаваться данные. Для распознавания следующих данных используется информация об их длительности. Каждый импульс в последовательности имеет длину 562.5 мкс, передаваемых на несущей частоте 38 кГц. Для логического 0 за импульсом длительностью 562.5 мкс и уровнем high следует импульс такой же длительности уровнем low. Таким образом, общее время передачи сигнала логического 0 составляет 1125 мкс. Для логической 1 за импульсом длительностью 562.5 мкс и уровнем high следует импульс с уровнем low длительностью 1687 мкс (562.5 x 3). Таким образом, общее время передачи сигнала логической 1 составляет 2250 мкс.

Инфракрасный приемник TSOP38238

Приемник TSOP38238 содержит специальную микросхему, которая демодулирует приходящий сигнал (снимает закон модуляции несущей) и декодирует принимаемые данные с помощью встроенного PIN диода, предварительного усилителя и полосового фильтра. Внешний вид инфракрасного приемника TSOP38238 и его структурная схема показаны на следующем рисунке.

Внешний вид инфракрасного приемника TSOP38238 и его структурная схема

Когда вы нажимает кнопку на пульте ДУ инфракрасный светодиод (IR LED) испускает инфракрасный сигнал, который модулируется частотой 38 кГц (для протокола NEC). Модуляция испускаемого светового потока необходима потому что Солнце также испускает инфракрасный свет и если бы не было модуляции, то свет Солнца мог бы создавать серьезные проблемы инфракрасной связи. Используя модуляцию мы можем свести эти проблемы к минимуму. После приема данных микроконтроллер или другое обрабатывающее устройство декодирует их и формирует на своем выходе результирующий сигнал.

Схема проекта

Схема декодера инфракрасных сигналов на основе микроконтроллера PIC представлена на следующем рисунке.

Схема декодера инфракрасных сигналов на основе микроконтроллера PIC"Сердцем" представленной схемы является микроконтроллер PIC16F886, работающий на тактовой частоте 16MHz. Модуль FTDI UART в схеме используется для процесса отладки и передачи данных через последовательный порт в компьютер. Подтягивающий резистор используется для "подтягивания" контакта MCLR микроконтроллера до уровня VCC. Значение сопротивления этого подтягивающего резистора может быть в диапазоне 4.7-10 кОм. Для приема инфракрасных сигналов мы используем приемник TSOP1838.

Объяснение программы для микроконтроллера PIC

Полный код программы приведен в конце статьи, здесь же мы кратко рассмотрим его основные фрагменты. Для написания кода программы мы использовали MPLAB X IDE.

Первым делом в программе настроим биты конфигурации – если этого не сделать программа будет выдавать сообщение об ошибке. В некоторых из этих настройках мы выбираем источник тактовой частоты и преобразуем ее в тактовую частоту для микроконтроллера PIC. Это нельзя делать в основном коде программы потому что тактовая частота должна быть корректно сконфигурирована перед тем основной код программы начнет исполняться.

Далее зададим макрос _XTAL_FREQ. Его также необходимо задавать в начале программы.

Затем в программе подключим необходимые библиотеки. Необходимо отметить что библиотеки <xc.h>, <pic16f886.h> и <stdio.h> есть в самой MPLAB X IDE, а библиотеки “uart.h” и “IRlib.h” мы запрограммируем сами.

Далее мы напишем еще ряд макросов – для работы с периферийными устройствами и прерываниями.

После этого запрограммируем еще ряд функций. В функции INTERRUPTS_Init() мы будем разрешать все прерывания, которые нам будут необходимы в программе. В функции assign_prescaler() мы будем задавать необходимый нам коэффициент деления предделителя, а в функции init() мы будем вызывать эти две вышеописанные функции и инициализировать последовательную связь.

В основной функции нашей программы main() мы будем вызывать функцию init(), а затем функцию ir_init() из библиотеки для работы с инфракрасной связью. Далее мы будем использовать функцию printf() из библиотеки studio.h чтобы проверить работает ли printf или нет. Если работает, то мы будем выводить соответствующее сообщение в окно монитора последовательной связи. Далее проверим состояние контакта IR_SENSOR_PIN – high оно или low. Если low, то мы будем проверять поступают ли данные от инфракрасного приемника или нет.

Библиотека для последовательной связи (UART)

Данная библиотека состоит из файлов uart.h и uart.c, оба этих файла необходимо подключить в проект. Функций в этой библиотеке немного. Принцип их работы вы достаточно легко поймете если ознакомитесь со статьей про использование последовательного порта в микроконтроллерах PIC. В файле uart.h содержится объявление следующих функций:

В файле “uart.c” мы подключаем его заголовочный файл “uart. h”, далее определяем все биты, которые нам понадобятся для осуществления последовательной связи, затем объявляем функцию putch(). Для компиляторов от фирмы microchip функция putch() представляет собой специальную функцию в которой при вызове функции printf() компилятор знает о ее редиректе на функцию putch() и, таким образом, мы можем задействовать функцию printf() для компилятора xc8. Далее в функции serialBegin() мы задействуем последовательную связь. В ней мы конфигурируем контакт TX для работы на вывод данных, а RX – для работы на ввод данных. Также мы конфигурируем бит TXSTA таким образом чтобы задействовать асинхронный режим работы для UART. Затем мы настраиваем регистр состояния приема (Receive Status) и управляющий регистр (Control Register). В данной функции мы также делаем активным бит Single Receive. Для настройки необходимой скорости передачи мы используем регистр SPBRG.

Библиотека для работы с инфракрасной связью (IR library)

Данная библиотека также состоит у нас из двух файлов: IRlib.h и IRlib.c. В файле IRlib.h мы объявляем все необходимые функции и структуры. А в файле IRlib.c мы программируем все необходимые нам функции. Начинаем мы этот процесс с указания порта и контакта, к которому подключен инфракрасный датчик. Далее записываем макрос для переполнения timer0, этот флаг будет устанавливаться в 1 каждый раз при срабатывании прерывания. Мы будем определять длительность импульса с помощью этого флага. Также мы используем структуру, в которой будут храниться все поступающие данные от пульта ДУ.

Первым делом в файле IRlib.c мы подключаем все необходимые библиотеки.

Затем с помощью макроса _XTAL_FREQ укажем тактовую частоту микроконтроллера – это необходимо для корректного функционирования функций задержки в программе.

В функции ir_init() мы просто конфигурируем режим работы контакта, к которому подключен инфракрасный приемник, на ввод данных.

Далее у нас идет функция ir_result(char debug_info), которая возвращает результат приема инфракрасных сигналов. Внутри данной функции вызывается функция protocol_check(). Мы уже знаем, что за первым стартовым импульсом длительностью 9 мс следует инвертированный импульс длительностью 4.5 мс. Функция protocol_check() проверяет наличие этих двух импульсов. Затем мы проверяем значение счетчика таймера (timer counter value), если оно true, то вызывается функция read_data(), внутри которой мы формируем двоичные данные из принятых импульсов и записываем их потом в нашу структуру.

Тестирование работы проекта

Для тестирования работы проекта его автор использовал аппаратное обеспечение, показанное на рисунке ниже. Как видно из этого рисунка, он подключил FTDI и осциллограф к компьютеру по USB. FTDI модуль используется для вывода информации в окно монитора последовательной связи.

Тестирование работы проекта

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

Пример выводимых данных для нашего проекта

Более подробно работу проекта вы можете посмотреть на видео, приведенном в конце статьи.

Исходный код программы

Видео, демонстрирующее работу проекта

Источник статьи

(Проголосуй первым!)
Загрузка...
749 просмотров

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *