Как написать эффекты для адресной светодиодной ленты

Данный гайд посвящен адресной светодиодной ленте применительно к использованию с микроконтроллерами (Arduino, esp8266). Рассмотрены базовые понятия, подключение, частые ошибки и места для покупки.

Набор GyverKIT
Лента есть в нашем Arduino наборе GyverKIT (1 метр), а в документации к набору есть краткий гайд по работе с адресной лентой на Arduino при помощи библиотеки FastLED

КУПИТЬ АДРЕСНУЮ ЛЕНТУ


  • Black PCB / White PCB — цвет подложки ленты, чёрная / белая
  • 1m/5m — длина ленты в метрах
  • 30/60/74/96/100/144 — количество светодиодов на 1 метр ленты
  • IPXX – влагозащита
    • IP30 лента без влагозащиты
    • IP65 лента покрыта силиконом
    • IP67 лента полностью в силиконовом коробе
  • ECO – “экономная” версия ленты, менее качественная и яркая чем обычная

ТИПЫ АДРЕСНЫХ ЛЕНТ


Сейчас появилось несколько разновидностей адресных светодиодных лент, они основаны на разных светодиодах. Рассмотрим линейку китайских чипов с названием WS28XX.

Чип Напряжение Светодиодов на чип Кол-во дата-входов Купить в РФ
WS2811 12-24V 3 1 30 led, 60 led
WS2812 3.5-5.3V 1 1 30 led, 60 led, 144 led
WS2813 3.5-5.3V 1 2 (дублирующий) 30 led, 60 led
WS2815 9-13.5V 1 2 (дублирующий) 30 led, 60 led
WS2818 12/24V 3 2 (дублирующий) 60 led

У двухпиновых лент из линейки WS28XX достаточно подключить к контроллеру только пин DI, пин BI подключать не нужно. При соединении кусков ленты нужно соединять все пины!

blank

WS2811 (WS2818) и WS2812


Сейчас популярны два вида ленты: на чипах WS2812b и WS2811 (и новая WS2818). В чём их разница? Чип WS2812 размещён внутри светодиода, таким образом один чип управляет цветом одного диода, а питание ленты – 5 Вольт. Чип WS2811 и WS2818 размещён отдельно и от него питаются сразу 3 светодиода, таком образом можно управлять цветом только сегментами по 3 диода в каждом. А вот напряжение питания у таких лент составляет 12-24 Вольта!

ЧТО ТАКОЕ АДРЕСНАЯ ЛЕНТА


Итак, данный гайд посвящен адресной светодиодной ленте, я решил сделать его познавательным и подробным, поэтому дойдя до пункта “типичные ошибки и неисправности” вы сможете диагностировать и успешно излечить косорукость сборки даже не читая вышеупомянутого пункта. Что такое адресная лента? Рассмотрим эволюцию светодиодных лент.

Обычная светодиодная лента представляет собой ленту с напаянными светодиодами и резисторами, на питание имеет два провода: плюс и минус. Напряжение бывает разное: 5 и 12 вольт постоянки и 220 переменки. Да, в розетку. Для 5 и 12 вольтовых лент нужно использовать блоки питания. Светит такая лента одним цветом, которой зависит от светодиодов.

RGB светодиодная лента. На этой ленте стоят ргб (читай эргэбэ – Рэд Грин Блю) светодиоды. Такой светодиод имеет уже 4 выхода, один общий +12 (анод), и три минуса (катода) на каждый цвет, т.е. внутри одного светодиода находится три светодиода разных цветов. Соответственно такие же выходы имеет и лента: 12, G, R, B. Подавая питание на общий 12 и любой из цветов, мы включаем этот цвет. Подадим на все три – получим белый, зелёный и красный дадут жёлтый, и так далее. Для таких лент существуют контроллеры с пультами, типичный контроллер представляет собой три полевых транзистора на каждый цвет и микроконтроллер, который управляет транзисторами, таким образом давая возможность включить любой цвет. И, как вы уже поняли, да, управлять такой лентой с ардуино очень просто. Берем три полевика, и ШИМим их analogWrit’ом, изи бризи.

Адресная светодиодная лента, вершина эволюции лент. Представляет собой ленту из адресных диодов, один такой светодиод состоит из RGB светодиода и контроллера. Да, внутри светодиода уже находится контроллер с тремя транзисторными выходами! Внутри каждого! Ну дают китайцы блэт! Благодаря такой начинке у нас есть возможность управлять цветом (то бишь яркостью r g b) любого светодиода в ленте и создавать потрясающие эффекты. Адресная лента может иметь 3-4 контакта для подключения, два из них всегда питание (5V и GND например), и остальные (один или два) – логические, для управления.

Лента “умная” и управляется по специальному цифровому протоколу. Это означает, что если просто воткнуть в ленту питание не произойдет ровным счётом ничего, то есть проверить ленту без управляющего контроллера нельзя. Если вы потрогаете цифровой вход ленты, то скорее всего несколько светодиодов загорятся случайными цветами, потому что вы вносите случайные помехи, которые воспринимаются контроллерами диодов как команды. Для управления лентой используются готовые контроллеры, но гораздо интереснее рулить лентой вручную, используя, например, платформу ардуино, для чего ленту нужно правильно подключить. И вот тут есть несколько критических моментов:

ОСОБЕННОСТИ ПОДКЛЮЧЕНИЯ


1) Команды в ленте передаются от диода к диоду, паровозиком. У ленты есть начало и конец, направление движение команд на некоторых моделях указано стрелочками. Для примера рассмотрим ws2812b, у нее три контакта. Два на питание, а вот третий в начале ленты называется DI (digital input), а в конце – DO (digital output). Лента принимает команды в контакт DI! Контакт DO нужен для подключения дополнительных кусков ленты или соединения матриц.

2) Если в схеме возможна ситуация, при которой на ленту не будет подаваться питание 5V, но будет отправляться сигнал с микроконтроллера – лента начнёт питаться от дата-пина. В этом случае может сгореть как первый светодиод в ленте, так и пин контроллера. Не испытывайте удачу, поставьте резистор с сопротивлением 200-500 Ом. Точность резистора? Любая. Мощность резистора? Любая. Да, даже 1/4.

2.1) Если между лентой и контроллером (Arduino) большое расстояние, т.е. длинные провода (длиннее 50 см), то сигнальный провод и землю нужно скрутить в косичку для защиты от наводок, так как протокол связи у ленты достаточно скоростной (800 кГц), на него сильно влияют внешние наводки, а экранирование земляной скруткой поможет этого избежать. Без этого может наблюдаться такая картина: лента не работает до тех пор, пока не коснёшься рукой сигнального провода.

2.2) При подключении ленты к микроконтроллерам с 3.3V логикой (esp8266, ESP32, STM32) появляется проблема: лента питается от 5V, а сигнал получает 3.3V. В даташите указана максимальная разница между питанием и управляющим сигналом, если её превысить – лента не будет работать или будет работать нестабильно, с артефактами. Для исправления ситуации можно:

3) Самый важный пункт, который почему то все игнорируют: цифровой сигнал ходит по двум проводам, поэтому для его передачи одного провода от ардуины мало. Какой второй? Земля GND. Как? Контакт ленты GND и пин GND Ардуино (любой из имеющихся) должны быть обязательно соединены. Смотрим два примера.

blank

blank

4) Питание. Один цвет одного светодиода при максимальной яркости кушает 12 миллиампер. В одном светодиоде три цвета, итого ~36 мА на диод. Пусть у вас есть метр ленты с плотностью 60 диод/метр, тогда 60*36 = 2.1 Ампера при максимальной яркости белого цвета, соответственно нужно брать БП, который с этим справится. Также нужно подумать, в каком режиме будет работать лента. Если это режимы типа «радуга», то мощность можно принять как половину от максимальной. Подробнее о блоках питания, а также о связанных с ними глюках читай здесь.

5) Продолжая тему питания, хочу отметить важность качества пайки силовых точек (подключение провода к ленте, подключение этого же провода к БП), а также толщину проводов. Как показывает мой опыт, брать нужно провод сечением минимум 1.5 квадрата, если нужна полная яркость. Пример: на проводе 0.75 кв.мм. на длине 1.5 метра при токе 2 Ампера падает 0.8 вольта, что критично для 5 вольт питания. Первый признак просадки напряжения: заданный программно белый цвет светит не белым, а отдаёт в жёлтый/красный. Чем краснее, тем сильнее просело напряжение!

6) Мигающая лента создаёт помехи на линию питания, а если лента и контроллер питаются от одного источника – помехи идут на микроконтроллер и могут стать причиной нестабильной работы, глюков и даже перезагрузки (если БП слабый). Для сглаживания таких помех рекомендуется ставить электролитический конденсатор 6.3V ёмкостью 470 мкФ (ставить более ёмкий нет смысла) по питанию микроконтроллера, а также более “жирный” конденсатор (1000 или 2200 мкФ) на питание ленты. Ставить их необязательно, но очень желательно. Если вы заметите зависания и глюки в работе системы (Ардуино + лента + другое железо), то причиной в 50% является как раз питание.

7) Слой меди на ленте не очень толстый (особенно на модели ECO), поэтому от точки подключения питания вдоль ленты напряжение начинает падать: чем больше яркость, тем больше просадка. Если нужно сделать большой и яркий кусок ленты, то питание нужно дублировать медным проводом 1.5 (или больше, надо экспериментировать) квадрата через каждый метр.

КАК ДЕЛАТЬ НЕЛЬЗЯ


Как мы уже поняли, для питания ленты нужен источник 5 Вольт с достаточным запасом по току, а именно: один цвет одного качественного светодиода на максимальной яркости потребляет 0.012 А (12 мА), соответственно весь светодиод – 0.036 А (36 мА) на максимальной яркости. У китайцев есть “китайские” ленты, которые потребляют меньше и светят тускло. Я всегда закупаюсь в магазине BTF lighting (ссылки в начале статьи), у них ленты качественные. Я понимаю, что порой очень хочется запитать ленту напрямую от Ардуино через USB, либо используя бортовой стабилизатор платы. Так делать нельзя. В первом случае есть риск выгорания защитного диода на плате Arduino (в худшем случае – выгорания USB порта), во втором – синий дым пойдёт из стабилизатора на плате. Если всё-таки очень хочется, есть два варианта:

  • Не подключать больше количества светодиодов, при котором ток потребления будет выше 500 мА, а именно 500/32 ~ 16 штук
  • Писать код на основе библиотеки FastLED, где можно ограничить ток специальной функцией. НО! В случае отключения пина Din от источника сигнала есть риск случайного включения ленты, и никакие программные ограничения не спасут от выгорания железа.

