123D circuits – Symulacja arduino część 1 (dioda LED, RGB, przyciski, potencjometry)

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.

1

Następnie wchodzimy w zakładkę Code Editor

2

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.

3

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.

4

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 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.

5

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:

6

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.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *

Time limit is exhausted. Please reload CAPTCHA.

This site uses Akismet to reduce spam. Learn how your comment data is processed.