ELECTRONICS

WS2811 и Arduino: лента на 12 В, три светодиода на пиксель, подключение и скетч

Адресные светодиоды и лентыСкетч проверен компиляцией

WS2811 — это не светодиод, а отдельная микросхема-контроллер. В ленте она стоит рядом с группой из трёх обычных RGB-светодиодов и управляет ими сразу: команда «зажечь пиксель» зажигает всю тройку одним цветом. Поэтому метр такой ленты по 60 светодиодов — это всего 20 адресуемых пикселей.

Зато лента питается от 12 вольт: три светодиода каждого цвета включены последовательно, и ток по ленте течёт втрое меньший, чем у пятивольтовой. Напряжение на длинных отрезках проседает слабее, питание подводят реже, провода тоньше. Это лента для подсветки комнаты, витрины или лестницы, а не для табло, где важен каждый пиксель.

Распиновка

ПроводКуда и зачем
+12VПитание 12 В от отдельного источника. К плате этот провод не идёт.
GNDЗемля. Соединяется и с блоком питания, и с землёй Arduino.
DI (DAT)Вход данных. Сюда приходит сигнал от вывода Arduino через резистор 330 Ом.
DOВыход данных на следующий сегмент; наружу нужен только при сращивании отрезков.

Как подключить к Arduino

Питание ленты и питание платы — разные цепи. Блок питания 12 В идёт на +12V и GND ленты, Arduino питается от USB или от того же блока через вывод VIN, на который 12 В подавать можно. Земли ленты и платы соединяют обязательно: без общей земли сигнал данных не читается.

Сигнал берут с любого цифрового вывода, в примере это шестой, и ведут через резистор 330 Ом к входу DI у самого начала ленты. Пятивольтовая логика Arduino подходит контроллеру WS2811 напрямую: сам чип на ленте питается через встроенный стабилизатор и понимает уровни 5 В. С платами на 3,3 В — ESP32, ESP8266 — сигнал слабоват, между платой и лентой ставят преобразователь уровня.

Провод +12V к плате не тянут никогда: на цифровой вывод или на 5V эти двенадцать вольт попадать не должны. Если лента и плата питаются от одного блока, плата подключается только через VIN.

Характеристики

Питание
12 В у большинства лент; бывают 5 и 24 В
Светодиодов на один контроллер
3 — адресуется тройка
Пикселей на метр
20 при 60 светодиодах на метр, 10 при 30
Ток одного сегмента
около 55 мА на белом
Ток метра ленты (60 шт.)
около 1,1 А при 12 В
Шаг реза
каждые три светодиода: 5 см при 60 шт./м
Протокол
однопроводный, 800 или 400 кГц
Логика входа
5 В напрямую, 3,3 В — через преобразователь

Чем отличается от соседей

Контроллер внутри каждого светодиода, питание 5 В, адресуется каждый пиксель. Для эффектов и табло — она; для ровной подсветки, где тройка светодиодов и так одного цвета, переплата.

WS2815

Тоже 12 В, но контроллер в каждом светодиоде и есть резервная линия данных. Адресуется каждый пиксель, как у WS2812B, при токе как у WS2811. Дороже обеих.

WS2818

WS2811 с резервной линией данных: те же тройки на 12 или 24 В, но обрыв одного сегмента не гасит остальные.

Пятивольтовая лента с резервной линией. Каждый светодиод — свой пиксель, и лента переживает сгоревший.

Что даёт 12 вольт

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

Расплата — общий цвет на тройку и то, что микросхема стоит отдельно: ленту режут только по меткам через каждые три светодиода, а в узкие места, куда влезала бы лента 5050 по 144 штуки на метр, WS2811 не помещается.

Библиотека

FastLEDТип ленты в строке addLeds — WS2811. Порядок цветов у лент WS2811 разный у разных производителей: чаще BRG или RGB, а не GRB, как у WS2812B. Если красный и синий поменялись местами, перебирают порядок в той же строке.

Методы FastLED, пример и типичные ошибки

Готовый скетч

#include <FastLED.h>

#define LED_PIN     6
#define NUM_PIXELS  20     // сегментов по три светодиода: метр ленты 60 шт./м
#define BRIGHTNESS  120

CRGB leds[NUM_PIXELS];

void setup() {
  // порядок цветов у WS2811 зависит от производителя: не BRG — пробуйте RGB
  FastLED.addLeds<WS2811, LED_PIN, BRG>(leds, NUM_PIXELS);
  FastLED.setBrightness(BRIGHTNESS);
}

void loop() {
  // плавная заливка: цвет медленно ползёт по всей ленте
  static uint8_t hue = 0;
  fill_rainbow(leds, NUM_PIXELS, hue, 255 / NUM_PIXELS);
  FastLED.show();
  hue++;
  delay(40);
}

Скетч собирается arduino-cli под Arduino UNO

Число в NUM_PIXELS — это сегменты, а не светодиоды. Если написать 60 для метровой ленты, скетч будет слать втрое больше данных, чем нужно: лента не сломается, но эффект окажется растянут за её край.

Частые ошибки

Двенадцать вольт попали на плату

Провод +12V ленты подключили к 5V или к цифровому выводу Arduino. Плата этого не переживает. Двенадцать вольт на плату можно подавать только через VIN или круглый разъём питания.

Цвета перепутаны

В addLeds указан порядок GRB по привычке от WS2812B. У WS2811 он другой и зависит от производителя: перебирают BRG, RGB, GBR, пока красный не станет красным.

Зажигается каждый третий светодиод

Это не поломка, так лента устроена: один пиксель в коде — три светодиода на ленте. Число светодиодов делят на три и получают NUM_PIXELS.

Лента с ESP32 мигает или молчит

Сигнал 3,3 В для входа WS2811 на грани порога. Между платой и лентой ставят преобразователь уровня на 5 В либо один пиксель-«переводчик» WS2812B, запитанный от 4,5 В.

Отрезали не по метке

Резать можно только по линии между сегментами — через каждые три светодиода. Разрез посередине тройки убивает сегмент целиком.

Что понадобится