Spis treści:
Nie da się ukryć, że Arduino, które sprzedało się w ilości ponad 10 mln płytek na całym Świecie, jest jedną z najchętniej kupowanych platform do programowania.
Na czym polega programowanie Arduino?
W niniejszym artykule, poświęcimy uwagę na podstawowy zarys tworzenia kodu programu w środowisku Arduino IDE. Dokonamy także porównania przykładowego kodu wykonanego w środowisku Arduino IDE do kodu programu wykonującego taki sam proces sprzętowy, który został napisany w języku C.
Zanim napiszemy nasz pierwszy program
Zanim przejdziemy do pierwszego szkicu programu, warto powiedzieć kilka słów o platformie Arduino. Jest to wszechstronne narzędzie, które pozwala użytkownikowi na tworzenie prototypów programowalnych urządzeń elektronicznych. Dzięki ogromnej popularności, Arduino zyskało sobie liczne grono użytkowników – od domorosłych hobbystów, po zawodowych inżynierów. Bogate wyposażenie dodatkowe w postaci modułów i nakładek rozszerzeniowych, tysiące opublikowanych projektów i znakomite wsparcie techniczne ze strony producenta i społeczności internetowej, to czynniki, które szczególnie przemawiają za nabyciem płytki Arduino lub jej licencjonowanego klona. Nieodłączną częścią ekosystemu Arduino jest także dedykowane oprogramowanie, tj. Arduino IDE – zintegrowane środowisko przeznaczone do tworzenia kodu programu – a do przykładowego kodu przejdziemy właśnie teraz!
Przykładowy kod programu w środowisku Arduino IDE
Aby zobrazować jak wygląda i na czym polega programowanie Arduino, posłużymy się poniższym, krótkim kodem programu, którego zadaniem jest cykliczne zaświecanie i gaszenie diody LED. Od strony sprzętowej, dioda LED jest podłączona do pinu cyfrowego “D2” anodą poprzez rezystor 330R ograniczający przepływ prądu do bezpiecznej wartości. Natomiast katodę diody LED podłączamy do pinu masy w sekcji “POWER”, tj. “GND”. Kod programu ma następującą postać:
// Miganie dioda LED w srodowisku Arduino IDE
void setup() //Wstepne ustawienia programu
{
pinMode(2,OUTPUT); // Pin cyfrowy nr 2 ustawiony jako wyjscie
}
void loop() // Instrukcje programu wykonywane w petli
{
digitalWrite(2,HIGH); // Pin cyfrowy nr 2 - stan wysoki - LED swieci
delay(500); // Opoznienie o 500ms
digitalWrite(2,LOW); // Pin cyfrowy nr 2 - stan niski - LED zgasl
delay(500); // Opoznienie o 500ms
}
Budowa powyższego kodu jest następująca. Każdy tekst napisany po podwójnym ukośniku jest przez kompilator ignorowany – są to komentarze, które mają na celu pomóc zrozumieć kod programu i zachować jego przejrzystość. Sekcja “void setup()” obejmuje wstępne ustawienia programu, które są wykonywane tylko raz, ale każdorazowo przy rozpoczęciu wykonywania programu przez mikrokontroler, aby ten ,,wiedział” jak jest ustawiona jego konfiguracja sprzętowa przed rozpoczęciem wykonywania programu. W naszym przypadku, jedynym zadeklarowanym ustawieniem, jest ustawienie pinu cyfrowego D2 w tryb wyjścia za pomocą komendy pinMode(). Z kolei sekcja void loop() zawiera instrukcje, które są wykonywane po kolei, każdorazowo, przy każdym obiegu pętli. Tu program korzysta z instrukcji digitalWrite(), która powoduje wystawienie stanu wysokiego (napięcia 5V) na pin cyfrowy “D2”, do którego jest podłączona anoda diody LED poprzez rezystor 330R. Po wykonaniu tej instrukcji, dioda LED zaświeca się. Kolejna instrukcja, tj. delay() zatrzymuje pętlę programu na czas wynoszący 500ms – przez ten czas podtrzymywany jest skutek wykonania instrukcji poprzedzającej – dioda LED w dalszym ciągu świeci. Kiedy ten czas minie, wykonywana jest zmiana stanu logicznego na pinie “D2”, na którym przed chwilą został wystawiony stan wysoki. Teraz dioda LED, po przerzuceniu pinu “D2” w stan niski, gaśnie. Ostatnią instrukcją w pętli jest ponowne opóźnienie, które powoduje zatrzymanie pętli programu na czas wynoszący 500ms – przez ten czas również jest podtrzymywany skutek wykonania instrukcji poprzedzającej, tj. stan niski na anodzie diody LED. Po wykonaniu tej instrukcji, sekcja void loop() jest w całości wykonywana ponownie od początku.
Kod programu sterującego świeceniem diody LED w języku C
Teraz dla porównania przyjrzymy się kodowi programu, który daje dokładnie taki sam rezultat końcowy co kod napisany w środowisku Arduino IDE, ale został napisany w języku C – jednym z najbardziej popularnych języków niskopoziomowych. Przykładowy kod programu w języku C napisany na mikrokontroler ATMEGA 328P z wykorzystaniem tych samych pinów, ma następującą postać:
#define F_CPU 16000000UL // Czestotliwosc zegara ustawiona na 16MHz
#include // Inicjalizacja biblioteki wejsc/wyjsc
#include // Inicjalizacja biblioteki opoznienien
int main() // Glowny zestaw instrukcji wykonywanych w petli
{
DDRD |= 1 << PIND2; // Pin nr 2 rejestru D jako wyjscie
while (1) // Petla while zawierajaca ponizsze warunki
{
PORTD |= 1 << PIND2; // Pin nr 2 rejestru D - stan wysoki - LED swieci
_delay_ms(500); // Opoznienie o 500ms
PORTD &= ~(1 << PIND2); // Pin nr 2 rejestru D - stan niski - LED zgasl
_delay_ms(500); // Opoznienie o 500ms
}
}
W pierwszej części programu musimy zadeklarować częstotliwość zegara taktującego mikrokontroler. ATMEGA 328P posiada wbudowany wewnętrzny oscylator, który maksymalnie może taktować mikrokontroler z częstotliwością 8MHz. Tu podobnie jak w Arduino, użyliśmy zewnętrznego rezonatora kwarcowego o częstotliwości 16MHz. Następnie załączamy biblioteki obsługujące porty wejścia/wyjścia mikrokontrolera AVR oraz opóźnienia. Pisząc w języku C, zwykle operujemy na rejestrach – tutaj stosując kierunek strzałek, skorzystaliśmy z przypisania pnu nr 2 w porcie D jako wyjścia. Następnie program wykonuje nieskończoną pętlę while, w której zadanymi warunkami jest przerzucenie pinu nr 2 w porcie D w stan wysoki. Pin nr 2 portu D jest w Arduino przypisany jako pin nr 2 w sekcji “DIGITAL”. Przed następnym cyklem maszynowym mikrokontrolera, jest wprowadzone opóźnienie o czas wynoszący 500ms – zwróćmy uwagę, że w odróżnieniu od języka programowania dla Arduino, w języku C piszemy podkreślenia oraz jednostkę czasu wprowadzanego opóźnienia, tj. “_delay_ms()” zamiast arduinowskiego “delay()”. Przez ten czas opóźnienia, na pinie nr 2 w porcie D utrzymywany jest stan wysoki. Po zakończeniu wykonywania tej instrukcji, pin nr 2 w porcie D jest przerzucany w stan niski poprzez iloczyn bitowy “&=” i negację “~” instrukcji przerzucenia pinu nr 2 w porcie D w stan wysoki. Po raz kolejny jest wprowadzana instrukcja opóźniająca wykonanie kolejnej instrukcji o czas wynoszący 500ms i program zaczyna się wykonywać od początku.
Arduino czy C?
Jak możemy zauważyć już na zaprezentowanych powyżej krótkich przykładach, kod programu w języku C jest bardziej bogaty w szczegóły względem kodu w Arduino IDE, który bazuje na składni języków C/C++. Jest tak, ponieważ język C jest językiem niskiego poziomu, w związku z czym wymaga poświęcenia większej uwagi konfiguracji sprzętowo-programowej. Można zaryzykować stwierdzenie, że w przypadku Arduino porównując je do klasycznego programowania w C, większość rzeczy mamy już w pełni gotowych. Nie ma w tym nic dziwnego – Arduino powstało właśnie w tym celu, aby ułatwić tworzenie prototypów bez potrzeby zagłębiania się w zakamarki hardware’u. Niemniej jednak, warto znać jeden jak i drugi język programowania, przy czym język C choć jest bardziej wymagający cierpliwości przy nauce, to jest on bardziej uniwersalny i umożliwia zaprogramowanie wielu innych mikrokontrolerów.
Jak oceniasz ten wpis blogowy?
Kliknij gwiazdkę, aby go ocenić!
Średnia ocena: 4.6 / 5. Liczba głosów: 10
Jak dotąd brak głosów! Bądź pierwszą osobą, która oceni ten wpis.