Blog

Diody LED

Witam ponownie.

Dłuższy czas zastanawiałem się od czego zacząć dywagacje dotyczące Arduino i zestawu Starter Kit. Doszedłem jednak do wniosku, że najlepiej będzie zrobić to tą samą procedurą, którą przeszedłem na uczelni wzbogacając jednak znacznie treści samych artykułów. Na wstępie chciałbym, abyście nie przerazili się tym co za chwilę zobaczycie. Otóż wykonałem za pomocą darmowego edytora Fritzing schemat, który zawiera znaczną większość elementów zakupionego zestawu. Nie znaczy to jednak, że już dziś będziemy je wszystkie obsługiwać! 🙂 Spokojnie. Na początku jak chyba w każdym tutorialu rozpoczniemy przygodę od opanowania podstawowych sposobów sterowania diodami LED w sposób, jaki tylko będziemy chcieli. Przejdźmy do czynu. Poniżej zamieszczam schemat upięcia elementów zestawu:

Schemat

Schemat

Kilka słów wyjaśnienia. W kwestii użytych rezystorów. Do czerwonych diod należy podłączyć rezystory o oporze 220Ohm załączone w paczce. Generalnie w zależności od koloru diód RGB do każdej z nich powinno się stosować opornik o dopasowanej do niej wartości rezystancji. I tak dla diody czerwonej powinno to być ok. 150Ohm dla zielonej – 120Ohm i w końcu dla niebieskiej – 100Ohm. Jako, że oporniki o takiej rezystancji raczej trudno jest dostać w zestawie posiadamy te o nominalnej wartości 220Ohm w związku z tym na wszystkie diody bez względu na kolor oraz buzzer podłączamy właśnie te. Z kolei w kwestii przycisków oraz fotorezystora jest troszkę inaczej. Tu już należy posłużyć się opornikami o oporze 10kOhm. Mam nadzieję, że schemat przeze mnie narysowany jest w miarę przejrzysty. W razie jakichkolwiek niejasności czekam na wasze komentarze.

Oczywiście w miarę kolejnych wpisów będziemy poznawać kolejne elementy oraz sposób ich obsługi, a także na koniec postaramy się połączyć wszystkie te elementy razem. Dziś jednak skupimy się tylko i aż na obsłudze diod LED.

Jak już zapewne zauważyliście diody podpięte są na wyjścia od 3 do 12. Są to wyjścia PWM. Opiszę co to oznacza przy najbliższej okazji. Na razie poprzestańmy na stwierdzeniu, że możemy zapalać i gasić diody. A więc napiszmy program, który sprawi, że nasze diody będą zapalały się pojedynczo w kolejności od lewej do prawej. Następnie gdy zapali się ostatnia dioda sekwencja ta powtórzy się w odwrotnej kolejności. Wyglądać będzie to mniej więcej tak, że najpierw będą się zapalały kolejne diody od lewej do prawej a następnie od prawej do lewej i ponownie od lewej do prawej. Zanim wytłumaczę jak to zrobić przedstawię kod, który realizuje tą operację a następnie wszystko szczegółowo wyjaśnię.

ZOBACZ KOD PROGRAMU

// Wedrujaca Dioda
int i=0;
int n=10;
boolean k=false;
int leds []={3,4,5,6,7,8,9,10,11,12};

void setup()
{
  for ( i; i <n; i++)   
  {     
    pinMode(leds[i], OUTPUT);   
  }      
} 
void loop()  {          
  if (i >= n)
  {
    i=1;
    k=!k;
  }
  if (k)
  {
    digitalWrite(leds[i], HIGH);
    digitalWrite(leds[i-1], LOW);
  }
  else
  {
    digitalWrite(leds[n-i], LOW);
    digitalWrite(leds[n-i-1], HIGH);
  }
  i++;
  delay (250);
}

