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



Следующая периферия микроконтроллера ESP32, которой мы сегодня коснёмся в нашем занятии  — это модуль RMT, чья аббревиатура расшифровывается как Remote Control (дистанционное управление).

Модуль RMT (Remote Control) в первую очередь предназначен для отправки и приема инфракрасных сигналов дистанционного управления, реализующих двухпозиционную манипуляцию на несущей частоте, но благодаря своей конструкции он может использоваться для генерации различных типов сигналов. Передатчик RMT делает это, считывая последовательные значения длительности активного и неактивного выхода из встроенного блока ОЗУ, опционально модулируя его несущей волной. Приемник проверяет входной сигнал, опционально отфильтровав его, и помещает значения промежутков времени, в течение которых сигнал активен и неактивен, в блоке ОЗУ.

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

 

 

Модуль RMT содержит восемь каналов. Каждый канал имеет и передатчик, и приемник, но только один из них может быть активен в каждом канале. Восемь каналов совместно используют блок ОЗУ размером 512×32 бит, который может считываться и записываться ядрами процессора по шине APB, считываться передатчиками и записываться приемниками. Передаваемый сигнал может дополнительно модулироваться несущей волной. Каждый канал тактируется разделённым сигналом, полученным либо из тактового сигнала шины APB, либо из REF_TICK, который также формируется из того же тактового сигнала, но через делитель.

Структура RAM модуля RMT

 

 

Досконально изучать данный модуль (прерывания, расчёты, регистры) не входит в планы данного урока, так как мы работаем с комплектом IDF, в котором всё запрятано в функциях. Тем не менее, если что-то потребуется изучить из данной периферии по ходу работы с её реализацией в коде, мы вернёмся к данному вопросу.

Мы попробуем на данном занятии принять сигнал с дистанционного пульта управления и получить код команды.

Схема наша будет состоять из платы с контроллером esp32, к которой мы подключим модуль ИК-приёмника

 

 

Хоть на рисунке и видно, к каким ножкам подключен модуль, но на всякий случай покажу нагляднее

 

 

Проект урока был создан из проекта урока 4 с именем BUTTON01 и получил имя REMCONTROL.

Откроем наш проект в ESPRESSIF IDE и из файла Kconfig.projbuild удалим пункт меню по работе с ножкой, к которой была подключена кнопка (BUTTON_GPIO). Также в данном файле ножку порта по умолчанию для светодиода выберем вторую

 

default 48 if IDF_TARGET_ESP32S3
default 2

 

В самой первую строке для приличия переименуем пункт меню

 

menu "REMCONTROL Configuration"

 

Далее добавим пункты, нужные нам впоследствии для работы с модулем, а именно тип протокола IR, также номера ножек и каналов

 

 

 

Запустим конфигуратор и выберем 4 мегабайта объёма памяти FLASH

 

 

В функции app_main файла main.c оставим только вот эти строки

 

 

Хочется также напомнить, что с ИК-портом мы работали в уроке 12 по контроллерам PIC, где мы очень подробно рассматривали протоколы NEC и RC5. Поэтому, если кто не знает о данных протоколах, то посмотрите данный урок.

Попробуем собрать наш проект. Если всё нормально собирается, то ещё создадим заголовочный файл main.h, в который соберём все подключенные заголовочные файлы из main.c, а заодно и подключим заголовочные файлы для работы с модулем RMT

 

 

Вернёмся в main.c и удалим подключение всех заголовочных файлов, а подключим только один

 

 

Если теперь мы попробуем собрать код, то он у нас не соберётся. Дело в том, что мы не увидим файла ir_tools.h, который надо будет подключить отдельно вместе с другими файлами, необходимыми для работы с библиотекой.

Из каталога C:\Espressif\frameworks\esp-idf-v4.4\examples\peripherals\rmt\ir_protocols\components\infrared_tools\include комплекта IDF в каталог main нашего проекта скопируем файлы ir_tools.h и ir_timings.h.

