119-Умные светодиоды WS2812B NeoPixels

Автор: | 24.07.2015

Светодиоды (пиксели) WS2812B и светодиодные ленты на базе этих пикселей довольно популярны и это оправдано по нескольким причинам:

— компактность — пиксель содержит в своем корпусе (размером всего 5х5 мм) 3 светодиода и драйвера для них
— простота управления – пиксель управляется посредством простого последовательного интерфейса, который легко реализовать как программно, так и используя аппаратные интерфейсы МК (такие как SPI и UART)
— управление всего по одной линии (не считая проводов питания)
— неограниченное количество включенных последовательно пикселей
— относительно небольшая стоимость (если посчитать стоимость отдельно 3х светодиодов и драйверов к ним выйдет гораздо дороже)

Эта статья попытка обобщить информацию (наверное, больше для себя) об умных светодиодах WS2812B в одном месте.

Начнем знакомство с серией WS

Первым идет WS2801

Фактически, это не светодиод а микросхема-драйвер для RGB-светодиода с последовательным интерфейсом SPI (есть линия данных и тактовая линия). Эти микросхемы используются во встраиваемых конструкциях пикселей:

Есть и ленты с использованием этих драйверов, но, наверное, их не найти уже.

WS2801.pdf - Даташит


Дальше — WS2811

Это тоже микросхема для управления RGB-светодиодом, но она уже компактней (8 ног, в отличие от WS2801 — 14 ног) и имеет однолинейный последовательный интерфейс.

WS2811.pdf - Даташит


Приближаемся — WS2812(S)

Это уже интегрированные в SMD корпусе 5050 и драйвер и сами светодиоды. Корпус 6-ти ножечный

Как и в предыдущем WS2811 интерфейс однолинейный, но тайминги протокола другие несовместимые.

WS2812.pdf - Даташит


И, наконец, WS2812B

Это почти аналог предыдущего светодиода, но уже с 4-мя ножками и слегка измененными таймингами протокола (совместимы, при использовании компромиссных значений временных периодов сигналов)

WS2812B.pdf - Даташит


Еще существует WS2812D (аналог PD9823)

Это полностью WS2812B но в корпусе обычного 8мм светодиода.

WS2812D.pdf - даташит


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


Принцип работы WS2812B — официальная информация из даташита.

Физически в WS2812B имеется 3 излучающих светодиода (красный, синий и зеленый) и ШИМ-драйвера управляющие их яркостью. ШИМ-драйвера 8-ми битные, то есть для каждого из цветов возможны 256 градаций яркости и, соответственно, для того чтобы установить яркости для каждого из 3-х светодиодов нужно передать пикселю 8х3=24 бит (3 байта) информации. Протокол передачи информации светодиоду однолинейный с фиксированной скоростью. Единички и нули информации о яркости кодируются длительностью высокого и низкого уровня сигнала в линии.

Время передачи одного бита составляет  0.8+0.45=1.25 мкС — это довольно быстро. Время передачи всего пакета из 24 бит для одного пикселя WS2812B составляет 24*1.25=30 мкС. Для 1000 штук — 1000*30=30 мС (что, например, позволяет обновлять по одной линии панно 30х30 пикселей с частотой 30 раз в секунду!).

Каждый из пикселей WS2812B имеет 2 вывода питания (VDD, VSS), вход (DIN) и выход (DOUT).

На вход DIN подается информация (24бита) для установки нового цвета. Информация о цвете передается побитно (начиная со старшего бита) последовательно для каждой из составляющей цветов G, R, B.

Пиксели соединяются в цепочку следующим образом:

Запись значений цвета цепочке пикселей происходит следующим способом:
Первые 24 бита поданные на DIN записывает себе во временную память (цвет пока остается неизменным с предыдущего раза) первый пиксель. Последующие биты первый пиксель пропускает через себя и выдает на выход DOUT. Второй пиксель повторяет действия первого (оставляя себе первые дошедшие до него 24 бита)  и так по цепочке. Для того, чтобы значения цветов из временной памяти пикселей стали активными должна быть выдержана пауза в передаче (reset code) в течении 50мкС. После этой паузы цикл можно повторять снова.

