Wychodzimy poza płytkę, czyli pierwsze peryferia i jak je podłączyć.

21 października 2018

W poprzednim artykule nauczyliśmy się budowy samej płytki, poruszania się po środowisku i wgraliśmy na Arduino pierwszy program. Dzisiaj przejdziemy do części trochę bardziej zaawansowanej, czyli do pisania programów i podłączenia zewnętrznych elementów. Dzięki wiedzy z tej części będziemy potrafili podłączyć podstawowe zewnętrzne elementy elektroniczne oraz sterować nimi.

Sekcje programu w IDE.

Arduino IDE jest środowiskiem w którym piszemy programy korzystając z zmodyfikowanego pod kątem środowiska językiem C. Szkielet programu omówimy na przykładzie “Blink”, czyli programu który wgraliśmy na płytkę w poprzednim artykule.

Szkielet programu w Arduino dzielimy na dwie sekcje, czyli “setup” i “loop”. W “void setup” głównie definiujemy co do czego służy oraz wykonujemy operacje które mają się wykonać w programie tylko raz i tylko po włączeniu płytki. Z angielskiego setup znaczy “ustawiać” i to właśnie robi ta sekcja. Kolejnym elementem jest sekcja “void loop”, która jest nieskończona, czyli po wykonaniu rozkazów w całej pętli, pętla uruchamia się od nowa. O ile mikrokontroler jest włączony sekcja “loop” będzie działać w nieskończoność. Z angielskiego loop znaczy “zapętlać”, czyli sekcja będzie się cały czas w pętli. Niezwykle ważną rzeczą jest zakończenie linii średnikiem. Program odczytuje średnik jako zakończenie danego polecenia i przechodzi do następnej linii. Na początku z pewnością nie zawsze będziemy pamiętać o dodawaniu go na końcu linii, ale nie ma się o co martwić, ponieważ kompilator pokaże nam błąd i nie wgra błędnego programu na płytkę.

Przejdziemy teraz do definiowania funkcji poszczególnych pinów w sekcji setup. Piny definiujemy za pomocą polecenia “pinMode”, czyli w wolnym tłumaczeniu tryb pinu. Polecenie budujemy w następujący sposób “pinMode(pin, funkcja);” W miejsce “pin” możemy wpisać jeden z 14 dostępnych na płytce pinów cyfrowych, oprócz tego możemy skorzystać też z jednego z 5 pinów analogowych (numeracja zaczyna się od A0 który w programie definiujemy jako 14). W miejsce funkcja w zależności od tego do czego będzie służył pin, możemy wpisać “OUTPUT”, jeśli pin będzie pełnił funkcję wyjściową, lub “INPUT” gdy pin będzie pełnił funkcję wejściową. Piny wyjściowe służą do podawania zasilania, możemy dzięki nim wysterować komponenty zewnętrzne, a piny wejściowe do odbierania sygnałów, na przykład z czujników. Każdy pin argumentujemy osobno, czyli gdy chcemy aby piny 10,11 i 12 były pinami wyjściowymi definiujemy je w ten sposób:

a nie w taki:

Zasilamy piny i tworzymy przerwy w programie.

Skoro umiemy już zdefiniować piny to możemy przejść do zasilenia ich. O stanie danego pinu cyfrowego decydujemy komendą “digitalWrite”, jej budowa wygląda w następujący sposób “digitalWrite(pin, stan);”, w miejsce pinu podobnie jak w w “pinMode” wpisujemy jeden z 14 pinów cyfrowym, lub jeden z 5 analogowych którym będziemy chcieli sterować. W miejsce stan wpisujemy stan jaki ma przyjąć pin. Możemy jedną z dwóch możliwości, gdy chcemy aby na pinie pojawiło się napięcie, czyli stan wysoki, wpisujemy “HIGH”, a gdy chcemy aby na pinie nie było napięcia, czyli aby komponent nie był zasilany wpisujemy “LOW”, osiągamy wtedy na stan niski.

Potrafimy już podać stan wysoki i niski na pin, więc aby stany nie trwały w nieskończoność musimy określić przerwę pomiędzy załączeniem stanu wysokiego, a stanu niskiego. Do wstrzymania programu na określony przez nas czas służy funkcja  “delay”, z angielskiego “opóźnienie”. Dzięki funkcji “delay” opóźniamy wykonanie następnego polecenia. Budowa polecenia “delay” wygląda w następujący sposób “delay(czas);”. Czas w funkcji delay określamy w milisekundach, jedna milisekunda to jedna tysięczna sekundy, czyli jeśli chcemy wstrzymać działanie programu tak jak w naszym przykładzie musimy w miejsce “czas” wpisać “1000”. natomiast jeśli chcemy aby było to 5 sekund wpisujemy “5000”.

