Хорошим выбором для динамического освещения в настоящее время являются светодиодные полоски. Они могут быть установлены практически везде, выпускаются в различных цветах и требуют минимального обслуживания. И сейчас это направление приобретает еще большую популярность в связи с появлением адресных светодиодных лент. Они обеспечивают большую гибкость в управлении и настройке, отличаются большим количеством визуальных эффектов и тем самым являются еще более визуально привлекательными. Подобными адресными светодиодными лентами достаточно легко управлять с помощью плат Arduino. И в данной статье мы рассмотрим подключение адресной цветной (RGB) светодиодной ленты WS2812B, также известной под названием Neopixel, к плате Arduino. Также будут достаточно подробно рассмотрены принципы работы этой светодиодной ленты.
Ранее на нашем сайте мы уже рассматривали использование адресной светодиодной ленты в следующих проектах:
- подключение адресной светодиодной ленты WS2812 к Arduino (фактически такая же статья как и эта, только в другом ракурсе, использована библиотека попроще, легче понять управление такой лентой);
- часы бесконечности на Arduino;
- комнатный термометр на Arduino.
Типы адресных RGB светодиодных лент
На сегодняшний день выпускаются различные типы адресных светодиодных лент, различных размеров и с различной распиновкой. Но основное отличие между ними кроется в типах их контроллеров. В настоящее время наиболее популярны серии таких контроллеров как WS281x, SK6812, SK9822 и APA102. В следующей таблице представлены основные различия между данными типами контроллеров.
Принципы работы адресной светодиодной ленты Neopixel
Модуль WS2812B
Внешний вид модуля WS2812B показан на рисунке ниже. На нем видно что чип WS2812B подключен к 3-м индивидуальным светодиодам (Red (красный), Green (зеленый) и Blue (синий)) с помощью проводников ярко-желтого цвета.
Представленное видео наглядно показывает принцип его работы.
На рисунке ниже показан отрезок светодиодной ленты с 8-ю светодиодами WS2812B, включенными последовательно. Каждым из этих светодиодов можно управлять индивидуально по его адресу, используя для этого всего один проводник. Контакт данных первого светодиода IN подключается к микроконтроллеру, а контакт DO/OUT (выходной контакт данных) – к контакту DI (входной контакт данных) следующей светодиодной ленты.
А на следующем рисунке показано RGB светодиодное кольцо Neopixel с 16 адресуемыми RGB светодиодами, расположенными по кругу. Подобно предыдущему рассмотренному модулю все светодиоды в этом кольце включены последовательно.
Распиновка светодиода WS2812B
Светодиод WS2812B содержит 4 контакта, два из которых используются для подачи питания, один для ввода данных и один для вывода данных. Распиновка светодиода WS2812B показана на следующем рисунке.
Назначение контактов следующее:
VCC – обеспечивает подачу питания на модуль, его необходимо подключить к контакту 5V платы Arduino.
GND – общий провод (земля), необходимо подключить к аналогичному контакту платы Arduino.
DI – вход данных от микроконтроллера.
DO – выход данных на следующий модуль или светодиод.
Распиновка модуля светодиодной ленты WS2812B Neopixel
На следующем рисунке показана распиновка 8-битного модуля WS2812B. Аналогично светодиоду WS2812B модуль также имеет контакты для подачи питания, контакт для ввода данных и контакт для вывода данных. Контакт вывода данных можно подключить к контакту ввода данных следующего модуля.
Назначение контактов следующее:
VCC – обеспечивает подачу питания на модуль, его необходимо подключить к контакту 5V платы Arduino.
GND – общий провод (земля), необходимо подключить к аналогичному контакту платы Arduino.
DI – вход данных от микроконтроллера.
DO – выход данных на следующий модуль или светодиод.
Компоненты светодиода WS2812B Neopixel
Как можно видеть из представленного рисунка, каждый подобный светодиод состоит из 3-х индивидуальных светодиодов – для красного, зеленого и синего цвета. Аноды этих светодиодов непосредственно подключены к контакту VCC, а катоды – к чипу WS2812B. Контакты DI, DO и GND также подключены к чипу WS2812B.
Компоненты светодиодной ленты WS2812B Neopixel
Модуль светодиодной ленты, который мы будем использовать в нашем проекте, содержит 8 RGB светодиодов WS2812B совместно с развязывающими конденсаторами. Кроме этих развязывающих конденсаторов никаких других дополнительных компонентов для создания светодиодной ленты не требуется.
Схема модуля светодиодной ленты WS2812B Neopixel
Схема модуля светодиодной ленты WS2812B Neopixel представлена на рисунке ниже. Как мы можем видеть, она предельно проста и содержит только светодиоды и развязывающие конденсаторы. На представленной схеме показаны всего 3 светодиода, но на самом деле один модуль светодиодной ленты содержит 8 RGB светодиодов, а светодиодное кольцо Neopixel содержит 16 подобных светодиодов.
Наиболее часто задаваемые вопросы про адресную светодиодную ленту
Что такое адресная RGB светодиодная лента?
Адресная RGB светодиодная лента позволяет осуществлять индивидуальное управление каждым светодиодом в своем составе. По факту, каждый RGB кластер в светодиодной ленте может иметь уникальную цветовую комбинацию и отображать множество цветов в одно и тоже время.
Как управлять адресной RGB светодиодной лентой?
Для управления адресной RGB светодиодной лентой с помощью платы Arduino необходимо установить специальную библиотеку. Для Arduino доступно много подобных библиотек, часть из них бесплатные.
В чем разница между WS2812 и WS2812B?
WS2812B имеет лучшую структуру чем WS2812, управление цепью и RGB светом в ней разделено, и она имеет лучшие показатели теплового рассеяния.
В чем разница между SK6812 и WS2812B?
Основное различие между этими двумя драйверами (контроллерами) состоит в том, что SK6812 имеет независимые от напряжения цвет и яркость в широком диапазоне напряжений, что означает что неожиданные падения напряжения не будут оказывать такого негативного эффекта на SK6812 по сравнению с WS2812B.
Лента WS2812B не работает или работает некорректно. Что делать?
Если лента WS2812B не работает убедитесь в правильности всех сделанных соединений и в том, что в коде программы вы выбрали правильный чип (драйвер) ленты. Если лента отображает неправильные цвета поменяйте порядок цветов в коде программы. Если не работают некоторые светодиоды ленты убедитесь в том, что число используемых светодиодов в программе правильно. Если в коде программы число светодиодов правильное, но часть из них все равно не работают, ищите причину аппаратного сбоя их работы. Если в составе ленты есть хотя бы один неисправный светодиод, то все светодиоды после него могут не работать. В этом случае замените неисправный светодиод или сделайте его обход.
Схема проекта
Схема подключения адресной светодиодной ленты Neopixel к плате Arduino представлена на следующем рисунке.
Необходимо подключить контакты VCC и GND светодиодной ленты к контактам 5V и GND платы Arduino соответственно. Контакт DI светодиодной ленты мы подключили к контакту D2 платы Arduino. При этом схема подключения адресной светодиодной ленты Neopixel к плате Arduino не будет меняться в зависимости от того, как много светодиодов содержит лента. Аналогичным образом можно подключить к плате Arduino и светодиодное кольцо Neopixel.
Внешний вид собранной конструкции проекта представлен на следующем рисунке.
Объяснение программы для Arduino
Полный код программы приведен в конце статьи, здесь же мы кратко рассмотрим его основные фрагменты.
Перед написанием кода программы установите библиотеку FastLED с помощью менеджера библиотек Arduino IDE, либо же скачайте эту библиотеку вручную с репозитория Github. В коде программы мы запрограммируем различные световые эффекты для нашей ленты.
Первым делом в коде программы подключим библиотеку FastLED. Затем укажем осмысленные имена для используемых контактов платы. Если ваша светодиодная лента неправильно отображает цвета вы можете изменить это с помощью COLOR_ORDER в представленном фрагменте кода программы. Объявим другие необходимые переменные и объекты.
1 2 3 4 5 6 7 8 9 10 11 12 |
#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.
1 2 3 4 5 6 7 |
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(). Эту функцию необходимо вызывать после того как вы задали цвета для всех светодиодов в ленте.
1 2 3 4 5 6 7 8 |
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 аналогично ранее рассмотренному подключению адресной светодиодной ленты.
Внешний вид подключенного к плате 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 }; |
Все необходимые файлы для проекта можно скачать по следующей ссылке.
3 474 просмотров
доброго дня, подскажите как в этот код добавить датчик движения ?
без всяких ик пультов и прочего?
Так PIR датчик очень просто же подключить к Ардуино. Или вы имели ввиду какой то другой датчик движения.
Да именно его, хотел подключить но не совсем понимаю как правильно составить код. Вы могли бы мне подсказать ?
Я видел эту статью, но два кода не смог собрать в одно целое, видимо что то делаю не правильно.
Суть проекта простая ргб диоды 24 штуки в кольце, задача когда датчик видит движение он начинает переливаться всеми цветами, что используются тут в коде. Когда я добавляю датчик движения, ничего не происходит. 89269355010 вотсап плиз
Допустим, как в этой статье у вас датчик движения подключен ко 2 цифровому контакту платы Ардуино.
Тогда при срабатывании датчика будет выполняться условие:
if (digitalRead(2) == HIGH) // проверяем сработал ли PIR датчик
{
....
}
И теперь в код этого условия (между фигурными скобками) вставляете не то, что стоит в этой статье, а все то, что написано в функции void loop() текущей статьи. Тогда при срабатывании датчика у вас будет ваша лента мигать.
И не забудьте в void setup() добавить:
pinMode(2, INPUT); // Pin 2 в режим ввода данных
чтобы сконфигурировать контакт 2 на ввод данных от датчика движения.