STM Урок 142. WS2812B. Подключаем ленты количеством 150-300 светодиодов. Часть 2



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

 

Перейдём в файл ws2812.h и изменим в макросе количество светодиодов

 

#define LED_COUNT 150

 

Только это ещё далеко не всё.

Перейдём в файл ws2812.c и также добавим размер временного буфера

 

uint8_t rgb_temp[15][3];

 

Теперь у нас в каждой группе будет не по 12, а по 15 светодиодов. В каждой ленте таких будет по 10 групп, так как на 12 число 150 не делится.

Функцию ws2812_prepareValue мы также перепишем, так как количество в цикле и количество циклов у нас изменилось

 

 

Перепишем также и прототип в заголовочном файле

 

 

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

 

 

К такому же виду приведём вызов данной функции и в функции ws2812_test01 в файле ws2812.c.

И все равно, если сейчас прошить контроллер, то светодиоды последние также не будут светиться.

Чтобы они засветились, исправим функцию ws2812_setValue, добавив в неё несколько строк, а также исправив существующие под схему 10×15

 

 

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

Теперь у нас светятся все светодиоды

 

Теперь перейдём к тестам.

 

 

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

 

 

Если мы сейчас запустим наш код, то светодиоды будут светиться все, так как мы их зажгли с помощью уже исправленной функции, но последние 6 светодиодов бежать не будут, поэтому перейдём в функцию ws2812_test01 в файле ws2812.c.

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

 

for(i=0;i<149;i++)

 

Также цифру с количеством устанавливаемых битов доже прибавим

 

memcpy((void*)(BUF_DMA+48+3576),(void*)DMA_BUF_TEMP,48);

 

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

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

Перейдём в файл main.c, закомментируем первый тест и раскомментируем второй

 

 

В дальнейшем мы будем поступать таким образом со всем тестами и я повторяться не буду в том, какой тест мы будем раскоментировать, а какой комментировать. Вернёмся в файл ws2812.c и перейдём в тело функции ws2812_test02.

Здесь изменений будет немного побольше.

Во-первых инициализацию коэффициента в обоих местах мы перенесём на уровень выше, так как переменная i в расчёте коэффициента не используется

 

 

Также в обоих циклах самого нижнего уровня добавим количество итераций

 

for(i=0;i<150;i++)

 

Соберём код, прошьём контроллер.

Тест работает, все 150 светодиодов плавно и одновременно мигают

 

 

Переходим к следующему тесту — ws2812_test03.

Первым делом прибавим количество итераций также в обоих циклах

 

for(i=0;i<150;i++)

 

 

В обоих условиях меняем интервалы

 

if((i<15)||((i>=30)&&(i<45))||((i>=60)&&(i<75))||((i>=90)&&(i<105))||((i>=120)&&(i<135)))

 

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

 

ws2812_pixel_rgb_to_buf_dma(rgb_temp[i%15][0]*k/1000,rgb_temp[i%15][1]*k/1000,rgb_temp[i%15][2]*k/1000,i);

 

Прошиваем, смотрим

 

 

Переходим к тесту ws2812_test04.

Раскомментируем пока только с единичкой

 

ws2812_test04(1);

 

Первым делом в начале теста изменим количество итераций в циклах обоих вложенностей

 

for(j=0;j<10;j++)

{

 for(i=0;i<15;i++)

 

Ближе к окончанию тела тоже изменим количество итераций в двух циклах

for(jj=0;jj<150;jj++)

{

  memcpy((void*)DMA_BUF_TEMP,(void*)(BUF_DMA+48),48);

  for(i=0;i<149;i++)

 

Также изменим ниже количество обрабатываемых битов

 

memcpy((void*)(BUF_DMA+48+3576),(void*)DMA_BUF_TEMP,48);

 

Дальше поднимемся выше и займёмся оператором вариантов, а вернее его первым кейсом.

Сначала увеличим порог (можно его увеличить сразу во всех кейсах)

 

if(i<8)

 

А затем далее меняем 12 на 15, а 128 на 255

 

if(i<8)

  {rgb_temp[j*15+i][0]=255/((i+1)*2); rgb_temp[j*15+i][1]=0; rgb_temp[j*15+i][2]=0;}

else

  {rgb_temp[j*15+i][0]=255/((15-i)*2); rgb_temp[j*15+i][1]=0; rgb_temp[j*15+i][2]=0;}

 

Попробуем собрать код и прошить контроллер.

Тест отлично работает

 

 

В остальных кейсах аналогично 12 заменим на 15, 128 — на 255, 64 — на 128, раскомментируем в main.c вызов 4 теста со всеми аргументами, соберём код, прошьём контроллер и посмотрим результат

 

 

Остался ещё один тест — ws2812_test05.

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

 

for(i=0;i<150;i++)

 

В цикле удалим 2 последних условия

if(i%12==10) ws2812_pixel_rgb_to_buf_dma(128*k/3000,128*(1000-k)/667,128*(1000-k)/1000,i);

if(i%12==11) ws2812_pixel_rgb_to_buf_dma(128*(1000-k)/3000,128*k/667,128*(1000-k)/3000,i);

 

А число 128 везде в цикле заменим на 255, 12 — на 10, а 667 — на 1333

 

if(i%10==0) ws2812_pixel_rgb_to_buf_dma(255*k/1000,255*(1000-k)/1000,0,i);

if(i%10==1) ws2812_pixel_rgb_to_buf_dma(0,255*k/1000,255*(1000-k)/1000,i);

if(i%10==2) ws2812_pixel_rgb_to_buf_dma(255*k/1000,0,255*(1000-k)/1000,i);

if(i%10==3) ws2812_pixel_rgb_to_buf_dma(255*(1000-k)/1000,255*k/2000,255*k/2000,i);

if(i%10==4) ws2812_pixel_rgb_to_buf_dma(255*k/2000,255*k/2000,255*(1000-k)/1000,i);

if(i%10==5) ws2812_pixel_rgb_to_buf_dma(255*k/2000,255*(1000-k)/1000,255*k/2000,i);

if(i%10==6) ws2812_pixel_rgb_to_buf_dma(255*(1000-k)/2000,255*(1000-k)/2000,255*k/1000,i);

if(i%10==7) ws2812_pixel_rgb_to_buf_dma(255*k/1000,255*(1000-k)/2000,255*(1000-k)/2000,i);

if(i%10==8) ws2812_pixel_rgb_to_buf_dma(255*(1000-k)/2000,255*k/1000,255*(1000-k)/2000,i);

if(i%10==9) ws2812_pixel_rgb_to_buf_dma(255*(1000-k)/3000,255*(1000-k)/1333,255*k/1000,i);

 

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

 

 

Раскомментируем вызов функций всех тестов и посмотрим ещё раз на все тесты.

Если всё нормально, то пока отключим блок питания от розетки, также отключим программатор от ПК.

 

В следующей части урока мы изменим код проекта под использование ленты на 300 светодиодов и проверим его на практике.

 

 

Предыдущая часть Программирование МК STM32 Следующая часть

 

Исходный код для ленты на 150 светодиодов

 

 

Отладочную плату STM32F103C8T6 можно приобрести здесь STM32F103C8T6

Программатор недорогой можно купить здесь ST-Link V2

Светодиодные ленты 1м-5м 1м-5м 150-300 светодиодов Защита IP60-IP67 можно приобрести здесь WS2812B

Импульсный источник питания 5 В в 40A 200 Вт можно приобрести здесь 5 В в 40A 200 Вт

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

 

 

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

 

STM WS2812B. Подключаем ленты количеством 150-300 светодиодов

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

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

*