
Views: 4884
В настоящее время большой популярностью стали пользоваться светодиоды со встроенным драйвером 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 ом.
Продолжение следует….
Это может быть интересно
MPLAB® Harmony – или как это просто! Часть 2.
Views: 2714 Часть вторая – Первая программа на PIC32. Музыкальная тема к статье, слушаем: Для начала изучения PIC32 надо иметь или демоплату или самому её изготовить имея микроконтроллер. Начнем из …Дифференциальный терморегулятор
Views: 4021 Дифференциальный терморегулятор ch-3020 Назначение. Ch-c3020 представляет собой дифференциальный терморегулятор. Основное назначение солнечные системы горячего водоснабжения, а также вентиляционные системы управление притоком свежего воздуха. Контроллер позволяет работать пяти режимах. …NS108-5050-16bit от Newstar
Views: 598 Кто уже использует в своих проектах адресуемые светодиоды хорошо знакомы с такими как WS2812 и им подобные. Эти светодиоды для управления используют однопроводную шину. Из-за этого пропускная способность …12-BIT A/D CONVERTER WITH THRESHOLD DETECT на примере PIC24FJ128GA204
Views: 844 Введение. 12-битный модуль A/D Converter является усовершенствованной версией 10-битного модуля, предлагаемого на некоторых устройствах PIC24. Оба модуля являются преобразователями, в своих ядрах, с последовательным приближением (SAR), в окружении …Проект с использованием MCC часть 04
Views: 1169 Теперь простого горения светиков нам не достаточно, заставим их мигать. Для начала используем первобытно простой способ, но достаточно простой. Используем функции delay, напрягаться откуда они берутся не будем, самое …MAX7219/21 и 8х8 LED дисплеи
Views: 949 MAX7219, MAX7221 предназначены для вывода информации на 8 разрядов семисегментного индикатора, но на нем легко организовать вывод на светодиодные индикаторы 8х8. продолжение следует…. Это может быть интересноЕмкостной сенсор
Views: 3055 Изучаем изготовление емкостных сенсоров на PIC-микроконтроллере. Конструкция емкостных сенсоров имеет вид: Емкостные сенсоры строятся по схеме высокочастотного генератора, сам принцип основан на измерение частоты этого генератора. Частота зависит …Система AT команд версии V2.0 для ESP8266 и ESP32
Views: 13106 Появление нового модуля на базе ESP32 заставило систематизировать систему AT команд, а так же систему обновления и для модулей на базе ESP8266. Начиная с версии v2.0 в ESP8266 …Мониторинг температуры
Views: 1403 Настоящий проект создан как обучающий с применением библиотек ds18b20 и LCDHD44780 и компилятора Microchip MPLAB XC8 C Compiler V1.12. Если необходимо иметь информацию по состоянию температуры в помещении или в здании, с количеством до 6 точек (16), то …Стабилизатор тока на SN3350, часть 2
Views: 1145 Если вам необходимо разработать устройство с применением мощных светодиодов, то никак не обойтись без применения стабилизатора тока. На настоящий момент стабилизаторы тока являются самым эффективным механизмом, для питания светодиода в течение всего …