Niech stanie się światłość, czyli podłączamy zewnętrzne diody.

Aby utrwalić zdobytą dzisiaj wiedzę napiszemy program który zapali zewnętrzną diodę podpiętą do pinu 10, po pięciu sekundach zgasi ją, zaczeka trzy sekundy na kolejne podanie stanu wysokiego, a po sekundzie znów zgasi i zaczeka pół sekundy. Po tych operacjach program rozpocznie się jeszcze raz i tak w kółko. Program może wydawać się trudny, ale taki nie jest. Dodam tylko, że tak jak w powyższych programach znajduje się tekst poprzedzony dwoma ukośnikami, środowisko podczas kompilowania programu pomija te elementy, ponieważ są to komentarze. Komentarz nie ma żadnego wpływu na działanie programu, natomiast przy większych projektach jest nieoceniony, ponieważ program staje się bardziej czytelny i łatwiej będzie nam znaleźć fragment kodu który będziemy chcieli zmodyfikować.

W ten sposób prezentuje się nasz program, jako, że całość jest w sekcji loop program tak jak zakładaliśmy będzie się zapętlał. Ciekawostką jest to, że jeśli nie dodamy po ostatnim poleceniu przerwy czyli naszego delay sekcja nie wystartuje od nowa, ponieważ ostatnie polecenie będzie trwało dopóki mikrokontroler podpięty jest do zasilania.

Po omówieniu sekcji związanej z programowaniem możemy przejść do fizycznego podłączenia diody LED do płytki. Aby wykonać całe zadania potrzebujemy oprócz zestawu z poprzedniego artykułu diodę led w dowolnym kolorze, rezystor 180 Ohm, lub o podobnej wartości, przewody połączeniowe i płytkę stykową. Teraz po kolei, do czego będzie służyć dioda oraz kable raczej wiemy, ale został jeszcze rezystor i płytka stykowa. Rezystor jest to pasywny element elektroniczny który ogranicza płynący prąd, czasem nazywany jest opornikiem, ponieważ stawia opór. Rezystor zamienia określoną ilość prądu w ciepło, ważne jest również, że nie posiada polaryzacji, czyli nie ma znaczenia w jaki sposób go podłączymy. Płytka stykowa, czasem zwana prototypową służy do łatwego łączenia urządzeń, bez konieczności lutowania. Podczas całego kursu będzie nam niezwykle przydatna, prawie tak bardzo jak samo Arduino, ze względu na to, że to właśnie z jej pomocą będziemy wykonywać większość zadań i projektów.

Aby całe połączenie było jak najbardziej czytelne całość przedstawię w formie rysunku w programie Fritzing.Podczas podłączania diody musimy pamiętać o jej polaryzacji, dłuższa “nóżka” to anoda, czyli plus, a krótsza to katoda, czyli minus.

Gdy już zbudujemy cały układ możemy śmiało wgrać nasz program na płytkę i cieszyć się z działającego programu. Po zbudowaniu układu na jednej diodzie zbudujemy układ który będzie mrugał każdą diodą po kolei. Na początek napiszemy program, diody będą przypisane do pinów 10,11 i 12 a ich stan będzie zmieniał się co sekundę. program wygląda w ten sposób:

Program rozszerza się o dwie diody i kilka poleceń więcej w programie, ale samo działanie za bardzo się nie różni. Jeśli chodzi o połączenia na płytce stykowej masę czyli GND podłączymy do oznaczonej na niebiesko linii zasilania, aby połączenia można było rozprowadzać bezpośrednio na płytce stykowej, co daje wygodę i porządek w połączeniach. Wyprowadzanie linii 5V i GND na sekcje zasilania w płytce stykowej sprawdza się szczególnie przy większych projektach, gdzie na płytce mieści się wiele elementów, takich jak czujniki, czy przyciski, ze względu na to, że Arduino ma tylko jeden pin wyjściowy 5V. Po dodaniu dwóch diód, dwóch rezystorów i paru przewodów do poprzedniego układu całość prezentuje się w następujący sposób:

Wprowadzamy prąd do Arduino, czyli przyciski i ich działanie.

