Как узнать протокол пульта ду

Обновлено: 29.11.2022

Следующая периферия микроконтроллера PIC, которую мы начнём сегодня изучать — это модуль CCP, чья аббревиатура расшифровывается как CAPTURE/COMPARE/PWM (Захват / сравнение / ШИМ). Таких модулей в нашем контроллере два и у каждого модуля разное назначение.

Compare (сравнение) не следует путать с аналоговым компаратором, для этого есть отдельный модуль.

Каждый модуль CCP содержит 16-разрядный регистр CCPx, который может использоваться для захвата, сравнения, а также для ШИМ, только для ШИМ он будет делиться на два восьмиразрядных.

Оба модуля CCP всегда работают в паре с определёнными таймерами, тем самым расширяя функционал последних. Причём каждый режим работы модуля CCP согласуется только с определённым таймером

Захват TIMER1
Сравнение TIMER1
ШИМ TIMER2

Также мы можем использовать одновременно оба модуля. Вот комбинации использования модулей и также условия данного использования

Условия совместного использования

У каждого из модулей CCP есть регистр управления CCPxCON (CCP1CON и CCP2CON).

Рассмотрим назначение его битов


7-6: не используются.

5-4: CCPxX:CCPxY (PWM Least Significant bits): Младшие биты длительности импульса ШИМ. В режимах захвата и сравнения не используются. В режиме ШИМ здесь находятся 2 младших бита длительности импульса. Остальные 8 старших бит (так как ШИМ 10-разрядный) находятся в регистре CCPRxL.

3-0: CCPxM3:CCPxM0 (CCPx Mode Select bits): Режим работы модуля CCP. Возможны следующие комбинации данных битов:

0000: модуль выключен (сброс модуля CCPx);

0100: Захват по каждому заднему фронту;

0101: Захват по каждому переднему фронту;

0110: Захват по каждому 4-му переднему фронту;

0111: Захват по каждому 16-му переднему фронту;

1000: Сравнение. Устанавливается выходной сигнал (устанавливается флаг CCPxIF);

1001: Сравнение. Выходной сигнал сбрасывается (устанавливается флаг CCPxIF);

1010: Сравнение. На выходной сигнал влияния не происходит (устанавливается флаг CCPxIF);

1011: Сравнение. Триггер специальных функций (устанавливается флаг CCPxIF);

11xx: Режим ШИМ.

Дальше идут регистры, которые используются в отдельных режимах.

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

Захват может происходить по четырём видам событий, которые мы уже увидели в настройках битов 3-0 регистра CCPxCON.

После того, как произойдёт захват, флаг CCPxIF будет установлен и должен быть сброшен программно.

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

Ещё при возникновении события захвата значения регистра TMR1 переписывается в регистровую пару CCPRx.

В режиме захвата ножка порта, отвечающая за захват определённого модуля CCP, должна быть настроена установкой одноимённого бита TRIS в 1.

Посмотрим структурную схему модуля CCP в режиме захвата


Для использования режима захвата таймер 1 должен работать в режиме таймера или в режиме синхронного счётчика. В режиме асинхронного счётчика режим захвата работать не будет.

Чтобы изменить режим работы модуля, необходимо запретить от него прерывания с помощью сброса бита CCP1IE (регистр PIE) в 0. После того, как мы изменим режим работы модуля CCP, прежде чем установить заново бит, разрешающий прерывания, необходимо сбросить флаг CCPxIF.

Также мы можем воспользоваться предделителем, встроенным в модуль CCP. Воспользоваться мы им можем, выбрав определённую комбинацию битов CCPxM3:CCPxM0.регистра CCPxCON. Его целесообразно использовать, когда частота входных импульсов постоянна.

В принципе, знакомство с модулем CCP и его режимом захвата мы вроде бы завершили.

И прежде чем перейти к нашему проекту, мы ещё должны будем познакомиться с принципом работы ИК-пультов, приёмника сигналов от него, а также с используемыми протоколами передачи данных таких пультов.

Передача данных способом инфракрасного излучения, а также управление устройствами с помощью такой передачи данных, используются повсеместно. Именно такой способ передачи данных для дистанционного управления различными устройствами был выбран по причине того, что ИК-излучатели (ИК-светодиоды) экономичны, безынерционны и недороги. Также приёмники ИК-сигналов имеют те же самые характеристики. Есть ещё очень немало плюсов такой передачи — низкое влияние на здоровье людей, также невозможность проходить сквозь стены позволяет не оказывать помехи на другие устройства, а ещё ИК-лучи невидимы и не отвлекают нас от других забот. Вот сколько плюсов.

