Как подключить панель со светодиодами WS2812 (WS2812B)
Для проекта нам понадобятся:
- светодиодная панель или лента со светодиодами WS2812B;
- отладочная плата с микросхемой FT2232H;
- персональный компьютер или ноутбук.
1Описание RGB светодиодов WS2812 и WS2812B
Светодиод WS2812 (или его модификация WS2812B, которая и будет использована в данной статье) представляет собой RGB светодиод. То есть в одном корпусе представлены сразу три светодиода разных цветов: красный, зелёный и синий.
Светодиод WS2812 имеет 6 выводов, в то время как WS2812B – лишь 4.
Номер вывода | Название | Назначение вывода |
---|---|---|
1 | Dout | Выход управляющего сигнала |
2 | Din | Вход управляющего сигнала |
3 | VCC | Питание управляющей цепи, 6…7 В |
4 | NC | Не подключен |
5 | VDD | Питание светодиода, 6…7 В |
6 | Gnd | Земля |
А вот назначение выводов светодиода WS2812B:
Номер вывода | Название | Назначение вывода |
---|---|---|
1 | VDD | Питание светодиода, 3,5…5,3 В |
2 | Dout | Выход управляющего сигнала |
3 | Gnd | Земля |
4 | Din | Вход управляющего сигнала |
Главное преимущество данных светодиодов в том, что они могут соединяться в цепочку последовательно друг за другом, их можно соединять в ленты или собирать из них панели. При этом управление осуществляется всего по одному проводу. Это возможно благодаря тому, что каждый светодиод содержит в своём составе контроллер, который и управляет цветом и яркостью трёх каналов RGB. Из-за того, что управлять можно отдельно каждым светодиодом WS2812 в цепочке, такие светодиоды называются «адресные». На сегодняшний день это самые «продвинутые» светодиоды для организации больших массивов светодиодов.
Для примера на схеме показано последовательное подключение трёх светодиодов. На вход DIN первого светодиода подаётся управляющий сигнал. Светодиод обрабатывает его и передаёт далее со своего выхода DOUT на вход следующего в цепочке светодиода. И так сигнал проходит по всей цепочке светодиодов, каждый из которых считывает свою управляющую последовательность и изменяет свой цвет и интенсивность в соответствии с пришедшей командой.
На фотографии представлена панель размером 10 на 10 светодиодов, с которой мы и будем экспериментировать. Как видно, на нижней части панели светодиоды соединены в единую цепочку.
Обратите внимание, что светодиодная панель весьма «прожорлива». На иллюстрации ниже это можно видеть по показаниям встроенного датчика тока источника питания: панель из ста светодиодов WS2812B потребляет ток более 3 амперов. Правда, почти все светодиоды в данном случае включены на максимальную яркость белым цветом (самый энергозатратный режим, т.к. для обеспечения белого свечения используются все три канала RGB на максимальной яркости).
Приблизительное потребление вашего устройства можно оценть так. Один канал светодиода на максимальной яркости потребляет около 20 мА. В одном корпусе располагаются 3 светодиода. Следовательно, один RGB светодиод в максимуме потребляет до 60 мА тока. Умножаете это число на количество светодиодов в вашей матрице или ленте – это и будет максимально возможное потребление, и ваш источник питания должен иметь возможность выдать такой ток.
2Управление светодиодами WS2812B (или WS2812)
Если просто подать на светодиодную ленту напряжение, ничего не произойдёт. Светодиоды ждут определённый сигнал, который будет ими управлять. Для управления используется последовательный однопроводный интерфейс. Биты "0" и "1" кодируются импульсами различной длины.
На диаграмме обозначены:
- T0H – время выдержки высокого уровня при передаче кода логического нуля;
- T0L – время выдержки низкого уровня при передаче кода логического нуля;
- T1H – время выдержки высокого уровня при передаче кода логической единицы;
- T1L – время выдержки низкого уровня при передаче кода логической единицы;
- Treset – время сигнала оповещения об окончании управляющей последовательности.
Причём временные допуски заданы весьма жёстко. Так, для WS2812B время T0H = T1L и составляет 0,35 мкс, а время T1H = T0L и составляет 0,9 мкс. Для светодиода WS2812 временные параметры более изощрённые: T0H = 0,35 мкс, T1H = 0,7 мкс, T0L = 0,8 мкс, T1L = 0,6 мкс. Но длительность передачи одного бита и там, и там составляет 1,25 мкс.
Для указания цвета светодиода используется 24-битная схема RGB: под каждый из трёх каналов отводится по 8 бит. И расположены цвета в следующем порядке:
То есть для того чтобы выставить желаемый цвет на первом светодиоде в цепочке, необходимо сформировать 24-битный код и подать его на вход DIN цепочки. Если мы хотим выставить цвет на двух светодиодах, необходимо сформировать уже 48-битный сигнал и так же подать его на вход DIN цепочки. И так далее. Чем больше светодиодов в цепочке – тем более длинную последовательность мы должны подать на её вход. Получив управляющий сигнал, контроллер светодиода берёт из неё первые 24 бита и выставляет тот цвет, который указан в этих 24 битах. Затем он отбрасывает эти 24 бита, а оставшуюся часть последовательности передаёт дальше. Там ситуация повторяется. Когда вся последовательность обработана или когда приходит сигнал сброса Reset, светодиоды запоминают состояние и не меняют его, пока не придёт новый управляющий сигнал.
Осталось дело за малым: передать цепочке светодиодов WS2812B осмысленную управляющую последовательность.
На этот счёт есть такая идея. По сути нам необходимо передавать 24-битные значения цвета в соответствии с положением светодиода в матрице 10 на 10. Аналогичным образом данные хранятся в графических файлах формата *.BMP. Только у них в начале файла ещё присутствует заголовок, который содержит дополнительную информацию: размер изображения, сколько бит приходится на один пиксель, есть ли сжатие и т.д. Вот как в деталях устроен формат BMP:
Можно в любом графическом редакторе (например, Paint .NET) нарисовать изображение размером 10 на 10 пикселей (или такого, какой размерности у вас светодиодная панель), сохранить его в 24-битном формате, а затем взять массив байтов из раздела Image Data Pixel Array с данной схемы, и таким образом мы получим управляющий массив для загрузки светодиодной панели.
Обратите внимание, что в массиве данных о точках изображения BMP содержатся заполнители (Padding), которые дополняют строку байтов до числа, кратного 4. Т.е., например, в нашем случае строка содержит 10 пикселей по 24 бита на цвет (3 байта). Соответственно, строка будет содержать 3×10=30 байтов. Но 30 не кратно 4. Ближайшее число, кратное 4, это 32. Соответственно, в файле BMP будет на каждую строку изображения на 2 байта заполнителя больше. Байты-заполнители нужно пропускать и не включать в управляющий массив.
Ах, да, чуть не забыл. В файле изображения BMP данные о цвете хранятся в формате R-G-B, а светодиод WS2812 принимает цвет в формате G-R-B. Необходимо поменять местами цвета, иначе все изображения будут совсем не тех цветов, которые мы ожидаем.
3Управление светодиодной панелью WS2812B по SPI с помощью FT2232H
Предлагаю использовать для управления диодами WS2812B отладочную плату с микросхемой FT2232H и программу SPI via FTDI, которые уже не раз нас выручали. Единственная загвоздка в том, что FT2232H не может формировать импульсы с заданной длительностью. Придётся сымитировать их. Идея здесь следующая.
Короткие импульсы (T0H и T1L) для WS2812B одинаковые и они в 3 раза короче, чем длинные (T0L и T1H). Таким образом, используя 4 импульса можно закодировать "0" или "1". А именно: для передачи логического нуля будем формировать бинарную последовательность "1000" или 0x8, а для передачи логической единицы будем формировать бинарную последовательность "1110" или 0xE. Таким образом на кодирование двух бит исходной управляющей последовательности у нас будет «уходить» 1 байт модифицированной последовательности.
Будем использовать режим SPI и его линию MOSI для передачи двоичных данных загрузки светодиодов. Причём необходимо выбрать такую частоту передачи, чтобы длительность одного бита равнялась 1,25 мкс. Т.к. нам вместо одного бита нужно передавать четыре, то для обеспечения той же длительности одного бита управляющей последовательности частота SPI должна быть в 4 раза выше: вместо 1/1.25 будет 4/1.25 мкс = 3.2 МГц. Это микросхема FT2232H способна обеспечить.
Если сформировать произвольную управляющую последовательность и посмотреть её на осциллографе, то увидим, что эта идея вполне работоспособна: на осциллограмме видны 6 логических единиц, а затем логический ноль. Причём длительность передачи одного бита в среднем равняется как раз тем самым 1.25 мкс.
Теперь, когда мы умеем формировать биты необходимой длительности, нужно взять массив, считанный из соответствующего раздела BMP файла, и преобразовать его побитово в то, что нам нужно (бит "0" – в 0x8, "1" – в 0xE).
Я всё это уже проделал и прикладываю к статье маленькое консольное приложение, которое принимает на вход файл *.BMP и генерирует из него бинарный файл с управляющей последовательностью, которую нужно «скормить» цепочке светодиодов.
Чтобы загрузить управляющую последовательность, воспользуемся программой SPI via FTDI. Подключимся к микросхеме FT2232H, установим режим SPI и зададим скорость передачи 3 МГц. Также в полях состояний выводов укажем "00000000"; этот нулевой уровень будет служить сигналом Reset, по которому светодиодная лента «поймёт», что передача управляющей последовательности завершена. Теперь в разделе «Записать» выберем сгенерированный двоичный файл. Нажмём на кнопку, и файл, содержащий управляющую последовательность, будет передан цепочке светодиодов.
В качестве примера на изображении в поле «Команда» приведён массив, который активирует первые три светодиода в цепочке цветами красный, зелёный, синий.
Когда мы загрузим управляющую последовательность, сгенерированную программой, на панели загорится изображение, которое мы чуть ранее нарисовали в графическом редакторе.
С помощью такой панели можно создавать довольно красивые и зрелищные эффекты, как, например, цветовые градиенты:
Как развитие данной идеи, с помощью такой LED-панели можно воспроизводить анимацию. Для этого можно создать управляющий файл, в котором последовательно будут содержаться управляющие массивы для всех кадров анимации, а для обеспечения пауз между кадрами будет необходимое число нулей. Посчитать число нулей несложно, если вспомнить, что время передачи одного бита составляет 1,25 мкс.
Upd. Я добавил к статье архив с обновлённой программой, которая позволяет создавать файлы анимации для светодиодной панели. Также в архиве лежат несколько изображений в формате bmp размером 10*10 пикселей просто для примера. Вы можете добавлять изображения своего размера (под размеры своей матрицы), программа сама определяет ширину и высоту картинки.
Download attachments:
- Скачать техническое описание (datasheet) светодиода WS2812B (601 Downloads)
- Программа преобразования BMP в управляющую последовательность WS2812B (696 Downloads)
- Скачать техническое описание (datasheet) светодиода WS2812 (523 Downloads)
- Программа преобразования BMP в управляющую последовательность WS2812B с анимацией (505 Downloads)
Поблагодарить автора:
Поделиться
Related items
3 comments
-
Сергей Суббота, 17 Октябрь 2020 14:23 Ссылка на комментарий
Очень интересно и подробно! Спасибо за статью!