Softvérová obsluha farebných RGB LED a diód NeoPixel pre Arduino

Pokračování jarního článku.

Klasické RGB LED diódy majú štyri vývody. V zapojení so spoločnou katódou je na jednom z nich katóda a na zvyšných troch jednotlivé farebné zložky R (red), G (green) a B (blue). Spoločná katóda je najdlhší vývod. Ak je LED dióda zapojená so spoločnou anódou, tak najdlhší vývod je táto spoločná anóda. Ak sa na diódu pozeráte tak, že najdlhší vývod je druhý zľava, tak úplne vľavo je druhý najdlhší vývod a to je R, čiže červená zložka. Vpravo od najdlhšieho vývodu je vývod G, čiže zelená zložka. Tento vývod je rovnako dlhý ako R. Úplne vpravo je najkratší vývod B, čiže modrá zložka.

Nastavením úrovní napätia na jednotlivých farebných zložkách získate výslednú farbu. Pri riadení mikrokontrolérom sa napäťové úrovne nastavujú pomocou PWM, čiže pulzne šírkovej modulácie.  Prúd LED diódou nesmie prekročiť hodnotu udávanú v katalógu, spravidla je to 20 mA na jeden segment, čiže maximálne 60 mA na celú LED diódu.

int red = 11; int green = 10; int blue = 9;

void setup()
{
  pinMode(red, OUTPUT);
  pinMode(green, OUTPUT);
  pinMode(blue, OUTPUT);
}

void RGB_color(int r, int g, int b)
{
  analogWrite(red, r);
  analogWrite(green, g);
  analogWrite(blue, b);
}

void loop()
{
  RGB_color(255, 0, 0); delay(1000);     // Red
  RGB_color(0, 255, 0); delay(1000);     // Green
  RGB_color(0, 0, 255); delay(1000);     // Blue
  RGB_color(255, 255, 255); delay(1000); // White
  RGB_color(0, 0, 0); delay(1000);       // Zhasnute

  RGB_color(0, 255, 255); delay(1000);   // Cyan
  RGB_color(255, 0, 255); delay(1000);   // Magenta
  RGB_color(255, 255, 0); delay(1000);   // Yellow
  RGB_color(0, 0, 0); delay(1000);       // Zhasnute
}

V príkladoch používame vývojovú dosku TotemDuino, ktorá je súčasťou jednej zo zostáv stavebnice Totem. Je 100 % kompatibilná a Arduinom UNO.

NeoPixel

LEDky, alebo pásiky, ktoré sú známe aj pod označením NeoPixel využívajú radič WS2812, ktorý je umiestnený priamo na polovodičovom substráte LED diódy. V prípade konštrukčného riešenia typu pásik, prstenec, prípadne matica diód je tento čip na každej LED dióde. Na pripojenie samostatnej LED NEopixel, pásika, alebo prstenca obsahujúcich viac diód stačia tri vodiče: napájacie napätie, GND, čiže elektrická zem a dátový vodič.

 

Iný konštrukčný formát NeoPixel diód (pohľad zhora a zospodu)

Každá z diód má štyri piny, okrem troch spomínaných signálov má aj výstupný dátový pin, ktorý umožňuje zreťazenie diód. Tento výstup je pripojený na dátový vstup ďalšej diódy. Zreťazené farebné LED diódy môžu tvoriť nielen pásiky, či prstence, ale aj matice znakov, napríklad na veľkoplošnej obrazovke.

Príklad prstenca s ôsmimi diódami

Aby v tom bol čo najväčší zmätok, tak Neopixel diódy sa vyrábajú aj v podobnom konštrukčnom formáte ako RGB LED diódy, Takže si treba dať pozor aké diódy kupujete, či objednávate

Diódy NeoPixel sa napájajú napätím 5 V, niektoré typy fungujú aj na 3.3 V.  Prúdový odber jednotlivých diód je 60 mA, takže podľa počtu diód je potrebné dimenzovať napájací zdroj. Pre 20 diód je potrebný prúd 1.2 A. Pri dlhších LED pásikoch je potrebné priviesť napájanie externým vodičom zhruba každé 1 až 2 metre, inak dochádza k úbytku napätia, čo má za následok skreslenie farieb.

