Kurs Raspberry Pi Pico – #2 – Słów kilka o programowaniu

Czas czytania: 7 min.

W pierwszym artykuleRaspberry Pi Pico opowiedziałem wam, czym będziemy się tutaj zajmować, co będzie nam potrzebne, a także przedstawiłem bardziej szczegółowo głównego bohatera. W tym materiale zajmiemy się językiem programowania, a dokładniej jego wyborem. Opisze tutaj trzy różne sposoby przygotowywania kodu dla Raspberry Pi Pico W. Przyjrzymy się bliżej wadom i zaletom każdego rozwiązania, a na koniec wybierzemy to, z którego w przyszłości będziemy korzystać.

Kup zestaw do nauki programowania z Raspberry Pi Pico W i skorzystaj z kursu dostępnego na Blog Botland!

W zestawie: moduł Raspberry Pi Pico W, płytka stykowa, przewody, diody LED, rezystory, przyciski, fotorezystory, cyfrowe czujniki światła, temperatury, wilgotności i ciśnienia, wyświetlacz OLED i przewód USB-microUSB.

Przed wyruszeniem w drogę należy zebrać drużynę

Zestaw elementów do kursu Raspberry Pi Pico.

Chcąc uczyć się programowania, bazując na rzeczywistych projektach, potrzebny będzie oczywiście odpowiedni sprzęt, ale bez obaw – nie musisz teraz skakać między kolejnymi artykułami i przygotowywać listę niezbędnych elektronicznych elementów. W sklepie Botland dostępny jest gotowy zestaw, zawierający wszystkie komponenty niezbędne do wykonania projektów opisanych w serii poradników o Raspberry Pi Pico. 

gotowym zestawie elementów znajdziecie:

  • Raspberry Pi Pico W,
  • Przewód microUSB,
  • Płytkę stykową,
  • Zestaw przewodów połączeniowych w trzech rodzajach,
  • Zestaw diod LED w trzech kolorach,
  • Zestaw najczciej stosowanych w elektronice rezystorów,
  • Przyciski Tact Switch,
  • Fotorezystory,
  • Cyfrowy czujnik światła,
  • Cyfrowy czujnik wilgotności, temperatury i ciśnienia,
  • Wyświetlacz OLED.

Co w zasadzie oznacza programowanie?