Сигналы по ИК-интерфейсу передаются как правило на частоте 30-50 кГц. Это несущая частота. В неё уже модулирован цифровой последовательный сигнал. Задача приёмника — извлечь его из несущей частоты. Затем мы уже цифровой сигнал, усиленный до определённой величины, подаём от приёмника какой-нибудь ножке порта и начинаем исследовать данный сигнал. Это делается либо программным путём либо так, как мы будем делать на данном занятии — путём использования ножки захвата таймера.

Цифровой последовательный сигнал, передаваемый от ИК-пульта бывает нескольких типов, поэтому также существует несколько протоколов. Данных протоколов очень много, но больше всего используются протоколы RC-5 и NEC, причём последний гораздо чаще. Поэтому мы пока и остановимся на данных протоколах, а в проекте будем использовать только последний, так как он больше всего используется и гораздо проще в распознавании с помощью захвата таймера, который может работать только по одному типу изменения сигнала (фронту или спаду).

Тем не менее мы всё же познакомимся и с протоколом RC-5, и с него мы и начнём.

В протоколе RC-5 каждая посылка включает в себя 14 информационных бит.

Это 2 стартовых бита (или 1 для протокола RC-5X). Данные биты всегда равны 1. Затем идёт 1 управляющий бит. Его значение меняется при каждой посылке, чтобы распознать чётность, так как посылок может быть несколько, если мы будем удерживать кнопку. Этот бит придуман для того, чтобы определить, что это идёт код от той же кнопки. Затем идут 5 бит адреса устройства. А по окончанию следуют 6 бит кода команды (или 7 для протокола RC-5X).

Каким же образом отличаются биты друг от друга (0 от 1)?

Отличие у них следующее. Под каждый бит отводится определённое время, то есть время на передачу 0 и 1 одинаковое. Только в случае передачи 1 происходит переход из уровня 1 в 0 (спад), а в случае 0 — переход из 0 в 1 (фронт). Поэтому прежде чем передать определённый бит, мы должны в начале периода подготовить сигнал, то есть если передаём 1 — то установить уровень 1, а если 0 — уровень 0. Но если у нас в данный момент уровень сигнала уже соответствует требуемому, то мы с уровнем ничего не делаем. Следует учесть, что в передатчике биты передаются наоборот, а в приёмнике они инвертируются, и всё вышесказанное относится именно к приёмнику.

Давайте посмотрим сначала отдельно, как передаётся бит 0


А вот так передаётся бит 1


То есть если после 1 будет передаваться опять 1, то в начале периода передачи 2-го бита установится сигнал в 1. А если после 1 будет передаваться 0, то уровень сигнала в начале периода передачи 2-го бита не изменится.

Хотя мы сегодня будем писать проект под протокол NEC, мы всё равно посмотрим, как именно работает и протокол RC-5.

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

Следует отметить также немаловажное преимущество отладочной платы, которую мы используем — это наличие в ней ИК-приёмника


Цифровой выход с данного приёмника подключается к ножке RC2 через перемычку


Вот эта перемычка на плате


Также, как мы все знаем, одним из условий того, чтобы поработать с передачей информации по ИК-интерфейсу, является наличие ИК-пульта дистанционного управления. Обычно в подобных уроках я всегда наблюдаю работу с пультами, которые присутствуют в стандартных наборах Arduino и прочих наборах. Я решил сломать эти стереотипы и не стал покупать такой пульт, а воспользовался готовыми, то есть теми, которые у меня есть в наличии. Нашлось таких целых 7 пультов при условии, что это ещё не все мои пульты. Причём оказалось так, что они все передают с помощью протокола NEC.

Но как же нам тогда поиграть с протоколом RC-5?

Однажды, путешествуя по одному из известных гипермаркетов в нашем областном центре, я набрёл на один дистанционный пульт, который стоил почти 500 рублей, но в тот момент была скидка и он стоил 100 рублей. Грех было его не приобрести. Также меня подкупила надпись, что он может управлять одновременно 12-ю устройствами. С ним также было руководство по эксплуатации, в котором всё подробно описывать, как менять коды устройств. Правда, ни к одному из существующих бытовых и прочих устройств, находящихся у меня в наличии, данный пульт я так и не приспособил, цена вопроса себя окупила с лихвой. Изменяя различные коды устройств, можно было поработать с разными протоколами, что меня даже больше заинтересовало, чем использование пульта по его прямому назначению.