Integrovaný radič WS2812 nastavuje napätie na jednotlivých segmentoch. Na reguláciu napätia využíva PWM. Adresované LED sú v pásikoch, ale aj maticiach spravidla zapojené ako jeden reťazec. Riadiaci signál vstupuje do prvého radiča, ktorý si z dát načíta vlastné nastavenie a replikuje signál do ďalšieho radiča. Údaje sú kódované pomocou dĺžky pulzov.

V prvom príklade budeme v pol sekundových intervaloch nastavovať farby jednej diódy NEOPIXEL v poradí červená, zelená a modrá. Najskôr je potrebné pripojiť knižnicu Adafruit_NeoPixel.h a definovať niekoľko konštánt:

PIN – pin Arduina  ku ktorému máme pripojený dátový signál pre diódu, prípadne diódy NeoPixel

NUM_LEDS – počet zreťazených diód

Následne vytvoríme inštanciu objektu na ovládanie NEOPIXEL diód. Konštruktor vyžaduje parametre počet pixelov, pin dátového signálu a konštantu udávajúcu typ NeoPixel diód. Pre diódy s radičom WS2812 je to konštanta NEO_GRB + NEO_KHZ800. Príkazom pixel.Colors(R,G,B) nastavujeme hodnoty jednotlivých farebných zložiek, ktoré tvoria výslednú farbu.

#include
#define PIN 9         //pin na ovládanid diód Neopixel
#define NUMPIXELS  1  //pocet zretazených diod
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);

void setup()
{
  pixels.begin(); // inicializacia knižnice NeoPixel
}

void loop()
{
  pixels.setPixelColor(0, pixels.Color(150,0,0)); //red
  pixels.show(); delay(500);
  pixels.setPixelColor(0, pixels.Color(0,150,0)); //green
  pixels.show(); delay(500);
  pixels.setPixelColor(0, pixels.Color(0,0,150)); //blue
  pixels.show(); delay(500);
}

V ďalšom príklade zreťazíme dve diódy tak, že výstup prvej z nich bude pripojený na vstup druhej. Parameter NUMPIXELS nastavíme na hodnotu 2. Pre jednoduchosť nebudeme diódami blikať takže hlavná slučka programu bude prázdna. Na prvej dióde nastavíme červenú a na druhej zelenú farbu.

#include
#define PIN 9         //pin na ovládani diód Neopixel
#define NUMPIXELS  2  //pocet zretazených diod
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);

void setup()
{
  pixels.begin(); // inicializacia knižnice NeoPixel.
  pixels.setPixelColor(0, pixels.Color(150,0,0)); //red
  pixels.setPixelColor(1, pixels.Color(0,150,0)); //green
  pixels.show();
}

void loop()
{
}

V ďalšom príklade použijeme prstenec (alebo pásik), ktorý má 8 zreťazených diód NEOPIXEL. Na každej dióde nastavíme inú farbu. Na prvých troch budú základné farby RGB, čiže červená, zelená a modrá. Na štvrtej dióde nastavíme bielu farbu, ktorú dosiahneme ako kombináciu základných zložiek R, G a B.

#include
#define PIN 9         //pin na ovládanid diód Neopixel
#define NUMPIXELS  8  //pocet zretazených diod
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);

void setup()
{
  pixels.begin(); // inicializacia knižnice NeoPixel
  pixels.setPixelColor(0, pixels.Color(150,0,0));     //red
  pixels.setPixelColor(1, pixels.Color(0,150,0));     //green
  pixels.setPixelColor(2, pixels.Color(0,0,150));     //blue
  pixels.setPixelColor(3, pixels.Color(150,150,150)); //white
  pixels.setPixelColor(4, pixels.Color(0,150,150));   //cyan
  pixels.setPixelColor(5, pixels.Color(150,0,150));    //magenta
  pixels.setPixelColor(6, pixels.Color(150,150,0));    //yellow
  pixels.setPixelColor(7, pixels.Color(0,0,255));      //blue

  pixels.show();
}

void loop()
{
}

V pokračovaní ukážeme obsluhu RGB a NeoPixel diód pomocou mikropočítačovej dosky BBC Micro:bit.


Článek je převzat z webu Nextech se souhlasem autora.