Uruchomienie komputera Odra 1305, który mógł korzystać z kart perforowanych, zdjęcie koloryzowane. (https://elwrowcy.pl)

Zanim jednak przejdziemy do programistycznych aspektów Raspberry Pi Pico W, chciałbym opowiedzieć wam o programowaniu samym w sobie, ale aby było to możliwe, musimy przenieść się myślami do 1941 roku. Realizowany przez procesor kod nie zawsze miał postać znanych obecnie słownych komend i opisów. Pierwszą maszyną, która potrafiła wykonać coś w rodzaju programu, był zbudowany przez niemieckiego inżyniera Konrada Zuse pierwszy automatyczny komputer o oznaczeniu Z3. Urządzenie bazowało na przekaźnikach i jak na współczesne standardy oferowało niewielkie możliwości. Komputer potrafił jedynie dodawać, odejmować, mnożyć, dzielić oraz wykonywać pierwiastkowanie na binarnych liczbach zmiennoprzecinkowych. Program realizowany przez Z3 przygotowywany był na specjalnej taśmie perforowanej. Był to papierowy nośnik danych, w którym w odpowiednich miejscach wycinano dziurki, które komputer identyfikował jako kolejne rzędy bitów. Perforowane nośniki danych były dość trudne w przygotowaniu, a poza tym zdarzały się pomyłki, których nie można było cofnąć. Jednak mimo tego techników przygotowujących program realizowany przez Z3 możemy nazwać jednymi z pierwszych programistów.

Jednak nauka i rozwój nigdy nie zwalniają, dlatego z czasem papierowe nośniki informacji zaczęły być wypierane przez swoich bardziej elektrycznych odpowiedników. Przełomowe było tutaj oczywiście pojawienie się pierwszych pamięci półprzewodnikowych, w których kolejne instrukcje realizowanego programu przechowywane są w niewielkich krzemowych rdzeniach. Od momentu pojawienia się tego typu konstrukcji, zmieniło się niejako postrzeganie kogoś, kogo nazwać możemy programistą. Początkowo człowiek był ściśle powiązany ze sprzętem, przygotowując odpowiedni „kod”, którego forma mogła być naprawdę różnorodna, jednak uruchamiany był on zazwyczaj tylko na jednym typie urządzeń. Z czasem zawód programisty stał się czymś bardziej uniwersalnym, związanym bardziej z językiem programowania aniżeli sprzętem. Aktualnie to właśnie język, w jakim pisane są kolejne instrukcje, stał się elementem nadrzędnym, ponieważ obecny sprzęt jest w stanie przyjąć niemal wszystko. Choć trzeba pamiętać, że istnieją platformy specjalizowane, ściśle powiązane z konkretnym typem uruchamianego „kodu”.

Uczeń Radzieckiej szkoły zawodowej Sasha Reshmin przygotowujący moduł operacyjnej pamięci ferrytowej, autorem wykonanej w 1961 roku fotografii jest Isaac Tunkel.

Czym właściwie jest programowanie? Odpowiedź na to pytanie może brzmieć następująco: Jest to proces, w którym tak zwany programista przygotowuje program o określonych parametrach, który ma realizować określone zadanie zdefiniowane w języku programowania. Brzmi to dość logicznie, jednak pojawia się pytanie – Skąd komputery, mikrokontrolery czy inne platformy, na których można uruchomić przygotowany program, znają języki programowania?

Kompilacje, syntezy i tłumaczenia

Żaden komputer, a tym bardziej mikrokontroler taki jak RP2040 nie zna i nie rozumie języków programowania, w ludzkim rozumieniu tego słowa. Cyfrowe układy scalone, jakimi są wszelkiego rodzaju procesory, operują w systemie binarnym, innymi słowy bazują tylko i wyłącznie na dwóch symbolach: 1 i 0. Są to cyfrowe reprezentacje napięcia elektrycznego, które w dużym uproszczeniu- gdy jest, mówimy o stanie wysokim 1 lub kiedy go nie ma, czego reprezentantem jest zero, stan niski. Dla mikrokontrolerów nie istnieją stany pośrednie. Każdy program, po przejściu kilku warstw wtajemniczenia ma właśnie taką formę – formę ciągu zer i jedynek zgodnych z projektem konkretnej jednostki centralnej. Dla przykładu binarnym odpowiednikiem mnemonika ADD (operacja dodawania) w procesorach opartych na rdzeniach ARM, czyli właśnie takim jak w RPI Pico W jest „000110 10000 00011 0000 0000 0010”. Chip RP2040 odczytując z pamięci takie polecenie, nazywane też kodem maszynowym wie, że musi wykonać operację dodawania dwóch liczb zapisanych w rejestrach roboczych i otrzymany wynik zapisać w kolejnym rejestrze.

Pisane programów w kodzie maszynowym jest oczywiście możliwe, jednak byłoby to niezwykle trudne, czasochłonne i wyczerpujące. Właśnie dlatego wraz z rozwojem technologii powstało coś takiego jak kompilatory. Są to programy służące do automatycznego tłumaczenia jednego języka programowania na inny, a mówiąc dokładniej z języka wysokiego poziomu na język nisko poziomowy, tak aby kod przygotowany przez programistę mógł być wykonany przez procesor.

Wartą zapamiętania ciekawostką jest fakt, że nie każde tłumaczenie jednego kodu na inny to kompilacja. Przykładem mogą być tutaj układy programowalne, takie jak FPGA. Przyglądając się z zewnątrz procesowi opisu sprzętu, można przyjąć błędnie, że jest to właśnie programowanie, a przygotowany wcześniej kod jest kompilowany. Poprawnym stwierdzeniem jest jednak konfiguracja, a napisany w języku VHDL lub Verilog opis sprzętu jest wedle poprawnego nazewnictwa syntezowany.

Wybór kamienia przeznaczenia

Płytki Arduino UNO R4, RPI Pico W oraz RPI Zero 2.

Wróćmy jednak do głównego tematu tego artykułu. Chcąc programować Raspberry Pi Pico W, skorzystać możemy z kilku rozwiązań. Najpopularniejszymi z nich są Arduino IDE, MicroPython oraz C/C++ SDK. Jeśli nazwy te są dla Ciebie obce, to nie masz powodów do zmartwień. Już za moment wytłumaczę, na czym polega każde z rozwiązań, odpowiem na pytania, jakie są ich mocne i słabe strony oraz gdzie są wykorzystywane.

Programowanie przy użyciu Arduino IDE

Każdy, kto już wcześniej miał okazję pracować z elektroniką, musiał słyszeć o płytkach Arduino. Te niewielkie platformy, podobne pod względem założeń do Raspberry Pi Pico zdobyły niezwykłą popularność, zwłaszcza wśród elektroników amatorów. Dzięki swojej prostocie, mnogości źródeł wiedzy i wsparciu społeczności stały się niezwykle częstym wyborem, w kategorii platform do nauki elektroniki i programowania. Warto jednak wiedzieć, że Arduino to nie tylko płytki z wlutowanym mikrokontrolerem, ale przede wszystkim środowisko programistyczne pozwalające przygotować kod, również na inne platformy sprzętowe.

Arduino IDE, bo pod taką nazwą funkcjonuje środowisko programistyczne skojarzone z platformą Arduino, jest niezwykle prostym i intuicyjnym narzędziem pozwalającym przygotować kod w języku C, który może być z powodzeniem uruchomiony na płytce RPI Pico W. Zaletą Arduino IDE jest przede wszystkim prostota i szybkie efekty. W dosłownie kilka minut możemy przygotować funkcjonalny program, realizujący proste zadania. Wizja szybkiego sukcesu jest kusząca, ale trzeba wiedzieć, że Arduino w szerokim znaczeniu tego słowa obarczone jest wieloma wadami i przeciwnościami, o których można by napisać osobny artykuł. Nie bez przyczyny w bardziej profesjonalnych zastosowaniach płytki, jak i środowisko programistyczne Arduino jest raczej niespotykane. Jest to prosta platforma, ale trzeba zdawać sobie sprawę z jej ograniczeń – brak wsparcia dla zaawansowanych funkcjonalności konkretnych mikroprocesorów, korzystanie w ciemno z kodu przygotowanego przez innych użytkowników i wchodzące w nawyk niewskazane praktyki programistyczne to tylko kilka przykładów pewnych niedogodności związanych ze środowiskiem Arduino.

Mimo tego niebywałą zaletą, o której już wspomniałem, jest prostota. Platformy Arduino, a co za tym idzie program służący do przygotowywania kodu, pozwala w szybki sposób przejść od pomysłu do funkcjonującego układu. Innymi słowy, wykorzystanie Arduino IDE do programowania Raspberry Pi Pico pozwala na szybkie prototypowanie wizji i pomysłów użytkownika, jednak przy docelowej wersji projektu warto rozważyć inny sposób przygotowania kodu.

Język MicroPython

Ciekawym sposobem programowania Raspberry Pi Pico W jest skorzystanie z języka MicroPython. O nim również mogliście już wcześniej słyszeć. Wywodzi się on z języka Python i jest w rzeczywistości jego implementacją zoptymalizowaną do pracy na mikrokontrolerach i systemach wbudowanych o ograniczonej mocy i zasobach.  

W ostatnich latach język Python zyskał w środowisku programistów sporą popularność, jest on lubiany zwłaszcza przez osoby ceniące prostotę i elastyczność kodu. MicroPython również charakteryzuje się tym, jak i wszystkimi innymi cechami języka skryptowego, przez co jest niezwykle przystępny zwłaszcza dla początkujących. Poza tym język ten wspiera wiele z gotowych bibliotek kodu i rozwiązań stosowanych w swoim oryginale, dzięki czemu podobnie jak Arduino IDE pozwala na szybkie i proste prototypowanie.

Trzeba jednak wiedzieć, że z MicroPythonem wiąże się kilka problemów. Język skryptowy sprawdza się w programowaniu komputerowym, jednak w systemie o ograniczonej wydajności, gdzie użytkownik musi zdawać sobie sprawę z obostrzeń sprzętu, nie sprawdza się najlepiej. Język ten nie daje pełnych możliwości w kontroli mikrokontrolera, można posłużyć się tutaj analogią mówiącą, że MicroPython opisuje bardziej co dany sprzęt ma robić, a nie jak dokładnie działać. To właśnie głównie z tego powodu społeczność MicroPythona jest jak na razie niewielka i nie zobaczymy go we większości rankingów popularności języków programowania w branży embedded. Warto jednak obserwować ten projekt, a nawet poznać pewne podstawy jego zastosowania, bo nikt nie wie, co przyniesie nam przyszłość.  

C/C++ SDK

Niekwestionowanym królem języków programowania w systemach wbudowanych jest C. Wykorzystywany jest on przez inżynierów i programistów już od bardzo wielu lat, a obecnie praktycznie nie ma układu mikroprocesorowego, który by go nie wspierał. Język C charakteryzuje się przede wszystkim pełną kontrolą nad sprzętem i niskim poziomem abstrakcji, co pozwala w pełni wykorzystać potencjał ukryty w układzie scalonym. Poza tym wokół C przez lata zgromadziła się niemała społeczność użytkowników, przez co znacznie łatwiej jest znaleźć odpowiedzi na nurtujące nas pytania. Dodatkowo trzeba wspomnieć, że kod wynikowy po kompilacji języka C jest optymalniejszy pod względem wykorzystywania zasobów, w porównaniu do języków skryptowych takich jak MicroPython.

Język C to jednak nie tylko same superlatywy, dla osób początkujących może on wydawać się nieco bardziej skomplikowany, zwłaszcza w porównaniu do języków skryptowych. Sam kod będzie też po prostu dłuższy i bardziej rozbudowany, przez co łatwiej o pomyłkę. Dodatkowo C opisać możemy jako mniej elastyczny, zwłaszcza przez fakt, że nie wspiera on automatycznego zarządzania pamięcią.

For power users… For hobbyists…

Pewnie domyślacie się już, że to właśnie C będzie językiem, którego używać będziemy w kolejnych materiałach. Warto tutaj zastosować się do rady, którą odnaleźć można na stronie internetowej Raspberry Pi Fundation. To właśnie język C znajdziemy w sekcji „For power users”, a przecież w przyszłości każdy chciałby być właśnie takim użytkownikiem. Nie jest wykluczone, że do Arduino IDEMicroPythona jeszcze wrócimy, ale bardziej w roli ciekawostek. Chcąc w pełni wykorzystać możliwości RPI Pico, musimy skorzystać z oferowanego przez producenta zestawu narzędzi C/C++ SDK. Poza tym, jeśli ktoś wiąże swoją przyszłość z elektroniką lub branżą embedde, warto jest poznać język C dogłębnie, ponieważ jest on w niej niezwykle często wykorzystywany. 

Kilka słów na koniec…

W tym materiale opisałem wam kilka możliwości programowania Raspberry Pi Pico oraz opowiedziałem nieco o programowaniu samym w sobie. Jak już wiecie, w kolejnych materiałach korzystać będziemy z języka C i nic nie stoi na przeszkodzie, aby teraz przygotować odpowiednie oprogramowanie i uruchomić nasz pierwszy projekt.

Źródła:

  • https://datasheets.raspberrypi.com/rp2040/rp2040-datasheet.pdf
  • https://datasheets.raspberrypi.com/picow/pico-w-datasheet.pdf
  • https://www.raspberrypi.com/products/rp2040/
  • https://en.wikipedia.org/wiki/Computer_programhttps://en.wikipedia.org/wiki/Read-only_memory

Jak oceniasz ten wpis blogowy?

Kliknij gwiazdkę, aby go ocenić!

Średnia ocena: 4.7 / 5. Liczba głosów: 41

Jak dotąd brak głosów! Bądź pierwszą osobą, która oceni ten wpis.

Podziel się:

Picture of Rafał Bartoszak

Rafał Bartoszak

Współpracujący z Botlandem elektronik, który dzieli się swoją wiedzą w  internecie. Entuzjasta systemów cyfrowych, układów programowalnych i mikroelektroniki. Pasjonat historii, ze szczególnym naciskiem na wiek XX.

Zobacz więcej:

Masz pytanie techniczne?
Napisz komentarz lub zapytaj na zaprzyjaźnionym forum o elektronice.

2 Responses

  1. Popraw jeśli się mylę ale kod skompilowany w Arduino napisany w C++ powiniem byc rownie wydajny jak ten z narzędzi producenta? Mogę zrozumieć że nie lubisz Arduino ale cały artykuł sugeruje ze wybór C to jedyne sensowne wyjście bo Arduino to jakiś Visual Basic czy coś 😉 a tak do końca to nie jest, prawda?

    1. I tak, i nie w prostych i nawet tych średnio zaawansowanych programach może nie być różnicy, te pojawiają się dopiero w tych bardziej rozbudowanych kodach. Choć z optymalizacją i wydajnością trzeba uważać, bo można wpaść w niekończące się koło i skończyć na assemblerze, bo to przecież on daje pełną kontrolę nad sprzętem. C jest według mnie dobrym wyborem pod kątem chęci nauki tego języka, natomiast samo Arduino i ich płytki bardzo lubię i chętnie z nich korzystam, właśnie ze względu na prostotę i szybkość, z jaką można coś zbudować.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

Ze względów bezpieczeństwa wymagane jest korzystanie z usługi Google reCAPTCHA, która podlega Polityce prywatności i Warunkom użytkowania.