این پست در مورد راه اندازی ws2812 است که یک LED RGB آدرس پذیر است. اطلاعات موجود در این پست با سایر LED مشابه مانند خانواده WS28XX، Neopixel و موارد دیگر نیز کار می کند.

راه اندازی WS2812B با آردوینو (به همراه کد و ویدیو پروژه)

معرفی LED WS2812B

نوار LED آدرس پذیر WS2812B در چندین مدل عرضه می شود که از نظر اندازه و تراکم LED متفاوت است. یکی را انتخاب کنید که با نیازهای شما مطابقت دارد.

در شکل زیر نوار LED WS2812B را مشاهده می کنید. طول آن 5 متر است و LED ها در یک سیلیکون ضد آب قرار گرفته اند. بنابراین، آنها را می توان بدون هیچ مشکلی در بیرون از خانه و زیر باران و گرد و غبار رها کرد.

راه اندازی WS2812B با آردوینو (به همراه کد و ویدیو پروژه)

به نظر من این جالب ترین نوع نوار LED است. شما می توانید روشنایی و رنگ هر LED را به صورت جداگانه کنترل کنید که به شما امکان می دهد جلوه های شگفت انگیز و پیچیده را به روشی ساده ایجاد کنید.

این نوار ال ای دی توسط ال ای دی های WS2812B که به صورت سری ساخته شده است. هر کدام از این ال ای دی ها دارای یک ای سی میباشد که میتوان به صورت جداگانه به هر ال ای دی دستور داد. این امکان برقراری ارتباط از طریق یک رابط تک سیم را فراهم می کند. این بدان معناست که شما می توانید تعداد زیادی LED را تنها با استفاده از یک پین دیجیتال آردوینو کنترل کنید.

در شکل زیر تراشه داخل LED را مشاهده می کنید.

راه اندازی WS2812B با آردوینو (به همراه کد و ویدیو پروژه)

این نوع نوارها بسیار انعطاف پذیر هستند و می توان آنها را به هر طولی که بخواهید برش دهید. همانطور که می بینید، نوار ال ای دی به بخش هایی تقسیم می شود و هر بخش حاوی یک LED RGB است.

راه اندازی WS2812B با آردوینو (به همراه کد و ویدیو پروژه)

که میتوانید از قسمت مشخص شده انها را تکه کنید.

راه اندازی WS2812B با آردوینو (به همراه کد و ویدیو پروژه)

این نوارها در هر انتها دارای کانکتور جهت اتصال سیم میباشد. اگر بخواهید نوار ال ای دی را به آردوینو یا برد بورد وصل کنید میتوانید از پین هدر به عنوان کانکتور استفاده نمایید.

راه اندازی WS2812B با آردوینو (به همراه کد و ویدیو پروژه)

منبع تغذیه مناسب جهت راه اندازی WS2812B

برای راه اندازی WS2812 باید با استفاده از منبع تغذیه 5 ولت تغذیه شود. در ولتاژ 5 ولت، هر LED در حداکثر میزان روشنایی خود حدود 50 میلی آمپر جریان می کشد. این بدان معنی است که برای هر 30 LED، نوار ممکن است به اندازه 1.5 A جریان کشیده شود. مطمئن شوید که منبع تغذیه ای را انتخاب کرده اید که مطابق با تعداد ال ای دی های نوار ال ای دی شما باشد. شما میتوانید از یک آداپتور برق AC به DC که 5 ولت و 2 آمپر را در خروجی ارائه می دهد برای این مورد استفاده نمایید.

شماتیک راه اندازی WS2812

در این مثال، نوار LED WS2812B با استفاده از پایه 5 ولت آردوینو تغذیه می شود. در این مثال ما میخواهیم 14 عدد LED را کنترل می کنم. اگر می خواهید تعداد زیادی از LED ها را کنترل کنید، باید از یک منبع تغذیه جداگانه استفاده کنید.

راه اندازی ws2812

