Views: 4864
В настоящее время большой популярностью стали пользоваться светодиоды со встроенным драйвером WS2812B. Текущий проект предназначен показать возможность использования и управления этими светодиодами. Это и проект и исследование по работе с этими светодиодами.
Для тестирования выбрана плата ILLISSI с контроллером PIC18F26R22.
Создание драйвера WS2812B вызвано необходимость получить недорогой RGB светодиод со встроенной схемой ШИМ, стабилизаторами тока и простым управлением.
Техническое описание
[wpdm_file id=241]
Функциональная схема
Драйвер поддерживает напряжение питания в диапазоне +3,5 до 5,3 вольт, и имеет защиту от переполюсовки. Для подавления помех рядом с каждым светодиодом WS2812B необходимо установить конденсатор 0,1 uF.
Для управления используется однопроводная шина с управлением временными интервалами. Основные характеристики передачи данных:
Сигнал | Описание | Длительность | Допустимое отклонение |
T0H | 0 code, длительность высокого уровня | 0.4us | ±150ns |
T1H | 1 code, длительность высокого уровня | 0.8us | ±150ns |
T0L | 0 code, длительность низкого уровня | 0.85us | ±150ns |
T1L | 1 code, длительность низкого уровня | 0.45us | ±150ns |
RES | Длительность импульса СТАРТ | Более 50μs |
Все данные передаются по битам, старшим битом в перед. Общая длительность передачи суммы двух бит 0 и 1 должна быть в пределах TH+TL=1.25μs±600ns
Передача бита 0:
Передача бита 1:
Принцип подключения драйверов-светодиодов.
Принцип передачи данных следующий:
- Сформировать условие СТАРТ – отрицательный импульс длительностью не менее 50 us.
- Начать передавать данные по битам. Данные передаются старшим битом в перед, каждый бит должен быть сформирован с учетом выше описанных условий.
- Для управления одним RGB светодиодом необходимо передать 24 бита.
- Если в цепочке N- светодиодов, то необходимо передать N*24 бит.
- Для передачи новых данных повторить пункты 1-4.
Длительности и формируемых сигналов имеют широкие допуски, но рекомендуется их сильно занижать, так как это может сказаться как искажение данных при передачи на длинные цепочки свыше 70-80 драйверов.
Последовательность передачи цветов GRB
т.е. с начала передаем зеленый, потом красный, а затем данные о синем цвете.
Простой принцип формирования цветов и загрузки данных в ленточки из N-светодиодов.
Для гибкого управления необходимо взять несколько параметров используемых в ch-светомузыке. Для нас это цвет, яркость светодиода и параметр интеграция – это скорость изменения яркости.
Для гибкого управления драйверами WS2812B необходимо следующие параметры:
- Указать количество используемых светодиодов
#define LEDC 72 // количество светодиодов ws2812b на полметра ленты.
- Описать цветовые массивы
char ledred[LEDC][2];// массив красных char ledblue[LEDC][2];// массив синих char ledgreen[LEDC][2];//массив зеленых
где параметр, например, ledred[LEDC][0] – яркость свечения, а ledred[LEDC][1] – скорость интеграции.
Скорость интеграции 0 – нет интеграции, – (минус, например, -3) уменьшение яркости, положительное число увеличение яркости. Если включено увеличение яркости, то при достижении максимума, выполняется автоматическое переключение на уменьшение с такой же величиной. При достижении яркости 0 функция интеграции устанавливается равной 0.
Тестирование WS2812B
Для любопытных программа выполняющая этот эффект
if(++c==9) { c=0; d++; if(d>72) { d=rand()%72; red=rand(); } d1++; if(d1>72) { d1=rand()%72; blue=rand(); } d2++; if(d2>72) { d2=rand()%72; green=rand(); } pointred (d,red,-2); pointred (LEDC-d1,red,-2); pointgreen (d2,green,-2); pointgreen (LEDC-d,green,-2); pointblue (d1,blue,-2); pointblue (LEDC-d2,blue,-2); }
Каждый драйвер получает данные и формирует на выходе данные для передачи на следующие светодиоды, Только длительности формируемых данных 0 и 1 несколько отличаются от паспортных:
Передача бита нуля близка к описанию
а передача бита единицы значительно отличается
эти сигналы сняты с выхода драйвера WS2812B. Опытным путем было получено, что скорость передачи не может превышать 500 кбит, если её увеличивать, то происходит потеря данных при передачи через цепочки свыше 30 светодиодов. Я склоняюсь к мнению, что драйвер отслеживает только длительность положительного импульса, длительность отрицательного, просто должна быть не меньше 0.9-1 микросекунды.
В связи с этим пример драйвера для загрузки данных в светодиоды
/*char ledred[LEDC];// массив красных где 0 - яркость в формате 0-255 * char ledblue[LEDC];// массив синих * char ledgreen[LEDC];//массив зеленых */ //---------------------------------------------------------------------------------------- #define PORTOUT LATA2 // порт для WS2812B // функция загрузки данных в ленточку, количество светодиодов задается в константе LEDC void loadWS2812B (void) { char a,b,temp; // формирование сброса PORTOUT=0; _delay(350);//50us //-------------------------------- for(a=0;a<LEDC;a++) { for(b=0;b<3;b++) { switch (b) { case 0 : temp=ledgreen[a]; break; case 1 : temp=ledred[a]; break; case 2 : temp=ledblue[a]; } // загрузка байта if(temp&0b10000000) { //формирование бита 1 PORTOUT=1; _delay(5); PORTOUT=0; _delay(2);//0.45us } else { //формирование бита 0 PORTOUT=1; _delay(2);//0.4us PORTOUT=0; _delay(2);//0.85us } if(temp&0b01000000) { //формирование бита 1 PORTOUT=1; _delay(5); PORTOUT=0; _delay(2);//0.45us } else { //формирование бита 0 PORTOUT=1; _delay(2);//0.4us PORTOUT=0; _delay(2);//0.85us } if(temp&0b00100000) { //формирование бита 1 PORTOUT=1; _delay(5); PORTOUT=0; _delay(2);//0.45us } else { //формирование бита 0 PORTOUT=1; _delay(2);//0.4us PORTOUT=0; _delay(2);//0.85us } if(temp&0b00010000) { //формирование бита 1 PORTOUT=1; _delay(5); PORTOUT=0; _delay(2);//0.45us } else { //формирование бита 0 PORTOUT=1; _delay(2);//0.4us PORTOUT=0; _delay(2);//0.85us } if(temp&0b00001000) { //формирование бита 1 PORTOUT=1; _delay(5); PORTOUT=0; _delay(2);//0.45us } else { //формирование бита 0 PORTOUT=1; _delay(2);//0.4us PORTOUT=0; _delay(2);//0.85us } if(temp&0b00000100) { //формирование бита 1 PORTOUT=1; _delay(5); PORTOUT=0; _delay(2);//0.45us } else { //формирование бита 0 PORTOUT=1; _delay(2);//0.4us PORTOUT=0; _delay(2);//0.85us } if(temp&0b00000010) { //формирование бита 1 PORTOUT=1; _delay(5); PORTOUT=0; _delay(2);//0.45us } else { //формирование бита 0 PORTOUT=1; _delay(2);//0.4us PORTOUT=0; _delay(2);//0.85us } if(temp&0b00000001) { //формирование бита 1 PORTOUT=1; _delay(5); PORTOUT=0; // _delay(2);//0.45us } else { //формирование бита 0 PORTOUT=1; _delay(1);//0.4us PORTOUT=0; // _delay(2);//0.85us } } } }
Пример функции приведен для PIC контроллеров 12-16-18 серии с тактовой частотой 32 МГц. Длительности в передачи последнего бита закомментированы, так как они не имеют значения, потому, что выборка следующего байта в пределах более 1 микросекунды.
Для серии PIC18.
Вариант 1. Функции для PIC18 с тактовой частотой 64 МГц.
#define PORTOUT LATC1 // порт для WS2812B // функция загрузки данных в ленточку, количество светодиодов задается в константе LEDC void loadWS2812B (void) { char a,b,c,temp; // формирование сброса PORTOUT=0; _delay(800);//50us //-------------------------------- for(a=0;a<LEDC;a++) { for(b=0;b<3;b++) { switch (b) { case 0 : temp=ledgreen[a][0]; break; case 1 : temp=ledred[a][0]; break; case 2 : temp=ledblue[a][0]; } // загрузка байта if(temp&0b10000000) { //формирование бита 1 PORTOUT=1; _delay(12);//0.41 PORTOUT=0; _delay(10);//1.00us } else { //формирование бита 0 PORTOUT=1; _delay(5);//0.4us PORTOUT=0; _delay(10);//1.00us } if(temp&0b01000000) { //формирование бита 1 PORTOUT=1; _delay(12);//0.83us PORTOUT=0; _delay(10);//1.00us } else { //формирование бита 0 PORTOUT=1; _delay(5);//0.4us PORTOUT=0; _delay(10);//1.00us } if(temp&0b00100000) { //формирование бита 1 PORTOUT=1; _delay(12);//0.83us PORTOUT=0; _delay(10);//1.00us } else { //формирование бита 0 PORTOUT=1; _delay(5);//0.4us PORTOUT=0; _delay(10);//1.00us } if(temp&0b00010000) { //формирование бита 1 PORTOUT=1; _delay(12);//0.83us PORTOUT=0; _delay(10);//1.00us } else { //формирование бита 0 PORTOUT=1; _delay(5);//0.4us PORTOUT=0; _delay(10);//1.00us } if(temp&0b00001000) { //формирование бита 1 PORTOUT=1; _delay(12);//0.83us PORTOUT=0; _delay(10);//1.00us } else { //формирование бита 0 PORTOUT=1; _delay(5);//0.4us PORTOUT=0; _delay(10);//1.00us } if(temp&0b00000100) { //формирование бита 1 PORTOUT=1; _delay(12);//0.83us PORTOUT=0; _delay(10);//1.00us } else { //формирование бита 0 PORTOUT=1; _delay(5);//0.4us PORTOUT=0; _delay(10);//1.00us } if(temp&0b00000010) { //формирование бита 1 PORTOUT=1; _delay(12);//0.83us PORTOUT=0; _delay(10);//1.00us } else { //формирование бита 0 PORTOUT=1; _delay(5);//0.4us PORTOUT=0; _delay(10);//1.00us } if(temp&0b00000001) { //формирование бита 1 PORTOUT=1; _delay(12);//0.83us PORTOUT=0; // _delay(2);//1.00us } else { //формирование бита 0 PORTOUT=1; _delay(5);//0.4us PORTOUT=0; // _delay(2);//1.00us } } } }
Вариант 2, для PIC18, более компактный, но по быстродействию он хуже.
#define PORTOUT LATC1 // порт для WS2812B // функция загрузки данных в ленточку, количество светодиодов задается в константе LEDC void loadWS2812B (void) { char a,b,c,temp; // формирование сброса PORTOUT=0; _delay(800);//50us //-------------------------------- for(a=0;a<LEDC;a++) { for(b=0;b<3;b++) { switch (b) { case 0 : temp=ledgreen[a][0]; break; case 1 : temp=ledred[a][0]; break; case 2 : temp=ledblue[a][0]; } // загрузка байта for(c=0;c<8;c++) { if(temp&0b10000000) { //формирование бита 1 PORTOUT=1; _delay(12);//0.8us PORTOUT=0; _delay(2);//0.45us } else { //формирование бита 0 PORTOUT=1; _delay(5);//0.4us PORTOUT=0; _delay(8);//0.85us } temp<<=1;// cдвиг переменной } } } }
Важное условие подключения драйвера к контроллеру.
Необходимо всегда (особенно для первого включения) устанавливать между микроконтроллером и первым драйвером резистор 430-330 ом.
Продолжение следует….
Это может быть интересно
- Просто о внешних переменныхViews: 788 Часто возникает задача когда необходимо предавать данные между модулями программы. Например, передать данные между файлами, или управлять работой модулей. Для этого создаем заголовочный файл и описываем наши переменные как …
- Система отопления на солнечных коллекторах от Дмитрия (rv3dpi)Views: 3204 Солнечные коллекторы для отопления в Европе используют в более 50% от общего количества установленных гелиосистем. Однако следует понимать, что гелиосистемы предназначены лишь для поддержки отопления и экономии затрат на основную …
- CAN – Controller Area NetworkViews: 1109 Controller Area Network (CAN) первоначально был создан немецким поставщиком автомобильных систем Робертом Бош в середины 1980-х для автомобильной промышленности как метод для обеспечения возможности надежной последовательной связи. Целью было сделать автомобили более надежными, …
- Датчик контроля протечки воды ch-c0020Views: 1953 Как здорово летом под теплым дождем с тобою вдвоем оказаться. Как классно по лужам бежать босиком, с тобою играть и смеяться! Но совсем грустно оказаться под таким дождем, который течет с …
- VU Meter Tower ARTViews: 1610 Стерео индикатор уровня аудио сигнала. Компактность и удобство проектирования устройств на светодиодах WS2812B, а также легкость реализации алгоритма родило идею созданию своей конструкции. В этом проекте я предоставлю …
- Проект с использованием MCC часть 10Views: 843 Алгоритм управления освещением от нажатия кнопки. Обработка удержания кнопки: Мы должны проверить кнопка в настоящий момент нажата и флаг удержания установлен, если да Проверить таймер удержания “отработал” – …
- ESP8266 процедура получение данных даты и времени от серверов точного времени.Views: 5915 Эта функция доступна уже в версии 1.6.1. Для многих приложений, необходимо часы реального времени, если в вашем проекте есть модуль WiFI ESP8266, то легко можно сделать следующим образом. …
- NeoPixel LED and PIC24Views: 649 Популярность однопроводной шины для управления светодиода типа WS2812 не ослабевает, а новые типы светодиодов в корпусах 3,5*3,5мм, 2,0*2,0мм становяться все больше привлекательными. Построение дисплеев для анимации требуют все …
- Индикатор температурыViews: 2630 Проект для начинающих, на демо плате BB-2T3D-01. Простой индикатор температуры. Проект никак не задумывался, просто на витрину магазин Ворон нужна была демонстрационная модель на макетной плате, чего нибудь работающего. Остановились на индикаторе …
- MTouch® Модуль Емкостной Библиотеки для MPLAB®X Code Configurator (MCC)Views: 1212 Введение MTouch ® Модуль Емкостной Библиотеки для MPLAB ® X Code Configurator (MCC) позволяет быстро и легко генерировать решение кода на Cи для емкостной сенсорной кнопки, датчика приближения и слайдера.