W dzisiejszym artykule pokażemy, jak obsłużyć moduły diód RGB z wbudowanymi kontrolerami PWM. Diody te mają oznaczenie WS2812B i są dostępne w naszym sklepie Gotronik: KLIK

W innych sklepach, diody można kupić zarówno pojedyńczo, jak i w taśmach ciętych z metra. Niewątpliwą zaletą omawianych diod jest to, że niezależnie od ich ilości, za komunikację z mikrokontrolerem odpowiada tylko jeden PIN mikrokontrolera, a co za tym idzie, tylko jeden przewód.  Warto wspomnieć, że kolejne moduły można łączyć ze sobą kaskadowo, jeden za drugim.

Za pomocą jednego przewodu, możemy sterować jasnością i kolorem każdej diody pojedynczo. Nie ma znaczenia czy mamy podłączone 1, 10 czy 100 diod.

Teraz chwila z teorią. Aby dioda zaświeciła, mikrokontroler musi wysłać odpowiednią sekwencję bitów do sterownika diod. Jako, iż w jednej diodzie znajduja się trzy kolory, i są one kodowane w zakresie 0-255 czyli 8 bitów, w sumie dla jednej diody należy nadać 3 bajty, czyli 24 bity.  Nota katalogowa mówi :

nota

 

Jeśli chcemy wysłać do sterownika logiczne 0, to najpierw musimy nadać stan wysoki trwający około 0.35uS, następnie stan niski trwający około 0.8uS. Jeżeli chcemy nadać logiczną jedynkę, musimy najpierw wystawić stan wysoki trwający około 0.7uS, następnie stan niski trwający około 0.6uS. Cały okres bitu powinien trwać 1.25uS. Oczywiście, istnieją widełki w których trzeba się mieścić. Instrukcja RET oznacza koniec transmisji bajtu.  Przebieg z oscyloskopu prezentuje się następująco:

Bajt wysłany przez mikrokontroler do sterownika

Bajt wysłany przez mikrokontroler do sterownika

 

 

Na powyższym przebiegu widać bajt, którego wartość wynosi 128. Był on rejestrowany, gdy dioda świeciła na kolor biały, w połowie swojej jasności. Zarówno jasnością, jak i kolorem, steruje się w tym przypadku, jako mieszaniną kolorów R, G oraz B. Ustawiono wartości: 128, 128, 128, czyli wszystkie trzy kolory świeciły na połowę swojej mocy, wynikiem czego jest kolor biały diody.

Moduły diód posiadają 4 wyprowadzenia:

  • VCC – zasilanie (nie wolno przekraczać 5V)
  • DIN – sygnał sterujący
  • DOUT – sygnał sterujący wyjściowy do podpięcia kolejnych modułów
  • GND – masa

Do uruchomienia omawianych modułów, użyjemy bibliotek dostępnych w sieci: light_ws2812.

Biblioteki zawierają trzy pliki:

  • light_ws2812.c
  • light_ws2812.h
  • ws2812_config.h

W pliku ws2812_config.h definiujemy port i pin do którego podłączony jest sterownik diód.  W pliku light_ws2812.h możemy zapoznać się z funkcjami bibliotek.

Poniżej prezentuję kod programu, który zapala 32 diody, zawarte w 3 modułach. Diody są zapalane jedna za drugą, w odstępach czasowych 100ms. Kolejne przejścia zmieniają kolor.

/*
 * diodyrgb.c
 *
 *  Created on: 3 wrz 2015
 *      Author: Serwis
 */


/*
* Light_WS2812 library example - RGB_blinky
*
* cycles one LED through red, green, blue
*
* This example is configured for a ATtiny85 with PLL clock fuse set and
* the WS2812 string connected to PB4.
*/

#include <util/delay.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include "light_ws2812.h"

struct cRGB led[32]; //struktura zdefiniowana w pliku nagłówkowym, tutaj ustalamy tylko ilośc diód
uint8_t i=0; //zmienna sterująca pętli for

int main(void)
{

   while(1)
  {

	       for (i=0; i<33; i++){ 
	led[i].r=50;led[i].g=00;led[i].b=0;    //ustala kolor diód
    ws2812_setleds(led,i);				   //zapala diody
    _delay_ms(100);
    }
    for (i=0; i<33; i++){
    	led[i].r=0;led[i].g=50;led[i].b=0;    
        ws2812_setleds(led,i);
        _delay_ms(100);
        }

    for (i=0; i<33; i++){
    	led[i].r=0;led[i].g=0;led[i].b=50;    
    	        ws2812_setleds(led,i);
    	        _delay_ms(100);
            }
    for (i=0; i<33; i++){
       	led[i].r=50;led[i].g=50;led[i].b=50;    
       	        ws2812_setleds(led,i);
       	        _delay_ms(100);
               }
    for (i=0; i<33; i++){
           	led[i].r=00;led[i].g=00;led[i].b=00;   
               ws2812_setleds(led,i);
               _delay_ms(50);
               }


  }
}

Efektem wykonania powyższego kodu powinna być taka sekwencja:

 

Dodaj komentarz