Вы наверное спросите: а как тогда прошивать проект с лентой? Ведь судя по первой картинке так подключать нельзя! Оч просто: если прошивка не включает ленту сразу после запуска – прошивайте. Если включает и есть риск перегрузки по току – подключаем внешнее питание на 5V и GND.

blank

blank

ПОДКЛЮЧЕНИЕ 12V ЛЕНТ


Если вы вдруг купили ленту на чипах WS2811/15/18, подключить её можно вот по этим двум схемам. Но следует помнить, что в прошивке нужно указать втрое меньшее количество светодиодов, так как каждый чип на этой ленте управляет тремя диодами, задаёт им один и тот же цвет!

blank

blank

ОТ ЧЕГО ПИТАТЬ ЛЕНТУ


Сетевые источники питания:

  • Адаптер 12V 2A – купить в РФ
  • Адаптер 12V 6A – купить в РФ
  • Адаптер 5V 3A – купить в РФ
  • Блок питания 5V 12A – купить в РФ
  • Блок питания 5V 20A – купить в РФ
  • Блок питания 5V 40A – купить в РФ
  • Мощные блоки питания aliexpress, aliexpress, искать

  • Блоки питания aliexpress, aliexpress, искать

Самый простой и понятный вариант – мощный блок питания на 5 Вольт. Если рядом есть источник постоянки 12 Вольт – можно взять понижайку и настроить её на 5 Вольт. Но часто возникает желание сделать “беспроводной” девайс с бортовым источником питания. Как быть в этом случае? Согласно даташиту на WS2812b светодиод будет работать от напряжения 3.5-5.5 Вольт, собственно как и сама Arduino. Помним, что при питании ленты от напряжения ниже 5 Вольт будет уменьшаться максимальная яркость. Отсюда имеем следующие варианты:

  • Powerbank 5V – берём провод с USB штекером и подключаем по схемам выше. Через Ардуино не питаем, нельзя. Ёмкость паурбанков очень высокая, сами знаете. По току обычно можно снять 2 Ампера, есть паурбанки на 3 А
  • Батарейки – можно взять обычные АА батарейки, 3 штуки полностью заряженных (дадут 4,5 Вольт), либо 4 штуки чуть разряженных (дадут 5.5 Вольт). Ёмкость батареек очень небольшая. По току можно снять 1-2 Ампера (алкалин, литий. Солевые сразу в помойку)
  • Никелевые аккумуляторы – имеют напряжение ~1.4В после зарядки, можно смело поставить 4 штуки (~5.5 Вольт). Ёмкость сборки весьма достойная (до 2700 ма*ч), по току можно снять 2-3 Ампера
  • Литиевые аккумуляторы – напряжение в процессе разряда меняется с 4.2 до 3.0 Вольт, значит ленту можно питать, но светить будет на 10-30% менее ярко. Также нельзя забывать следить за напряжением, литий боится переразряда. Ёмкость – параллельно можно поставить много банок, по току – с обычных банок можно снять 3 Ампера (если стоят в параллель – то с каждой)

Вот здесь описаны проблемы дешёвых блоков питания и как с ними бороться.

  • Литиевый акум + повышайка – отличный способ сохранить полную яркость при небольшом количестве светодиодов, у китайцев есть куча повышаек с лития (3-4.2В) до 5 Вольт с максимальным током до 2 Ампер. Считай тот же powerbank, но можно более компактно разместить

ПОЧЕМУ НЕ РАБОТАЕТ?


Убедись, что земля ленты соединена с землёй ардуино КАК НА СХЕМЕ

  • Убедись, что сигнальный провод идёт в начало ленты (контакт DI) КАК НА СХЕМЕ
  • Убедись, что не перепутал 5в и GND. КАК НА СХЕМЕ
  • Цвет отдаёт в красный? У тебя слабый БП, некачественная пайка линии питания или слишком тонкие провода питания
  • Подключил без резистора и теперь не работает даже с резистором? Пин ардуино отбросил ласты, подключай в другой
  • Лента глючит и иногда показывает артефакты? У вас беды с питанием, читать гайд на форуме.

УПРАВЛЕНИЕ С ARDUINO


Для управления лентой можно выделить четыре библиотеки: microLED, FastLED, Adafruit NeoPixel и LightWS2812, из всех трёх рекомендую FastLED и microLED.

  • FastLED обладает гигантским набором инструментов и позволяет делать сложные эффекты, краткий гайд и частичная документация на русском языке есть на сайте набора GyverKIT.
  • microLED – моя библиотека, она гораздо проще, имеет подробнейшую документацию на русском языке, занимает меньше места в памяти Ардуино, а также обновляет ленту быстрее FastLED.

Ниже привожу примеры кода с использованием разных библиотек.

Бегущая радуга (microLED)

#define STRIP_PIN 2     // пин ленты
#define NUMLEDS 100     // кол-во светодиодов
#include <microLED.h>   // подключаем библу
microLED < NUMLEDS, STRIP_PIN, -1, LED_WS2812, ORDER_GRB > strip;

void setup() {
  strip.setBrightness(60);  // яркость
}

void loop() {
  static byte counter = 0;
  for (int i = 0; i < NUMLEDS; i++) {
    strip.set(i, mWheel8(counter + i * 255 / NUMLEDS));   // counter смещает цвет
  }
  counter += 3;   // counter имеет тип byte и при достижении 255 сбросится в 0
  delay(30);      // 30 кадров в секунду
}

Бегущая радуга (FastLED)

#define NUM_LEDS 144
#include "FastLED.h"
#define PIN 6
CRGB leds[NUM_LEDS];
byte counter;
void setup() {
  FastLED.addLeds<WS2811, PIN, GRB>(leds, NUM_LEDS).setCorrection( TypicalLEDStrip );
  FastLED.setBrightness(50);
  pinMode(13, OUTPUT);
}
void loop() {
  for (int i = 0; i < NUM_LEDS; i++ ) {         // от 0 до первой трети
    leds[i] = CHSV(counter + i * 2, 255, 255);  // HSV. Увеличивать HUE (цвет)
    // умножение i уменьшает шаг радуги
  }
  counter++;        // counter меняется от 0 до 255 (тип данных byte)
  FastLED.show();
  delay(5);         // скорость движения радуги
}

Эффекты для адресной ленты

12.12.2018 исправлен код для поддержки свежими версиями IDE
04.04.2019 добавлена прошивка со сменой эффектов кнопкой

Папки

FastLED — библиотека для дисплея, установить в C:Program FilesArduinolibraries (для 64 разрядных Windows C:Program Files(x86)Arduinolibraries)

WS2812_FX — прошивка для просмотра режимов и эффектов

WS2812_FX_rndChange_light — прошивка со случайной сменой режимов и адаптивной подсветкой

Схема

СХЕМА

Материалы и компоненты

Всё указанное ниже можно найти здесь
http://alexgyver.ru/arduino_shop/

  • Arduino NANO 328p – искать
  • https://ali.ski/KePE9
  • https://ali.ski/IDYZQ
  • https://ali.ski/2v_KZ
  • https://ali.ski/C3xNl
  • Адресная лента
  • https://ali.ski/jfFbn_
  • https://ali.ski/tx7JlA
  • Купить в РФ, 60 свет/метр, 30 свет/метр
  • Black PCB / White PCB – цвет подложки ленты, чёрная / белая. В видео была чёрная
  • 1m/5m – длина ленты в метрах (чтобы заказать 2 метра, берите два заказа 1m, очевидно)
  • 30/60/74/96/100/144 – количество светодиодов на 1 метр ленты. В видео использовалась лента 60 диодов на метр
  • IP30 лента без влагозащиты (как на видео)
  • IP65 лента покрыта силиконом
  • IP67 лента полностью в силиконовом коробе
  • Постфикс ECO – лента чуть более низкого качества, меньше меди, на длинной ленте будет сильно проседать яркость
  • Крутой гибкий профиль! https://ali.ski/Ttwe6
  • БП 5V (мощные)
  • Giant4 60W
  • Giant4 100W
  • БП 5V Али искать (минимум 3A на каждые 100 LED)
  • https://ali.ski/KFvzA
  • https://ali.ski/KwLMQ
  • Мощные https://ali.ski/hVVRGQ
  • Мощные https://ali.ski/pZSMm

Вам также пригодится

  • Всё для пайки http://alexgyver.ru/all-for-soldering/
  • Электронные компоненты http://alexgyver.ru/electronics/

HOW TO

  • Загрузка прошивки http://alexgyver.ru/arduino-first/

СОДЕРЖАНИЕ ►

  • Arduino адресная светодиодная лента WS2812B
    • Технические характеристики WS2812B
    • Проверяем адресную светодиодную ленту
  • Подключение адресной ленты к Arduino Nano
    • Код для управления адресной лентой Arduino
    • Код для эффектов на адресной ленте Arduino

Адресная светодиодная лента WS2812B привлекает многих радиолюбителей за возможность создания интересных и ярких проектов на Ардуино с ws2812b светодиодами. Но прежде, чем приступать к новому крутому проекту, следует понять, как подключить и правильно управлять адресной лентой от Ардуино. Рассмотрим в этой статье несколько простых примеров по работе с WS2812B Arduino Uno.

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

Адресные светодиоды ws2812b и Ардуино

Адресные ленты отличаются плотностью — от 30 до 144 светодиодов на метр, изготавливаются разном защитном исполнении: IP30, IP65, IP67, IP68. Все варианты исполнения, кроме IP30, могут применяться на улице в диапазоне температур от -25 до +80°C. Еще одна, более надежная лента — WS2813 отличается возможностью передавать сигналы дальше по цепочке даже через сгоревший чип.

Светодиодная лента WS2812B характеристики

  • Размер светодиода — 5 х 5 мм
  • Частота ШИМ — 400 Гц
  • Скорость передачи данных — 800 кГц
  • Размер данных — 24 бита на светодиод
  • Напряжение питания — 5 Вольт
  • Потребление при нулевой яркости — 1 мА на светодиод
  • Потребление при максимальной яркости — 60 мА на светодиод
  • Цветность: RGB, 256 оттенков на канал, 16 миллионов цветов

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

Характеристики WS2812B адресной светодиодной ленты

Адресная светодиодная лента ws2812b — это вершина эволюции лент. Каждый светодиод в ленте состоит из обычного RGB светодиода и контроллера с тремя транзисторными выходами. Благодаря этому есть возможность управлять цветом любого светодиода и создавать потрясающие цветовые и световые эффекты. Именно поэтому устройство пользуется популярностью, несмотря на высокую стоимость.

Как проверить адресную ленту без Ардуино

WS2812B светодиоды

