WS2812B 5V Adreslenebilir Şerit Led Kullanımı, arduino kodları (Arduino Dersleri, 32) Featured

Rate this item
(0 votes)

Bu dersimizde Arduino ile WS2812B 5V Adreslenebilir Şerit led kullanımıyla ilgili temel bir uygulama yapacağız.

Yazacağımız kodlarla WS2812B 5V Adreslenebilir Şerit led kullanarak basit sistem yapacağız.  

Not: WS2812B 5V Adreslenebilir Şerit Ledin bir kaç ledini çalıştıracaksak arduino dan besleyebiliriz. Ancak şerit led kullanıyorsak amacımız bir metre veya daha fazlasını çalıştırmak olacaktır. Bu durumda ise harici bir güç kaynağına ihtiyacımız vardır. 5V ve duruma göre birkaç Amperlik bir güç kaynağı işimizi görecektir. Şerit ledin, metresine, ve metredeki led sayısına göre güç kaynağını hesaplayabiliriz. Hatta kodlarda şerit ledi kullanırken, parlaklık ayarı da bu güce etki etmektedir. Ortalama bir RGB led 60 mA akım çekmektedir. Bir metrede isteğinize göre 30-60-144 led bulunmaktadır.  30*60mA  yaklaşık 2Amper yapmaktadır. Buna göre gerekli olan akımı hesap edebilir ya da güçlü akıma sahip bir güç kaynağıyla çalışabilirsiniz. 5V 10A gibi.

Not2: WS2812B 5V Adreslenebilir Şerit led kullanırken güç kaynağı olarak ne seçmeliyim diye sorabilirsiniz kendi kendinize? Ben bu uygulamada güç kaynağı olarak 5V 2A taşınabilir şarj cihazını kullandım. (Dilerseniz bu videoya bakabilirsiniz) https://youtu.be/TqDxBJFcFRQ?t=222 Bir USB şarj kablosunu keserek taşınabilir şarj aletinden şerit lede güç verdim. Kablonun içindeki kırmızı kabloyu ve siyah kabloyu kullanıyoruz sadece(Kırmızı güç, siyah GND). Burada ortak GND olmasını unutmayalım. Yani harici güç kaynağıyla, arduinonun güç kaynağının GND'lerini birbirine bağlamamız gerekmektedir, aksi halde çalışmaz projemiz.

 

Gerekli Malzemeler

1 adet Arduino Uno R3
1 adet breadboard
1 adet WS2812B 5V Adreslenebilir Şerit led
1 adet 5V 2A güç kaynağı (taşınabilir şarj aleti)
1 adet direnç (330R)
6 adet jumper kablo (6EE)

WS2812B 5V Adreslenebilir Şerit led nedir?

Adreslenebilir şerit leddeki ledlerin her birini ayrı ayrı kontrol edebiliriz. Böylelikle farklı ve oldukça renkli animasyonlar elde edebiliriz.  WS2812B  şerit ledlerin metre başına led sayısı (30-60-144), led bandı rengi (siyah-beyaz), kaplamasına göre (su geçirmeyen) çeşitleri vardır. Siz projenize ve bütçenize göre en uygununu alabilirsiniz. Elbette metre başına led miktarı arttıkça daha güzel bir görüntü çıkıyor ortaya, ancak daha fazla akım çekeceğini de unutmayalım ve aradaki ciddi fiyat farkını da.  1metre veya 5 metre olarak satılan ledleri dilediğimiz bağlantı noktalarından keserek ayrı ayrı da kullanabiliriz.
Şerit lede güç verme konusu önemlidir. Amperi yüksek bir güç kaynağı kullanmalısınız. 5V 2Alık bir güç kaynağı metrede 30 led bulunan bir WS2812B 5V Adreslenebilir Şerit led için uygundur. Ancak 5 metrelik bir led için daha çok akım verebilen bir güç kaynağına ihtiyacımız vardır. 5v 10A gibi.
Bazı kaynak gücün şerit lede zarar vermesini engellemek için bir kapasitör kullanılmasını gerektiğini vurguluyor. Aynı şekilde ledin ortaki sinyal kablosuyla arduino arasına 2220-330 veya 470 ohmluk bir direnç takılması da öneriliyor.
Fastled ve Adafruit Neopixel kütüphanelerinde güzel örnekler var. Biz de bu uygulamamızda bu kütüphanelerden birini kullanacağız.
WS2812b Adreslenebilir Şerit Led ile WS2813 Adreslenebilir Şerit Led arasındaki farklılıkları merak ediyorsanız bu videoyu izleyebilirsiniz.   Benim dikkatimi çeken tek nokta WS2813'te aradaki bir led zarar görse de animasyon bozulmadan devam ediyor. Ancak WS2812B modelinde ortada bir led bozulduğunda, sonraki ledlere güç gitmediği için çalışmayacaktır. Ortadaki bozuk ledi kesip, gerekli işlemi yaparsak çalışır elbet.

Bu adreste WS2812 B şerit ledlerle ilgili ayrıntılı ve güzel bilgiler yer almaktadır. Dilerseniz göz atabilirsiniz.

 

WS2812B 5V Adreslenebilir Şerit led Devresi

Devre için arduino ve şerit led için ayrı ayrı güç kaynağı kullandım. Dilerseniz tek bir güç kaynağından arduinoyu da besleyebilirsiniz. Ancak Arduino'dan fazla miktardaki şerit ledi beslemeyin aksi halde arduinoyaya zarar verirsiniz. Arduino'nun verebileceği 400mA olduğunu bilelim.
Devremizde kırmızı kablo 5V, beyaz kablo GND ve yeşil yani ortadaki kablo ise dijital sinyallerden herhangi birine takılacaktır.

 

Aşağıdaki videoda AdaFruit Neopixel kütüphanesinin/ Standtest  ile RGBWstandtest örnekleri ile
FastLed Kütüphaneisnin / ColorPalette   ve ColorTemperature örnekleri kullanılmıştır.

 

 

WS2812B 5V Adreslenebilir Şerit led kodları

Kütüphanedeki örnek kodlardan açarak, gerekli değişiklikleri yapalım ve çalıştıralım.
Adafruit Neopixel ve Fastled Kütüphanelerinde örnek uygulamalar mevcuttur. Bu kütüphaneleri indirip, aşağıdaki ayarları yaparak kullanınız.
Dosya / Örnekler / Adafruit Neopixel /  kısmından strandTest isimli örneği çalıştırabilirsiniz.
Not: Devreyi kurarken şerit ledimizin ortadaki sinyal kablosunu 3 numaraya taktığımız için
#define LED_PIN    3   şeklinde değiştiriyoruz.
Hemen altında yer alan led sayısını ise kaç led ile kullanacaksanız onu yazıyoruz.
#define LED_COUNT 60
Son olarak ledin parlaklığını ayarlamak için aşağıdaki satırda yer alan sayıya 0-255 arasında değer veriyoruz.
strip.setBrightness(50); 

 

 

// A basic everyday NeoPixel strip test program.

// NEOPIXEL BEST PRACTICES for most reliable operation:
// - Add 1000 uF CAPACITOR between NeoPixel strip's + and - connections.
// - MINIMIZE WIRING LENGTH between microcontroller board and first pixel.
// - NeoPixel strip's DATA-IN should pass through a 300-500 OHM RESISTOR.
// - AVOID connecting NeoPixels on a LIVE CIRCUIT. If you must, ALWAYS
//   connect GROUND (-) first, then +, then data.
// - When using a 3.3V microcontroller with a 5V-powered NeoPixel strip,
//   a LOGIC-LEVEL CONVERTER on the data line is STRONGLY RECOMMENDED.
// (Skipping these may work OK on your workbench but can fail in the field)

#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
 #include <avr/power.h> // Required for 16 MHz Adafruit Trinket
#endif

// Which pin on the Arduino is connected to the NeoPixels?
// On a Trinket or Gemma we suggest changing this to 1:
#define LED_PIN    3

// How many NeoPixels are attached to the Arduino?
#define LED_COUNT 60

// Declare our NeoPixel strip object:
Adafruit_NeoPixel strip(LED_COUNT, LED_PIN, NEO_GRB + NEO_KHZ800);
// Argument 1 = Number of pixels in NeoPixel strip
// Argument 2 = Arduino pin number (most are valid)
// Argument 3 = Pixel type flags, add together as needed:
//   NEO_KHZ800  800 KHz bitstream (most NeoPixel products w/WS2812 LEDs)
//   NEO_KHZ400  400 KHz (classic 'v1' (not v2) FLORA pixels, WS2811 drivers)
//   NEO_GRB     Pixels are wired for GRB bitstream (most NeoPixel products)
//   NEO_RGB     Pixels are wired for RGB bitstream (v1 FLORA pixels, not v2)
//   NEO_RGBW    Pixels are wired for RGBW bitstream (NeoPixel RGBW products)


// setup() function -- runs once at startup --------------------------------

void setup() {
  // These lines are specifically to support the Adafruit Trinket 5V 16 MHz.
  // Any other board, you can remove this part (but no harm leaving it):
#if defined(__AVR_ATtiny85__) && (F_CPU == 16000000)
  clock_prescale_set(clock_div_1);
#endif
  // END of Trinket-specific code.

  strip.begin();           // INITIALIZE NeoPixel strip object (REQUIRED)
  strip.show();            // Turn OFF all pixels ASAP
  strip.setBrightness(50); // Set BRIGHTNESS to about 1/5 (max = 255)
}


// loop() function -- runs repeatedly as long as board is on ---------------

void loop() {
  // Fill along the length of the strip in various colors...
  colorWipe(strip.Color(255,   0,   0), 50); // Red
  colorWipe(strip.Color(  0, 255,   0), 50); // Green
  colorWipe(strip.Color(  0,   0, 255), 50); // Blue

  // Do a theater marquee effect in various colors...
  theaterChase(strip.Color(127, 127, 127), 50); // White, half brightness
  theaterChase(strip.Color(127,   0,   0), 50); // Red, half brightness
  theaterChase(strip.Color(  0,   0, 127), 50); // Blue, half brightness

  rainbow(10);             // Flowing rainbow cycle along the whole strip
  theaterChaseRainbow(50); // Rainbow-enhanced theaterChase variant
}


// Some functions of our own for creating animated effects -----------------

// Fill strip pixels one after another with a color. Strip is NOT cleared
// first; anything there will be covered pixel by pixel. Pass in color
// (as a single 'packed' 32-bit value, which you can get by calling
// strip.Color(red, green, blue) as shown in the loop() function above),
// and a delay time (in milliseconds) between pixels.
void colorWipe(uint32_t color, int wait) {
  for(int i=0; i<strip.numPixels(); i++) { // For each pixel in strip...
    strip.setPixelColor(i, color);         //  Set pixel's color (in RAM)
    strip.show();                          //  Update strip to match
    delay(wait);                           //  Pause for a moment
  }
}

// Theater-marquee-style chasing lights. Pass in a color (32-bit value,
// a la strip.Color(r,g,b) as mentioned above), and a delay time (in ms)
// between frames.
void theaterChase(uint32_t color, int wait) {
  for(int a=0; a<10; a++) {  // Repeat 10 times...
    for(int b=0; b<3; b++) { //  'b' counts from 0 to 2...
      strip.clear();         //   Set all pixels in RAM to 0 (off)
      // 'c' counts up from 'b' to end of strip in steps of 3...
      for(int c=b; c<strip.numPixels(); c += 3) {
        strip.setPixelColor(c, color); // Set pixel 'c' to value 'color'
      }
      strip.show(); // Update strip with new contents
      delay(wait);  // Pause for a moment
    }
  }
}

// Rainbow cycle along whole strip. Pass delay time (in ms) between frames.
void rainbow(int wait) {
  // Hue of first pixel runs 5 complete loops through the color wheel.
  // Color wheel has a range of 65536 but it's OK if we roll over, so
  // just count from 0 to 5*65536. Adding 256 to firstPixelHue each time
  // means we'll make 5*65536/256 = 1280 passes through this outer loop:
  for(long firstPixelHue = 0; firstPixelHue < 5*65536; firstPixelHue += 256) {
    for(int i=0; i<strip.numPixels(); i++) { // For each pixel in strip...
      // Offset pixel hue by an amount to make one full revolution of the
      // color wheel (range of 65536) along the length of the strip
      // (strip.numPixels() steps):
      int pixelHue = firstPixelHue + (i * 65536L / strip.numPixels());
      // strip.ColorHSV() can take 1 or 3 arguments: a hue (0 to 65535) or
      // optionally add saturation and value (brightness) (each 0 to 255).
      // Here we're using just the single-argument hue variant. The result
      // is passed through strip.gamma32() to provide 'truer' colors
      // before assigning to each pixel:
      strip.setPixelColor(i, strip.gamma32(strip.ColorHSV(pixelHue)));
    }
    strip.show(); // Update strip with new contents
    delay(wait);  // Pause for a moment
  }
}

// Rainbow-enhanced theater marquee. Pass delay time (in ms) between frames.
void theaterChaseRainbow(int wait) {
  int firstPixelHue = 0;     // First pixel starts at red (hue 0)
  for(int a=0; a<30; a++) {  // Repeat 30 times...
    for(int b=0; b<3; b++) { //  'b' counts from 0 to 2...
      strip.clear();         //   Set all pixels in RAM to 0 (off)
      // 'c' counts up from 'b' to end of strip in increments of 3...
      for(int c=b; c<strip.numPixels(); c += 3) {
        // hue of pixel 'c' is offset by an amount to make one full
        // revolution of the color wheel (range 65536) along the length
        // of the strip (strip.numPixels() steps):
        int      hue   = firstPixelHue + c * 65536L / strip.numPixels();
        uint32_t color = strip.gamma32(strip.ColorHSV(hue)); // hue -> RGB
        strip.setPixelColor(c, color); // Set pixel 'c' to value 'color'
      }
      strip.show();                // Update strip with new contents
      delay(wait);                 // Pause for a moment
      firstPixelHue += 65536 / 90; // One cycle of color wheel over 90 frames
    }
  }
}

 

CTRL Bizde

Kendi halinde bir kaç kişiyiz,. Karşılaştığımız sorunları çözmek için bazen "çok zaman" harcadığımızı fark edip

devamı

Yeni Eklenenler