Выглядит данный пульт следующим образом


Так что если встретите такой пульт по приемлемой цене, то берите. Поиграться хватит вдоволь.

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


Также подключим к логическому анализатору общий провод


Теперь мы можем, вообще не используя контроллер посмотреть изменение сигнала на цифровом выходе ИК-приёмника.

Переведём наш пульт на код 102 и нажмём, например, на кнопку POWER, направив пульт на приёмник, запустив перед этим программу логического анализа, в результате чего получим следующий график


Вот такой вот, казалось бы на первый взгляд, нехитрый график. Следуя разъяснению протокола, попробуем разобрать данный код


Теперь, я думаю, всё прояснилось.

Я, в принципе, придумал, как можно отследить данный код, используя захват только по одному фронту, только данный код получился очень нетривиальный, поэтому демонстрировать его я лучше не буду. Возможно, я напишу урок по такому протоколу для контроллеров STM, в которых мы уже дошли до таких контроллеров, в которых можно одновременно отлавливать оба типа фронтов.

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

Купить программатор (неоригинальный) можно здесь: PICKit3

Купить программатор (оригинальный) можно здесь: PICKit3 original

Отладочную плату PIC Open18F4520-16F877A можно приобрести здесь: PIC Open18F4520-16F877A

Дистанционный пульт управления телевизором – одно из наиболее уязвимых устройств в нашем доме. Пульт подвержен регулярным падениям, физическому давлению, загрязнению и другим видам воздействия, плохо влияющим на его функционал. В конце концов он попросту выходит из строя, и мы вынуждены искать для него замену, которой обычно становится универсальный пульт для телевизора. Для его удобного подключения к нашему ТВ может понадобится специальный код, связывающий два устройства друг с другом. Каким образом узнать код пульта ДУ для нашего телевизора, и какие инструменты в этом помогут? Расскажем в нашем материале.

Что нужно знать о коде пульта ДУ?

Как известно, пульты управления телевизорами используют способ связи, именуемый импульсной кодовой модуляцией. Каждой команде следующей из вашего пульта на приёмник ТВ присваивается какая-либо 3-битная (обычно) последовательность. Например, для включения телевизора используется последовательность 000, для увеличения громкости – 011 и так далее. С помощью таких команд происходит управление телевизором с помощью пульта дистанционного управления.

При поломке старого пульта ДУ владелец ТВ обычно покупает взамен старого универсальный пульт ДУ, который необходимо настроить под нужную модель телевизора. Для такого сопряжения используются специальные коды, составляющие от 2 до 5 цифр (наиболее часто это 3 цифры). После отправки такого кода с пульта на телевизор последний опознаёт такой пульт как свой, и вы сможете в дальнейшем пользоваться данным пультом для управления вашим TV.

Проблемой может стать поиск такого кода, так как данная информация для несведущего пользователя может выглядеть сложной и недоступной. Как мы покажем ниже, есть специальные источники, где можно получить данный код пульта ДУ от телевизора, и использовать его для программирования вашего пульта.

Изучите инструкцию к вашему ТВ и пульту управления

Занявшись поиском кода к пульту ДУ рекомендуем, прежде всего, изучить инструкцию к вашему телевизору. Некоторые мануалы имеют довольно подробный характер, и вы сможете узнать там код подключения универсального пульта к телевизору.

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

Вы сможете найти и загрузить руководство пользователя, в котором отыщите коды сопряжения пульта с вашим телевизором. Но если ваш ТВ-приёмник был изготовлен после изготовления пульта (бывает и такое), то в мануале может не оказаться работающего кода пульта дистанционного управления. В этом случае рекомендуем использовать сетевые сервисы для поиска кода, доступные онлайн.

Сетевые сервисы с кодом пульта для телевизора

В сети представлено несколько сетевых сервисов, позволяющих найти нужный код пульта для телевизора онлайн. Обычно поиск в них выполняется по марке телевизора, а в случае популярных и распространённых брендов (Samsung, Philips, LG и других), вы можете обнаружить сразу с десяток кодов для пульта ДУ. В этом случае будет необходимо попробовать их все, пока не найдёте работающий вариант.