При подключении обращайте внимание на направление стрелок

Многих интересует, как включить адресную ленту без Ардуино и проверить ее на работоспособность. Если просто подключить питание к ленте, то ничего не произойдет — проверить ленту без контроллера нельзя. Если задеть цифровой вход адресной ленты, то могут загореться несколько светодиодов из-за случайных помех, которые воспринимаются контроллерами ws2812b светодиодов, как команды.

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

Как подключить адресную ленту WS2812B Arduino

Для этого занятия понадобится:

  • Arduino Uno / Arduino Nano / Arduino Mega;
  • лента WS2812B;
  • макетная плата;
  • 1 резистор от 100 до 500 Ом;
  • провода «папа-папа».

WS2812B светодиоды довольно энергоемкие, один светодиод потребляет до 60 мА при максимальной яркости. Для ленты со 100 диодами потребуется блок питания на 6 и более Ампер. Микроконтроллер Arduino и светодиодная лента могут быть подключены к разным источникам питания, но «земля» должна быть общая. Дело в том, что пин GND тоже участвует в управлении адресной лентой от платы Ардуино Уно.

Схема подключения адресной ленты 5V

Схема подключения адресной ленты 5 Вольт к Ардуино
WS2812B Arduino Uno Arduino Nano Arduino Mega
GND GND GND GND
5V 5V 5V 5V
DO 10 10 10

Для работы с лентой используются три популярные библиотеки — FastLED, AdafruitNeoPixel и LightWS2812. Все библиотеки доступны для скачивания на нашем сайте. Работать с библиотеками FastLED и Adafruit NeoPixel просто, отличаются они в функциональности и объеме занимаемой памяти. После сборки этой простой схемы и установки библиотек, загрузите скетч для адресной светодиодной ленты.

Скетч. Тестирование адресной ленты WS2812b Arduino

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

#define PIN  10              // указываем пин для подключения ленты
#define NUMPIXELS 3  // указываем количество светодиодов в ленте

// создаем объект strip с нужными характеристиками
Adafruit_NeoPixel strip (NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);

void setup() {
   strip.begin();                     // инициализируем ленту
   strip.setBrightness(50);  // указываем яркость светодиодов (максимум 255)
}

void loop() {
   strip.setPixelColor(0, strip.Color(255, 0, 0));   // включаем красный цвет на 1 светодиоде
   strip.show();   // отправляем сигнал на ленту
   delay(500);
   strip.clear();   // выключаем все светодиоды

   strip.setPixelColor(1, strip.Color(0, 0, 255));   // включаем синий цвет на 2 светодиоде
   strip.show();   // отправляем сигнал на ленту
   delay(500);
   strip.clear();   // выключаем все светодиоды

   strip.setPixelColor(2, strip.Color(255, 255, 255));   // включаем белый цвет на 3 светодиоде
   strip.show();   // отправляем сигнал на ленту
   delay(500);
   strip.clear();   // выключаем все светодиоды

}

Пояснения к коду:

  1. нумерация светодиодов в ленте начинается с нуля, поэтому если мы хотим включить первый светодиод, то указывать надо «0».

Схема подключения адресной ленты 12 Вольт

Схема подключения адресной ленты 12 Вольт к Ардуино