Wyprowadzić prąd już umiemy, więc warto nauczyć się jak wprowadzać go do układu i zaprogramować Arduino, aby reagowało na sygnały z zewnątrz. Najłatwiejszym i zarazem najwygodniejszym rozwiązaniem są przyciski, my skorzystamy z tradycyjnych tact-switchy. Cyfrowe piny Arduino skonfigurowane jako piny wejściowe wykrywają tylko dwa stany, czyli wysoki oraz niski. Stan niski jest wykrywany gdy napięcie znajduje się w zakresie 0-0.8V a stan wysoki gdy mieści się w zakresie 2,5-5V. Jeśli potrzebujemy dokładnie określić poziomy napięć posłużymy się pinami analogowymi, ale omówimy je dopiero w następnych artykułach, bo dzisiaj nie są nam konieczne.

Przycisk możemy podłączyć na dwa sposoby, albo korzystając z zewnętrznego rezystora podciągającego, albo z wbudowanego. Osobiście zawsze buduje układy korzystając z opornika zewnętrznego. Opornik służy do tak zwanego “podciągania”, stosuje się go, aby na pinie był albo stan wysoki albo niski, ponieważ gdy przycisk nie jest wciśnięty nie ma na nim żadnego stanu i powoduje to wartość nieokreśloną. Chcąc uniknąć niewiadomej wartości do jednej z nóżek podłączamy rezystor o odpowiednio dużej oporności (najczęściej 10K Ohm), a drugą nóżkę podłączamy do GND. Dzięki temu na pinie mamy wartość określoną i Arduino nie ma problemu z określeniem stanu. Możemy także podczas definiowania pinu jako wejściowy (czyli “pinMode(pin, INPUT);”) skorzystać z funkcji “INPUT_PULLUP. Podczas korzystania z funkcji INPUT_PULLUP do jednego pinu przycisku podłączamy 5V a do drugiego przewód prowadzący do pinu ustawionego jako wejściowy.

Aby odczytać stan danego pinu korzystamy z polecenia “digitalRead(pin);”. W miejsce pin wpisujemy tak jak podczas definiowania pin do którego podłączony jest przycisk.

Aby móc zaprogramować Arduino aby reagowało na sygnały z zewnątrz musimy zastosować instrukcję warunkowa, w tym wypadku będzie to instrukcja warunkowa “if”, co w tłumaczeniu z angielskiego znaczy “jeśli”. Do pętli możemy dodać warunek “else”, z angielskiego “w przeciwnym wypadku”, warunek “else” jest wykonywany, gdy nie zostanie spełniony argument “if”. Aby przedstawić budowę instrukcji “if” zbudujemy prosty układ, będzie miał za zadanie podawać na pin 10 stan wysoki, a na 11 stan niski gdy przycisk jest wciśnięty, a gdy nie jest na pin 10 podawać niski, a na 11 wysoki. Program będzie wyglądał w ten sposób:

Instrukcja zbudowana jest w następujący sposób “if(warunek)”, w tym wypadku warunkiem do wykonania instrukcji jest stan wysoki na pinie 9. Gdy warunek zostaje spełniony wykonują się polecenia z pierwszej części kodu. Warto dodać, że podczas tworzenia warunku znak równości to “==” a nie “=”, jeden znak równości służy do przypisania, a jest to zupełnie inna operacja, co prawda program się skompiluje, bo nie jest to błąd w budowie kodu, ale nie będzie działać prawidłowo. Użycie argumentu “else” jest opcjonalne i gdy go nie użyjemy to w przypadku niespełnienia warunku program po prostu pominie instrukcję “if” i wykona dalsze rozkazy. Używając “else” mówimy programowi co ma zrobić gdy warunek określony w instrukcji “if” nie zostaje spełniony, zostało to określone w drugiej części kodu.

Tak jak powiedzieliśmy wcześniej zbudujemy teraz układ, który będzie sterował dwoma diodami w zależności od tego czy przycisk jest wciśnięty, czy nie. Pamiętajmy o tym, że do diód stosujemy rezystory rzędu 180/220 Ohm, a do przycisku stosujemy rezystor rzędu 10K Ohm. Układ powinien wyglądać tak:

A działający program tak:

Tym układem zakończymy dzisiejszy artykuł, aby całość utrwalić najlepiej pisać programy i budować układy na bazie tych z kursu, bo w końcu na praktyce najszybciej się uczymy!

 

Dodaj komentarz

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