К примеру, набор таких кодов может выглядеть вот так:

Здесь вы найдёте полный набор кодов от 2 до 5 символов, в частности:

Перейдя по каждой из данных ссылок, вы найдёте многообразие кодов для всех возможных моделей ТВ, которые и сможете использовать для программирования вашего пульта ДУ. Несмотря на то, что в большинстве ТВ используется 3х-значный код, попробуйте также 4х-значный и другие альтернативы, пока не отыщите работающий аналог.

Среди других сетевых сервисов с кодами для универсальных пультов ДУ отметим следующие:

Как использовать код пульта ДУ от телевизора

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

В частности, такая процедура может выглядеть следующим образом:

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

Если вы испытываете проблемы с английским языком, рекомендуем воспользоваться автопереводом страницы, предлагаемыми браузерами Хром или Яндекс. Или использовать Гугл Переводчик для перевода шагов по настройке подключения пульта.


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

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

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

Пульт дистанционного управления при нажатии кнопки формирует кодовую последовательность, которой модулируется световой поток, излучаемый инфракрасным светодиодом. На практике в пультах ДУ используются три вида модуляции [1] (таблица1).

Таблица 1. Виды модуляции в пультах ДУ

Вид модуляции

1. Двухфазное кодирование (ДФК). Наличие фронта импульса в середине интервала передачи бита соответствует логической единице, а наличие среза импульса логическому нулю.

2. Модуляция длительностью пауз (МДП). Длительность импульсов постоянная. Паузы большей длительности соответствует логической единице, меньшей длительности - логическому нулю.

3. Модуляция длительностью импульса (МДИ). Длительность пауз постоянная. Импульсы большей длительности соответствуют логической единице, а меньшей длительности - логическому нулю.

Посылаемый пультом пакет световых импульсов состоит из заголовка и информационного поля. Заголовок, как правило, представляет собой импульс. Его длительность импульса и следующей за ним паузы позволяют определить тип используемого протокола. Информационное поле содержит биты адреса и команды. Число битов адреса и команды, а также порядок их размещения в информационном поле зависит от типа протокола. Адрес, формируемый пультом, всегда постоянный и не зависит от нажатой кнопки. Устройства разного типа, как правило, имеют отличающиеся адреса, что позволяет исключить одновременное их срабатывание от одного пульта при одинаковом протоколе обмена. Код команды наоборот определяет нажатую кнопку и для разных устройств может быть одинаковым. Таким образом, несовместимость пультов управления от разных устройств может быть обусловлена либо отличием протоколов, либо отличием адресов при одинаковых протоколах. В таблице 2 приведены структуры информационных полей некоторых протоколов систем дистанционного управления [1, 2].

Таблица 2. Структуры информационных полей протоколов ДУ

Структура информационного поля

В том случае, если кнопка пульта нажата и удерживается, вслед за основным пакетом передается последовательность повтора (рис.1), которая может представлять собой:

повторение основного пакета;

только заголовок основного пакета с измененной длительностью паузы;

информационное поле (или только команда) основного пакета без заголовка.

Рис.1. Вид сигнала пульта ДУ при удержании кнопки

Временные параметры указанных выше протоколов приведены в таблце 3.

Таблица 3. Временные параметры протоколов ДУ

Последовательность повтора

Только заголовок с паузой 2,25 мс

Заголовок и сигнал лог. 1

Только команда

Пакет целиком

Пакет целиком

Две лог. 1 и бит управл.

Пакет целиком

Для идентификации типа используемого протокола и определения кодов адреса и команд разработан анализатор сигналов пульта дистанционного управления. Он представляет собой аппаратно-программное устройство, состоящее из PC -совместимого персонального компьютера, DAQ -платы типа NI PCI 6251 компании National Instruments и интегрального фотоприемника типа BRM -1020 (рис.2).

Рис.2. Структурная схема анализатора

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

Программное обеспечение анализатора разработано в среде графического программирования LabVIEW [3]. На рис.3 показан интерфейс пользователя. Изображение импульсной последовательности выводится на графический индикатор для визуального наблюдения. По виду сигнала можно убедиться в работоспособности пульта управления и предварительно оценить тип используемого в нем протокола.


Рис.3. Интерфейс пользователя программного обеспечения анализатора

В табл.4 приведены параметры сигналов для некоторых пультов ДУ, определенные с помощью анализатора. Полученные результаты показали широкую распространенность протокола NEC .

