WS2812B и Arduino: схема подключения адресной ленты, библиотека FastLED и скетч
WS2812B выглядит как обычный светодиод, но внутри его корпуса спрятан управляющий контроллер. Он получает по одному проводу длинную посылку, забирает первые три байта себе — яркость зелёного, красного и синего — а остальное передаёт следующему светодиоду в цепочке.
Поэтому лента из ста светодиодов управляется одним выводом платы. И поэтому же подключать её нужно строго с того конца, где нарисована стрелка: сигнал идёт только в одну сторону.
Схема подключения
Распиновка
| Провод | Куда и зачем |
|---|---|
| VDD (5V) | Питание 5 В. Для ленты — от отдельного источника. |
| GND | Земля. Обязательно общая с платой. |
| DIN | Вход данных. Сюда приходит сигнал от Arduino через резистор. |
| DOUT | Выход данных. Идёт на DIN следующего светодиода в цепочке. |
Характеристики
- Питание
- 5 В
- Ток одного светодиода
- до 60 мА на белом во всю яркость
- Ток метра ленты (60 шт.)
- до 3,6 А
- Глубина цвета
- 8 бит на канал, 16,7 млн оттенков
- Частота обновления
- около 400 кадров в секунду на 100 светодиодов
- Управление
- один цифровой вывод на всю ленту
Сколько нужно питания
Считать просто: шестьдесят миллиампер на светодиод в худшем случае — это белый цвет на полной яркости. Тридцать светодиодов — почти два ампера, метр по шестьдесят штук — три с половиной.
На практике до такого доходит редко: цветные эффекты потребляют втрое меньше. Но блок питания берут с запасом, по худшему случаю, иначе при первой же белой вспышке напряжение просядет и плата перезагрузится.
И ещё: землю внешнего источника обязательно соединяют с землёй Arduino. Без общей земли уровень сигнала данных не с чем сравнивать, и лента либо не зажигается, либо мигает случайными цветами.
Библиотека
FastLED— Ставится через менеджер библиотек. Умеет десятки типов лент, палитры и готовые эффекты. Альтернатива — Adafruit NeoPixel: проще устроена и занимает меньше памяти, но и возможностей меньше.
Готовый скетч
#include <FastLED.h>
#define LED_PIN 6
#define NUM_LEDS 8 // сколько светодиодов в цепочке
#define BRIGHTNESS 60 // не ставьте 255 при питании от платы
CRGB leds[NUM_LEDS];
void setup() {
FastLED.addLeds<WS2812B, LED_PIN, GRB>(leds, NUM_LEDS);
FastLED.setBrightness(BRIGHTNESS);
}
void loop() {
static uint8_t hue = 0;
// радуга: каждому светодиоду свой оттенок со сдвигом
for (int i = 0; i < NUM_LEDS; i++) {
leds[i] = CHSV(hue + i * 32, 255, 255);
}
FastLED.show(); // без этой строки в ленту ничего не уйдёт
hue++;
delay(20);
}Скетч собирается arduino-cli под Arduino UNO
Порядок цветов указан как GRB, и это не опечатка: WS2812B принимает сначала зелёный. Если поставить RGB, красный и зелёный поменяются местами — классический симптом неправильно указанного типа ленты.
Частые ошибки
Лента не реагирует вообще
Провод данных подключён к DOUT вместо DIN, то есть лента подключена с обратного конца. Ищите стрелки на ленте — сигнал идёт только по ним.
Красный и зелёный поменялись местами
В скетче указан порядок RGB вместо GRB. Меняется одним словом в строке addLeds.
Первый светодиод горит, остальные нет
Обычно это просадка питания или обрыв дальше по цепочке. Проверьте напряжение на дальнем конце ленты под нагрузкой: если сильно ниже пяти вольт, нужно подводить питание с обоих концов.
Плата перезагружается при включении
Все светодиоды вспыхивают одновременно, и бросок тока сажает питание. Помогает конденсатор на 1000 микрофарад у начала ленты и ограничение яркости в скетче.
Светодиоды мерцают случайными цветами
Нет общей земли с платой либо слишком длинный провод данных. Резистор на 330 Ом у первого светодиода и общая земля решают почти все такие случаи.
Что понадобится
- Адресная лента WS2812B или отдельные светодиоды
- Резистор 330 Ом
- Конденсатор 1000 мкФ
- Блок питания 5 В с запасом по току
- Arduino UNO