Если у вас лента на 12 Вольт, то ее нужно подключать по схеме, размещенной выше. Резистор на цифровом пине защищает его от выгорания (если питание к ленте будет отключено, то она начнет питаться от цифрового пина, при этом пин может выгореть. Также не стоит подключать питание ленты к плате Ардуино, иначе может выгореть защитный диод на Ардуино или USB порт на компьютере (в худшем случае).

Скетч. Управление адресной лентой Ардуино

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

#define PIN  10              // указываем пин для подключения ленты
#define NUMPIXELS 3  // указываем количество светодиодов в ленте

// создаем объект strip с нужными характеристиками
Adafruit_NeoPixel strip (NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);

void setup() {
   strip.begin();                     // инициализируем ленту
   strip.setBrightness(50);  // указываем яркость светодиодов (максимум 255)
}

void loop() {

   // поочередно включаем красный цвет
   for (int i = -1; i < NUMPIXELS; i++) {
      strip.setPixelColor(i, strip.Color(255, 0, 0));
      strip.show();
      delay(100);
   }

   // поочередно включаем зеленый цвет
   for (int i = -1; i < NUMPIXELS; i++) {
      strip.setPixelColor(i, strip.Color(0, 255, 0));
      strip.show();
      delay(100);
   }

   // поочередно включаем синий цвет
   for (int i = -1; i < NUMPIXELS; i++) {
      strip.setPixelColor(i, strip.Color(0, 0, 255));
      strip.show();
      delay(100);
   }

}

Пояснения к коду:

  1. с помощью библиотеки Adafruit NeoPixel довольно просто управлять адресной лентой. В примерах к библиотеке можно найти много различных эффектов. Мы продемонстрировали простой вариант с циклом for для включения ленты.

Заключение. В этом обзоре мы рассмотрели лишь подключение и возможность управления адресной лентой от Ардуино. Так как возможности работы с библиотеками FastLED, AdafruitNeoPixel довольно разнообразны. Больше интересных примеров на Arduino и WS2812B размещено в разделе Проекты на Ардуино, где представлены проекты с бегущей строкой на адресной ленте и другие световые эффекты.

Содержание

  1. Светодиодная лента на базе WS2812B
  2. Технические характеристики элементов WS2812B
  3. Arduino и WS2812B
  4. Протокол
  5. Светодиодная лента Ардуино – написание кода.
  6. Плавное включение светодиодной ленты на Ардуино
  7. 5Подключение RGB светодиода с общим катодомк Arduino
  8. Полезный совет
  9. ДОКУМЕНТАЦИЯ
  10. Виды транзисторных ключей
  11. Признаки и симптомы ВПЧ 45 у женщин
  12. Управление RGB лентой с помощью Andurino
  13. КАК ДЕЛАТЬ НЕЛЬЗЯ
  14. Объяснение программы Arduino для работы с адресной светодиодной лентой
  15. 122-Эффектор с выходом на умную ленту WS2812
  16. WS2811 (WS2818) и WS2812
  17. Подключение ленты на базе WS2812B к Arduino Uno (Nano)

Светодиодная лента на базе WS2812B

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

Как подключить адресную светодиодную ленту WS2812B к Arduino
Внешний вид светодиода с драйвером.

Элементы объединены в ленту для параллельного питания и управляются по последовательной шине: выход первого элемента соединен с управляющим входом второго и так далее. В большинстве случаев последовательные шины построены на двух линиях, одна из которых передает стробоскопы (импульсы синхронизации), а другая — данные.

Внешний вид адресной ленты.
Внешний вид адресной ленты.

Шина управления микросхемы WS2812B состоит из линии: по ней передаются данные. Данные кодируются как импульсы постоянной частоты, но с другим рабочим циклом. Один импульс — один бит. Длительность каждого бита составляет 1,25 мкс, нулевой бит состоит из высокого уровня длительностью 0,4 мкс и низкого уровня 0,85 мкс. Единица кажется высокой для 0,8 мкс и низкой для 0,45 мкс. 24-битный (3-байтовый) пакет отправляется на каждый светодиод, после чего следует пауза низкого уровня на 50 мкс. Это означает, что для следующего светодиода будет передано больше данных, и так далее для всех элементов в цепочке. Передача данных завершается паузой в 100 мкс. Это означает, что цикл программирования ленты завершен и можно отправлять следующий набор пакетов данных.

Данные для управления адресной лентой.
Данные для управления адресной лентой.

Этот протокол позволяет обойтись без передачи данных по одной строке, но требует точности отсчета временных интервалов. Расхождение допускается не более 150 нс. К тому же помехозащищенность такой шины очень низкая. Любое вмешательство достаточной силы может быть воспринято диспетчером как данные. Это накладывает ограничения на длину проводов от цепи управления. С другой стороны, это позволяет проверить исправность ленты без дополнительных устройств. Если включить светильник и коснуться пальцем контактной площадки шины управления, некоторые светодиоды могут случайным образом включаться и выключаться.

Технические характеристики элементов WS2812B

Для создания систем освещения на основе адресной ленты необходимо знать важные параметры элементов, излучающих свет.

Размер светодиода 5×5 мм
Частота модуляции ШИМ 400 Гц
Энергопотребление при максимальной яркости 60 мА на ячейку
Напряжение питания 5 вольт

Arduino и WS2812B

Всемирно известная платформа Arduino позволяет создавать скетчи (программы) для управления адресными лентами. Возможности системы довольно обширны, но если их уже недостаточно на определенном уровне, приобретенных навыков будет достаточно, чтобы безболезненно перейти на C ++ или даже на ассемблер. Хотя базовые знания получить на 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 мкс. Затем вы можете повторить перенос.

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

Светодиодная лента Ардуино – написание кода.

Подключите плату Arduino к компьютеру через USB и откройте Arduino IDE. Убедитесь, что вы выбрали правильную карту и номер порта для своей карты в Инструменты> Инструменты и инструменты> Порт. Откройте новый эскиз и сохраните его с соответствующим именем.
Этот эскиз исчезает с постоянным светом, удерживает его в таком состоянии в течение нескольких секунд, а затем гаснет, пока он снова не погаснет.

Начните с определения контактов, которые будут использоваться для управления полевыми МОП-транзисторами.

Тогда вам нужны переменные. Создайте общую переменную яркости вместе с переменной яркости для каждого цвета. Мы будем использовать только первичную переменную яркости для выключения светодиодов, поэтому установите максимальное значение здесь 255.
Вам также необходимо создать переменную для управления скоростью затухания.

В вашей настройке мы установим контакты Arduino. Мы также вызовем несколько функций с задержкой в ​​5 секунд. Этих функций пока нет, но не волнуйтесь, мы до них доберемся.

Адресная светодиодная лента ws2812 и arduino
Адресная светодиодная лента: подключение, управление через arduino, предложения
Адресная светодиодная лента и ее подключение к Arduino
Подключите фоторезистор к ардуино и работайте с датчиком освещенности
Освещение телевизора Ambilight своими руками на Arduino

Эти три цикла for полностью смешивают каждый цвет за время, указанное значением fadeSpeed.
Наконец, вам нужно создать метод TurnOff ():
Когда вы закончите с этим кодом, сохраните его. Проверьте код и загрузите его на плату Arduino. Если вы видите ошибки, проверьте код еще раз на наличие опечаток или пропущенных точек с запятой.

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

Теперь вы должны увидеть, как яркость светодиодной ленты Arduino увеличивается, белый оттенок сохраняется в течение 5 секунд, а затем постепенно исчезает до нуля:

Если у вас возникнут трудности, дважды проверьте проводку и код.

5Подключение RGB светодиода с общим катодомк Arduino

Если вы используете RGB-светодиод с общим катодом, подключите длинный кабель светодиода к GND платы Arduino, а каналы R, G и B — к цифровым портам Arduino. Помните, что светодиоды загораются, когда высокий уровень (HIGH) применяется к каналам R, G, B, в отличие от светодиода с общим анодом.

Схема подключения светодиодов RGB с общим катодом к Arduino

Если вы не измените приведенный выше эскиз, каждый цвет светодиода в этом случае будет гореть на 0,2 секунды, а пауза между ними будет составлять 0,1 секунды.

Полезный совет

Если вы хотите управлять яркостью светодиода, подключите светодиод RGB к цифровым контактам Arduino, которые имеют функцию ШИМ. Эти контакты на Arduino обычно отмечены тильдой (волнистой линией), звездочкой или кружком.

ДОКУМЕНТАЦИЯ

Виды транзисторных ключей

  • Биполярный;
  • Поле;
  • Композитный (сборка Дарлингтона).

Когда высокий логический уровень (digitalWrite (12, HIGH);) применяется к выходному порту на базе транзистора через цепь коллектор-эмиттер, опорное напряжение течет на нагрузку. Таким образом вы можете включать и выключать светодиод.

Полевой транзистор работает аналогичным образом, но поскольку он имеет сток вместо «базы», ​​который управляется не током, а напряжением, ограничительный резистор в этой схеме не нужен.

Биполярное зрение не позволяет регулировать мощные нагрузки. Ток, протекающий через него, ограничен 0,1-0,3 А.

Полевые транзисторы работают с более мощными нагрузками с током до 2А. Для еще более мощной нагрузки используются полевые транзисторы Mosfet с током до 9А и напряжением до 60В.

Вместо полевого эффекта можно использовать сборку биполярных транзисторов Дарлингтона на микросхемах ULN2003, ULN2803.

Микросхема ULN2003 и принципиальная схема электронного переключателя напряжения:

Признаки и симптомы ВПЧ 45 у женщин

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




Папилломавирус 45 не имеет характерных признаков, но заподозрить инфекцию можно по следующим симптомам:

  • зловонный запах из половых органов;
  • боль во время полового акта и оргазма;
  • зуд и другие неприятные ощущения внутри половых органов;
  • болезненное мочеиспускание;
  • боль внизу живота, не проходящая даже в состоянии покоя.

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

Управление RGB лентой с помощью Andurino

Помимо однокристальных светодиодов, Arduino может работать с цветными светодиодами. Подключив контакты каждого цвета к аналоговым выходам Arduino, можно произвольно изменять яркость каждого кристалла, достигая желаемого цвета свечения.

Схема подключения светодиодов Arduino RGB:

Ленточный элемент управления Arduino RGB устроен аналогично:


Контроллер Arduino RGB лучше всего собирать на полевых транзисторах.

для равномерного управления яркостью можно использовать две кнопки. Один увеличит яркость свечения, другой — уменьшится.

КАК ДЕЛАТЬ НЕЛЬЗЯ

Как мы уже поняли, для питания ленты требуется источник на 5 Вольт с достаточным запасом по току, а именно: один цвет качественного светодиода на максимальной яркости потребляет 0,012 А (12 мА) соответственно, весь светодиод — 0,036 А (36 мА) на максимальной яркости… У китайцев есть «китайские» ленты, которые меньше потребляют и тускло светятся. Всегда покупаю в магазине осветительных приборов БТФ (ссылка в начале статьи), там ленты качественные. Я понимаю, что иногда мне очень хочется пропустить ленту напрямую с Arduino через USB или с помощью встроенного стабилизатора платы. Ты не сможешь это сделать. В первом случае есть риск сжечь защитный диод на плате Arduino (в худшем случае сжечь порт USB), во втором из стабилизатора на плате выйдет синий дым. Если очень хочется, есть два варианта:

  • Не подключайте больше того количества светодиодов, при котором ток потребления будет больше 500мА, то есть 500/32 ~ 16шт
  • Напишите код на основе библиотеки FastLED, где вы можете ограничить ток специальной функцией. НО! Если отсоединить вывод Din от источника сигнала, есть риск случайно включить ленту и никакие программные ограничения не спасут вас от прожига утюга.

Вы можете спросить: как я могу затем прошить проект на магнитную ленту? Ведь судя по первой картинке так подключиться не получится! Все очень просто: если в прошивку сразу после загрузки не входит магнитная лента, просто прошейте ее. Если он включается и есть риск перегрузки по току, подключите внешний источник питания к 5V и GND.

Объяснение программы Arduino для работы с адресной светодиодной лентой

Прежде чем начать работу с адресуемой светодиодной лентой в Arduino, вам необходимо скачать и установить для нее библиотеку: библиотеку Adafruit NeoPixel.

Ардуино

1 Пиксель Adafruit_NeoPixel (NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);

Эта функция определяет количество светодиодов и вывод Arduino для управления ими.

Ардуино

Эта функция инициализирует адресуемую светодиодную ленту.

Ардуино

Функция, устанавливающая яркость светодиодов. 1 — минимальная яркость, 255 — максимальная.

Ардуино

1 pixelColor (какой светодиод, какой цвет (красный, зеленый, синий));

Эта функция устанавливает цвет свечения светодиода с использованием системы RGB, одновременно задавая номер светодиода (от 0 до NUMPIXELS-1).

Ардуино

Функция, которая активирует настройки по умолчанию, т.е включает светодиоды с настройками по умолчанию.

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






122-Эффектор с выходом на умную ленту WS2812

После переноса старого Effector на платформу Arduino (ATmega328P) появилась возможность дальнейшего развития проекта. А теперь подключил к Эффектору смарт-ленту (NeoPixels) WS2812. В то же время новый Effector WS2812 не только демонстрирует свои эффекты на смарт-ленте вместо обычных светодиодов, но и приобрел впечатляющее количество новых функций. Новые вкусности: — переработан алгоритм формирования уровней, теперь яркость каналов имеет 255 градаций (против 8 в предыдущей версии)

  • встроенные эффекты переработаны, теперь они стали плавнее — количество встроенных эффектов увеличено с 8 до 16.

правда, из управляющей программы Effector-12 доступно всего 8, как и в предыдущей версии

  • как и в предыдущем эффекторе, управление с ИК-пульта дистанционного управления осталось, но были добавлены новые команды управления, связанные с интеллектуальной лентой — поскольку интеллектуальная лента окрашена, цветовые палитры использовались для генерации разных цветов из монохромных сигналов уровня канала. Вы можете выбрать одну из 8 палитр (включая динамическую палитру переливающихся цветов) — теперь Effector может быть членом сети ZiCip в качестве сателлита

Эффектор может предоставлять информацию о канале другим спутникам или управляться другим устройством в сети. Я собираюсь использовать его, чтобы модернизировать свою супер-гирлянду, подружить с программой Effector 12 (об этом будет отдельная статья)

  • количество пикселей, отображаемых на смарт-ленте, может быть произвольным, до 255 пикселей — можно регулировать общую яркость ленты — 12-канальный рисунок не только на 12 пикселей ленты, но может масштабироваться (растягиваться)) на любое количество пикселей — рисунок на ленте длиннее 12 пикселей, повторяются циклически — большинство генерируемых эффектов цикличны и на ленте создается непрерывное изображение эффекта (невозможно определить границы области эффектов) — для нециклических эффектов предусмотрен зеркальный вариант повторяющихся каналов, что создает непрерывное изображение, и в этом случае — изображение на ленте можно перемещать по произвольному количеству пикселей — контрольные линии (те к которым подключаются кнопки) выполнены по принципу «ИЛИ сборки» — это означает, что, управляя устройством с пульта ДУ, можно принимать на этих линиях сигналы счетчика llo (нажав на землю), который можно использовать, например, для управления вашими устройствами.

Как это выглядит вживую.

Как вы можете видеть на видео, по сравнению с предыдущим Arduffector, где все эффекты быстрые и четкие, новый Effector создает плавное и неторопливое изображение с эффектами. В общем, данная модификация эффектора была сделана под девизом «Smooth».

Сборка

Поскольку устройство работает на готовой плате Arduino Nano (или Uno), собирать / паять что-то особенное не нужно. Просто подключите смарт-ленту к Arduin (к контакту 13), скомпилируйте прошивку (через стандартный USB-кабель Arduin) и устройство заработает.

Если у вас WS2812 не более 2-3 десятков пикселей, отдельный блок питания вам не понадобится — все будет работать от одного USB-порта. Если лента длинная, порт USB не сможет обеспечить необходимый ток. В этом случае вам понадобится мощный внешний блок питания на 5 вольт.

Для демонстрационного видео на YouTube я собрал необходимый минимум на шаблоне и уложил ленту в пластиковый кабельный канал (подсвечивается изнутри, создает связное изображение, скрывая свечение отдельных пикселей).



Если вы хотите получить от устройства больше, добавьте переменные резисторы, кнопки, TSOP и т.д.

Ленту для теста мне предоставил магазин DiyLab.com.ua. Если прибор понравился и хочется повторить, ленту в Украине можно купить в этом же магазине — ссылка на ленты. Для России его можно приобрести у другого моего партнера TIXER.RU (обещали в ближайшее время пополнить ассортимент).

Описание работы

Устройство работает как и его предшественник, но есть и нововведения. Пройду чеки. Кнопки: — 0 All Off — отключает все эффекты и выключает кассету — 1 серия EE — запускает последовательность эффектов, хранящихся в EEPROM (их 4, их можно изменить с помощью программы Effector-12) — 2 Flash-серии — запускает случайную последовательность встроенных в устройство эффектов (их 16, их нельзя изменить, период смены эффекта 10 секунд) — 3 Next — запускает следующий эффект, при этом продолжая работать постоянно, причем после перезапуска Эффект, этот эффект будет продолжать работать — 4 полосы_Зеркало — когда держать на земле »В этой строке 12 каналов Эффекта начинают периодически позиционироваться в зеркале на ленте (например, AL, LA, AL, ..) вместо периодической позиции по умолчанию (например, AL, AL, AL,…) — 5strip_R, 6strip_G, 7strip_B — эти три строки определяют текущую палитру, в которой отображается рисунок эффекта на ленте


в «радужном» варианте цвет меняется непрерывно циклически

— 8strip_IROut — при удерживании этой линии нажатой на «землю» информация о состоянии канала начинает передаваться в ИК-сеть (ИК-излучатель светодиода) (более подробно об этом будет рассказано в отдельной статье).

