Подключение адресной светодиодной ленты WS2812B к Arduino

23.02.2017 20:25

genaonyx



WS2812B

Введение

Приветствую всех. Мы продолжаем знакомить Вас со светодиодными лентами. На этот раз мы рассмотрим адресную RGB светодиодную ленту WS2812B. Лента основана на светодиодах WS2812B в корпусе LED 5050, куда в корпус производители поместили не только три встроенных светодиода (Красный, Зеленый, Синий), но и управляемый ШИМ драйвер, управляющий их яркостью. Благодаря этому мы можем получить произвольный цвет, изменяя яркость встроенных светодиодов, а так же управлять отдельно взятым пикселем на ленте. Собственно, три встроенных разноцветных светодиода вместе с ШИМ драйвером и образуют светодиод WS2812B.

Немного запутывает, не правда ли? Светодиод, который содержит себе три разноцветных светодиода, но при этом сам - не светит, а светятся те три, что в него встроены. Поэтому мне проще называть его пикселем, нежели светодиодом. И далее, если я упоминаю пиксель – знайте, что это светодиод WS2812B.

На фото справа вы можете увидеть этот самый светодиод WS2812B, где большой черный прямоугольник это ШИМ драйвер, а вот три встроенных в него светодиода настолько малы, что их с трудом видно, и можно отследить только по золотым нитям, идущим от драйвера к трем разноцветным светодиодам.


Технические характеристики

Теперь давайте немного пройдемся по техническим характеристикам из datasheet который мне удалось раскопать в интернете.

  • Светодиод WS2812B работает от напряжения 5В (±0.5).
  • Ток ~20мА на один встроенный светодиод, то есть ~60мА на пиксель в целом.
  • Рабочая температура от -20 до +80 ℃.

Остальное можете посмотреть самостоятельно в даташите.


Подключение

Подключается светодиодная лента довольно-таки просто, необходимо подать на +5V и GND, плюс (+) и минус (-) от 5В блока питания, а контакт DIN соединить с портом Arduino, как правило, по умолчанию используется 6-й порт Arduino, но вы вправе выбрать и любой другой свободный порт. Так же рекомендуется соединить земли Arduinoи блока питания, как нарисовано на рисунке ниже.

Будьте внимательны, лента на светодиодах WS2812B имеет направление, с одной стороны она имеет контакты DIN, +5V, GND, а с другой стороны DO, +5V, GND, подключать необходимо именно вход, то есть DIN, иначе лента не будет работать. Так же на ленте нарисованы стрелки, указывающие на направление.


WS2812B подключение к Arduino

Протокол

Теперь, когда мы разобрались, как подключить нашу ленту к Arduino, нам надо понять, как ею управлять, для этого в даташите есть описание протокола, который мы сейчас и рассмотрим.

Каждый светодиод WS2812B имеет один вход (DIN) и один выход (DO). Выход каждого светодиода подключается ко входу следующего. Подавать сигналы же надо на вход самого первого светодиода, таким образом, он запустит цепь, и данные будут поступать от первого ко второму, от второго к третьему и т. д.

Команды светодиодам передаются пачками по 24 бита (3 байта, один байт на каждый цвет, первым передается байт для зеленого, потом для красного, и заканчивает байт для синего светодиода. Порядок бит - от старшего к младшему). Перед каждой пачкой идет пауза в 50 мкс. Пауза больше 100 мкс воспринимается как окончание передачи. Все биты, будь то 0 или 1, имеют фиксированное время 1.25 мкс. Бит 1 кодируется импульсом в 0.8 мкс, после чего идет пауза в 0.45 мкс. Бит 0 кодируется импульсом в 0.4 мкс, после чего идет пауза в 0.85 мкс. Собственно, наглядная диаграмма на фото ниже. Так же допускаются небольшие погрешности в 0-150 нс на каждый фронт. Ну и следует учесть, что подобное необходимо повторить для каждого светодиода на ленте, после чего сделать паузу минимум в 100 мкс. Потом можно повторить передачу.

WS2812B протокол

Глядя на все эти цифры, становится ясно, что сделать все это, используя стандартные функции digitalWrite, delay и тому подобные - попросту невозможно, ввиду их долгой работы и неточности. Реализовать подобный протокол можно только использовав специальные библиотеки вроде CyberLib или написав собственную на чистом Си или, того хуже для нынешнего программиста, на Ассемблере.

Но не все так плохо, как кажется. Светодиоды WS2812B довольно таки популярны в Arduino сообществе, а это значит, что нам не придётся вдаваться в такие сложности, и достаточно выбрать одно из понравившихся решений.


