Serwis Edukacyjny
w I-LO w Tarnowie
obrazek

Materiały dla uczniów liceum

  Wyjście       Spis treści       Wstecz       Dalej  

obrazek

Autor artykułu: mgr Jerzy Wałaszek
Konsultacje: Wojciech Grodowski, mgr inż. Janusz Wałaszek

©2021 mgr Jerzy Wałaszek
I LO w Tarnowie

obrazek

Warsztat

Kurs Digispark

DS004

SPIS TREŚCI
Podrozdziały

Dioda RGB

Oprócz diod LED świecących jednym kolorem produkowane są diody wielokolorowe, zwane diodami RGB (ang. Red = Czerwony, Green = Zielony, Blue = Niebieski). Nazwa RGB pochodzi od tzw. barw podstawowych, których mieszanina tworzy różne kolory. Technika mieszania barw podstawowych: czerwonej, zielonej i niebieskiej stosowana jest powszechnie w kolorowych wyświetlaczach telewizorów, telefonów, itp.

Dioda RGB składa się z trzech diod LED umieszczonych w jednej obudowie:

obrazek
LED RGB 5mm
obrazek
LED RGB SMD
obrazek
LED RGB SMD

Na zewnątrz wyprowadzona jest wspólna katoda oraz anody poszczególnych diod (uwaga, możliwe jest również połączenie odwrotne, tzn. wspólna anoda i osobne katody, w diodach SMD wyprowadzane mogą być osobno katody i anody diod – informacji szukaj u producenta lub użyj multimetru do sprawdzenia wyprowadzeń):

obrazek

Oprócz diod RGB produkowane są diody RG (ang. red, green), które w jednej obudowie zawierają diody LED czerwoną i zieloną (czasem spotyka się również inne zestawy). Na zewnątrz wyprowadzona jest wspólna katoda (lub anoda) oraz anody (katody) diod:

obrazek

Przez regulację strumienia świetlnego diod uzyskuje się różne barwy pośrednie:

obrazek
dioda RGB
obrazek
dioda RG

Jasność świecenia poszczególnych diod LED będziemy regulować szerokością impulsów zasilających te diody, czyli tzw. trybem PWM. Tryb ten można uzyskać programowo na każdym wyjściu mikrokontrolera. Istnieje również możliwość sprzętowej regulacji PWM na portach P0, P1 i P4.

Przypomnijmy, tryb PWM (ang. Pulse Width Modulation = Modulacja Szerokości Impulsu) polega na tym, iż mikrokontroler generuje ciąg impulsów, których czas trwania (czyli szerokość) można zmieniać od 0% do 100% okresu:

obrazek

Impulsy muszą być generowane z odpowiednio dużą częstotliwością, inaczej oko odbierze to jako mruganie. Im impuls szerszy, tym dłużej świeci dioda i oko odbiera to jako jaśniejsze światło (więcej energii dociera do receptorów oka).

Diody ze wspólną anodą i wspólną katodą różnią się sposobem sterowania:

obrazek

Przy wspólnej katodzie diody LED są zaświecane stanem wysokim, przy wspólnej anodzie diody LED są zaświecane stanem niskim.

W projekcie płytki zastosuję diody o wspólnej anodzie. Dlaczego akurat takie? Ponieważ mam ich większą ilość i muszę je jakoś wykorzystać. To chyba dobry powód.

Na początek:  podrozdziału   strony 

Płytka DS004

Płytkę wykonamy w dwóch wersjach: A i B. W wersji A będzie użyta dioda RGB, a w wersji B dioda RG.

Schemat ideowy płytki DS004

obrazek
DS004A
  obrazek
DS004B

Wersja na płytce stykowej

obrazek

DS004_A, wersja THT

obrazek   obrazek
Elementy Ilość Uwagi
Dioda LED 1 RGB ze wspólną anodą
Opornik 220Ω 3 0,25W
Przycisk TACT 2  
Goldpiny męskie długie 1x3 1  
Goldpiny męskie 1x5 1  

Pliki do pobrania

ds004_tht_a.sch : schemat ideowy w Eagle
ds004_tht_a.brd : projekt płytki drukowanej w Eagle
ds004_tht_aa.png : obrazek z widokiem elementów na płytce
ds004_tht_ab.png : obrazek spodu płytki
ds004.svg : plik Inkscape do wydruku na drukarce laserowej

obrazek

DS004_A, wersja SMT

obrazek

  obrazek

