Рейтинг@Mail.ru

Как подключить панель со светодиодами WS2812 (WS2812B)

автор:
2 comments Электроника
Print Friendly, PDF & Email
Рассмотрим подключение светодиодной ленты или панели со светодиодами WS2812/WS2812B, принцип и особенности их работы, а также управление панелью с помощью микросхемы FT2232H по интерфейсу SPI.

Для проекта нам понадобятся:

1Описание RGB светодиодов WS2812 и WS2812B

Светодиод WS2812 (или его модификация WS2812B, которая и будет использована в данной статье) представляет собой RGB светодиод. То есть в одном корпусе представлены сразу три светодиода разных цветов: красный, зелёный и синий.

Внешний вид и габариты светодиодов WS2812
Внешний вид и габариты светодиодов WS2812

Светодиод WS2812 имеет 6 выводов, в то время как WS2812B – лишь 4.

Назначение выводов светодиода WS2812
Номер выводаНазваниеНазначение вывода
1DoutВыход управляющего сигнала
2DinВход управляющего сигнала
3VCCПитание управляющей цепи, 6…7 В
4NCНе подключен
5VDDПитание светодиода, 6…7 В
6GndЗемля

А вот назначение выводов светодиода WS2812B:

Внешний вид и габариты светодиодов WS2812B
Внешний вид и габариты светодиодов WS2812B
Назначение выводов светодиода WS2812B
Номер выводаНазваниеНазначение вывода
1VDDПитание светодиода, 3,5…5,3 В
2DoutВыход управляющего сигнала
3GndЗемля
4DinВход управляющего сигнала

Главное преимущество данных светодиодов в том, что они могут соединяться в цепочку последовательно друг за другом, их можно соединять в ленты или собирать из них панели. При этом управление осуществляется всего по одному проводу. Это возможно благодаря тому, что каждый светодиод содержит в своём составе контроллер, который и управляет цветом и яркостью трёх каналов RGB. Из-за того, что управлять можно отдельно каждым светодиодом WS2812 в цепочке, такие светодиоды называются «адресные». На сегодняшний день это самые «продвинутые» светодиоды для организации больших массивов светодиодов.

Для примера на схеме показано последовательное подключение трёх светодиодов. На вход DIN первого светодиода подаётся управляющий сигнал. Светодиод обрабатывает его и передаёт далее со своего выхода DOUT на вход следующего в цепочке светодиода. И так сигнал проходит по всей цепочке светодиодов, каждый из которых считывает свою управляющую последовательность и изменяет свой цвет и интенсивность в соответствии с пришедшей командой.

Последовательное подключение светодиодов WS2812B
Последовательное подключение светодиодов WS2812B

На фотографии представлена панель размером 10 на 10 светодиодов, с которой мы и будем экспериментировать. Как видно, на нижней части панели светодиоды соединены в единую цепочку.

Внешний вид панели из светодиодов WS2812B
Верхняя сторона панели светодиодов WS2812B
Внешний вид панели из светодиодов WS2812B
Нижняя сторона панели из светодиодов WS2812B

Обратите внимание, что светодиодная панель весьма «прожорлива». На иллюстрации ниже это можно видеть по показаниям встроенного датчика тока источника питания: панель из ста светодиодов WS2812B потребляет ток более 3 амперов. Правда, почти все светодиоды в данном случае включены на максимальную яркость белым цветом (самый энергозатратный режим, т.к. для обеспечения белого свечения используются все три канала RGB на максимальной яркости).

Управление светодиодной панелью WS2812B
Управление светодиодной панелью WS2812B

Приблизительное потребление вашего устройства можно оценть так. Один канал светодиода на максимальной яркости потребляет около 20 мА. В одном корпусе располагаются 3 светодиода. Следовательно, один RGB светодиод в максимуме потребляет до 60 мА тока. Умножаете это число на количество светодиодов в вашей матрице или ленте – это и будет максимально возможное потребление, и ваш источник питания должен иметь возможность выдать такой ток.

2Управление светодиодами WS2812B (или WS2812)

Если просто подать на светодиодную ленту напряжение, ничего не произойдёт. Светодиоды ждут определённый сигнал, который будет ими управлять. Для управления используется последовательный однопроводный интерфейс. Биты "0" и "1" кодируются импульсами различной длины.

Коды нуля, единицы и сброса светодиода WS2812B
Коды нуля, единицы и сброса светодиода WS2812B