Затем из каталога C:\Espressif\frameworks\esp-idf-v4.4\examples\peripherals\rmt\ir_protocols\components\infrared_tools\src комплекта скопируем все файлы также в каталог main нашего проекта.

После копирования проект также может не собраться, поэтому надо будет подправить файл CMakeLists.txt, также находящийся в каталоге main нашего проекта

 

 

Теперь точно всё соберётся.

Объявим и заполним строковый массив для работы с логами

 

 

Ниже добавим функцию задачи приёма пакетов от пульта управления

 

 

 

В функции app_main установим низкий уровень на ножке синего светодиода и создадим задачу для приёма пакетов

 

 

Перейдём в функцию ir_rx_task и инициализируем конфигурационные параметры RMT по умолчанию для ножки и канала

 

 

При помощи специальной функции инициализации назначим размер буфера

 

 

Ноль в третьем параметре гласит о том, что флаги прерываний используются по умолчанию.

Также по умолчанию инициализируем парсер для входящих пакетов

 

 

Задействуем флаг использования расширенных ИК-протоколов для NEC и RC5

 

 

Объявим указатель для ИК-парсера

 

 

Инициализируем парсер в зависимости от используемого протокола

 

 

Выше объявим указатель на кольцевой буфер

 

 

Привяжем кольцевой буфер к каналу

 

 

Проверим буфер на ошибки

 

 

Запустим модуль

 

 

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

 

 

В бесконечном цикле начнём принимать наши пакеты.

Попытаемся принять пакет

 

 

Если пакет непустой, то изменим уровень ножки светодиода

 

 

Получим остаток от деления на 4 значения длины пакета

 

 

Получим точку входа в пакет

 

 

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

 

 

Получим скан-код после декодирования

 

 

Выведем в терминал адрес и команду в зависимости от типа протокола

 

 

Выйдем из двух условий и после синтаксического анализа данных возвратим пробелы в кольцевой буфер

 

 

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

 

 

Вот, в принципе и весь код.

Соберём код, прошьём контроллер и запустим терминал.

Пульты можно использовать любые из тех, которые работают по протоколам RC5 и NEC. Я будут использовать тот же пульт, который я использовал в уроке 12 по контроллеру PIC

 

 

По умолчанию у нас задействован протокол NEC, что видно из активных строк кода. Поэтому переключим пульт на источник SAT1.

Наведём пульт на наш ИК-приёмник и понажимаем различные кнопки.

Мы получим адреса и коды команд

 

 

Попробуем принять пакеты по другому протоколу.

Переключим протокол в конфигураторе

 

 

Пересоберём код, прошьём контроллер, переключим источник на пульте на TV1 и попробуем также понажимать какие-нибудь кнопки на пульте

 

 

Мы также получили коды команд и адресов.

Итак, на данном занятии мы познакомились с работой модуля RMT и нам удалось при помощи функционала комплекта разработчика IDF принять пакеты от пульта управления по двум протоколам и получить команды управления.

 

Всем спасибо за внимание!

 

 

Предыдущий урок Программирование МК ESP32 Следующий урок

 

Исходный код

 

Недорогие отладочные платы ESP32 можно купить здесь:

На AliExpress Недорогие отладочные платы ESP32

На Яндекс.Маркет Недорогие отладочные платы ESP32

Логический анализатор 16 каналов можно приобрести (AliExpress) здесь

Инфракрасные модули приёмника и передатчика ИК можно приобрести здесь (AliExpress) здесь

Цифровой ИК (IR) приемник можно приобрести (Яндекс.Маркет) здесь

 

 

Смотреть ВИДЕОУРОК в YouTube (нажмите на картинку)

ESP32 RMT. Работа с ИК-пультом

 

Смотреть ВИДЕОУРОК в Дзен (нажмите на картинку)

ESP32 RMT. Работа с ИК-пультом

Один комментарий на “ESP32. Урок 36. RMT. Работа с ИК-пультом
  1. shrijith jain:

    Hi Sir,

    you have done a great job providing this tutorial, I tried this to recieve IR codes of AC remote, but i am not able to receive any codes, it is not going into ir_parser function.
    Please help me out

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

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

*