Вот это основное, что нам говорит довольно скудный даташит.


Теперь более интересная часть – 
Практические способы включения ленты и реализации протокола WS2812B.

То, о чем умалчивает даташит, я собрал из разных источников у людей имевший практический опыт работы с WS2812B. Конечно, это больше касается лент.


Для начала, общие советы (по большей части взятые с https://learn.adafruit.com):

— подключайте к ленте (между линиями питания) конденсатор побольше, вплоть до 1000 мкФ

— в разрыв линии данных (от МК к ленте) добавляйте резистор  300 — 500 Ом, устанавливая его ближе к ленте.

— по возможности, делайте короче провод данных к ленте

— при «горячем» подключении ленты, подключайте «землю» первой (отключайте последней)

— если лента запитана от отдельного источника питания, ее нужно запитать первой (после чего запитать схему управления)

— не допускайте статического электричества при монтаже ленты

— используйте преобразователь уровня, если лента и устройство управления запитаны от источников питания с разным напряжением

— напряжение питания пикселей, заявленное в даташите, лежит в пределах +3.5 ~ +5.3 вольт. Из чего видно, что предпочтительней подавать на ленту меньше 5ти вольт (этим правилом следует пользоваться при выборе количества элементов при батарейном питании)

— максимальный ток каждого пикселя составляет 60мА (при полной яркости белого цвета). Если Вы не планируете использовать ленту WS2812B как источник белого света (для этого лучше взять обычную светодиодную ленту с белыми светодиодами), то принято считать, что, усреднено, каждый пиксель потребляет 20мА.

Соответственно:
минимальный  ток ИП = 20мА*количество_пикселей.
максимальный  ток ИП = 60мА*количество_пикселей

— из последнего пункта вытекает следующее: если лента длинная, то недопустимо подавать на нее питание только с одной стороны. Для того чтобы исключить перегревание (или даже перегорание) токопроводящих дорожек ленты, питание ленты необходимо распределить по всей ее длине, подводя питание в нескольких местах отдельными проводами.


Теперь более ценные советы по реализации протокола

Есть несколько способов реализовать протокол умных светодиодов:
— аппаратный при помощи SPI-интерфейса
— аппаратный при помощи UART-интерфейса
— программный

Достоинство первых двух способов – это возможность освободить МК от части работы по передаче бит информации о цвете пикселю. Недостатки этих способов – во-первых, ограниченное количество линий управления пикселями (у МК редко бывает много незадействованных интерфейсных выходов), во-вторых, требуется дополнительное разбитие байтов информации о цвете на пачки битов (что частично съедает свободное время МК в моменты аппаратной передаче бит)


Реализация протокола WS2812B (NeoPixel) при помощи SPI

Прежде, чем приступить к реализации, следует акцентировать внимание, что у WS2812B кодирование нулей и единичек происходит по правилу 1/3 (смотрите даташит выше). То есть ноль передается как 1/3 времени высокий уровень и 2/3 низкий. Единица – это 2/3 высокий и 1/3 низкий. Из этого следует, что для передачи одного бита для  WS2812B нам достаточно 3х бит переданных по SPI.

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

Но есть решение этой проблемы! Забегая наперед, сообщу, что для пикселя важна длительность периода высокого уровня, а низкий уровень может быть с бОльшим отклонением, чем указано в даташите. Поэтому мы может удлинить наши цепочки бит SPI с трех до четырех:

Вот теперь алгоритм становится более простым и приемлемым к реализации.

Для выдачи информации на пиксели используется только один вывод SPI – MOSI. Выводы MISO и SCK остаются незадействованными. Частота SPI должна быть 1/0.4мкС = 2.5МГц


Реализация протокола WS2812B (NeoPixel) при помощи UART

Все, о чем я писал для SPI, подходит и для UART, но тут есть несколько моментов, которые усложнят реализацию:

— UART в паузах удерживает свою выходную линию (TXD) в высоком уровне, что для пикселей недопустимо, так как невозможно будет избежать неопределенностей в моменты начала и окончании передачи

— соответственно, нужно инвертировать сигнал перед подачей его на пиксели

— а, так как линия инвертируется, нужно инвертировать и передаваемые данные

— UART-пакет, в отличии от SPI, содержит служебные биты – это старт-бит и стоп-бит (бит четности нужно отключать в настройках UART — он не нужен). Дополнительные биты служебной информации нужно учитывать при формировании передаваемого байта, так как они тоже пойдут в пиксель

В итоге, если учесть все нюансы, получается идеальная реализация протокола. Устанавливаем скорость UART 2.5 МГц (это нестандартно), устанавливаем размер кадра 7 бит (вместо стандартных 8-ми), убираем бит четности, оставляем один стоп-бит и получаем следующую картинку:


Программная реализация протокола WS2812B (NeoPixel)

Переходим к тому разделу, ради которого я и писал эту статью (но, видимо, увлекся по ходу 🙂 ). Для меня интересней реализовать этот протокол программно, так как эта реализация дает мне произвольное количество линий у МК к которым можно подключить ленты и управлять ими независимо. Это плюс. Минусом является то, что протокол довольно быстрый и это накладывает ограничения на процедуру формирования сигналов и, конечно, в моменты вывода значений цвета все прерывания у МК должны быть запрещены.

Первая проблема, которую придется решать – это формирование малых временных интервалов.
Для примера. МК работает на частоте 16МГц. Время одного такта 0,0625 мкС
Для формирования интерфейса WS2812B нам нужно формировать 2 временных интервала: 0,4мкС  (6 тактов) и 0,85мкС (14 тактов). Всего период бита составляет 20 тактов. Очевидно, язык высокого уровня не способен сформировать код с точной размерностью по тактам. Это возможно реализовать только на языке низкого уровня – придется использовать ассемблер (по крайней мере, только для этой процедуры).

Дальше возникает проблема с точностью формирования этих промежутков. Если мы говорим о передаче данных только для одного пикселя (3 байта), то периоды можно соблюсти очень точно, прописав отдельно буквально каждый бит. Другое дело если нам нужно передавать массив значений в одной посылке без пауз. Тут придется создавать алгоритм, который, кроме того что формирует сигнал (дрыгает ногой МК), еще и считывает данные с массива данных в SRAM (или Flash), возможно, осуществляет несложную обработку данных. В этом случае очень сложно будет уложиться в 20 тактов периода передачи бита и, неизбежно, будут возникать ситуации, где потраченное на обработку время превысит допустимые значения. Вот тут нам помогут исследования проведенные здесь:

Привожу итоговую таблицу того что допускает протокол в плане ухода от даташита.

Более детально читайте в статье по ссылке выше, но если кратко — протокол требует более жесткого формирования периодов сигнала с высоким уровнем, а периоды с низким уровнем могут быть значительно затянуты. Это дает нам простор для реализации «тяжелых» мест.

Далее, даташит нам дает время паузы после которой происходит защелкивание новых значений цвета – 50 мкС. По факту, защелкивание начинается уже после 10 мкС – нужно стараться не делать паузы больше 10 мкС во время передачи длинных пакетов данных.

И последнее, как видно из приведенных выше даташитов, у пикселей WS2812 и WS2812B разные временные периоды, формирующие нули и единички. Но используя допустимые отклонения по времени можно реализовать протокол, который сможет работать без проблем с обоими пикселями.

(Visited 39 481 times, 161 visits today)

119-Умные светодиоды WS2812B NeoPixels: 33 комментария

  1. mcmega

    Очень познавательно! Спасибо огромное, буду ждать реализации задуманного.

  2. kkozyrev

    Спасибо. Здорово и как всегда интересно. Жду продолжения

  3. GetChiper Автор записи

    Уже есть первое устройство — за субботу собрал.
    Очень интересно получается! Доведу до презентабельного вида — будет новая статья.

  4. Jack

    Хотел купить ленту к НГ, да увидя эту статью призадумался… Если брать 60 диодов/метр то 5 метров будет потреблять 9А! ОК, возьмем 30 диодов/метр — 4.5А (30*5*20мА=4500мА). В таком случае питание нужно подавать через каждый метр? Получается 30*20мА=600мА на метр.

  5. GetChiper Автор записи

    Так проблема в большом токе?
    Думаю метра 2 можно включать без промежуточной подпитки (по крайней мере я включал)

  6. Jack

    GetChiper :
    Думаю метра 2 можно включать без промежуточной подпитки (по крайней мере я включал)

    Дорожки не выгорят/перегреются если через 2 метра подключать? Провод/кабель какой лучше использовать? 0.5 0.75 1.0 кв.мм.?

  7. GetChiper Автор записи

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

    А вообще, по меди обычно берут сечение с расчета 7 А на 1кв.мм

  8. Jack

    @GetChiper
    Спасибо!
    Ну да мигать будет, белого впринципе вообще никогда не будет, да мне на НГ, на праздники и так, вечерами иногда включать)))

  9. sasa123a

    Приветствую! Подскажите пожалуйста.
    Я планирую покрыть лентой WS2812B костюм, как тело человека. Это где-то 150 метров ленты или около 9000 диодов. Все это должно работать от аккумулятора и иметь миниатюрную систему управления. задача только показывать заготовленные видео с флешки 30кадров в секунду.
    Вопрос1: с чего лучше запускать систему. Я так понял, что ардуино нано не потянет такое количество диодов.
    Вопрос 2: как мне найти специалистов которые могут сделать эти работы в моём городе (казань) на платной основе. Спаять и приделать ленту смогу сам. Спасибо

  10. GetChiper Автор записи

    Лучше не завязываться на разработке с нуля — можно погубить проект.
    Существуют готовые контроллеры — просто нужно подобрать более подходящий.
    http://ru.aliexpress.com/wholesale?catId=0&initiative_id=AS_20151120073804&isPremium=y&SearchText=ws2812+controller+sd

    Единственно проблемой будет аккумулятор (вернее его размер) — ток-то не маленький. В среднем 270А. Чтоб Вы понимали, стандартного аккумулятора для автомобиля (весом в 15кг и емкостью 60А/ч) хватит на 10 минут работы устройства.

  11. sasa123a

    @GetChiper
    Спасибо за ссылку. На данный момент на верхней половине тела уже стоят 5 блоков питания. Их заказывали алиэкспресс примерно по 2000р каждый. Предыдущий инженер говорил, что надо еще где-то 3 для ног и ботинок. Не решает ли надобность в огромном аккумуляторе? Я честное слово супердилетант, поэтому прошу совета как мне найти людей такой профессии, которые могли на пальцах показать что делать, или сделали бы сами.
    Времени работы надо всего 10 минут. Аккумуляторы наверное можно распределить по телу несколько штук?

  12. GetChiper Автор записи

    Да, автомобильный аккумулятор — это я для эффектного примера привел :).
    Если брать современные аккумуляторные блоки (которые, по видимому, и заказал Ваш инженер)то при подходе без фанатизма к времени работы — все возможно.
    Проект, конечно, амбициозный и в плане визуального эффекта и в денежном плане — я бы хотел увидеть как это получится.

    Но, человека, который-бы разбирался в теме и смог адекватно вести проект Вам обязательно нужно найти — иначе Вы рискуете не закончить проект.

    Я-бы, наверное, в Вашей ситуации (я так понимаю с финансированием проблем нет?) нашел-бы в Казани адекватных рекламщиков занимающихся светодиодной рекламой и одного мастера (больше не нужно) из них привлек-бы к проекту.

  13. sasa123a

    @GetChiper
    Спасибо, попробую найти рекламщиков)
    А вы не Казани случайно обитаете?

  14. GetChiper Автор записи

    Нет, не в Казане)

  15. vitalic_81

    Всем привет! Возник вопрос, может и детский. WS2812B соединены на ленте последовательно. Допустим вышел из строя 3-й светодиод, я беру со второй ленты донора (например светодиод №9) и меняю неисправный третий. Что случится с эффектами в данной ситуации? Или все будет нормально? Они сами определяют последовательность?
    Подскажите пожалуйста!

  16. GetChiper Автор записи

    Все будет нормально — лента этого не заметит.

  17. timmy_l

    Добрый день, а нужно ли подпитывать на промежуточных участках, если я собираюсь использовать 3-3.5 метра 2812b (30 диодов на метр), в итоге где-то 104 диода будет.
    И нужно ли в таком случае подключать всю ленту последовательно, или в местах подключения доп питания, подключать только по DATA пину?

    Блок питания заказал на 5в, 8А. хочу собрать по этому гайду подсветку, паять умею.
    (http://mysku.ru/blog/aliexpress/28820.html)

  18. GetChiper Автор записи

    Должно нормально работать и без подпитки.

  19. Анатолий-Войцеховский

    интересут чать програмирования по среде arduino, планиниру управлять 3 ряда по 8 светодиодов. Интересует среда програмировани и пример

  20. Андрей-Данилец

    Помогите! Сделал стол с подсветкой. Всё работал хорошо единственное что меня напрягала так это то что иногда раз в 10-20 мин лента на мгновения местами ярко вспыхивало (как вспышка молнии). Я решил поэкспериментировать и заменить резистер 220 ом, который стоял на входе для сигнала от ардуины к ленте (ID), на резистор 1k ом в надежде что это исправит сей дефект. Но похоже что я всё сломал. После того как я подключил резистор на 1k у меня перестало гореть половина ленты, либо сразу при включении, либо она в начале вся работает, но через 2 мин одна половина работает нормально, а вторая замирает, не перилеваеться и светиться случайными цветами. Я с дуру поменял резистор когда подсветка вместе с контролером была включена. Это плохо да? Как вы думаете что вообще могло сломаться?

  21. admin Автор записи

    А если вернуть назад 220 Ом?

  22. Ваня-Дулин

    Здравствуйте уважаемый GetChiper, благодарю за статью, но я несколько недель нахожусь в поиске проблемы которую не могу решить. У меня есть костюм для светового шоу, а точнее костюмов три, они сделаны на светодиодах ws2812b, мы достаточно бережно их возим, выступаем и прочее, но постоянно выходят те или иные пиксели, приходится их менять регулярно, нахожу какой именно некорректно работает, вырезаю фрагмент и впаиваю новый. Но как не всматривался так и не увидел физических повреждений самой ленты или не пропайки. В костюме дополнительное питание раз в какой то промежуток присутствует, помогите мне найти причину и устранить её. Заранее благодарен Вам!!!

  23. admin Автор записи

    Первое, что нужно сделать — это проверить качество питания (уровень, помехи).

    Если с питанием все нормально, то причиной могут быть не очень качественные светодиоды (я уверен что их производят у китайцев все кому не лень). Пока кусок ленты небольшой — это особо незаметно. Но когда пикселей много — закон больших чисел начинает работать.

    Входной сигнал, в общем, не имеет значения, так как он ретранслируется самими пикселями и если сгорает не первый, то причина не в этом.

  24. Chrome2-Zzz

    Друзья, с наступающими праздниками! Я к вам за срочной скорой помощью!!!

    Срочно нужна помощь, совет. До нового года считанные дни, а у меня неполадки с гирляндами.
    Купил на Али-Экспресс блок управления T1000S и 5 пиксельных гирлянд на 50 светодиодов каждая, получается в сумме на 250 светодиодов.
    https://ru.aliexpress.com/item/original-T1000S-SD-card-for-WS2801-WS2811-LPD6803-led-pixel-controller-RGB-full-color-DMX512-2013/1132147162.html?spm=2114.13010608.0.0.jmzSLM&detailNewVersion=&categoryId=200001057
    https://ru.aliexpress.com/item/12mm-WS2811-as-WS2801-led-pixel-module-IP68-waterproof-DC5V-full-color-RGB-50pcs-a-string/1022672558.html?spm=2114.13010608.0.0.jmzSLM&detailNewVersion=&categoryId=200001559

    Покупал их поэтапно: сначала 3 гирлянды и блок управления, проверил — все работает. Через пару месяцев заказал еще две, тоже все работало. Все это еще по лету.
    Где-то 10го декабря достал я эти запасы, подключил их все. На каждой гирлянде есть выход на доп.питание. Допаял разъемы, сделал на все это центральную жилу доп.питания, запустил — все отлично работает. Погонял ее, включал-выключал, менял программы, тестил, как мог — все было хорошо. Собрал, аккуратно убрал до появления елки.
    Вчера развесили на елку всю эту красоту, включаем — НЕ РАБОТАЕТ!
    Методом соединения-разъединения разъемов выяснили, что нижний ярус, первая по счету гирлянда, не работает. Все остальные четыре штуки — работают. Сняли нерабочую, подключили ее одну напрямик к блоку управления T1000S. Не горит. Прозвонили красный-зеленый провод, отвечающий за питания 5В, питание есть. Стали проверять белый провод, отвечающий за сигнал (DAT). Иглой с проводом подключились к блоку управления (к разъему DAT), и через каждый пиксель проверяли провод на пробой, так как мультиметром этот провод нельзя прозвонить на пробой, по той причине, что он проходит через микросхему WS2811 (это ШИМ-Контролер, отвечающий за адресацию светодиодных пикселей).
    Получается, что с первого светодиода не идет сигнал ко второму и далее. Я в этом не силен, но впечатление, что микросхему на первом светодиоде просто выбило, из-за чего сигнал и не проходит, и гирлянда не горит.
    Решил отрезать этот злополучный светодиод вместе с микросхемой, и оставить 49 пикселей. Сделал, подключил эту гирлянду напрямую к блоку управления — работает. Вернул на елку, подключил ее в цепь, включаю. Горит только эта гирлянда, все остальные — нет.
    Методом подключения каждой гирлянды в отдельности к блоку управления, я понял, что из строя вышла вторая по порядку гирлянда. История та же, что и с первой.
    Сижу и не знаю, что делать. Боюсь пожечь все микросхемы на гирляндах. Кромсать от балды я их больше не хочу. Есть какая-то причина, что пиксели выходят из строя, но я не могу ее определить и понять.
    Простите, если не совсем внятно описал всю ситуацию, постарался все объяснить, как можно подробнее, дабы не упустить что-то важное, чего сам могу не учесть.
    Может кто-то сталкивался с подобным или разбирается в таких вещах. Прошу помогите. Очень хотел устроить детям красоту, а получается все срывается. Да и денег вложено немерено!

  25. admin Автор записи

    На форуме ответил

  26. Владимир

    Подскажите, кто нибудь реально мерил потребляемый ток одним пикселом на ленте WS2812b?. У меня получается при питании 5V и белом цвете 30-35 мА. Т.е. до паспортных 60 ма не доходит. Проверял, как минимум на пяти лентах разных производителей. А на матрице 8х8 (64 пикселя) потребляемый ток
    2290 мА, т.е. 36 мА на пиксель. И при этом за 5 минут матрица нагрелась до 73 градусов. Дальше не стал испытывать прочность светодиодов. Включил на 1/4 яркости. При этом температура упала до 55 градусов.
    Просто хочется понять, это у меня все ленты такие бракованные (60 мА/пиксель и близко нет), или это практически у всех так?

  27. GetChiper Автор записи

    Насколько я помню, мои замеры были близки к номинальным. Ток зависит от напряжения питания. 5 вольт при максимальной яркости не проседает?

  28. GetChiper Автор записи

    Тогда это действительно может быть показателем качества леннты…

  29. Джигурда

    Добрый день, хочу спаять кольцо из примерно 40-50 WS2812B, их можно просто спаять параллельно или нужно сопротивление между ними(кроме того, что между контроллером и первым диодом)? Кольцо будет запитано от стабилизатора на LM2596

  30. GetChiper Автор записи

    Привет!
    Bсе пиксели ставятся последовательно друг за другом. Сопротивления не нужны.

Добавить комментарий