Аналоговые входы (АЦП) — новый метод управления в этом устройстве. Посредством протекающего через них напряжения (в диапазоне 0-5 вольт) можно изменить изображение, отображаемое на ленте. Линии АЦП подтянуты до 5 вольт, то есть если к линии ничего не подключено, прибор воспринимает это как максимальный уровень.

— Strip_PixelsNumber — количество пикселей в ленте, воспроизводящих изображение (5 вольт — 255 шт., 0-0) — strip_Scale — масштабирование изображения на ленте (5 вольт — масштаб 1 канала: проецируется 1 пиксель, 0 — 1 канал на всю ленту) — strip_Offset — смещение изображения на ленте — strip_Bright — общая яркость ленты (5 вольт — максимум, 0 — минимум)

Проверка уровня напряжения открывает новые возможности использования устройства. Например, если подключить аналоговый сигнал от усилителя к входу strip_Pixels Number, мы получим измеритель уровня. Также, используя палитру огня и подключив сигнал от термометра к strip_Bright, вы можете просматривать температуру и т.д.

Управление устройством с домашнего пульта ДУ.

Для управления устройством подойдет любой домашний пульт (могут быть проблемы с конкретными пультами с обратной связью, например, с пультом для кондиционера).

Для изучения кнопок необходимо: 1 — нажать (и удерживать) кнопку «Learn» 2 — сбросить Arduino с помощью кнопки сброса (светодиодный индикатор должен мигнуть несколько раз) 3 — отпустить кнопку «Learn».

В связи с тем, что в данном алгоритме невозможно подавить дребезг контакта кнопки «Обучение», необходимо контролировать момент отпускания кнопки. Если в этот момент светодиодный индикатор мигает, необходимо перезапустить процедуру обучения (дребезг контакта создает сигнал, аналогичный сигналу пульта дистанционного управления, который запоминается как первая кнопка)

4 — последовательно нажать 9 кнопок пульта ДУ в последовательности функций (кнопки прибора 0 All Off… 8 strip_IR Out) 5 — после чего прибор автоматически перейдет в нормальный режим работы

Каждое нажатие кнопки на пульте дистанционного управления будет подтверждаться сигнальным светодиодом.

Если вам в устройстве не нужны никакие кнопки (например, советую пока не использовать 8 strip_IR Out), то в процессе обучения нужно нажимать ранее изученную клавишу.

Как я уже писал выше, новой особенностью этого устройства является то, что управляющие входы для кнопок также являются выходами одновременно, если управление осуществляется с пульта. При нажатии кнопки на пульте дистанционного управления соответствующая линия управления будет прижата к земле. Это можно использовать для управления нажатиями клавиш на пульте дистанционного управления или для управления вашими устройствами. Строки от «0 All Off» до «3 Next» при нажатии кнопок на пульте дистанционного управления будут на короткое время прижаты к земле, а строки от «4 strip_Mirror» до «8 strip_IR Out» действуют как триггер (нажатие один раз — нажал, снова нажал — отпустил)

Управление устройством с помощью программы Effector-12.

Несмотря на незначительные изменения, устройство оставалось совместимым с программой Effector-12 (за исключением некоторых нюансов, связанных с палитрами и дополнительными функциями). Встроенный в Arduin USB-UART позволяет подключать устройство к компьютеру и легко управлять им. Напомню, что управляющая программа может управлять каналами и эффектами устройства в ручном режиме, воспроизводить музыку (с возможностью самостоятельно создавать различные способы отображения), выполнять различные действия с течением времени и так далее. Подробнее читайте в соответствующей статье.

WS2811 (WS2818) и WS2812

В настоящее время популярны два типа лент: WS2812b и WS2811 (и новый WS2818). Какие отличия? Микросхема WS2812 находится внутри светодиода, поэтому одна микросхема контролирует цвет светодиода, а лента питается от 5 В. Микросхемы WS2811 и WS2818 находятся отдельно и питают 3 светодиода одновременно, поэтому вы можете контролировать цвет только сегменты по 3 светодиода в каждом. Напряжение питания этих лент 12-24 В!

Подключение ленты на базе WS2812B к Arduino Uno (Nano)

На первом этапе достаточно простых плат Arduino Uno или Arduino Nano. В будущем более сложные платы можно будет использовать для построения более сложных систем. При физическом подключении адресуемой светодиодной ленты к плате Arduino необходимо соблюдать несколько условий:

  • из-за малой помехоустойчивости соединительные провода линии передачи данных должны быть как можно короче (старайтесь проложить их в пределах 10 см);
  • необходимо подключить провод данных к свободному цифровому выходу платы Arduino — тогда он будет указан программно;
  • из-за большого энергопотребления нет необходимости подавать ленту с карты — для этого предусмотрены отдельные блоки питания.

Общий кабель питания лампы и Arduino должен быть подключен.

Схема подключения WS2812B.
Схема подключения ленты WS2812B.

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

О чем это я и для кого?
Я хочу рассказать как быстро и просто можно оживить ленту на базе «умных» светодиодов типа WS2811(12), SK6812, INK1003 и других без лишних затрат, имея только ардуино, библиотеку Adafruit NeoPixel, кусок ленты и час свободного времени, чтобы получить подобную занятную иллюминацию или что то еще в соответствии с вашей целью. Моя цель — не эта гирлянда или готовый скетч. Весь код в тексте и в прилагаемом скетче служит только для того, чтобы показать возможности сторонней библиотеки от компании Adafruit, накидан на скорую руку, и никак не является образцом для подражания или пособием по программированию. Он всего лишь работает с кусочком ленты и демонстрирует несложные эффекты. Вам не нужно ничего тупо повторять. Считайте это подробным справочником по нескольким функциям NeoPixel с примерами их использования в коде СИ. Посему просьба оставить мокрые тапки для своих котов)
Для кого обзор? Конечно для тех, кто только начинает знакомство со смарт-лентами и имеет представление о том, как работает ардуино и как пишется под него код.

ссылка на скетч из видео

Теперь поехали)
Достаточно популярными «умные ленты» стали уже давно. Среди них существует множество китайских клонов, собранных как на обычных диодах RGB и внешними управляющими регистрами, так и «полноценные», с использованием ws2812 со встроенным в корпус 5050 контроллером. Принцип работы практически одинаков для всех лент и матриц с SPI (последовательным) интерфейсом. Это относится к WS2811(12), SK6812, INK1003 и другим подобным драйверам. На вход первого контроллера ленты передается непрерывный поток данных, в каждом пакете которого содержится 3 или 4 (для RGBW пикселей)байта со значением цвета для каждого из 3 или 4 светодиодов в пикселе. Контроллер первого пикселя «откусывает» себе первые 3(4) байта, устанавливает свой цвет в соответствии с содержимым, а остальной поток пропускает к следующим пикселям, где происходит аналогичное «откусывание» и дальнейшая передача «из рук в руки» до тех пор, пока в потоке не возникнет пауза в 50 мкс, означающая что пора принимать данные с начала)В зависимости от типа контроллера, тактовая частота может составлять 400 или 800 кГц. Это позволяет не видеть глазу переходных процессов при реализации достаточно сложных световых эффектов. В различных контроллерах может быть разной тактовая частота, разное кодирование 0 и 1 Lo-Hi уровнями и наоборот, разное следование цвета в пакете и другие мелочи, значительно усложняющие жизнь нормальным людям при выборе средств реализации задуманной елочной гирлянды или пересвета днища в 14-ке) Ленты могут иметь и 4 вывода — два питающих, один управляющий, и один тактируемый. В моем примере лента имеет три вывода — питание 12В и управление. Так же есть моменты, связанные с питанием ленты — это опять же напряжение — 5 или 12В и ток потребления на метр. Я использовал отдельный блок питания 12В. При этом нужно учитывать, что питание ленты и ардуино никак не должны между собой быть связаны, если у вас разные напряжения питания! Только по общему проводу для передачи данных. С ардуинки нужно подключить вывод GND к минусовому проводу ленты и управляющий пин 6 (или какой назначите) ко входу ленты D in. +12В подается на ленту от своего
источника питания, ардуинка питается от своего (либо от USB).

Капиталисты из Adafruit рекомендуют сигнальный провод подключать через резистор порядка нескольких сот Ом, а на саму ленту перед первым контроллером вешать по питанию электролит 1000-2000uF, но у меня все прекрасно работает и напрямую, и через килоОмный резистор при длине шлейфа около 0,5 метра и без каких либо кондеров на ленте. Все страхи актуальны имхо при гораздо бОльших отрезках ленты, чем мой)
С подключением в общем то ничего хитрого нет. Рассмотрим программную часть.
Для управления ws2812 настоящие true-программисты напишут true-код на ассемблере и прошьют true-контроллер от фирмы майкрочип, но для простых смертных выход тоже есть! Добрые дяди из Adafruit написали замечательную библиотеку, заточенную под ардуино, при помощи которой можно на простом cи из г.на и костылей (как в моем случае) соорудить вполне себе работающий г.но код и не заботиться об организации интерфейса и не заглядывать в даташиты контроллеров лент. Об этом уже позаботились авторы библиотеки и нам не нужно ничего знать, кроме ее функций и конфигурирования двух строк в привычной среде.
Что еще следует понимать — каждый пиксель — это память. И она не бесконечна. Например ардуинка uno R3 потянет не более 500 пикселей.