Идея родилась после изготовления электропривода для рулонных штор, разработанным автором АСЕ, за что ему отдельное спасибо. Ссылка на проект.

Навыков в программировании нам не понадобится, можно обойтись и без навыков пайки если использовать монтажные соединительные провода.
Например такие

Что нам понадобится:
Wemos D1 mini (чтобы потом не заморачиваться с блоком питания используем ЗУ от сотового и минимальные размеры)

приемник на 433 МГц SRX882

ИК приемник 38 кГц (любой 1. VS1838 2. TSOP31238 (TSOP1738) 3. Из набора для Arduino

Соединяем все по схеме:

Укладываем все в коробочку из под tic tac направив ИК приемник наружу в нужном нам направлении и вырезав дырку под разъем USB.

Приступаем к прошивке:
Скачиваем с официального сайта Tasmota последний релиз прошивки для ESP8266 tasmota-sensors.bin и прошиваем наш Wemos D1 mini.
(как прошить ESP не описываю, в интернете 1000 примеров)

Скачиваем с github официальный прошивальшик Tasmotizer x64 или x32 под Вашу операционку.
ссылка
Запускаем.

Подключаем ESP через USB (желательно 2.0, первый раз надо подождать пока установятся драйвера).
Если устройство подключено, выбираем com порт (Select port) на котором определилась ESP.
В Select image ставим галочку на Release и выбираем ниже tasmota.bin
Нажимаем кнопку Tasmotizer! и ждем окончания прошивки.
После окончания прошивки сбрасываем устройство или передергиваем питание.
Подождав секунд 5 (пока устройство перезагрузится) нажимаем кнопку Send config

Ставим галочку на WiFi, вводим имя своей сети и пароль, нажимаем Save.
Cбрасываем устройство или передергиваем питание. Ждем 5 сек.
Нажимаем в Tasmotizer кнопку Get IP, копируем IP адрес, вставляем в браузере и в строку адреса, переходим по адресу и радуемся главному меню Tasmota!

Если вместо IP адреса Вы увидели XX.XX.XX.XX, значит вы не подождали 5 сек (ESP не успела перезагрузится, подключиться к Вашему роутеру и получить IP адрес) или что то пошло не так.


Настройка WiFi по классике:
Берем в руки смартфон, включаем WiFi (если не включен), лезем в Настройки -> WiFi и подключаемся к сети Tasmota_ХХХХХХ-ХХХХ, где X цифра или буква от А до F.
Смартфон предложит авторизоваться (если этого не произошло, то открываем браузер и в строке адреса набираем 192.168.4.1), переходим на страницу авторизации.

Выбираем сверху свою сеть (или вводим имя сети) и вводим пароль. Нажимаем Save.
Смартфон отключится от сети и подключится к вашей домашней сети.
Жмем в Tasmotizer кнопку Get IP, что бы узнать IP адрес.

Подключаем к сети WiFi наш Wemos D1 mini и заходим в веб интерфейс.

Конфигурируем под нашу собранную схему:
Нажимаем Configuration далее Configure Module
конфигурируем пины к которым подключены приемники
D1 — GPIO5 -> IRrecv
D2 — GPIO4 -> RFrecv

Сохраняем настройку, устройство перезагрузится.
В главном меню нажимаем кнопку Console
Попадаем в консоль:

Берем в руки пульт и начинаем нажимать на нужные нам кнопки внимательно смотря в консоль.
Нас интересуют коды кнопок!

В примере у меня первые 2 строки от радио пульта на 433 МГц (кнопки А и В, пульт на картинке топика), вторые 2 строки от пульта ДУ телевизора LG (громкость + и -).
Значение Data это код кнопки который нам нужен!

Создаем правило реакции на полученный код!
В консоли пишем:

Нажимаем Enter
Активируем это правило. Пишем:


Синтаксис Rule:

Примеры WebSend:
example 1: отправит как
example 2: отправит как
Более подробно на Tasmota Rules.

Что имеем:
При нажатии на пульте кнопки А принимается код 0x6864A8 и на IP адрес 192.168.1.108 отправляется GET запрос open, при нажатии кнопки В на код 0x6864A2 туда же шлем close.

Пока работа над проектом Управление любым ИК-пультом не закончена, я решил выделить некоторые решения в отдельные заметки (под проекты), тем более, что часть из них уже не будет включена в проект.

Сегодня я расскажу об алгоритме обработки ИК-посылок. (Ранее я уже описывал один из возможных вариантов декодирования ИК-посылок Работаем с ИК пультом).

Аппаратная часть

ИК-приемник я буду использовать самый дешевый и способный работать при низком напряжении питании (от 2,5 до 5,5 В) TSOP31236 (26 рублей):

image

Использовать можно на любую из отладочных плат STM8/STM32 серии Discovery.

Протоколы ИК-пультов

Форматов посылок (протоколов) формируемых ИК-пультами различной бытовой аппаратуры очень много.

Основные отличия протоколов:

  • различия в кодировании “0” и “1”
  • различные длины посылок
  • различия в командах автоповтора

Например вот такие сигналы генерирует один из моих пультов (как записать сигналов читаем тут Запись сигналов IR-пульта на звуковую карту):

image

Больше всего формат посылок похож на Extended NEC protocol:

image

Я составил таблицу для сравнения протоколов (конечно она не полная, здесь только, что я нашел):

image

Как видим написать программу способную декодировать все протоколы довольно сложно, слишком уж большая разница между ними.

Особенно, если ещё учесть, что и количество длительностей импульсов (как для кодирования импульсов синхронизации, так и кодировании “0” и “1”) значительно больше двух.

Однако, для текущей задачи (управление) необходимо просто “принимать” и однозначно идентифицировать посылки с любого пульта, это позволяет очень сильно упростить алгоритм обработки.

Два ключевых момента в алгоритме:

Первый.

Примечание: Импульс — временной отрезок между одинаковыми фронтами выходных сигналов ИК-приемника.

Была принята следующая последовательность импульсов .

1) Первое значение посылки используется только для сравнения и не сохранятся;

