Arduino, C, a może… czyli mikrokontrolery w praktyce

Reading Time: 6 minutes

Na wstępnie chciałbym ciebie poinformować, że nie jest to kolejny artykuł o wyższości jednego rozwiązania nad innym w programowaniu mikrokontrolerów firmy Atmel ale próba rzetelnego przedstawienia tobie pewnych faktów, abyś wiedział dokładnie co z czym i dlaczego.

Mikrokontrolery firmy Atmel, czyli wszelkie AtTiny, AtMegi, XMegi można programować w sumie na cztery różne sposoby, czy też w czterech różnych językach programowania. Pierwszym jest język C, jaki był od samego początku dla nich dedykowany, następny C++,  potem assembler oraz tzw. Arduino. Jest jeszcze Bascom ale z racji, że jest to chyba najgorsze rozwiązanie z możliwych, pominę go w tym artykule.

Arduino, to platforma sprzętowa oparta na mikrokontrolerach firmy atmel, z wgranym bootloaderem, który odpowiada za programowanie je po porcie usb oraz oprogramowanie w specjalnym języku zbliżonym do C++. Mówiąc o Arduino w tym artykule, będę się odnosił zarówno do samego sprzętu jak i języka programowania. O czym mowa jest aktualnie powinieneś wywnioskować z kontekstu.

W internecie można znaleźć wiele artykułów, zachwalających dany język programowania i też dlaczego on właśnie powinien być używany, a nie inne,  ale przeważająca większość z tych artykułów całkowicie ignoruje zalety konkurencji i wady własnego rozwiązania. Przyjrzyjmy się teraz więc tym tezom, które one głoszą.

Najlepszy jest język C bo

  • lepiej pozwala poznać architekturę mikrokontrolera i to jak działa
  • kod wynikowy jest najmniejszy i najbardziej wydajny
  • da się w nim zrobić o wiele więcej niż w tak zwanym arduino
  • programy pisze się szybko i przyjemnie
  • Znając C można pisać programy nie tylko na mikrokontrolery ale też i na PC

Najlepszy jest Arduino bo

  • jest łatwy do nauczenia (bardzo podobny do C++)
  • da się dzięki niemu zrobić praktycznie wszystko co w C
  • w łatwy sposób, ze względu na swoje podobieństwo do C++ można zacząć pisać aplikacje także na PC
  • napisane programy są bardziej czytelne niż w C, czy asemblerze (kod wygląda lepiej)
  • jest jakby taką nakładka na C, więc kod wynikowy i tak jest taki sam jak odpowiednik kodu pisanego w czystym C
  • programy pisze się jeszcze szybciej i przyjemniej niż w C i asemblerze, a na pewno dużo prościej
  • mikrokontroler programuje się bardzo łatwo poprzez USB (UART)

Najlepszy jest Asembler bo

  • programy w nim napisane są najszybsze i najbardziej wydajne
  • pozwala na dokładne, niemal mistrzowskie poznanie architektury różnych mikrokontrolerów
  • w nim piszą najlepsi zawodowcy
  • pozwala na wyciśnięcie z mikrokontrolera wszystkiego co jest możliwe

Teraz antyargumenty przeciw

Język C

  • C jest dość trudny do nauczenia i jego nauka trwa dość długo
  • C to archaiczny język, a programy w nim pisane wyglądają często jak spagetti, są zagmatwane i nieczytelne
  • proste rzeczy trzeba często robić naokoło, jak chociażby wypisanie łańcuchów znaków

Arduino

  • posiada botloader zajmujący niepotrzebnie miejsce w pamięci, a pamięć mikrokontrolera jest często na wagę złota
  • ma na stałe wbudowany kwarc i nie możliwa jest jego wymiana
  • nie możliwe jest zastosowanie innego mikrokontrolera niż ten wbudowany w dane Arduino
  • po co się uczyć Arduino jak można ten czas od razu wykorzystać na naukę C lub asemblera
  • jest duże gabarytowo w porównaniu z samym mikrokontrolerem i posiada wiele niepotrzebnych rzeczy
  • służy bardziej do zabawy niż poważnych zastosowań, a wiadomo że profesjonaliści to piszą albo w C albo w Asemblerze

Asembler

  • jest bardzo trudny do nauczenia
  • programowanie w nim trwa wieki
  • programowanie często najprostszych operacji, to kombinacje alpejskie
  • kod wynikowy nie zawsze jest bardziej wydajny i mniejszy niż w C, czy Arduino, gdyż obecne kompilatory są tak zaawansowane, że często lepiej sobie poradzą z optymalizacją kodu niż taki średnio douczony programista asemblera

Oczywiście trudno na pierwszy rzut oka wszystkim sympatykom i sceptykom danego rozwiązania nie przyznać racji, wgłębiając się jednak w zagadnienie zauważymy, że one dość mocno odbiegają od rzeczywistości i są to najczęściej jedynie półprawdy.

Spróbujmy więc je zestawić ze sobą i przeanalizować

Czy Asembler i C faktycznie pozwalają lepiej poznać architekturę mikrokontrolera niż Arduino?