С мегой можно развернуться и пошире)
А пока хочу немного рассказать после пары дней экспериментов про использование возможностей библиотеки, назначение ее функций и конфигурирование в привязке к типу ленты и количества пикселей в ней. Сам к ардуине подключал unoR3 и отрезок ленты с INK1003 всего на 6 пикселей (каждый из 3-х отдельных RGB диодов 5050?, бывает и такое в Китае). Но об этом немного позже, а сейчас начнем с самого начала — установки.
Устанавливается библиотека просто — в программной среде для ардуино в меню «Скетч» выбираем «Подключить библиотеку» —> «Управлять библиотеками».
Откроется окно со списком библиотек, которые уже установлены. В форме поиска вводим «Adafruit NeoPixel», находим, скачиваем и устанавливаем.
Теперь остается до функциии void setup()прописать заголовок библиотеки — #include <adafruit_NeoPixel.h>, несколько строк конфигурации и можно начинать кодить)
Чтобы лучше понять, что мы получили, давайте посмотрим, что содержат файлы библиотеки)
Каталог Adafruit_NeoPixel/examples/ — содержит несколько примеров использования библиотеки:
RGBWstrandtest — не интересен, так как моя лента просто RGB)
buttoncycler — демонстрирует переключение 3-х эффектов нажатием кнопки
simple.ino показывает как покрасить ленту зеленым
strandtest.ino — те же три эффекта, но без нажатия кнопок
Примеры очень полезные и интересные, но лучше пойдем дальше и сделаем что то свое, пусть и не так красиво).
Нужно условиться, что дальше по тексту под словом «пиксель» я подразумеваю три (или 4) разных светодиода в одном корпусе. Поэтому «красный цвет пикселя» и «красный цвет диода» — понятия совершенно разные. Первый — это совокупность цветов. Второй — восьмибитная яркость отдельного красного светодиода из этой совокупности — от 0 до 255.
Идем дальше, файл — Adafruit_NeoPixel.cpp
Содержит функции, с которыми мы будем работать. Желающие ознакомиться с оригинальным (на английский езыке) руководством можно здесь — learn.adafruit.com/adafru…?view=all#arduino-library, а для ленивых продолжу излагать своим языком как умею)
Кстати — по ссылке много интересных проектов для ардуины с описанием и кодом не только для ленточных изделий)
Первая чуть ли не самая важная функция — strip.setPixelColor(n, red, green, blue, white); Она устанавливает цвет каждого диода (красного-зеленого-синего) в n-пикселе в соответствии с переданными функции параметрами.
Т.е. n здесь — номер пикселя в ленте, следующие за ним три или четыре параметра — цвета диодов от 0 до 255. Если используем ленту с дополнительным белым диодом в пикселе — мы задаем 4 параметра (32 бита информации, по байту на цвет) или 3 (24 бита информации), как в моем случае.
Например, strip.setPixelColor(45, 255, 0, 0); задаст красный цвет 46-му пикселю в ленте (нужно помнить, что в программе первый пиксель — это «0»).
Альтернативно — strip.setPixelColor(n, color); Здесь n так же — номер пикселя в ленте, но уже 32 битный цвет, например — uint32_t magenta = strip.Color(255, 0, 255);
Еще одна функция strip.Color(255, 0, 255); — как раз конвертирует в одно 32 битное значение три разных параметра цвета для отдельных диодов — RGB. В этом примере (255, 0, 255)- одинаковые по яркости красный и синий диоды. Теперь если мы вызовем strip.setPixelColor с 32 битным параметром magenta, которому ранее присвоили значение функцией strip.Color, мы зададим 46 пикселю этот цвет одним значением: strip.setPixelColor(45, magenta); Итого — всего два параметра) Просто вместо трех восьми битных имеем один 32 битный с местом под значение четвертого диода, даже если его в пикселях ленты нет.
Но как и сколько бы мы не задавали цвет, с лентой ничего не произойдет. Передачу каждого пакета данных с заданными цветами каждого диода в каждом пикселе нужно инициализировать. Поэтому ваш код должен быть как можно эффективнее, ибо для вывода сложных эффектов нужна максимальная частота обновления пикселей, а выполнение вашего кода тоже требует процессорного времени. Допустим, вы назначили каждому пикселю набор цветов. Пора вызывать функцию поважнее «сет_пиксел_колора» — strip.show(); Она вызывается без параметров и обновляет все пиксели ленты, один за другим с частотой 400 или 800 кГц). Теперь изменения можно увидеть). Эта же функция является обязательной в разделе void setup(). Перед ней в этом разделе так же обязан находится вызов функции strip.begin(), т.е. примерно так:
void setup()
{
strip.begin();
strip.show(); // Здесь эта функция ничего не «засветит, а наоборот -принудительно выключит все пиксели.
}

Продолжим по функциям, нужным для комфортного кодинга) Раз уж есть функция, «запихивающая» три байта в одно значение, логичным будет и обратный процесс. Но увы, его нет.
Есть только возможность средствами библиотеки извлечь тот же 32-битный цвет из конкретного пикселя. Занимается этим делом uint32_t color = strip.getPixelColor(11); Хотя при необходимости и желании можно уже «вручную» вытащить нужные цвета и определить каждый по своему байту)
Например так —
//—————————————
long i = strip.getPixelColor(15); //Получаем цвет 16-го пикселя
uint8_t r = (uint8_t)((i >> 16) & 0xff), //Первый байт — красный цвет
uint8_t g = (uint8_t)((i >> 8) & 0xff), //Второй байт — зеленый цвет
uint8_t b = (uint8_t)(i & 0xff); //Третий байт — синий цвет
strip.setPixelColor(16, r, g, b); //Назначаем полученные значения отдельным диодам 17-го пикселя
//—————————————

Это желательно оформить в свою отдельную функцию и для своего же удобства и упрощения кода. Хотя и необязательно.
Здесь важно понимать один момент — несмотря на название getPixelColor, функция не выполняет физического обращения к ленте для получения цвета заданного вами номера пикселя. Это невозможно в SPI, работающего по принципу ниппеля — только «туда». Но при первом же вызове setPixelColor в массив pixels[n] для значений пикселей записываются по порядку все устанавливаемые цвета всех диодов в 32-битном значении и хранятся там до следующего вызова этой же функции, которая опять обновит и ленту, и массив. В промежутке можно извлечь из этого массива 32-битный цвет из нужного пикселя с помощью getPixelColor. Это значит, что вы можете в любой момент в любом месте кода выполнять любые действия, не связанные с управлением лентой, и затем вернуться к установленным и включенным хоть 5 минут назад цветам в совсем другой функции и продолжить с ними работать «с того же места».
Можно легко задать (установить) или изменить полученный 32-битный цвет в HEX формате. В качестве аргумента мы можем передать параметр цвета пикселя как 0xFF9C00 и функция это так же переварит.
Здесь то же самое, только FF — это красный диод с диапазоном значений от 0x00 до 0xFF, 9C — зеленый, и 00 — синий.
Аналогично «вытаскиванию» восьмибитных десятичных значений каждого цвета мы можем побайтно изменить исходную величину.
Для этого я набросал небольшую функцию, которая изменяет HEX представление цвета SummColor на передаваемые значения RGB —
HEX_R, HEX_G, HEX_B.

uint32_t HEX_Math(uint32_t SummColor, uint32_t HEX_R, uint32_t HEX_G, uint32_t HEX_B)
{
SummColor+=((HEX_R << 16)|(HEX_G << 8)|(HEX_B));
return SummColor;
}

Если мы имели 0x9000FE и 0x03, 0x02, 0x01, функция вернет значение 9302FF.
Следующая «штатная» функция — uint16_t n = strip.numPixels(); — возвращает задекларированное количество пикселей в ленте. Полезна в тех случаях, когда у вас гора кода и своих функций, а применяться код будет к разным лентам с разным количеством пикселей в них. Чтобы не перебивать все в коде, следует заранее использовать в счетчиках этот вызов.
strip.setBrightness(100); — устанавливает яркость всей ленты, вызывается в setup() единожды. В коде использовать нельзя, для этого задавайте параметры яркости значениями RGB. (55,0,0) — тоже красный, но не такой яркий как (255,0,0). Полезность этого для себя нашел в том, что неудобно отлаживать код, когда рядом на столе бьет в глаз в разнобой разный злой колор с уровнями 200-255). А так — установил временно strip.setBrightness(30) и работай себе спокойно. Выше этого значения ни один диод не прыгнет, как бы вы не задавали уровень в коде. Просто все итоговые цвета пикселей будут пропорционально пересчитаны для этого значения, как самого яркого.
Подключение нескольких лент к разным выходам ардуины — тоже не вопрос. Пишем в заголовке еще одну ленту с нужным количеством пикселей и пин управления.
Adafruit_NeoPixel strip_a = Adafruit_NeoPixel(24, 5);
Adafruit_NeoPixel strip_b = Adafruit_NeoPixel(45, 6);

Я этим не пользовался, но сложного в этом ничего не вижу.
Остается файл Adafruit_NeoPixel.h — заголовок библиотеки, но в нем нам искать нечего. Там прописаны конфигурации пинов, смещения цветов для RGB и RGBW, частоты для разных типов лент, объявлены уже рассмотренные нами функции а так же различные типы и константы.
keywords.txt содержит перечень имен функций и констант.
Это собственно все, что нам дает библиотека Adafruit NeoPixel — вполне достаточно для написания чего нибудь светящегося, мерцающего и переливающегося)
Теперь, имея некий «справочник» можно прописать параметры и начать кодить что нибудь свое, родное)

Вот пример готового скетча, в котором нужно только поправить параметры Adafruit_NeoPixel(12, PIN, NEO_GRB + NEO_KHZ800); под свою ленту.

//***********************************************************************************************
#include <adafruit_NeoPixel.h> // подключаем библиотеку, здесь все просто. копи-паст.
#define PIN 6 // назначаем управляющий лентой пин. Пусть будет шестой, как в примере оригинальной статьи.
Adafruit_NeoPixel strip = Adafruit_NeoPixel(12, PIN, NEO_GRB + NEO_KHZ800); // здесь нужно указать параметры своей ленты.
// 12 — количество пикселей в ленте. У меня в отрезке было 6, хотя физически диодов было 18.
// Просто один контроллер INK1003 управлял одновременно тремя 5050 RGB сборками.
// NEO_GRB — порядок следования цветов. У меня обычный — RGB. Если у вас так же — меняйте этот параметр на NEO_RGB
// В любом случае с лентой страшного ничего не произойдет, просто будут перепутаны красный с зеленым, исправит никогда не поздно)
// NEO_KHZ800 — частота работы контроллеров пикселей. Смотрите или в даташите к вашей ленте или опять же методом научного тыка.
// Так как варианта всего два — запутаться сложно. Либо светит, либо нет.

//***********************************************************************************************
void setup() //Это мы уже рассмотрели выше, забежав малость вперед, зато теперь все ясно и понятно —
{
strip.begin();
strip.show();
strip.setBrightness(55); // Выше писал для чего и как)
// В процессе кодинга-отладки полезными окажутся:
Serial.begin(9600); // Это для вывода значений переменных в порт. Интерфейс тут — «Инструменты» —> «Монитор порта».
// Пишем в коде Serial.print(Count);, ставим код на паузу delay(5000), и 5 секунд зрим значение
// переменной Count и осознаем почему у нас она не считает что либо или считает не так)
randomSeed(analogRead(0)); // инициализация аналогового входа для получения с него псевдослучайных значений.
// Тоже может пригодиться
}
//***********************************************************************************************
void loop() // Здесь непосредственно будет выполняться код и вызываться функции, код которых вы напишите за пределами петли
{
SetMyColor(0, 0, 155); // Давай покрасим эту ленту в синий цвет) — вызываем функцию 1
delay(3000);
TurnOffSecondPixel(); // И погасим каждый второй) — вызываем функцию 2
delay(3000);
}
//***********************************************************************************************
void SetMyColor(uint8_t r, uint8_t g, uint8_t b) //Тело функции 1
{
for(uint8_t i=0; i<strip.numPixels(); i++) //В цикле считаем пиксели
strip.setPixelColor(i, r, g, b); //И красим их
strip.show(); //За циклом включаем цвета
}
//***********************************************************************************************
void TurnOffSecondPixel() //Тело функции 2
{
for(uint8_t i=0; i<strip.numPixels(); i++) //В цикле считаем пиксели
{
if(i%2)strip.setPixelColor(i, 0, 0, 0); //И тушим каждый второй (0,0,0)
}
strip.show(); //За циклом включаем что осталось
}

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

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