Библиотеки

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

  • Библиотека FastLED, разрабатывается Даниэлем Гарсиа и Марком Кригсманом. Имеет свой сайт, справочную систему и большое сообщество в ~5000 человек. Библиотека написана на чистом Си, без использования Wiring. FastLED поддерживает все виды Arduino (и не только), а так же умеет работать с кучей различных протоколов и интерфейсов. В том числе и протокол для управления лентами на светодиодах WS2812B.
  • Библиотека Adafruit NeoPixel (Полное описание на нашем сайте), разрабатывается компанией Adafruit Industries. Предназначена для работы со светодиодными лентами и неопиксельными кольцами, продаваемыми в их интернет магазине. Библиотека написана на Си и Ассемблере с небольшим использованием Wiring. Эдакая солянка. Поддерживает все виды Arduino. Содержит меньший функционал по сравнению с FastLED, немного медленней, но имеет более компактный вид, только основное для работы.

Теперь давайте напишем наш излюбленный пример Blink, используя обе эти библиотеки, и затем сравним их.


Пример Blink используя ленту WS2812B (с 30 светодиодами) и библиотеку FastLED

// Подключаем библиотеку FastLED.
#include "FastLED.h"

// Указываем, какое количество пикселей у нашей ленты.
#define LED_COUNT 30

// Указываем, к какому порту подключен вход ленты DIN.
#define LED_PIN 6

// Создаем переменную strip для управления нашей лентой.
CRGB strip[LED_COUNT];

void setup()
{
  // Добавляем ленту.
  FastLED.addLeds(strip, LED_COUNT);
}

void loop()
{
  // Включаем все светодиоды.
  for (int i = 0; i < LED_COUNT; i++)
  {
    strip[i] = CRGB::Red; // Красный цвет.
  }
  // Передаем цвета ленте.
  FastLED.show();
  // Ждем 500 мс.
  delay(500);
  // Выключаем все светодиоды.
  for (int i = 0; i < LED_COUNT; i++)
  {
    strip[i] = CRGB::Black; // Черный цвет, т.е. выключено.
  }
  // Передаем цвета ленте.
  FastLED.show();
  // Ждем 500 мс.
  delay(500);
}
Скетч использует 3758 байт (11%) памяти устройства. Всего доступно 32256 байт.
Глобальные переменные используют 187 байт (9%) динамической памяти, оставляя 1861 байт для локальных переменных. Максимум: 2048 байт.


Пример Blink используя ленту WS2812B (с 30 светодиодами) и библиотеку Adafruit NeoPixel

// Подключаем библиотеку Adafruit NeoPixel.
#include "Adafruit_NeoPixel.h"

// Указываем, какое количество пикселей у нашей ленты.
#define LED_COUNT 30

// Указываем, к какому порту подключен вход ленты DIN.
#define LED_PIN 6

// Создаем переменную strip для управления нашей лентой.
Adafruit_NeoPixel strip = Adafruit_NeoPixel(LED_COUNT, LED_PIN, NEO_GRB + NEO_KHZ800);

void setup()
{
  // Инициализируем ленту.
  strip.begin();
}

void loop()
{
  // Включаем все светодиоды.
  for (int i = 0; i < LED_COUNT; i++)
  {
    strip.setPixelColor(i, strip.Color(255, 0, 0)); // Красный цвет.
  }
  // Передаем цвета ленте.
  strip.show();
  // Ждем 500 мс.
  delay(500);
  // Выключаем все светодиоды.
  for (int i = 0; i < LED_COUNT; i++)
  {
    strip.setPixelColor(i, strip.Color(0, 0, 0)); // Черный цвет, т.е. выключено.
  }
  // Передаем цвета ленте.
  strip.show();
  // Ждем 500 мс.
  delay(500);
}
Скетч использует 2592 байт (8%) памяти устройства. Всего доступно 32256 байт.
Глобальные переменные используют 40 байт (1%) динамической памяти, оставляя 2008 байт для локальных переменных. Максимум: 2048 байт.


Подытожим

Как вы видите из скетчей выше, работать с обеими библиотеками довольно таки просто. Но библиотека FastLED занимает больше места в памяти Arduino, более того чем больше пикселей в вашей ленте тем больше памяти она зарезервирует для своей работы, а точнее 3 байта на каждый пиксель. Таким образом подключить к Arduino можно не более 600 пикселей при использовании минимальной логики. По этому, мне больше приглянулась библиотека Adafruit NeoPixel. В ней только нужное для работы со светодиодными лентами и более рациональное использование памяти. Какую из этих библиотек использовать, решать, конечно, вам. Обе они работают и со своею задачей справляются на 5+.

Ну а мы на этом закончим с обзором ленты. Далее мы сделаем на ее основе несколько проектов, для более наглядной демонстрации, но это уже буду отдельные статьи. Успехов вам и удачи. Оставляйте свои отзывы и комментарии.


Смотрите также



Расскажи о нас

Сообщение

Если у Вас есть опыт в работе с Arduino и собственно есть время для творчества, мы приглашаем всех желающих стать авторами статей публикуемых на нашем портале. Это могут быть как уроки, так и рассказы о ваших экспериментах с Arduino. Описание различных датчиков и модулей. Советы и наставления начинающим. Пишите и размещайте свои статьи в соответсвующей ветке форума.