ELECTRONICS

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 Ом у первого светодиода и общая земля решают почти все такие случаи.

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