Внешний вид проекта подключения адресной светодиодной ленты WS2812 к Arduino

Ранее на нашем сайте мы уже рассматривали использование адресной светодиодной ленты в следующих проектах:

  • подключение адресной светодиодной ленты WS2812 к Arduino (фактически такая же статья как и эта, только в другом ракурсе, использована библиотека попроще, легче понять управление такой лентой);
  • часы бесконечности на Arduino;
  • комнатный термометр на Arduino.

Типы адресных RGB светодиодных лент

На сегодняшний день выпускаются различные типы адресных светодиодных лент, различных размеров и с различной распиновкой. Но основное отличие между ними кроется в типах их контроллеров. В настоящее время наиболее популярны серии таких контроллеров как WS281x, SK6812, SK9822 и APA102. В следующей таблице представлены основные различия между данными типами контроллеров.

Основные различия между контроллерами адресных светодиодных лент

Модуль WS2812B

Внешний вид модуля WS2812B показан на рисунке ниже. На нем видно что чип WS2812B подключен к 3-м индивидуальным светодиодам (Red (красный), Green (зеленый) и Blue (синий)) с помощью проводников ярко-желтого цвета.

Внешний вид модуля WS2812B

Представленное видео наглядно показывает принцип его работы.

На рисунке ниже показан отрезок светодиодной ленты с 8-ю светодиодами WS2812B, включенными последовательно. Каждым из этих светодиодов можно управлять индивидуально по его адресу, используя для этого всего один проводник. Контакт данных первого светодиода IN подключается к микроконтроллеру, а контакт DO/OUT (выходной контакт данных) – к контакту DI (входной контакт данных) следующей светодиодной ленты.

Отрезок светодиодной ленты с 8-ю светодиодами WS2812B, включенными последовательно

А на следующем рисунке показано RGB светодиодное кольцо Neopixel с 16 адресуемыми RGB светодиодами, расположенными по кругу. Подобно предыдущему рассмотренному модулю все светодиоды в этом кольце включены последовательно.

Светодиодное кольцо Neopixel с 16 адресуемыми RGB светодиодами

Распиновка светодиода WS2812B

Светодиод WS2812B содержит 4 контакта, два из которых используются для подачи питания, один для ввода данных и один для вывода данных. Распиновка светодиода WS2812B показана на следующем рисунке.

Распиновка светодиода WS2812B

Назначение контактов следующее:

VCC – обеспечивает подачу питания на модуль, его необходимо подключить к контакту 5V платы Arduino.

GND – общий провод (земля), необходимо подключить к аналогичному контакту платы Arduino.

DI – вход данных от микроконтроллера.

DO – выход данных на следующий модуль или светодиод.

Распиновка модуля светодиодной ленты WS2812B Neopixel

На следующем рисунке показана распиновка 8-битного модуля WS2812B. Аналогично светодиоду WS2812B модуль также имеет контакты для подачи питания, контакт для ввода данных и контакт для вывода данных. Контакт вывода данных можно подключить к контакту ввода данных следующего модуля.

Распиновка модуля светодиодной ленты WS2812B Neopixel

Назначение контактов следующее:

VCC – обеспечивает подачу питания на модуль, его необходимо подключить к контакту 5V платы Arduino.

GND – общий провод (земля), необходимо подключить к аналогичному контакту платы Arduino.

DI – вход данных от микроконтроллера.

DO – выход данных на следующий модуль или светодиод.

Компоненты светодиода WS2812B Neopixel

Как можно видеть из представленного рисунка, каждый подобный светодиод состоит из 3-х индивидуальных светодиодов – для красного, зеленого и синего цвета. Аноды этих светодиодов непосредственно подключены к контакту VCC, а катоды – к чипу WS2812B. Контакты DI, DO и GND также подключены к чипу WS2812B.

Компоненты светодиода WS2812B Neopixel

Компоненты светодиодной ленты WS2812B Neopixel

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

Компоненты светодиодной ленты WS2812B Neopixel

Схема модуля светодиодной ленты WS2812B Neopixel

Схема модуля светодиодной ленты WS2812B Neopixel представлена на рисунке ниже. Как мы можем видеть, она предельно проста и содержит только светодиоды и развязывающие конденсаторы. На представленной схеме показаны всего 3 светодиода, но на самом деле один модуль светодиодной ленты содержит 8 RGB светодиодов, а светодиодное кольцо Neopixel содержит 16 подобных светодиодов.

Схема модуля светодиодной ленты WS2812B Neopixel

Наиболее часто задаваемые вопросы про адресную светодиодную ленту

Что такое адресная RGB светодиодная лента?
Адресная RGB светодиодная лента позволяет осуществлять индивидуальное управление каждым светодиодом в своем составе. По факту, каждый RGB кластер в светодиодной ленте может иметь уникальную цветовую комбинацию и отображать множество цветов в одно и тоже время.

Как управлять адресной RGB светодиодной лентой?
Для управления адресной RGB светодиодной лентой с помощью платы Arduino необходимо установить специальную библиотеку. Для Arduino доступно много подобных библиотек, часть из них бесплатные.

В чем разница между WS2812 и WS2812B?
WS2812B имеет лучшую структуру чем WS2812, управление цепью и RGB светом в ней разделено, и она имеет лучшие показатели теплового рассеяния.

В чем разница между SK6812 и WS2812B?
Основное различие между этими двумя драйверами (контроллерами) состоит в том, что SK6812 имеет независимые от напряжения цвет и яркость в широком диапазоне напряжений, что означает что неожиданные падения напряжения не будут оказывать такого негативного эффекта на SK6812 по сравнению с WS2812B.

Лента WS2812B не работает или работает некорректно. Что делать?

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

Схема проекта

Схема подключения адресной светодиодной ленты Neopixel к плате Arduino представлена на следующем рисунке.

Схема подключения адресной светодиодной ленты Neopixel к плате ArduinoНеобходимо подключить контакты VCC и GND светодиодной ленты к контактам 5V и GND платы Arduino соответственно. Контакт DI светодиодной ленты мы подключили к контакту D2 платы Arduino. При этом схема подключения адресной светодиодной ленты Neopixel к плате Arduino не будет меняться в зависимости от того, как много светодиодов содержит лента. Аналогичным образом можно подключить к плате Arduino и светодиодное кольцо Neopixel.

Внешний вид собранной конструкции проекта представлен на следующем рисунке.

Внешний вид собранной конструкции проекта

Объяснение программы для Arduino

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

Первым делом в коде программы подключим библиотеку FastLED. Затем укажем осмысленные имена для используемых контактов платы. Если ваша светодиодная лента неправильно отображает цвета вы можете изменить это с помощью COLOR_ORDER в представленном фрагменте кода программы. Объявим другие необходимые переменные и объекты.

#include <FastLED.h>

#define LED_PIN     2

#define NUM_LEDS    8

#define BRIGHTNESS  10

#define LED_TYPE    WS2812B

#define COLOR_ORDER GRB

CRGB leds[NUM_LEDS];

#define UPDATES_PER_SECOND 100

CRGBPalette16 currentPalette;

TBlendType    currentBlending;

extern CRGBPalette16 myRedWhiteBluePalette;

extern const TProgmemPalette16 myRedWhiteBluePalette_p PROGMEM;

В функции setup() мы инициализируем библиотеку FastLED и установим яркость ленты. Также мы установим первую палитру цветов для Rainbow.

void setup() {

    delay( 3000 ); // power-up safety delay

    FastLED.addLeds<LED_TYPE, LED_PIN, COLOR_ORDER>(leds, NUM_LEDS).setCorrection( TypicalLEDStrip );

    FastLED.setBrightness(  BRIGHTNESS );

    currentPalette = RainbowColors_p;

    currentBlending = LINEARBLEND;

}

В функции loop() мы будем непрерывно в цикле переключать различные эффекты при помощи вызова функции ChangePalettePeriodically(). Эта функция будет изменять шаблоны цвета через определенные промежутки времени. Функция FillLEDsFromPaletteColors будет использоваться для установки цвета каждого пиксела в соответствии с выбранной палитрой. Затем все указанные цвета отображаются на светодиодной ленте или модуле с помощью функции FastLED.show(). Эту функцию необходимо вызывать после того как вы задали цвета для всех светодиодов в ленте.

void loop() {

    ChangePalettePeriodically();  

    static uint8_t startIndex = 0;

    startIndex = startIndex + 1; /* motion speed */

    FillLEDsFromPaletteColors( startIndex);  

    FastLED.show();

    FastLED.delay(1000 / UPDATES_PER_SECOND);

}

Эффекты для каждой палитры описаны в комментариях в полном тексте программы. Вы можете поэкспериментировать с этими палитрами чтобы создать новые эффекты и цвета.

Тестирование работы светодиодной ленты WS2812B

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

Подключение 16-битного светодиодного кольца WS2812B Neopixel к Arduino

Данное кольцо представляет собой ни что иное как 16 светодиодов WS2812B, объединенных в форме круга. Его подключение к плате Arduino аналогично ранее рассмотренному подключению адресной светодиодной ленты.

Схема подключения 16-битного светодиодного кольца WS2812B Neopixel к Arduino

Внешний вид подключенного к плате Arduino 16-битного светодиодного кольца WS2812B Neopixel показан на следующем рисунке.

Внешний вид подключенного к плате Arduino 16-битного светодиодного кольца WS2812B Neopixel

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

Исходный код программы (скетча)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

#include <FastLED.h>

#define LED_PIN     2

#define NUM_LEDS    8

#define BRIGHTNESS  10

#define LED_TYPE    WS2812B

#define COLOR_ORDER GRB

CRGB leds[NUM_LEDS];

#define UPDATES_PER_SECOND 100

// This example shows several ways to set up and use ‘palettes’ of colours

// with FastLED.

// These compact palettes provide an easy way to re-colourize your

// animation on the fly, quickly, easily, and with low overhead.

// USING palettes is MUCH simpler in practice than in theory, so first just

