Руководство по адресной RGB светодиодной ленте WS2812B с Arduino

Эта статья посвящена светодиодной ленте WS2812B, которая является адресной RGB светодиодной лентой. Информация в этой статье также применима к другим аналогичным светодиодным лентам, таким как ленты семейства WS28XX, ленты Neopixel и другие.

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

Знакомство со светодиодной лентой WS2812B

Адресная светодиодная лента WS2812B выпускается в нескольких моделях, которые отличаются размером, герметиком или плотностью светодиодов. Выбирайте ту, которая лучше всего подходит для ваших целей.

Где купить?

Вы можете посетить Maker Advisor и найти RGB светодиодную ленту WS2812B по лучшей цене.

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

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

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

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

На следующем рисунке вы можете увидеть чип внутри светодиода. Это RGB светодиод, и он работает следующим образом.

Чип внутри светодиода WS2812B

Этот вид лент очень гибкий и может быть обрезан до любой длины, которую вы хотите. Как видите, лента разделена на сегменты, и каждый сегмент содержит один RGB светодиод.

Сегменты светодиодной ленты WS2812B

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

Обрезка светодиодной ленты WS2812B

Эти ленты поставляются с разъемами на каждом конце. Я решил отрезать разъемы и припаять штырьковые контакты. Это удобнее, если вы хотите подключить ленту к Arduino или к макетной плате.

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

Питание светодиодной ленты WS2812B

Светодиодная лента должна питаться от источника питания 5 В. При напряжении 5 В каждый светодиод потребляет около 50 мА при максимальной яркости. Это означает, что на каждые 30 светодиодов лента может потреблять до 1,5 А. Убедитесь, что вы выбрали источник питания, соответствующий потребностям ленты. Блок питания AC-DC, обеспечивающий 5 В и 2 А, должен справиться с задачей:

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

Схема подключения

В этом примере светодиодная лента WS2812B будет питаться от пина 5 В Arduino. В моем случае я управляю 14 светодиодами. Если вы хотите управлять большим количеством светодиодов, вам потребуется использовать внешний источник питания.

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

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

  • Подключите конденсатор емкостью от 100 мкФ до 1000 мкФ между питанием и землей для сглаживания напряжения питания.

  • Добавьте резистор 220 или 470 Ом между цифровым выходным пином Arduino и входным пином данных ленты для уменьшения помех на этой линии.

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

  • Если ваша лента повреждена и не работает, проверьте, не сломан ли первый светодиод. Если это так, отрежьте его, перепаяйте штырьковые контакты, и лента должна снова заработать.

Код

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

Установка библиотеки FastLED

  1. Нажмите здесь, чтобы скачать библиотеку FastLED. У вас должен появиться .zip файл в папке загрузок.

  2. Распакуйте .zip файл, и вы получите папку FastLED-master.

  3. Переименуйте папку из FastLED-master в FastLED.

  4. Переместите папку FastLED в папку libraries вашей установки Arduino IDE.

  5. Наконец, перезапустите Arduino IDE.

После установки необходимой библиотеки загрузите следующий код на вашу плату Arduino (это пример скетча, предоставленный в папке примеров библиотеки). Перейдите в File > Examples > FastLED > ColorPalette или скопируйте код ниже.

#include <FastLED.h>

#define LED_PIN     5
#define NUM_LEDS    14
#define BRIGHTNESS  64
#define LED_TYPE    WS2811
#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 colors
// with FastLED.
//
// These compact palettes provide an easy way to re-colorize 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 color schemes,
// the entire sketch compiles down to about 6.5K on AVR.
//
// FastLED provides a few pre-configured color palettes, and makes it
// extremely easy to make up your own 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;
    }
}

// There are several different palettes of colors demonstrated here.
//
// FastLED provides several 'preset' palettes: RainbowColors_p, RainbowStripeColors_p,
// OceanColors_p, CloudColors_p, LavaColors_p, ForestColors_p, and PartyColors_p.
//
// Additionally, you can manually define your own color palettes, or you can write
// code that creates color palettes on the fly.  All are shown here.

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; }
    }
}

// This function fills the palette with totally random colors.
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;

}

// This function sets up a palette of purple and green stripes.
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
};

// Additionl notes on FastLED compact palettes:
//
// Normally, in computer graphics, the palette (or "color lookup table")
// has 256 entries, each containing a specific 24-bit RGB color.  You can then
// index into the color palette using a simple 8-bit (one byte) value.
// A 256-entry color palette takes up 768 bytes of RAM, which on Arduino
// is quite possibly "too many" bytes.
//
// FastLED does offer traditional 256-element palettes, for setups that
// can afford the 768-byte cost in RAM.
//
// However, FastLED also offers a compact alternative.  FastLED offers
// palettes that store 16 distinct entries, but can be accessed AS IF
// they actually have 256 entries; this is accomplished by interpolating
// between the 16 explicit entries to create fifteen intermediate palette
// entries between each pair.
//
// So for example, if you set the first two explicit entries of a compact
// palette to Green (0,255,0) and Blue (0,0,255), and then retrieved
// the first sixteen entries from the virtual palette (of 256), you'd get
// Green, followed by a smooth gradient from green-to-blue, and then Blue.

Посмотреть исходный код

Вам нужно изменить переменную NUM_LEDS на количество светодиодов в вашей светодиодной ленте. В нашем примере светодиодная лента содержит 14 светодиодов.

#define NUM_LEDS 14

Если вы хотите использовать другой пин Arduino для управления светодиодной лентой, вам нужно изменить переменную LED_PIN:

#define LED_PIN 5

Демонстрация

В конце концов, вот что у вас получится. Потрясающие эффекты, как этот:

Демонстрация эффекта светодиодной ленты WS2812B - 1

И вот этот:

Демонстрация эффекта светодиодной ленты WS2812B - 2

И вот этот:

Демонстрация эффекта светодиодной ленты WS2812B - 3

И так далее (…)

Использование корпуса для светодиодной ленты

Эти светодиодные ленты обычно поставляются со съемной клейкой лентой, чтобы вы могли приклеить их куда угодно. Проблема в том, что они не очень хорошо держатся, так что, скорее всего, на следующий день вы найдете свою ленту на полу.

Решение: я нашел этот корпус для ленты, который хорошо рассеивает свет, и его можно прикрутить к полке, например, если вы хотите постоянное решение.

Корпус для светодиодной ленты WS2812B

Заключение

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

Если вам понравилась эта статья, вам также могут понравиться:

Спасибо за чтение.