Uwaga: Na schemacie i na płytce drukowanej zamienione są katody diod zielonej z niebieską, ponieważ takie diody RGB miałem do dyspozycji. Sprawdź swoją diodę RGB miernikiem i w razie konieczności popraw schemat oraz projekt PCB.

Elementy Ilość Uwagi
Dioda LED 1 RGB ze wspólną anodą
Opornik 220Ω 3 0805
Przycisk TACT 2  
Goldpiny męskie długie 1x3 1  
Goldpiny męskie 1x5 1  

Pliki do pobrania

ds004_smt_a.sch : schemat ideowy w Eagle
ds004_smt_a.brd : projekt płytki drukowanej w Eagle
ds004_smt_aa.png : obrazek z widokiem elementów na płytce
ds004_smt_at.png : obrazek góry płytki
ds004.svg : plik Inkscape do wydruku na drukarce laserowej

DS004_B, wersja THT

obrazek obrazek
Elementy Ilość Uwagi
Dioda LED 1 RG ze wspólną anodą
Opornik 220Ω 2 0,25W
Przycisk TACT 2  
Goldpiny męskie długie 1x3 1  
Goldpiny męskie 1x5 1  

Pliki do pobrania

ds004_tht_b.sch : schemat ideowy w Eagle
ds004_tht_b.brd : projekt płytki drukowanej w Eagle
ds004_tht_ba.png : obrazek z widokiem elementów na płytce
ds004_tht_bb.png : obrazek spodu płytki
ds004.svg : plik Inkscape do wydruku na drukarce laserowej

obrazek

Na początek:  podrozdziału   strony 

Programowanie DS004

Dioda RGB na płytce DS004 koliduje z transmisją USB. Digispark jest bardzo oszczędnym projektem, co niestety wpływa na parametry użytkowe. Przy programowaniu z Arduino IDE musisz odłączać płytkę od modułu Digispark, inaczej nie nawiąże on komunikacji z komputerem PC poprzez USB.

Test

Pierwszy program testuje wykonanie płytki. Kolory są włączane stanem niskim na wyjściu portu, a stan wysoki wyłącza kolor. Przyporządkowanie kolorów do portów jest następujące:

Program włącza kolejno kolory czerwony, zielony, niebieski na około 1 sekundę.

// RGB
// Test
// (C)2019 mgr Jerzy Wałaszek
//---------------------------

// Konfigurujemy mikrokontroler
//-----------------------------
#define DG 0  // Dioda zielona
#define DB 1  // Dioda niebieska
#define DR 4  // Dioda czerwona

void setup()
{
  // Ustawiamy porty diody RGB jako wyjścia
  pinMode(DR,OUTPUT);
  pinMode(DG,OUTPUT);
  pinMode(DB,OUTPUT);
  // Gasimy RGB
  digitalWrite(DR,1);
  digitalWrite(DG,1);
  digitalWrite(DB,1);
}

// Pętla główna
//-------------
void loop()
{
 digitalWrite(DR,0); // Zapalamy diodę czerwoną
 delay(1000);
 digitalWrite(DR,1); // Gasimy diodę czerwoną
 digitalWrite(DG,0); // Zapalamy diodę zieloną
 delay(1000);
 digitalWrite(DG,1); // Gasimy diodę zieloną
 digitalWrite(DB,0); // Zapalamy diodę niebieską
 delay(1000);
 digitalWrite(DB,1); // Gasimy diodę niebieską
}

Programem tym możesz również testować płytkę DS004B. Ponieważ nie ma na niej koloru niebieskiego, dioda RG gaśnie po kolorze zielonym na 1 sekundę.

Kojak

Ten program symuluje światła radiowozów policyjnych przez szybkie mruganie kolorem czerwonym i niebieskim.

// RGB
// Kojak
// (C)2019 mgr Jerzy Wałaszek
//---------------------------

// Konfigurujemy mikrokontroler
//-----------------------------
#define DG 0  // Dioda zielona
#define DB 1  // Dioda niebieska
#define DR 4  // Dioda czerwona

// Zaświeca wybrany kolor na 0,05s, po czym gasi go i czeka 0,15s.
void flash(char c)
{
  digitalWrite(c,0);
  delay(50);
  digitalWrite(c,1);
  delay(150);
}
void setup()
{
  // Ustawiamy porty diody RGB jako wyjścia
  pinMode(DR,OUTPUT);
  pinMode(DG,OUTPUT);
  pinMode(DB,OUTPUT);
  // Gasimy RGB
  digitalWrite(DR,1);
  digitalWrite(DG,1);
  digitalWrite(DB,1);
}

// Pętla główna
//-------------
void loop()
{
 char i;
 for(i = 0; i < 3; i++) flash(DR);
 for(i = 0; i < 3; i++) flash(DB);
}

Tęcza 1

Kolejny program steruje diodą RGB w ten sposób, iż kolejno są wyświetlane kolory:

czerwony
żółty
zielony
biały
jasno-niebieski
niebieski
fioletowy
czarny (brak świecenia)
// RGB
// Tęcza 1
// (C)2019 mgr Jerzy Wałaszek
//---------------------------

// Konfigurujemy mikrokontroler
//-----------------------------
#define DG 0  // Dioda zielona
#define DB 1  // Dioda niebieska
#define DR 4  // Dioda czerwona

void setup()
{
  // Ustawiamy porty diody RGB jako wyjścia
  pinMode(DR,OUTPUT);
  pinMode(DG,OUTPUT);
  pinMode(DB,OUTPUT);
  // Gasimy RGB
  digitalWrite(DR,1);
  digitalWrite(DG,1);
  digitalWrite(DB,1);
}

// Tablica kolorów
//                  R G B
char ctab[8][3] = {{0,1,1}, // Czerwony        - R..
                   {0,0,1}, // Żółty           - RG.
                   {1,0,1}, // Zielony         - .G.
                   {0,0,0}, // Biały           - RGB
                   {1,0,0}, // Jasno-niebieski - .GB
                   {1,1,0}, // Niebieski       - ..B
                   {0,1,0}, // Fioletowy       - R.B
                   {1,1,1}};// Czarny          - ...
// Pętla główna
//-------------
void loop()
{
 char i;
 for(i = 0; i < 8; i++)
 {
   digitalWrite(DR,ctab[i][0]); // Zapalamy/gasimy składnik czerwony
   digitalWrite(DG,ctab[i][1]); // Zapalamy/gasimy składnik zielony
   digitalWrite(DB,ctab[i][2]); // Zapalamy/gasimy składnik niebieski
   delay(1000);
 }
}

Tęcza 2

W tym programie wykorzystane zostały tryby PWM. Na wyjścia P0, P1 i P4 przesyłamy ciąg impulsów o różnych szerokościach, regulując w ten sposób jasność barw składowych.

// RGB
// Tęcza 2
// (C)2019 mgr Jerzy Wałaszek
//---------------------------

// Konfigurujemy mikrokontroler
//-----------------------------
#define DG 0  // Dioda zielona
#define DB 1  // Dioda niebieska
#define DR 4  // Dioda czerwona

void setup()
{
  // Ustawiamy porty diody RGB jako wyjścia
  pinMode(DR,OUTPUT);
  pinMode(DG,OUTPUT);
  pinMode(DB,OUTPUT);
  // Gasimy RGB
  digitalWrite(DR,1);
  digitalWrite(DG,1);
  digitalWrite(DB,1);
}

// Pętla główna
//-------------
int cr = 128, dr = -1;
int cg = 80,  dg =  1;
int cb = 255, db = -3;

void loop()
{
  if(cr + dr > 255)
  {
     cr = 255; dr = - dr;
  }
  else if(cr + dr < 0)
  {
     cr = 0; dr = - dr;
  }
  else cr += dr;

  if(cg + dg > 255)
  {
     cg = 255; dg = - dg;
  }
  else if(cg + dg < 0)
  {
     cg = 0; dg = - dg;
  }
  else cg += dg;

  if(cb + db > 255)
  {
     cb = 255; db = - db;
  }
  else if(cb + db < 0)
  {
     cb = 0; db = - dr;
  }
  else cb += db;

  analogWrite(DR,cr);
  analogWrite(DG,cg);
  analogWrite(DB,cb);

  delay(25);
}

Poruszaj płytką szybko tam i z powrotem – zobaczysz, że poszczególne składowe RGB świecą z przerwami.

Aurora

Ten program działa podobnie do poprzedniego, lecz wykorzystuje generator liczb pseudolosowych. Kolor docelowy jest losowany, a następnie w 255 krokach następuje przejście z bieżącego koloru do koloru wylosowanego, po czym losowany jest kolejny kolor. W programie wykorzystujemy liczby zmiennoprzecinkowe, aby uzyskać płynne przejścia kolorów.

// RGB
// Aurora
// (C)2019 mgr Jerzy Wałaszek
//---------------------------

