
Просмотров: 4508
В настоящее время большой популярностью стали пользоваться светодиоды со встроенным драйвером 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 ом.
Продолжение следует….
Это может быть интересно
Проект с использованием MCC часть 15
Просмотров: 1279 EUSART – Универсальный асинхронный приёмопередатчик (УАПП, англ. Universal Asynchronous Receiver-Transmitter, UART) — узел вычислительных устройств, предназначенный для организации связи с другими цифровыми устройствами. … читать на вики. Внесем изменения в нашу схему, …PIC18 – модуль DMA
Просмотров: 949 Введение Модуль прямого доступа к памяти (DMA) предназначен для обслуживания передачи данных непосредственно между различными областями памяти без вмешательства процессора. Исключив при этом необходимость в интенсивной обработки …ESP8266 применение в проектах
Просмотров: 3114 (Актуально только для версий прошивки 1.хх) ESP8266 показала себя как надежное и безотказное устройство для обмена данными с применением WIFI. Я использую ESP8266 исключительно через UART, с применением AT …Гаджеты для домашней автоматики – Датчик движения
Просмотров: 1280 Управление светодиодным освещением – Датчик движения. Данный гаджет предназначен для управления освещением рабочих столов (кухонных столов), освещение прихожих, освещение зеркал в прихожих, автоматическое включение света в коридорах. Датчик позволяет …Проект с использованием MCC часть 04
Просмотров: 913 Теперь простого горения светиков нам не достаточно, заставим их мигать. Для начала используем первобытно простой способ, но достаточно простой. Используем функции delay, напрягаться откуда они берутся не будем, самое …USB K-L-line адаптер
Просмотров: 5614 USB K-L-line адаптер предназначен для связи персонального компьютера с диагностической шиной автомобиля – интерфейс ISO-9141. Этот проект предназначен для сборки недорого устройства с использованием специально для этой цели …LCD индикаторы на драйвере ML1001
Просмотров: 1671 ML1001 – статический LCD GOG (чип в стекле) драйвер для 40-сегментного LCD в позолоченном противоударном исполнении. На них можно каскадно строить цельные из 80 или 120 сегментов LCD индикаторы. …MPLAB® Code Configurator and Encoder
Просмотров: 1222 Еще раз про энкодер… Для некоторых приложений очень удобно и экономически выгодно, для настройки и управления использовать энкодер. Такие энкодеры имеют строенную тактовую кнопку которую можно применить для выбора …Защита датчиков температуры DS18B20 от статического электричества
Просмотров: 1465 Статья перепечатана с сайта http://svetomuzyka.narod.ru При удалении датчика на большие расстояния возникает опасность наведения импульсов высокого напряжения на кабель, который соединяет датчик с контролером. Если не принимать меры защиты, …DS18B20 – удаленный контроль температуры
Просмотров: 2791 Плата в корпусе Датчики температуры DS18B20 Схема подключения Вывод данных на ПК Установка дополнительных резисторов Назначение выводов This jQuery slider was created with the free EasyRotator for WordPress …