STM32Duino: Arduino dla STM32 (cz.1)
Programator
Drugim po mikrokontrolerze, niezwykle istotnym elementem płytki uruchomieniowej jest programator. Jego rolą jest zapisanie pliku wykonywalnego stworzonego przez środowisko programistyczne na podstawie kodu źródłowego w pamięci mikrokontrolera. Rozwiązanie zastosowane przez Arduino jest niezwykle proste. Programowanie odbywa się z wykorzystaniem umieszczonego w pamięci mikrokontrolera bootloadera. Bootloader to program, który za pomocą interfejsu komunikacyjnego poprzez prosty protokół odbiera dane z komputera i zapisuje je pod wskazany adres pamięci mikrokontrolera.
Danymi są jak można się łatwo domyśleć fragmenty pliku wykonywalnego, natomiast adres pamięci jest zwiększany z każdym cyklem zapisu. W ten sposób po wielu iteracjach tej samej czynności kompletny plik wykonywalny zostaje zapisany w pamięci mikrokontrolera. Używanym przez bootloader w Arduino interfejsem komunikacyjnym jest UART, w związku z czym do komunikacji z komputerem wymagany jest most USB-UART, a więc układ pełniący funkcję wirtualnego portu COM. W roli tej na płytkach uruchomieniowych Arduino wykorzystywany jest popularny układ firmy FTDI lub mikrokontroler firmy Atmel wykonujący aplikację o tej samej funkcjonalności.
Porty IO
Ostatnim elementem charakterystycznym dla płytek uruchomieniowych Arduino, na który warto zwrócić uwagę, są listwy sygnałowe. Są to łącznie cztery pojedyncze listwy: dwie 8-pinowe, jedna 6-pinowa oraz jedna 10-pinowa. Udostępniają one sygnały pochodzące z pinów mikrokontrolera: porty analogowe będące wejściami przetwornika A/C, zasilanie oraz porty cyfrowe będące wejściami/wyjściami ogólnego przeznaczenia lub pełniące rolę interfejsów komunikacyjnych bądź wyjść timerów. Co istotne, rozmieszczenie względem siebie wspomnianych czterech listew jest ściśle określone, tak samo jak przyporządkowanie sygnałów do pinów listew.
Całość tworzy zatem standard. Dzięki takiemu podejściu powszechne stało się projektowanie płytek rozszerzeniowych (shields) kompatybilnych z płytkami uruchomieniowymi. Poprzez łączenie tych dwóch typów płytek za pomocą listew możliwe stało się budowanie w prosty sposób platform prototypowych o określonej funkcjonalności np. mikrokontroler + czujniki, mikrokontroler + moduł GSM/GPS, mikrokontroler + wyświetlacz itp. Co więcej, dopuszczalne jest łączenie płytki uruchomieniowej z więcej niż jedną płytką rozszerzeniową jednocześnie, metodą „jedna na drugą”, co daje użytkownikom Arduino dużą elastyczność i swobodę projektowania.
Warto dodać, że oprócz klasycznego formatu Arduino istnieje również forma miniaturowa, zwana Arduino Nano. W tej wersji płytka uruchomieniowa jest niezwykle mała i udostępnia tylko dwie listwy sygnałowe (każda dysponuje 15 pinami).
Wszystkie trzy omówione do tej pory elementy warstwy sprzętowej (mikrokontroler, programator, listwy sygnałowe) zilustrowano na rysunku 2.
Rys. 2. Rysunek przedstawiający kluczowe elementy płytki uruchomieniowej Arduino
Warstwa programowa Arduino
Warstwę programową platformy Arduino stanowi środowisko programistyczne – Arduino IDE. Dostępne jest ono w dwóch postaciach: klasycznym wydaniu instalowanym na komputerze oraz edycji online o nazwie Arduino Web Editor. Obie wersje oferują tą samą funkcjonalność i zbliżony wyglądem interfejs użytkownika. Różnicą jest natomiast fakt, że w wersji klasycznej pliki środowiska wraz z projektami użytkownika przechowywane są na dysku twardym, natomiast w wersji online dostęp do środowiska odbywa się z poziomu przeglądarki internetowej, a projekty przechowywane są w chmurze.
W artykule skupimy się na klasycznej wersji środowiska programistycznego Arduino IDE. Plik instalacyjny można pobrać ze strony internetowej pod adresem https://www.arduino.cc/en/Main/Software. Najbardziej aktualną wersją środowiska w momencie pisania artykułu jest rewizja 1.8.5. Chcąc pobrać plik instalacyjny należy wskazać wersję odpowiednią dla użytkowanego systemu operacyjnego: Windows, Linux lub Mac OS X. Po kliknięciu jednej z wymienionych opcji otworzone zostanie okno, w którym możliwe stanie się rozpoczęcie pobierania pliku. Instalacja przebiega w sposób typowy – w kilku krokach z wybraniem ścieżki na dysku twardym wskazującej miejsce zapisania plików środowiska programistycznego.
Po pomyślnym zakończeniu instalacji środowisko Arduino jest gotowe do pracy. Wraz z jego uruchomieniem użytkownikowi ukazuje się ekran główny.
Pozycje menu
Pokazano go na rysunku 3. Na samej górze okna znajduje się menu główne. Składa się ono z pięciu pozycji:
• File – pozycja pozwalająca na operacje na plikach: tworzenie nowych projektów (Sketches), otwieranie istniejących projektów (w tym gotowych przykładów), zapisywanie otwartych projektów i drukowanie kodu otwartych projektów. Ponadto pozycja ta pozwala na otworzenie okna ustawień (Preferences) środowiska programistycznego.
• Edit – pozycja pozwalająca na operacje na treści projektów (kodzie i komentarzach): cofanie zmian, kopiowanie, wklejanie, zaznaczanie, przejście do linii o wskazanym numerze, szukanie wskazanych fraz.
• Sketch – pozycja pozwalająca na operacje na otwartym projekcie: kompilowanie kodu, wgrywanie pliku wykonywalnego do pamięci mikrokontrolera (programowanie), dodawanie bibliotek i plików zewnętrznych.
• Tools – pozycja pozwalająca na konfigurację i używanie narzędzi, między innymi: włączenie terminala komunikacji szeregowej, wybranie używanej platformy sprzętowej, wybranie potu COM, do którego przypisana została przez system operacyjny platforma sprzętowa.
• Help – pozycja pozwalająca na korzystanie z pomocy, głównie odnośników do podstron na portalu Arduino.
Ikony skrótów
Tuż poniżej menu głównego usytuowane są ikony będące skrótami do najczęściej używanych funkcji. Zaczynając od lewej strony są to: ikona do kompilowania projektu, ikona do programowania mikrokontrolera, ikona do stworzenia nowego projektu, ikona do otworzenia istniejącego projektu oraz ikona do zapisania aktualnie otwartego projektu.
Pod ikonami znajduje się nazwa projektu, a pod nią pole z kodem źródłowym projektu. Stworzony od nowa projekt nie jest pusty. Domyślnie znajdują się w nim dwie funkcje: setup oraz loop. Jak łatwo się domyśleć, w ciele funkcji setup programista umieszcza funkcje, które wykonać mają się jeden raz. Są to funkcje konfigurujące peryferia mikrokontrolera. Równie intuicyjnie można rozszyfrować znaczenie funkcji loop. W jej ciele programista umieszcza funkcje, które wywoływane będą cyklicznie. Są to funkcje realizujące konkretne zadania przewidziane mikrokontrolerowi przykładowo odczytywanie stanu przycisku, sterowanie diodą LED, wysyłanie danych do komputera, wyświetlanie treści na wyświetlaczu i wiele innych.
Pod polem z kodem źródłowym przewidziano miejsce na jedną linię tekstu informującego o wyniku procesu kompilacji. Podczas kompilacji obok komunikatu widoczny jest zielony pasek pokazujący postęp kompilacji.
Komunikaty
Jeszcze niżej znajduje się pole z komunikatami generowanymi przez środowisko programistyczne. Podczas kompilacji komunikaty te informują szczegółowo programistę o kolejnych czynnościach wykonywanych przez kompilator. Po udanej kompilacji prezentowane są z kolei informacje o wielkości pamięci Flash i SRAM wykorzystywanych przez aplikację i procentowy udział użytej pamięci w całości dostępnej pamięci mikrokontrolera.
Na samym dole ekranu wyświetlone są informacje o używanej platformie sprzętowej, poziomie wybranej optymalizacji kompilatora oraz numerze wybranego portu COM służącego do programowania mikrokontrolera i komunikacji szeregowej między aplikacją mikrokontrolera i terminalem komputera.
Rys. 3. Widok ekranu głównego Arduino IDE