// run this sketch, and watch the pretty lights as you then read through

// the code.  Although this sketch has eight (or more) different colour schemes,

// the entire sketch compiles down to about 6.5K on AVR.

// FastLED provides a few pre-configured colour palettes, and makes it

// extremely easy to make up your color schemes with palettes.

// Some notes on the more abstract ‘theory and practice of

// FastLED compact palettes are at the bottom of this file.

CRGBPalette16 currentPalette;

TBlendType    currentBlending;

extern CRGBPalette16 myRedWhiteBluePalette;

extern const TProgmemPalette16 myRedWhiteBluePalette_p PROGMEM;

void setup() {

    delay( 3000 ); // power-up safety delay

    FastLED.addLeds<LED_TYPE, LED_PIN, COLOR_ORDER>(leds, NUM_LEDS).setCorrection( TypicalLEDStrip );

    FastLED.setBrightness(  BRIGHTNESS );

    currentPalette = RainbowColors_p;

    currentBlending = LINEARBLEND;

}

void loop() {

    ChangePalettePeriodically();  

    static uint8_t startIndex = 0;

    startIndex = startIndex + 1; /* motion speed (скорость движения) */  

    FillLEDsFromPaletteColors( startIndex);

    FastLED.show();

    FastLED.delay(1000 / UPDATES_PER_SECOND);

}

void FillLEDsFromPaletteColors( uint8_t colorIndex) {

    uint8_t brightness = 255;

    for( int i = 0; i < NUM_LEDS; ++i) {

        leds[i] = ColorFromPalette( currentPalette, colorIndex, brightness, currentBlending);

        colorIndex += 3;

    }

}

// здесь продемонстрировано несколько различных палитр цветов

// FastLED provides several ‘preset’ palettes: RainbowColors_p, RainbowStripeColors_p,

// OceanColors_p, CloudColors_p, LavaColors_p, ForestColors_p, and PartyColors_p.

// дополнительно вы можете задать свои собственные цветовые палитры, или же вы можете

// написать код программы, который меняет цветовую палитру «на лету».  Все это продемонстрировано здесь.

void ChangePalettePeriodically() {

    uint8_t secondHand = (millis() / 1000) % 60;

    static uint8_t lastSecond = 99;

    if( lastSecond != secondHand) {

        lastSecond = secondHand;

        if( secondHand ==  0)  { currentPalette = RainbowColors_p;         currentBlending = LINEARBLEND; }

        if( secondHand == 10)  { currentPalette = RainbowStripeColors_p;   currentBlending = NOBLEND;  }

        if( secondHand == 15)  { currentPalette = RainbowStripeColors_p;   currentBlending = LINEARBLEND; }

        if( secondHand == 20)  { SetupPurpleAndGreenPalette();             currentBlending = LINEARBLEND; }

        if( secondHand == 25)  { SetupTotallyRandomPalette();              currentBlending = LINEARBLEND; }

        if( secondHand == 30)  { SetupBlackAndWhiteStripedPalette();       currentBlending = NOBLEND; }

        if( secondHand == 35)  { SetupBlackAndWhiteStripedPalette();       currentBlending = LINEARBLEND; }

        if( secondHand == 40)  { currentPalette = CloudColors_p;           currentBlending = LINEARBLEND; }

        if( secondHand == 45)  { currentPalette = PartyColors_p;           currentBlending = LINEARBLEND; }

        if( secondHand == 50)  { currentPalette = myRedWhiteBluePalette_p; currentBlending = NOBLEND;  }

        if( secondHand == 55)  { currentPalette = myRedWhiteBluePalette_p; currentBlending = LINEARBLEND; }

    }

}

// данная функция заполняет палитру случайными цветами

void SetupTotallyRandomPalette()

{

    for( int i = 0; i < 16; ++i) {

        currentPalette[i] = CHSV( random8(), 255, random8());

    }

}

// This function sets up a palette of black and white stripes,

// using code.  Since the palette is effectively an array of

// sixteen CRGB colors, the various fill_* functions can be used

// to set them up.

void SetupBlackAndWhiteStripedPalette()

{

    // ‘black out’ all 16 palette entries…

    fill_solid( currentPalette, 16, CRGB::Black);

    // and set every fourth one to white.

    currentPalette[0] = CRGB::White;

    currentPalette[4] = CRGB::White;

    currentPalette[8] = CRGB::White;

    currentPalette[12] = CRGB::White;

}

// эта функция устанавливает палитру пурпурных и зеленых полосок.

void SetupPurpleAndGreenPalette() {

    CRGB purple = CHSV( HUE_PURPLE, 255, 255);

    CRGB green  = CHSV( HUE_GREEN, 255, 255);

    CRGB black  = CRGB::Black;  

    currentPalette = CRGBPalette16(

                                   green,  green,  black,  black,

                                   purple, purple, black,  black,

                                   green,  green,  black,  black,

                                   purple, purple, black,  black );

}

// This example shows how to set up a static color palette

// which is stored in PROGMEM (flash), which is almost always more

// plentiful than RAM.  A static PROGMEM palette like this

// takes up 64 bytes of flash.

const TProgmemPalette16 myRedWhiteBluePalette_p PROGMEM = {

    CRGB::Red,

    CRGB::Gray, // ‘white’ is too bright compared to red and blue

    CRGB::Blue,

    CRGB::Black,

    CRGB::Red,

    CRGB::Gray,

    CRGB::Blue,

    CRGB::Black,

    CRGB::Red,

    CRGB::Red,

    CRGB::Gray,

    CRGB::Gray,

    CRGB::Blue,

    CRGB::Blue,

    CRGB::Black,

    CRGB::Black

};

Все необходимые файлы для проекта можно скачать по следующей ссылке.

Источник статьи

Загрузка…

1 560 просмотров

Arduino и адресная светодиодная лента WS2812B

В этой статье мы научимся работать с адресной светодиодной RGB лентой WS2812B. Лента состоит из RGB пикселей WS2812B в корпусе LED 5050 (физические размеры каждого элемента составляют 5×5 мм).

Адресные модули и ленты WS2812B в нашем магазине

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

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

Arduino и адресная светодиодная лента WS2812B

Немного о характеристиках адресных светодиодов WS2812B:

  • Напряжение питания: 5 ± 0.5 В;
  • Потребление тока: ~20 мА один светодиод, т.е. ~60 мА весь пиксель.

В начале нам необходимо подключить светодиоды к Arduino. Сделать это предельно просто. Контакты +5V и GND подключаем к плюсу и минусу источника питания, соответственно. Din подключаем к любому цифровому пину Arduino, по умолчанию это будет 6-ой цифровой пин, но можно использовать любой другой.

Кроме того, желательно соединить землю Arduino с землей источника питания. Нежелательно использовать Arduino в качестве источника питания, так как выход +5V может обеспечить ток лишь в 800 мА. Этого хватит не более чем на 13 пикселей светодиодной ленты.

С другой стороны ленты есть выход Do, он подключается к следующей ленте, позволяя управлять лентами по принципу каскада, как одной. Разъём питания в конце также продублирован.

Arduino и адресная светодиодная лента WS2812B

Далее будем разобираться с управлением лентой. Описание протокола управления присутствует в Datasheet к WS2812B.

Все пиксели по умолчанию подключены друг к другу последовательно. Вход Din каждого их них подключается к выходу Do следующего. Сигнал управления должен поступать на первый из них.

Команды управления подаются пакетами по 3 байта, по одному для каждого из трёх цветов. Между пакетами идет пауза длительностью 50 мкс, пауза более 100 мкс означает конец передачи.

Длительность любого бита – 1,25 мкс. Бит “1” кодируется импульсом длительностью 0,8 мкс и паузой в 0,45 мкс. Бит “0”– 0,4 и 0,85 мкс. Возможны расхождения по времени до 150 нс. Такой пакет должен быть отправлен для каждого пикселя в светодиодной ленте. На диаграмме изображён требуемый сигнал.

Arduino и адресная светодиодная лента WS2812B

Глядя на данную схему, несложно догадаться, что такое невозможно воплотить в жизнь стандартными функциями Wiring, вроде digitalWrite и delay. Однако ленты WS2812B достаточно популярны и для них уже есть библиотеки на языках более низкого уровня. Вам достаточно только выбрать любую из них.

Самые популярные библиотеки:

FastLED

Поддерживает все версии Ардуино и множество протоколов передачи данных (не только для нашей ленты). Язык программирования, на котором она написана – чистый C.

Adafruit NeoPixel

Библиотека предназначена для работы со светодиодными кольцами NeoPixel Ring, разработки и производства Adafruit. Работает медленнее, обладает меньшими возможностями, но содержит в себе лишь самое нужное. Написана на C, языке ассемблера и немного на Wiring. Поддерживает всю линейку Ардуино.

Подключение WS2812B в Arduino IDE

Давайте попробуем обе библиотеки и сравним их. Напишем стандартный скетч Blink, чтобы лента загоралась красным на полсекунды и выключалась на такой же интервал.

По умолчанию, количество пикселей в ленте – 30, но при необходимости это можно изменить в скетче.

Пример с использованием библиотеки FastLED:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

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

#include «FastLED.h»

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

#define LED_COUNT 30

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

#define LED_PIN 6

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

CRGB strip[LED_COUNT];

void setup()

{

  // Добавляем ленту

  FastLED.addLeds<WS2812B, LED_PIN, RGB>(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 байт в программной памяти Arduino и 187 байт ОЗУ.

Теперь попробуем тоже самое с библиотекой Adafruit NeoPixel:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

// Подключаем библиотеку 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 постоянной и 40 байт оперативной памяти Arduino.

Arduino и адресная светодиодная лента WS2812B

Как можно увидеть, библиотека FastLED более ресурсоёмка. Кроме того, используя её в Arduino с 2 Кб ОЗУ (таковой является, например, UNO) можно управлять не более чем 600 пикселями светодиодной ленты. Это связано с тем, что на каждый пиксель резервируется 3 байта памяти.

А вот в Adafruit NeoPixel минимум нужных функций и меньший расход памяти. Какую из них использовать – ваш выбор. Удачи в проектах!

Товары, используемые в материале

Самые популярные материалы в блоге

За все время

За сегодня

Вольтик — это слаженная команда амбициозных и заядлых инженеров. Мы создали этот проект с целью вовлечения вас, талантливых и начинающих профессионалов, в увлекательный мир мейкерской микроэлектроники!

Понравилась статья? Поделить с друзьями:
  • Как написать этот знак на клавиатуре
  • Как написать это дорогого стоит
  • Как написать этапы работы над проектом
  • Как написать эстония на английском
  • Как написать эссе эмоционально