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 В, адресуется каждый пиксель. Для эффектов и табло — она; для ровной подсветки, где тройка светодиодов и так одного цвета, переплата.
Тоже 12 В, но контроллер в каждом светодиоде и есть резервная линия данных. Адресуется каждый пиксель, как у WS2812B, при токе как у WS2811. Дороже обеих.
WS2811 с резервной линией данных: те же тройки на 12 или 24 В, но обрыв одного сегмента не гасит остальные.
Пятивольтовая лента с резервной линией. Каждый светодиод — свой пиксель, и лента переживает сгоревший.
Что даёт 12 вольт
Мощность та же, а ток втрое меньше, поэтому на проводах и дорожках ленты падает втрое меньше напряжения. Пятивольтовую ленту длиннее двух метров приходится питать с обоих концов, иначе дальний край желтит. Двенадцативольтовая держит четыре-пять метров от одного конца.
Расплата — общий цвет на тройку и то, что микросхема стоит отдельно: ленту режут только по меткам через каждые три светодиода, а в узкие места, куда влезала бы лента 5050 по 144 штуки на метр, WS2811 не помещается.
Библиотека
FastLED— Тип ленты в строке addLeds — WS2811. Порядок цветов у лент WS2811 разный у разных производителей: чаще BRG или RGB, а не GRB, как у WS2812B. Если красный и синий поменялись местами, перебирают порядок в той же строке.
Готовый скетч
#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 В.
Отрезали не по метке
Резать можно только по линии между сегментами — через каждые три светодиода. Разрез посередине тройки убивает сегмент целиком.
Что понадобится
- Адресная лента WS2811 на 12 В
- Блок питания 12 В с запасом по току
- Резистор 330 Ом
- Конденсатор 1000 мкФ на 16 В
- Arduino UNO