Второй.

У полученной последовательности отсекать слева N-бит (я выбрал три бита, в них попадает преамбула и бит повтора) и если кол-во принятых бит больше 64, то использовать только последние 64 бита. Полученную последовательность для экономии памяти “ужимать” до двух байт используя циклический избыточный код (CRC16) (хэш-код).

Алгоритм обработки (декодирования) посылок с ИК-приемника

Для декодирования посылок ИК-приемника используется один таймер.

Таймер должен иметь канал захвата с внешней линии ввода-вывода.

image

Диаграмма сигналов для пояснения работы:

image

Примечание к рисунку:

1) Счетчик ведет счет в сторону увеличения значений счетного регистра. 2) По приходу спадающего фронта (можно изменить на нарастающий, если выходной сигнал с ИК-приемника не инверсный, хотя в целом считаю, что направление захвата не влияет на работу алгоритма) происходит захват значения счетного регистра таймера и генерируется соответствующее прерывания. 2.1) В обработчике прерываний считывается захваченное значение и сбрасывается счетчик. 2.2) Полученные длительности импульсов (в тиках таймера) делятся на две группы: импульсы короче 10 мс, считаются информационными (т. е. содержат информацию о коде клавиши), а импульсы которые длиннее 10 мс или равные нулю, принимаются за разделители посылок (т. е. обозначают начало посылки). 3) Если в течении 20 мс не был принят спадающий фронт выходного сигнала с ИК-приемника, то формируется прерывание по сравнению (второй канал таймера). Данное событие используется для фиксации момента окончания приема посылки.

Исходный код

Алгоритм был опробован на микроконтроллере STM8S003F3, таймеры у него самые простые, что однозначно позволит реализовать данный алгоритм на других микроконтроллерах STM8/STM32.

Настройка таймера (используется стандартная библиотека периферии от ST):

Микроконтроллер тактируется от встроенного RC-генератора на 16 МГц.

Обработчик (захват и переполнение):

Получение последовательности из входных импульсов:

Окончание приема посылки (по таймауту) и получения хэш-кода посылки (“сжатие”):

Прием посылок и формирование событий.

На мой взгляд обработка принятых посылок занимает значительно больше времени, чем сам прием (декодирование), что может повлиять на прием посылок (пропуск, ошибки и п.р.).

Попробую объяснить как это работает (временной масштаб не соблюден):

image

Самый простой вариант, когда обрабатывается только одна посылка.

После приема устанавливается флаг окончания приема посылки (ir_decoder.is_received).

image

Вариант по сложнее, когда обрабатывается две разных посылки.

Читайте также: