WS2812b RGB led traka

UVOD

Na sve strane govori se o led trakama i danas ih je moguće vidjeti gotovo u svakom ugostiteljskom objektu, kafiću, lounge baru, restoranu, hotelima, itd. Jednostavno izgledaju ugodno oku i zašto ne bi ukrasili i svoj dom na ovaj način, sobu, radni stol, police, stepenište, vama po volji. Upravo intenzitet svjetlosti, pouzdanost, efektivna potrošnja energije led tehnologije i mogućnosti raznoraznih animacija i igre svjetla čine ih tako atraktivnim.

 

 

Karakteristike:
Boja: RGB (crvena/zelena/plava)
Napon: 5V
Snaga: 16W/m (za bijelu boju)
Struja: 3.2A/m (za bijelu boju)
Broj dioda: 60 dioda po metru
Vrsta dioda: WS2812b SMD LED (5050 LED dioda s ugrađenim ICom)
Zaštita: IP20
Dimenzije: 10mm širine, 2mm debljine

KAKO RADI?

Razlog zašto je ova LED traka tako posebna je način na koji ju možemo kontrolirati. WS2812b je ime integriranog upravljačkog čipa koji upravlja RGB ledicama. Ono što vidimo na traci zapravo su 5050 (5.0 x 5.0 mm) kućišta. Unutra se nalazi WS2812b IC te 3 ledice (crvena, zelena i plava). WS2812b IC komunicira na vrlo praktičan jedno-žični način koristeći NZR komunikacijski protokol. Svaki čip ima Din i Dout pin tako da ih je moguće kaskadirati u duže nizove. Traku možemo produžiti na način da Dout pin prethodne ledice spojimo na Din sljedeće, no treba pripaziti na potrošnju struje, jer vrlo lako traka može postati prezahtjevna za mikrokontroler.

via GIPHY

KOMUNIKACIJA

Mikrokontroler neprestano šalje niz „0“ i „1“ na data liniju. WS2812b IC sprema prvih 24 bita, odnosno 3 bajta (po bajt za svaku boju G, R, B) u latch, a ostalo propušta dalje za sljedeći IC i tako redom do zadnjeg piksela. Kada stigne do kraja izvršava se reset kod i sve kreće iz početka.

JOŠ MALO ZANIMLJIVOSTI

- WS2812B čipovi na traci imaju ugrađenu zaštitu od obrnutog polariteta, odnosno ako slučajno zamijenite +5V i GND IC-ovi neće biti uništeni. Međutim, svakako je bolje još jednom pregledati povezivanje.

- Svaki piksel od tri primarne boje (R,G,B) može poprimiti 256 (0-255) razina svjetlosti, što znači 16 777 216 (256^3) različitih boja.

- IC-ovi u sebi imaju ugrađen sklop za konstantnu struju koji osiguravaju najoptimalniju svjetlinu ledica.

POVEZIVANJE

Traku je najbolje napajati preko vanjskog izvora, jer mikrokontroler nema veliku izlaznu snagu, ali pripazite da imate reguliranih 5V. Isti izvor možete iskoristiti i za napajanje Croduina preko pina +5V. Još jednom napomena, i za napajanje trake i Croduina morate imati izvor od 5V, naponi veći od 5.3V mogu oštetiti Croduino ili traku, a naponi manji od 3.5V neće biti dovoljni za ispravan rad.

 

ARDUINO KOD

Za pisanje koda koristit ćemo Adafruit_NeoPixel library. Ako niste sigurni kako instalirati library podsjetite se u tutorialu na linku.
Ledice će se najprije paliti jedna po jedna crvenom bojom, zatim zelenom pa plavom i na kraju bijelom bojom. Nakon toga kreće efekt duginih boja. Svakako isprobajte još zanimljivih animacija koji dolaze uz library kao primjeri.

 

#include "Adafruit_NeoPixel.h"
#ifdef __AVR__
  #include "avr/power.h"
#endif

// Na koji pin Croduina je spojen Data pin led trake
#define PIN 6 

//Prvi broj koji predajemo funkciji označava koliko ledica ima traka
//Promijenite po potrebi(odnosi se na prvi argument)
Adafruit_NeoPixel strip = Adafruit_NeoPixel(60, PIN, NEO_GRB + NEO_KHZ800);  

void setup() {
  strip.begin();
  strip.show();
}

void loop() {
  colorWipe(strip.Color(225, 0, 0), 25); // Crvena
  delay(500);
  colorWipe(strip.Color(0, 225, 0), 25); // Zelena
  delay(500);
  colorWipe(strip.Color(0, 0, 225), 25); // Plava
  delay(500);
  colorWipe(strip.Color(225, 225, 225), 25); // Bijela
  delay(500);
  rainbow(40); //dugine boje
}

// Upali jednu po jednu ledicu nekom bojom
void colorWipe(uint32_t c, uint8_t wait) {
  for(uint16_t i=0; i<strip.numPixels(); i++) {
    strip.setPixelColor(i, c);
    strip.show();
    delay(wait);
  }
}

//funkcija za dugine boje
void rainbow(uint8_t wait) {
  uint16_t i, j;
  for(j=0; j<256*5; j++) {
    for(i=0; i< strip.numPixels(); i++) {
      strip.setPixelColor(i, Wheel(((i * 256 / strip.numPixels()) + j) & 255));
    }
    strip.show();
    delay(wait);
  }
}

uint32_t Wheel(byte WheelPos) {
  WheelPos = 255 - WheelPos;
  if(WheelPos < 85) {
    return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3);
  }
  if(WheelPos < 170) {
    WheelPos -= 85;
    return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3);
  }
  WheelPos -= 170;
  return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
}
Leave a Reply