Arduino – czy można programować Arduino w czystym C?

Czy można zaprogramować płytkę Arduino pisząc w czystym języku C, bez użycia wysokopoziomowej biblioteki dostarczanej przez producenta? Przeglądając różne fora dyskusyjne już kilkukrotnie natknąłem się na to pytanie i zdania były delikatnie mówiąc podzielone. Odpowiedzmy sobie zatem na pytanie czym tak naprawdę jest płytka Arduino, czy można ją zaprogramować w czystym języku C i po co właściwie to robić?

Czym jest Arduino?

Arduino jest otwartą platformą programistyczną dla systemów wbudowanych. Celem tego projektu było stworzenie ogólnodostępnych i prostych w użyciu narzędzi dostępnych zarówno dla hobbystów jak i bardziej wymagających użytkowników. W skład zestawu narzędzi jakie twórcy Arduino oddali w nasze ręce wchodzi szeroki wybór płytek w różnych konfiguracjach sprzętowych, zintegrowane środowisko programistyczne oraz specjalnie przygotowana wysokopoziomowa biblioteka bazująca na języku C/C++. Wspomniana biblioteka ma za zadanie ułatwić pracę z kodem początkującym użytkownikom wprowadzając szereg przydatnych i łatwych w użyciu funkcji. Czy jednak to jedyny sposób na programowanie Arduino? Oczywiście, że nie!

Po co pisać w C?

Wiele osób może w tej chwili zadawać sobie pytanie po co właściwie ma rezygnować z wygody i prostoty jakie daje programowanie z użyciem biblioteki Arduino ? Powodów może być kilka: dla zabawy i poznania nowych możliwości swojej płytki, dla nauki podstaw programowania w C dla kontrolerów AVR ale przede wszystkim dla poznania i zrozumienia jak działa mikroprocesor! Rezygnacja z wysokopoziomowej biblioteki da nam szanse „zajrzeć w głąb” mikroprocesora, poznać jego zasadę działania, umożliwi lepszą kontrolę nad sprzętem oraz otworzy nas na całkowicie nowe możliwości programowania, ograniczone tylko poziomem naszych umiejętności a nie możliwościami jednej biblioteki.

Płytka Arduino czy sama ATmega?

Możliwości są dwie: możemy pisać programy korzystając z gotowej płytki np. Arduino UNO, możemy też wykorzystać sam mikroprocesor ATmega wgrywając do niego wcześniej bootloader Arduino. Bootloader da nam możliwość wgrywania kodu wprost z Arduino IDE wykorzystując jako programator nasze Arduino. W tym artykule zajmę się pierwszym przypadkiem, czyli będziemy wgrywać kod bezpośrednio na płytkę Arduino UNO korzystając ze standardowego środowiska Arduino IDE.

Pierwszy program dla Arduino w czystym C

Jak już wspomniałem rezygnując z biblioteki dostarczanej przez Arduino zmieni się całkowicie nasze podejście do pisania programów. Teraz to my musimy się o wszystko zatroszczyć! Przyjrzyjmy się więc programowi Blink napisanemu z użyciem biblioteki:

Oraz ten sam program napisany w C:

Oba programy działają identycznie czyli migają wbudowaną diodą co jedną sekunde. Pierwszy program myślę, że nie wymaga komentarza, zajmijmy się więc przypadkiem drugim:

Dodajemy standardową bibliotekę wejścia/wyjścia dla mikroprocesorów AVR, oraz bibliotekę delay.h odpowiedzialną za działanie funkcji _delay_ms. Definiujemy też makrodefinicję LED, do której przypisujemy wartość PB5 co wskazuje na pin 13 w Arduino UNO. Przyjrzyj się dokładnie poniższej ilustracji a zrozumiesz skąd owe PB5 się wzięło:

programowanie Arduino w czystym C

Jak widzisz w ATmedze 328P (taka jest zainstalowana na Arduino UNO) piny są pogrupowane w trzy porty (PORTB, PORTC, PORTD) wieć zapis PB5 oznacza pin 5 portu B, co w Arduino UNO daje pin 13. Trochę to zawiłe, ale wystarczy dokładnie przeanalizować ilustrację, żeby wszystko stało się jasne.

W C nie korzystamy z funkcji setup oraz loop, funkcja główna programu to funkcja main i to ona można powiedzieć zastępuje nam funkcję setup, zaś funkcję loop zastąpi nam nieskończona pętla while. Druga linia kodu ustawia pin 13 jako wyjście i można powiedzieć, że jest równa zapisowi :

Dalej przechodzimy już do głównej pętli programu, jak już wspomniałem nie stosujemy w C funkcji loop, zamiast tego w głównej funkcji programu wstawiamy nieskończoną pętlę – jest to konieczne ponieważ bez niej program wykonałby się tylko raz. Kod pętli wygląda tak:

Jak widzisz program robi dokładnie to czego od niego oczekiwaliśmy czyli miga wbudowaną diodą co sekundę. W komentarzach do kodu zaznaczyłem, które linie są odpowiedzialne za zmianę stanu na pinie 13.

Skoro funkcja main jest typu int to powinna zwracać wartość w postaci liczby całkowitej. W praktyce zapis ten można pominąć i program skompiluje się bezbłędnie, jednak ja uważam, że dla formalności warto wklepać te kilka znaków, żeby nasz kod był konsekwentny i profesjonalny. Dla ciekawostki dodam, że wartość ta prawdopodobnie nigdy nie zostanie zwrócona, ponieważ program finalnie zostanie zamknięty wewnątrz głównej pętli i nigdy jej nie opuści.

Podsumowanie

Jak widzisz nic nie stoi na przeszkodzie aby zaprogramować Arduino w czystym C i to z użyciem standardowego Arduino IDE! Oczywiście nie wyczerpałem tutaj tematu programowania w C dla Arduino i mikroprocesorów AVR, jednak nie taki był cel tego artykułu. Nie przejmuj się, że na tym etapie nie rozumiesz w pełni kodu programów napisanych w C, na wszystko przyjdzie pora. Potraktuj ten artykuł jako furtkę do nowych możliwości jakie daje Ci Twoje Arduino.

Jeśli artykuł Ci się spodobał i chciałbyś aby temat programowania w C na platformie Arduino był dalej rozwijany napisz o tym w komentarzu!

  • 3
    Udostępnienia

Dodaj komentarz

Bądź pierwszy!

Powiadom o
avatar