نکات مفید جهت راه اندازی WS2812

  • یک خازن با ظرفیت بین 100uF و 1000uF را روی خط تغذیه قرار دهید تا خروجی منبع تغذیه صاف شود.
  • یک مقاومت 220 یا 470 اهم بین پین خروجی دیجیتال آردوینو و پایه ورودی din ال ای دی ها اضافه کنید تا جریان کشی پایه دیجیتال میکرو را محدود نمایید.
  • سیم های بین آردوینو، منبع تغذیه و ال ای دی را تا حد امکان کوتاه کنید تا افت ولتاژ را به حداقل برسانید.
    اگر نوار شما آسیب دیده و کار نمی کند، بررسی کنید که آیا اولین LED سوخته است یا خیر. اگر چنین است، آن را برش دهید، پین های هدر را دوباره لحیم کنید، و باید دوباره کار کند.
  • در صورتی که یکی از ال ای دی های خط خراب باشد به دلیل اینکه تمام ال ای دی ها سری هستند از آن ال ای دی به بعد تماما ال ای دی ها خاموش خواهند ماند بنابراین باید ال ای دی خراب را پیدا کنید و ان را از داخل نوار برش دهید.

کد

برای راه اندازی WS2812، باید کتابخانه FastLED را دانلود کنید.

نصب کتابخانه

  • برای دانلود کتابخانه FastLED اینجا را کلیک کنید. حالا شما باید یک پوشه .zip در پوشه Downloads خود داشته باشید
  • پوشه .zip را از حالت فشرده خارج کنید و پس از آن باید پوشه FastLED-master را دریافت کنید
  • نام پوشه خود را از FastLED-master به FastLED تغییر دهید
  • پوشه FastLED را به پوشه کتابخانه های نصب Arduino IDE خود منتقل کنید
  • در نهایت، Arduino IDE را دوباره باز کنید

پس از نصب کتابخانه مورد نیاز، کد زیر را در برد آردوینو خود آپلود کنید (این یک نمونه برنامه ارائه شده در پوشه نمونه های کتابخانه است). به 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 را به تعداد LED های نوار LED خود تغییر دهید. در این مثال، نوار LED ما 14 LED طول دارد.

#define NUM_LEDS 14

اگر می خواهید از پین دیگری از آردوینو برای کنترل نوار LED استفاده کنید، باید متغیر LED_PIN را تغییر دهید:

#define LED_PIN 5

نتیجه راه اندازی WS2812

در نهایت، این چیزی است که شما خواهید داشت. افکت های شگفت انگیز مانند این:

راه اندازی WS2812B با آردوینو (به همراه کد و ویدیو پروژه)

و این یکی:

راه اندازی WS2812B با آردوینو (به همراه کد و ویدیو پروژه)

و این یکی:

راه اندازی WS2812B با آردوینو (به همراه کد و ویدیو پروژه)

استفاده از محفظه نوار LED

این نوارهای ال ای دی معمولاً با یک نوار چسب عرضه می شوند تا بتوانید آنها را به هر کجا که می خواهید بچسبانید. مشکل این است که آنها خیلی خوب نمی‌چسبند، بنابراین احتمال دارد که روز بعد نوار ال ای دی خود را روی کف زمین پیدا کنید.

راه حل: من این باکس نوار ال ای دی را پیدا کردم که نور را به خوبی پخش می کند و همچنین اگر می خواهید نوار ال ای دی را به صورت دائمی به جایی متصل کنید می توانید آن را به محل مورد نظرتان پیچ کنید.

راه اندازی WS2812B با آردوینو (به همراه کد و ویدیو پروژه)

جمع بندی

این پست مقدمه ای بر نوار LED آدرس پذیر RGB با آردوینو است. در این پست ما فقط مثال کتابخانه را آزمایش کردیم. شما میتوانید مثال را تغییر دهید تا فقط افکت های مورد نظر شما نمایش داده شود. امیدواریم این پست برای شما مفید بوده باشد.

برای امتیاز به این نوشته کلیک کنید!
[کل: 3 میانگین: 3.7]

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *