Tym artykułem chciałbym rozpocząć krótki cykl o aplikacji webowej 123D Circuits, a dokładniej to symulacji działania arduino w połączeniu z różnymi układami. W tej części opiszę jak sterować diodą LED, oraz diodą RGB, do sterowania będą wykorzystywane proste przełączniki, jak i potencjometry.
Dioda LED
Jako pierwszy przykład pójdzie klasyczne elektroniczne „Hello World”, czyli migająca dioda. Do tego celu potrzebujemy w symulatorze płyty Arduino Uno, diody led i rezystora.
Następnie wchodzimy w zakładkę Code Editor
Gdzie należy wkleić poniższy kod programu:
int led = 11; void setup() { pinMode(led, OUTPUT); } void loop() { digitalWrite(led, HIGH); delay(1000); digitalWrite(led, LOW); delay(1000); }
Pierwsza linia to wpisanie do zmiennej „led” wartości ozaczającej numer pinu sterującego diodą. Następnie jest funkcja setup() w której ustawiamy pin 11(led) na wyjście (output). W funkcji loop() która jest wykonywana już do końca działania mikrokontrolera na przemian załączamy diodę lub wyłączamy w odstępach 1000ms (1s).
Kiedy już mamy wpisany nasz prosty program możemy przejść do symulacji. Klikamy przycisk Upload & Run znajdujący się powyżej edytora kodów.
Nastąpi automatyczne podłączenie modułu arduino do usb i wystartuje nasz program, a dioda będzie zapalała się i gasiła w odstępach 1s.
Dioda LED i PWM
Kiedy mamy już diodę migającą na zasadzie załącz-wyłącz, można przejść do kontroli jasności świecenia. Do tego celu wykorzystamy PWM (modulacja szerokością impulsu). Dla lepszego zaobserwowania działania dołączę do obwodu oscyloskop.
Musimy oczywiście zmienić kod programu. Przyjmijmy, że program ma stopniowo zapalać diodę coraz bardziej, a później ją gasić. Więc będziemy potrzebować taki kod:
int led = 11; int a = 0; int b = 50; void setup() { pinMode(led, OUTPUT); } void loop() { analogWrite(led, a); delay(200); a += b; if(a > 255) { a = 200; b = b*(-1); } }
Tym razem potrzebujemy dwie zmienne pomocnicze a i b.
- a – przechowuje wartość PWM
- b – przechowuje o jaką wartość ma nastąpić zmiana zmiennej a
Funkcja setup() zostaje bez zmian, a w funkcji loop() ustawiamy wartość PWN pinu led, do tego używany funkcji analogWrite(), następnie czekamy 200ms i zwiększamy a o wartość zmiennej b. Kiedy a przekroczy wartość 255 to wpisujemy do zmiennej a 200, a b mnożymy razy -1, odwracając znak.
Dioda nadal będzie migać, ale w stopniowy sposób, będzie pomału się zapalać i pomału gasnąć.
Program zachowuje się według przewidywań, a na oscyloskopie można zaobserwować zmieniający się czas trwania impulsów. Im czas impulsu dłuższy względem czasu wartości zera tym dioda świeci jaśniej, ponieważ ma dostarczoną większą energię.
Dioda LED RGB i obsługa wejścia
Dioda RGB zawiera z sobie trzy diody LED o kolorach czerwony (red), zielony (green), oraz niebieski (blue). Te trzy wbudowane diody posiadają wspólną katodę, dzięki czemu minimalizuje się liczba połączeń. Jako przełączniki najlepiej w tym przypadku zastosować dipswitche, które są po prostu przełącznikami bistabilnymi (są stabilne w obydwóch stanach). Oczywiście wejścia kontrolera należy podciągnąć do plusa, a drugie wyjście przełączników podpiąć do masy. W takiej konfiguracji na wejściu będzie plus napięcia zasilania w jednej pozycji przełącznika, a w drugiej będzie minus.
W programie nie będzie nic skomplikowanego, kiedy przełącznik damy do góry, to zapali się odpowiadająca mu dioda LED.
int ledR = 11; int ledG = 6; int ledB = 10; int sR = 7; int sG = 4; int sB = 2; void setup() { pinMode(ledR, OUTPUT); pinMode(ledG, OUTPUT); pinMode(ledB, OUTPUT); pinMode(sR, INPUT); pinMode(sG, INPUT); pinMode(sB, INPUT); } void loop() { if(digitalRead(sR) == LOW) digitalWrite(ledR, HIGH); else digitalWrite(ledR, LOW); if(digitalRead(sG) == LOW) digitalWrite(ledG, HIGH); else digitalWrite(ledG, LOW); if(digitalRead(sB) == LOW) digitalWrite(ledB, HIGH); else digitalWrite(ledB, LOW); }
Tym razem musimy zdefiniować w trzech osobnych zmiennych numery pinów diod LED, następnie definiujemy numery pinów wejściowych o przełączników. W funkcji setup() ustawiamy, który pin ma być wejściem a który wyjściem. A w funkcji loop() sprawdzamy czy na wejściach występuje stan niski (LOW), czy wysoki (HIGH) i zależnie od tego zapalamy lub gasimy diody.
Jak można zaobserwować kolory ładnie się mieszają, a przy załączeniu wszystkich kolorów dioda świeci na biało, czyli każdego koloru jest dokładnie po tyle samo, co rzadko jest spotykane w naturze (przeważnie świeci w tedy na blado żółty, albo ciepły biały), dla poprawy stosuje się diody RGBW, gdzie mamy dodatkowo diodę białą (white).
Dioda LED RGB i obsługa wejścia analogowego
W tym przykładzie zamiast przełączników użyjemy potencjometrów i będziemy mogli dokładnie ustawić jaki chcemy kolor. Wartość ustawiona na potencjometrach będzie odczytywana przez wejścia analogowe arduino, następnie zostanie przeskalowana i podana na wyjścia PWM, gdzie jest podpięta dioda RGB. Otrzymamy taki oto schemat:
A program przedstawiam poniżej:
int ledR = 11; int ledG = 6; int ledB = 10; int pR = 0; int pG = 1; int pB = 2; int valPR = 0; int valPG = 0; int valPB = 0; void setup() { pinMode(ledR, OUTPUT); pinMode(ledG, OUTPUT); pinMode(ledB, OUTPUT); } void loop() { valPR = analogRead(pR); valPR = map(valPR, 0, 1023, 0, 255); analogWrite(ledR, valPR); valPG = analogRead(pG); valPG = map(valPG, 0, 1023, 0, 255); analogWrite(ledG, valPG); valPB = analogRead(pB); valPB = map(valPB, 0, 1023, 0, 255); analogWrite(ledB, valPB); }
Początek jest bez zmian, następnie zmienne przechowujące numery wejść analogowych oraz zmienne przechowujące wartość odczytaną z wejścia. Nie musimy deklarować że wejścia analogowe mają być wejściami, jest to już domyślne. W funkcji loop() odczytujemy wartość analogową i wykorzystujemy do tego funkcję analogRead(), której wartość zapisujemy do zmiennej. Następnie ta wartość zostaje przeskalowana na zakres 0-255 z zakresu 0-1023 i służy do tego bardzo praktyczna funkcja map(). Przeskalowanie jest konieczne, ponieważ odczyt analogowy jest 10 bitowy, a wyjście PWM jest 8 bitowe. Ostatnim etapem jest ustawienie wartości PWN dla każdego z wyjść.
Na zaprezentowanym filmie widać jak łatwo można zmieniać kolor świecenia diody RGB, kiedy w poprzednim przykładzie mieliśmy do dyspozycji tylko 8 kolorów (23) tak tutaj już mamy ponad 16 milionów kolorów (2563).
Tym przykładem zakończę tą część, mam nadzieje, że wszystko było zrozumiałe i czytelne, w razie czego zapraszam do komentarzy.
Po przygotowaniu tej część zaobserwowałem, że diody zbyt wolno się zapalają i zbyt wolno gasną, co czasem może utrudnić obserwacje obwodu, ale jak na taką aplikację to i tak jestem bardzo zadowolony.
W następnej części opiszę jak sterować wyświetlaczem LCD oraz wyświetlaczami 7 segmentowymi.