Адресные светодиоды WS2812B: устройство, подключение, ограничения

Адресные светодиоды WS2812B: устройство, подключение, ограничения

Как работают адресные светодиоды, чем различаются WS2811, WS2812B, WS2812S, WS2813 и SK6812, как подключить ленту к Arduino и управлять ею через NeoPixel.

Чем адресный светодиод отличается от обычного RGB

Обычному трёхцветному светодиоду нужны три вывода контроллера с ШИМ. Уже для игрушечного светофора из трёх таких светодиодов с плавным переключением потребуется 9 ШИМ-выводов, тогда как у Arduino UNO их всего 6.

Обычный трёхцветный RGB-светодиод

В адресном светодиоде рядом с RGB-кристаллами находится собственный контроллер, который сам формирует ШИМ для каждого цвета. Это даёт три преимущества: главный контроллер больше не генерирует по три ШИМ-сигнала на каждый светодиод; светодиоды соединяются цепочкой один за другим всего тремя проводами, включая питание, причём в цепочке могут быть сотни штук с индивидуальным цветом у каждого; для управления всей цепочкой достаточно одного вывода Arduino, причём любого, не обязательно с ШИМ.

Обновление происходит быстро: цепочка из 100 светодиодов получает данные за 3 мс, что теоретически позволяет работать с частотой до 300 кадров в секунду.

Изображение, сформированное адресными светодиодами

Протокол передачи данных

У самого распространённого варианта, WS2812B, четыре вывода: два питания, вход и выход данных. Команда — это 24 бита, по 8 на каждый цвет. Синхроимпульса нет, поэтому ноль и единица различаются длительностью импульса: 0,4 мкс — ноль, 0,85 мкс — единица. На один бит уходит 1,25 мкс, на один светодиод — 30 мкс.

Светодиод WS2812B и назначение его выводов

Каждый чип оставляет себе последние 24 бита, полученные перед завершением передачи, а всё предыдущее транслирует на выход, дальше по цепочке. Конец пакета обозначается паузой на низком уровне длительностью 50 мкс; после неё все чипы одновременно выставляют цвет и сохраняют его до следующей команды.

Осциллограмма передачи 24 бит данных на один светодиод

Разновидности

  • WS2811 — отдельный чип в корпусе SOIC-8 без светодиода; к нему подключают обычный RGB-светодиод или другую нагрузку, управляемую ШИМ.
  • WS2812B — самый популярный вариант, размер 5х5 мм, частота ШИМ 400 Гц.
  • WS2812S — с раздельным питанием чипа и светодиода; рекомендуется для особо длинных цепочек, так как напряжение на чипе меньше падает с расстоянием и не зависит от яркости.
  • WS2812B-Mini — уменьшенная до 3,5х3,5 мм и менее яркая версия.
  • WS2813 — частота ШИМ повышена до 2 кГц, сигнал проходит дальше даже через вышедший из строя чип; подходит для труднодоступных мест.
  • SK6812-RGBW — к трём цветам добавлен белый излучатель, на светодиод требуется 32 бита; светит ярче и подходит для освещения.

По исполнению различают ленты плотностью от 30 до 144 светодиодов на метр со степенью защиты IP30, IP65, IP67 или IP68 (все, кроме IP30, пригодны для улицы), отдельные «пиксели» для свободного размещения и светодиоды в привычном корпусе диаметром 5 мм, которые излучают равномерно во все стороны и удобны для гирлянд и кубов.

Размер5х5 мм
Частота ШИМ400 Гц
Напряжение питания5 В
Потребление при нулевой яркости1 мА на светодиод
Потребление при максимальной яркости60 мА на светодиод
ЦветностьRGB, 256 оттенков на канал, 16 млн цветов
Размер данных24 бита на светодиод
Скорость передачи данных800 кГц

Подключение к Arduino

Схема состоит из питания, земли и одной сигнальной линии, но есть несколько правил:

  • Блок питания рассчитывают на максимальную мощность с запасом: лента из 100 светодиодов потребляет до 6 А, лучше взять источник на 8 А и более.
  • Ленты длиннее пары десятков светодиодов питают с двух сторон или в нескольких точках по длине, чтобы избежать падения напряжения и перегрева дорожек.
  • Arduino и ленту можно питать от разных источников, но земля должна быть общей.
  • Резистор на управляющем выводе не обязателен, но желателен: без него при кратковременном обрыве питания ленты вывод контроллера может выгореть.

Управление через библиотеку NeoPixel

Передать пакет с нужной скоростью и точностью способен только код, близкий к машинному уровню, поэтому используют готовые библиотеки. Самые известные — NeoPixel и FastLED. NeoPixel занимает заметно меньше флеш-памяти и оперативной памяти контроллера.

При создании объекта указывают количество светодиодов, номер управляющего вывода и тип ленты: Adafruit_NeoPixel strip(PIXEL_COUNT, PIXEL_PIN, NEO_GRB + NEO_KHZ800). Сочетание NEO_GRB и NEO_KHZ800 подходит для WS2812B, для лент с белым каналом выбирают вариант RGBW.

  • strip.begin() — инициализация; сразу после неё рекомендуется вызвать show(), чтобы погасить случайно загоревшиеся пиксели.
  • setBrightness(50) — задаёт общий масштаб яркости: максимальное значение цвета ограничивается этим параметром, промежуточные уменьшаются пропорционально.
  • setPixelColor(i, R, G, B) или setPixelColor(i, 0xRRGGBB) — цвет светодиода с номером i, нумерация с нуля. Для RGBW-лент добавляется четвёртый байт белого.
  • show() — отправляет подготовленный массив на ленту. На время передачи отключаются прерывания и таймеры, что может повлиять на отсчёт времени и реакцию контроллера на события.

Для нескольких лент создают несколько объектов Adafruit_NeoPixel, каждому назначая свой вывод; так же рекомендуется разбивать слишком длинные ленты.

Недостатки и ограничения

  • Помехоустойчивость. Быстрая передача без синхронизации и обратной связи чувствительна к помехам: любая из них портит весь пакет. При длине проводов до первого светодиода и между светодиодами более 10 см сбои появляются от наводок.
  • Температура. При морозе от -15 градусов и ниже чипы начинают работать со сбоями и могут перестать работать совсем; для улицы стоит предусмотреть подогрев.
  • Глубина цвета. Светодиоды начинают светиться примерно с уровня 6–8 и сразу довольно ярко, поэтому глубоких тёмных оттенков получить не удаётся.
  • Цветопередача. Полученный цвет не всегда совпадает с ожидаемым, а чистые цвета могут отличаться от модели к модели и от партии к партии.

← Все статьи