// Konfigurujemy mikrokontroler
//-----------------------------
#define DG 0  // Dioda zielona
#define DB 1  // Dioda niebieska
#define DR 4  // Dioda czerwona

// Zmienne globalne
float red, dr;
float green, dg;
float blue, db;
int i;

void setup()
{
  // Ustawiamy porty diody RGB jako wyjścia
  pinMode(DR,OUTPUT);
  pinMode(DG,OUTPUT);
  pinMode(DB,OUTPUT);
  // Gasimy RGB
  digitalWrite(DR,1);
  digitalWrite(DG,1);
  digitalWrite(DB,1);
  red = green = blue = 255;
  i = 256;
  pinMode(3, INPUT);
  randomSeed(analogRead(3));
}

// Pętla główna
//-------------

void loop()
{
  if(i == 256)
  {
    i = 0;
    int Red = random(256);
    int Green = random(256);
    int Blue = random(256);
    dr = (Red - red) / 255.0;
    dg = (Green - green) / 255.0;
    db = (Blue - blue) / 255.0;
  }
  else
  {
    i++;
    analogWrite(DR,red);
    analogWrite(DG,green);
    analogWrite(DB,blue);
    red += dr;
    green += dg;
    blue += db;
    if(red > 255)   red = 255;
    if(red < 0)     red = 0;
    if(green > 255) green = 255;
    if(green < 0)   green = 0;
    if(blue > 255)  blue = 255;
    if(blue < 0)    blue = 0;
    delay(10);
  }
}

Kolory podstawowe

Sam rozgryź zasadę działania tego programu

// RGB
// Kolory podstawowe
// (C)2019 mgr Jerzy Wałaszek
//---------------------------

// Konfigurujemy mikrokontroler
//-----------------------------
#define DG 0  // Dioda zielona
#define DB 1  // Dioda niebieska
#define DR 4  // Dioda czerwona

// Zmienne globalne
float red, dr;
float green, dg;
float blue, db;
int i;

void setup()
{
  // Ustawiamy porty diody RGB jako wyjścia
  pinMode(DR,OUTPUT);
  pinMode(DG,OUTPUT);
  pinMode(DB,OUTPUT);
  // Gasimy RGB
  digitalWrite(DR,1);
  digitalWrite(DG,1);
  digitalWrite(DB,1);
  red = green = blue = 255;
  i = 256;
  pinMode(3, INPUT);
  randomSeed(analogRead(3));
}

// Pętla główna
//-------------

void loop()
{
  if(i == 256)
  {
    i = 0;
    int rr,gg,bb;
    switch(random(5))
    {
      case 0: rr = random(256);
              gg = 255;
              bb = 255;
              break;
      case 1: gg = random(256);
              bb = 255;
              rr = 255;
              break;
      case 2: bb = random(256);
              rr = 255;
              gg = 255;
              break;
      case 3: rr = 0;
              gg = 0;
              bb = 0;
              break;
      case 4: rr = 255;
              gg = 255;
              bb = 255;
              break;
    }
    dr = (rr - red) / 256.0;
    dg = (gg - green) / 256.0;
    db = (bb - blue) / 256.0;
  }
  else
  {
    i++;
    analogWrite(DR,red);
    analogWrite(DG,green);
    analogWrite(DB,blue);
    red += dr;
    green += dg;
    blue += db;
    if(red > 255) red = 255;
    if(red < 0)   red = 0;
    if(green > 255) green = 255;
    if(green < 0)   green = 0;
    if(blue > 255) blue = 255;
    if(blue < 0)   blue = 0;
    delay(10);
  }
}

Ćwiczenia

Napisz program, który wykorzystuje przyciski na płytce SB004 do sterowania zmianą koloru świecenia diody RGB.

Napisz program, który losowo zmienia kolory RGB, natomiast przyciski regulują jasność świecenia barw składowych.

Na początek:  podrozdziału   strony 

Zespół Przedmiotowy
Chemii-Fizyki-Informatyki

w I Liceum Ogólnokształcącym
im. Kazimierza Brodzińskiego
w Tarnowie
ul. Piłsudskiego 4
©2021 mgr Jerzy Wałaszek

Materiały tylko do użytku dydaktycznego. Ich kopiowanie i powielanie jest dozwolone
pod warunkiem podania źródła oraz niepobierania za to pieniędzy.

Pytania proszę przesyłać na adres email: i-lo@eduinf.waw.pl

Serwis wykorzystuje pliki cookies. Jeśli nie chcesz ich otrzymywać, zablokuj je w swojej przeglądarce.

Informacje dodatkowe.