Na pierwszy rzut oka zdawało by się, że tak, ale jak już wspomniałem Arduino pozwala praktycznie na to samo co C, bo jest na nie jedynie nakładką, można zresztą na arduino programować i w czystym C jak najdzie nas ochota lub potrzeba. Co do architektury, to trzeba poznać tak samo możliwości mikrokontrolera jaki ono posiada, jak działają poszczególne elementy w arduino tak jak i programując w C, czy asemblerze sam mikrokontroler. Czy jednak aż tak dokładne poznanie jego architektury jest niezbędne, aby pisać swoje programy?

Kod wynikowy

Wiesz już, że Arduino jest nakładką na C, więc kod wynikowy jest co najmniej taki sam, a może być mniejszy jeśli unikniesz dzięki temu pewnej gimnastyki w C, a jesteś początkującym i niezbyt jeszcze doświadczonym programistą. Co do asemblera, to także wspominałem, że kod wynikowy nie koniecznie musi być lepszej jakości i często nie jest, bo kompilator GCC poradzi sobie z tym lepiej niż własna optymalizacja.

W C i Asemblerze da się zrobić wiele więcej niż w Arduino?

Tak? a co ? Gdyby jednak faktycznie zaszła potrzeba, to można zrobić wstawkę asemblerową lub C. W 99.9999% przypadków jednak myślę, że nie będzie to potrzebne.

Programy w C pisze się szybko i przyjemnie

Szybko i przyjemnie, to się pisze w Arduino lub C++. W C to często gimnastyka, Asembler to jeszcze większa gimnastyka. Widać to także po tym jak po dłuższym czasie wracamy do kodu i musimy coś poprawić bądź dopisać jakąś nową funkcjonalność do istniejącego kodu:]

Znając C można pisać programy nie tylko na mikrokontrolery ale i na PC.

Jak już wspomniałem Arduino bardzo mocno przypomina C++, wiec znając arduino bardzo szybko można na PC pisać w C++. Różnice są minimalne i często wynikające z architektury procesora. Tak samo jak C na mikrokontrolery, tak i C przeznaczony na PC się lekko różnią. Czas potrzebny na ogarnięcie różnic będzie myślę podobny. Inaczej jest z Asemblerem, ten jest całkiem inny na każdy procesor, więc i na ten atmelowski będzie inny niż na PC.

Arduino posiada bootloader zajmujący niepotrzebnie miejsce

Tak posiada, ale jeśli naprawdę te utracone 2kb, czy 0,5kb stanie się dla ciebie bardzo ważne, to można zaprogramować arduino bez bootloadera 🙂 Więcej, można wziąć jedynie sam mikrokontroler i kilka potrzebnych elementów, jak kwarc, rezystory, kondensatory i dołączyć do kontrolowanego urządzenia, którym ma sterować. Sam kwarc też można zamienić, na taki jaki potrzebujemy. Jak to zrobić? https://www.youtube.com/watch?v=kLGPvuMELF0&index=20&list=PLZQKTfr7_vvQxeN3PKtdjhpOFBTaukqok&t=0s

Po co się uczyć Arduino jak mozna od razu C lub Asemblera?

Bo jest łatwiejszy na początek? bo programy pisze się w nim szybciej? bo kod jest czytelniejszy? bo daje praktycznie to samo co C pod względem możliwości?, po jego nauczeniu łatwiej ogarnąć C++?

Arduino jest duże gabarytowo i posiada wiele zbędnych elementów, jest też drogie

Tak ale, jak już wspomniałem wyżej, można wykorzystać jedynie sam mikrokontroler przecież, i tak się właśnie robi. Nie sądzicie chyba, że do każdego projektu kupuje się nowe arduino?. Szczególnie w Polsce.

Patrząc na powyższe możesz dojść do wniosku, że gloryfikuję arduino, a wcale tak nie jest. Pokazałem jedynie, że nie odbiega ono wcale od innych języków programowania mikrokontrolerów jak sądzą co poniektórzy i wcale nie jest to zabawka oraz można pisać w nim różnie poważne, profesjonalne oprogramowanie jak w każdym innym języku.

Jeśli zaczynasz dopiero zabawę z mikrokontrolerami i nie znasz jeszcze żadnego innego języka programowania, zacznij od arduino, potem i z  czasem w razie potrzeby naucz się c, a dalej może i samego asemblera.

Korzystaj z nich w razie potrzeby, czas to pieniądz, więc wybierz dokładnie taki język jaki będzie najlepszy do realizacji danego projektu. Jeśli uznasz, że nie obejdzie się bez C, pisz w C. Jeśli wystarczy Arduino, pisz w Arduino. Jeśli natworzysz jakichś dziwadełek w kodzie i uznasz, że musisz użyć wstawek asemblera, aby to jakoś zaczęło po ludzku działać, pisz w asemblerze.

Języki programowania to tylko narzędzia mające ułatwić ci pracę, aby stworzyć wysoce czytelny, funkcjonalny i wydajny kod i tym samym bezawaryjnie działające urządzenie, którym ten programowany przez ciebie mikrokontroler steruje. Warto więc z czasem poznać wszystkie trzy języki, a najlepiej to nauczyć się C++ i tego jak go wykorzystać do programowania mikrokontrolerów.

2 komentarze

  1. Do celów własnych do Arduino często się podłącza inne elementy (LCD, zegary itp) które obsługiwane są przez juz napisane biblioteki. Czy większość nie jest wlasnie napisana w Arduino?

Zostaw komentarz

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

trzy × trzy =