Views: 5054
В настоящее время большой популярностью стали пользоваться светодиоды со встроенным драйвером 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 ом.
Продолжение следует….
Это может быть интересно
My libraries for Altium DesignerViews: 4468 Attention, this version of the database is outdated today. See updates in articles https://catcatcat.d-lan.dp.ua/altium-designer-my-setup-system-and-project-structure and https://catcatcat.d-lan.dp.ua/altium-designer-my-setup-system-and-project-structure-v23-2/ My libraries for Altium designer (Updated V – 29/05/2022) (c) 2021 …
Простой цифровой вольтметр ch-c3200Views: 2667 В этой статье рассмотрен пример создания простого вольтметра постоянного тока на основе печатной платы ch-c0030pcb, а при возможности использования внешнего делителя и вольтметр переменного тока. Дан краткий принцип …
Temperature measurement with NTC thermistor.Views: 725 Проекты в которых присутствовало измерение температуры начинал с цифровых датчиков, т.к. в них все просто и не надо ничего преобразовывать и вычислять. При использовании цифровых датчиков ты получаешь …
ch-светомузыка и AK4113Views: 1524 Пришло время вернуться к светомузыке. На сегодня использование аналогового входа стало непрактичным, на сегодня необходимо использовать S/PDIF и Toslink. С этим надо было как то разобрать, что это …
Контроллер управления светодиодным освещением с дистанционным управлениемViews: 2077 Все активнее светодиоды входят в нашу жизнь. Всё эффективнее становится светодиодное освещение. Всё ниже опускаются цены. Всё больше появляется возможностей получения сочных цветов, простоты в управлении. Всё чаще …
DS18B20 – удаленный контроль температурыViews: 3248 Контроль температуры с использованием датчиков температуры DS18B20 и платы ILLISSI-4B-09-primum Проект позволяет подключать к плате ILLISSI-4B-09-primum до 16 датчиков температуры DS18B20, удаленных более 300 метров, и выводить информацию …
Часы + Календарь + Термометр + …Views: 2834 Часы + Календарь + Термометр + Индикатор влажности + Секундомер + Дистанционное управление на ИК лучах (пульты на RC-5 протоколе) + Автоматическая регулировка яркости + Возможность вывода данных через USB, …
LCD драйвер – UC1601sViews: 1834 http://svetomuzyka.narod.ru/project/UC1601s.html Читайте обновление на http://catcatcat.d-lan.dp.ua/?page_id=178 В данный момент можно приобрести в ООО “Гамма” несколько типов индикаторов на драйвере UC1601s. RDX0048-GC, RDX0077-GS, RDX0154-GC и RDX0120-GC выполнены по технологии COG.
Проект с использованием MCC часть 02Views: 2464 Когда мы запустили конфигуратор, самое главное понять, что с этим делать и как проверить, то что мы делаем работает или нет. Для начала настроим регистры конфигурации микроконтроллера и настроем …
Бегущие огни на WS2812BViews: 5054 В настоящее время большой популярностью стали пользоваться светодиоды со встроенным драйвером WS2812B. Текущий проект предназначен показать возможность использования и управления этими светодиодами. Это и проект и исследование по …