На диаграмме обозначены:

  • 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 бит. И расположены цвета в следующем порядке:

Кодирование цвета в пространстве RGB для светодиода WS2812B
Кодирование цвета в пространстве RGB для светодиода WS2812B

То есть для того чтобы выставить желаемый цвет на первом светодиоде в цепочке, необходимо сформировать 24-битный код и подать его на вход DIN цепочки. Если мы хотим выставить цвет на двух светодиодах, необходимо сформировать уже 48-битный сигнал и так же подать его на вход DIN цепочки. И так далее. Чем больше светодиодов в цепочке – тем более длинную последовательность мы должны подать на её вход. Получив управляющий сигнал, контроллер светодиода берёт из неё первые 24 бита и выставляет тот цвет, который указан в этих 24 битах. Затем он отбрасывает эти 24 бита, а оставшуюся часть последовательности передаёт дальше. Там ситуация повторяется. Когда вся последовательность обработана или когда приходит сигнал сброса Reset, светодиоды запоминают состояние и не меняют его, пока не придёт новый управляющий сигнал.

Осталось дело за малым: передать цепочке светодиодов WS2812B осмысленную управляющую последовательность.

На этот счёт есть такая идея. По сути нам необходимо передавать 24-битные значения цвета в соответствии с положением светодиода в матрице 10 на 10. Аналогичным образом данные хранятся в графических файлах формата *.BMP. Только у них в начале файла ещё присутствует заголовок, который содержит дополнительную информацию: размер изображения, сколько бит приходится на один пиксель, есть ли сжатие и т.д. Вот как в деталях устроен формат BMP:

Внутреннее устройство формата 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 мкс.

Осциллограмма части управляющего сигнала светодиодами WS2812B
Осциллограмма части управляющего сигнала светодиодами WS2812B

Теперь, когда мы умеем формировать биты необходимой длительности, нужно взять массив, считанный из соответствующего раздела BMP файла, и преобразовать его побитово в то, что нам нужно (бит "0" – в 0x8, "1" – в 0xE).

Я всё это уже проделал и прикладываю к статье маленькое консольное приложение, которое принимает на вход файл *.BMP и генерирует из него бинарный файл с управляющей последовательностью, которую нужно «скормить» цепочке светодиодов.

Чтобы загрузить управляющую последовательность, воспользуемся программой SPI via FTDI. Подключимся к микросхеме FT2232H, установим режим SPI и зададим скорость передачи 3 МГц. Также в полях состояний выводов укажем "00000000"; этот нулевой уровень будет служить сигналом Reset, по которому светодиодная лента «поймёт», что передача управляющей последовательности завершена. Теперь в разделе «Записать» выберем сгенерированный двоичный файл. Нажмём на кнопку, и файл, содержащий управляющую последовательность, будет передан цепочке светодиодов.

Параметры программы при загрузке управляющего массива WS2812
Параметры программы при загрузке управляющего массива WS2812

В качестве примера на изображении в поле «Команда» приведён массив, который активирует первые три светодиода в цепочке цветами красный, зелёный, синий.

Включение первых трёх светодиодов панели WS2812B
Включение первых трёх светодиодов панели WS2812B

Когда мы загрузим управляющую последовательность, сгенерированную программой, на панели загорится изображение, которое мы чуть ранее нарисовали в графическом редакторе.

Управление светодиодной панелью WS2812B
Управление светодиодной панелью WS2812B

С помощью такой панели можно создавать довольно красивые и зрелищные эффекты, как, например, цветовые градиенты:

Рисование с помощью светодиодной панели WS2812B
Рисование с помощью светодиодной панели WS2812B
Градиент с помощью светодиодной панели WS2812B
Градиент с помощью светодиодной панели WS2812B

Как развитие данной идеи, с помощью такой LED-панели можно воспроизводить анимацию. Для этого можно создать управляющий файл, в котором последовательно будут содержаться управляющие массивы для всех кадров анимации, а для обеспечения пауз между кадрами будет необходимое число нулей. Посчитать число нулей несложно, если вспомнить, что время передачи одного бита составляет 1,25 мкс.

Демонстрация анимации на светодиодах WS2812B
Last modified onВоскреснье, 11 Октябрь 2020 09:15 Read 715 times
Ключевые слова: :

Поделиться

Print Friendly, PDF & Email

2 comments

Leave a comment