Począwszy od samej góry. Deklarujemy dwie zmienne i oraz n nadając im wartości. Następnie definiujemy zmienną boolowską ustawiając jej wartość na false czyli logiczne 0. Następnie deklarujemy tablicę dziesięciu pinów, pod które podłączone są wszystkie wyjścia diod na mikrokontrolerze. W sekcji setup korzystając z wcześniej zadeklarowanych zmiennych przy użyciu jednej prostej pętli for “przebiegamy” przez kolejne piny wyjść ustawiając ich stan jako “wyjście”. Wchodząc ostatecznie do pętli loop natrafiamy na pierwszy warunek if. Nim jednak zajmiemy się troszkę później. Przyjrzyjmy się teraz konstrukcji if – else. Komendy występujące w if-ie informują nas, że  zapalmy diodę o indeksie 1 czyli tą z wyjściem 4 jednocześnie gasząc diodę z indeksem o jeden mniejszym. Po wykonanej operacji na końcu programu możecie dostrzec iterację i++. To znaczy, że w kolejnym obiegu pętli zapalamy już diodę o indeksie o jeden większym, czyli w tym przypadku 5. Gasimy natomiast diodę o indeksie 4. Program postępuje tak aż do diody oznaczonej indeksem 10. Kiedy zapali się ostatnia dioda wówczas zostaje spełniony warunek w pierwszym if-ie naszej pętli loop. Przecież i=10 a to z kolei jest równe n! W związku z tym zmienna boolowska staje się prawdziwa i już do if-a nie zostaniemy wpuszczeni. Jedynym miejscem, do którego w danym momencie możemy się dostać jest oczywiście else. Tam to właśnie rozpoczyna się zapalanie diod o indeksie 10 pomniejszanym z każdą iteracją o coraz większą liczbę i gaszenie diody z większym indeksem. Warto zauważyć, że tam gdzie zmieniała się wartość zmiennej boolowskiej istnieje przypisanie i=1. Czyli przy pierwszym obiegu else zmniejszamy indeks o 1 a przy kolejnym już o 2. Tak właśnie uzyskujemy efekt zapalania się diod wstecz aż do momentu kiedy znów nasze i osiągnie wartość nominalną 10 i k ponownie zmieni wartość logiczną. Ot cała magia.

Zdaję sobie sprawę, że wygląda to trochę mętnie. Przede wszystkim dlatego, że do zapalania i gaszenia diod nie użyłem tak sławnej przecież pętli for. Dlaczego? Z 3 bardzo ważnych powodów. Po pierwsze dlatego, że to właśnie pętla loop jest swego rodzaju for-em. Po drugie i najważniejsze dlatego, że użycie pętli for w pętli loop skutkuje tym, że podczas jednego obiegu pętli loop wykona się cała pętla for. W związku z tym w trakcie jednego obiegu loop zapalą się wszystkie diody a w trakcie drugiego zapalą w odwrotnej kolejności. Możecie zapytać co to za różnica? Otóż zasadnicza, ale na tym etapie nie do końca jestem w stanie to wytłumaczyć. Tu przydałaby się znajomość obsługi microswitchy. Powiem jednak tak. Jeżeli w mikrokontrolerze użyjemy pętli for a już co gorsza w tym forze dołożymy delay to na czas wykonywania całego fora nasz mikrokontroler jest wyłączony z obsługi jakichkolwiek innych zdarzeń (oczywiście poza przerwaniami!). Wyobraźmy sobie, że napisaliśmy kod, który zawiera pętlę for wykonującą się w sumie 10 sekund w trakcie jednego obiegu pętli loop. W trakcie tego fora naciskamy przycisk odpowiadający za włączenie alarmu w związku z okradaniem naszego domu. Niestety alarm się nie włączy, ponieważ Arduino będzie zajęte wykonywaniem pętli for! Oto najważniejszy powód, dla którego nie należy tego stosować. Jako trzeci powód podam po prostu fakt, że lepiej od początku wpajać sobie dobre, poprawne nawyki. Gdybyśmy teraz w naszych programach używali pętli for a za kilka lub kilkanaście artykułów powiedziałbym, żeby tego nie robić uznalibyście to za herezję. W związku z tym poświęćmy się trochę analizując trudniejszy z logicznego punktu widzenia kod, ale dużo sprawniejszy w funkcjonowaniu. Takie jest moje zdanie na ten temat.

Pozdrawiam.

  • Data Wpisu Styczeń 13, 2014 - 11:25 pm
  • Utworzył Azura
  • Kategoria
4
Komentarze

Skomentuj



Wszelki prawa zastrzeżone przez CordaSystems