ESP32 Урок 53. RMT. WS2812B. Лента на умных светодиодах RGB. Зажигаем светодиоды



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

Схема урока осталась без изменений: светодиодная лента, плата с контроллером ESP32 и логический анализатор на случай мониторинга сигнала

Подключим плату с контроллером к USB-порту компьютера, также к нему подключим анализатор и подадим питание на ленту с помощью DC/DC-преобразователя, не забыв перед подключением его к ленте выставить необходимое напряжение (не более 5 вольт), и займёмся проектом, который был сделан из проекта прошлого урока с именем WS2812_INIT и получил новое имя WS2812.

Откроем наш проект в Espressif IDE и для начала немного подправим ошибки.

В файле led_strip.c в функции rmt_encode_led_strip присвоим адрес указателю

 

 

Также для того, чтобы настройки из файла sdkconfig.defaults применились, удалим файл sdkconfig, чего мы не сделали на прошлом уроке.

Теперь пересоберём наш проект.

Перед тем как работать со свечением ленты, нам желательно отправить такие данные, чтобы все светодиоды в ней перестали светиться, то есть очистить её. В файле led_strip.c выше функции rmt_new_led_strip_encoder добавим функцию для очистки ленты

 

 

Здесь мы проверяем валидность входящего аргумента и с помощью поля переменной свойств ленты вызываем функцию led_strip_rmt_clear.

Объявим в заголовочном файле на нашу функцию прототип и вызовем её в функции configure_led файла main.c

 

 

Вернёмся в файл led_strip.c и в функции led_strip_rmt_clear создадим переменную типа глобальной структуры и передадим ей указатель из входящего аргумента

 

 

Забьём нулями буфер

 

 

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

 

 

Объявим переменную типа структуры свойств канала передачи и обнулим поле времени передачи в цикле

 

 

Включим канал передачи

 

 

Передадим буфер в канал RMT

 

 

Дождёмся окончания передачи и отключим канал

 

 

Соберём код, прошьём контроллер и мы должны увидеть, что в лента нашей не будет светиться ни один светодиод. Правда проверить это смогу пока, видимо, только я, так как у меня уже прошит конечный проект с бегущими огнями

 

Перейдём в файл main.c и добавим функцию, которая будет зажигать разными цветами наши светодиоды на ленте

 

 

Мы будем использовать только три варианта свечения ленты, поэтому число n — это номер варианта.

 

 

Вызовем нашу функцию в цикле в функции app_main с небольшой задержкой

 

 

Вернёмся в функцию blink_led и создадим три переменных для цветов и, в зависимости от варианта, назначим основной цвет

 

 

Интенсивность свечения мы выставим 5, чтобы светодиоды не светились слишком сильно.

Теперь, прежде чем зажигать светодиоды, нам нужна будет функция, поэтому перейдём в файл led_strip.c и выше функции led_strip_clear добавим такую функцию

 

 

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

Ниже добавим ещё одну подобную функцию для работы с другим форматом пикселя

 

 

И ниже также добавим функцию для отправки буфера в ленту

 

 

Ниже функции led_strip_clear добавим функцию удаления ленты

 

 

Объявим на эти четыре функции прототипы в заголовочном файле и в функции led_strip_rmt_set_pixel получим адрес входящего аргумента и проверим количество светодиодов

 

 

Получим адрес буфера байтов цветов пикселей

 

 

Занесём байты пикселей по полученному адресу

 

 

Если байтов на пиксель в свойствах ленты более трёх, то в остальные занесём нули

 

 

 

Аналогичный код будет и в функции led_strip_rmt_set_pixel_rgbw, только здесь будет ещё один байт белого цвета

 

 

Осталось дописать нам только функцию led_strip_rmt_del, в которой для начала также получим наш указатель, а затем проверим поле номера канала и поле энкодера

 

 

Очистим указатель

 

 

Перейдём в main.c и в функции blink_led заполним в буфере цвета всех 144 светодиодов и вызовем функцию передачи в ленту

 

 

Соберём код, прошьём контроллер, и увидим, что цвет наших светодиодов будет циклично меняться по кругу

 

 

Также мы видим, как передаются данные в ленту в программе логического анализа

 

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

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

 

 

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

 

Исходный код

 

 

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

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

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

Ленты светодиодные WS2812B разные можно приобрести здесь WS2812B

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

 

 

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

ESP32 RMT. WS2812B. Лента на умных светодиодах RGB. Зажигаем светодиоды

 

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

ESP32 NaRMT. WS2812B. Лента на умных светодиодах RGB. Зажигаем светодиодыme

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

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

*