Arduino swój początek ma w roku 2003 we Włoszech. Student Hernando Barragán z placówki akademickiej Interaction Design Institute Ivrea w ramach pracy dyplomowej podjął się opracowania nowego środowiska programistycznego dla mikrokontrolerów. Rozwiązanie to otrzymało nazwę Wiring i w formie IDE oraz biblioteki z funkcjami pozwalało na tworzenie aplikacji dla układu ATmega168. Po ukończeniu tego projektu inni studenci tej samej uczelni (Massimo Banzi oraz David Mellis) rozbudowali Wiring o obsługę mikrokontrolerów ATmega8. Po tej modyfikacji nazwa Wiring została zastąpiona przez Arduino. Pierwsza, nieoficjalne jeszcze edycja Arduino ujrzała światło dzienne w roku 2005. Wraz z upływem czasu środowisko programistyczne było uzupełniane o płytki uruchomieniowe. Dzięki temu Arduino stało się kompletną platformą dla systemów wbudowanych składającą się zarówno z warstwy programowej, jak też sprzętowej. W takiej postaci Arduino zaczęło błyskawicznie zyskiwać ogólnoświatową popularność.
Ciekawa historia związana jest z nazwą, jaką ostatecznie przyjęła stworzona przez Włochów platforma projektowa. Słowo Arduino jest nazwą baru, który był miejscem spotkań studentów. Z kolei nazwa baru pochodzi od lokalnego szlachcica z okresu średniowiecza o imieniu Arduin, który piastował funkcję margrabiego Ivrei i był królem Włoch w latach 1002 – 1014.
Idea Arduino, czyli dla kogo?
Po zapoznaniu się z rysem historycznym Arduino nasuwa się pytanie dlaczego studenci zdecydowali się utworzyć i rozwijać nową platformę dla mikrokontrolerów. Aby zrozumieć ich motywację warto odbyć wirtualną podróż w czasie do roku 2003 i postawić się na chwilę w roli osoby chcącej na własną rękę rozpocząć przygodę z mikrokontrolerami. Okazuje się, że wtedy nie było to takie łatwe. Otóż w warstwie sprzętowej były dostępne głównie drogie płyty ewaluacyjne z mikrokontrolerami oraz również kosztowne programatory/debugery. Alternatywą było samodzielne wykonanie płytki oraz programatora, co z kolei wymagało odpowiednich umiejętności. Problem stanowić mogła również warstwa programowa.
Środowisko programistyczne mogło być wprawdzie dostępne bezpłatnie, niemniej jednak do pisania kodu w oparciu o dominującą wtedy metodę modyfikacji rejestrów niezbędna była dogłębna wiedza o mikrokontrolerze, a samo pisanie kodu operującego na rejestrach wymagało pewnego doświadczenia w programowaniu w języku C lub Assembler. Podsumowując – środki finansowe na zakup sprzętu, umiejętność lutowania, wiedza o architekturze układu, znajomość języka programowania w stopniu pozwalającym na pisanie kodu niskopoziomowego. Wszystkie te wymagania stanowiły nie lada wyzwanie i potrafiły przestraszyć lub nawet zniechęcić początkującą osobę. Włoscy studenci postawili sobie za cel stworzenie rozwiązania pozbawionego wymienionych niedogodności i tym samym maksymalnie przyjaznego niedoświadczonemu użytkownikowi.
Jakie są zatem główne cechy platformy Arduino?
- Cena – środowisko programistyczne Arduino jest bezpłatne, płytki z mikrokontrolerem są przystępne cenowo: koszt zazwyczaj na poziomie kilkunastu – kilkudziesięciu dolarów.
- Łatwość użycia – pisanie kodu zostało maksymalnie uproszczone przez zastąpienie skomplikowanej metody niskopoziomowej (modyfikacji rejestrów) przez łatwy do zrozumienia i użycia język Arduino posługującym się elementami języka C, np. funkcjami, pętlami i instrukcjami warunkowymi.
- Elastyczność – język Arduino umożliwia tworzenie aplikacji o różnym stopniu skomplikowania.
- Open source – kod oprogramowania Arduino jest otwarty i tworzy go społeczność internetowa.
- Unifikacja warstwy sprzętowej – płytki Arduino dysponują zestawem listew rozszerzeniowych zgodnym ze zdefiniowanym standardem.
- Wieloplatformowość – środowisko programistyczne Arduino jest dostępne dla trzech różnych systemów operacyjnych: Windows, Macintosh OSX i Linux.
Cechy te sprawiły, że Arduino zostało entuzjastycznie przyjęte przez osoby rozpoczynające przygodę z mikrokontrolerami. Rozwiązanie to chętnie wykorzystywane jest przez studentów kierunków związanych z elektroniką i informatyką np. do realizacji projektów akademickich takich jak nieskomplikowane roboty. Po Arduino chętnie sięga również młodzież szkolna, dla której platforma stworzona przez Włochów pozwala w łatwy sposób wkroczyć w świat elektroniki. W końcu Arduino jest też atrakcyjne dla osób nieaspirujących do roli elektronika, a więc wszelkiej maści hobbystów i nieprofesjonalistów. Za przykład posłużyć tu mogą artyści, którzy za pomocą Arduino są w stanie dodać elementy sterowania i prezentacji do swoich instalacji artystycznych np. tworząc motywy świetlne z użyciem diod LED.
Struktura Arduino
Chcąc lepiej poznać i zrozumieć czym jest Arduino warto przejść od ogólników do szczegółów. Platformę podzielić można na trzy obszary: warstwę sprzętową, warstwę programową oraz społeczność. Odpowiedni schemat blokowy pokazano na rysunku 1. Przyjrzyjmy się bliżej każdemu z tych obszarów.
Warstwa sprzętowa Arduino
Podstawę warstwy sprzętowej tworzą płytki uruchomieniowe z mikrokontrolerami. Historycznie pierwszymi układami wspieranymi przez Arduino były 8-bitowe mikrokontrolery AVR. Współpraca twórców Arduino z firmą Atmel (obecnie Microchip) będącą producentem układów AVR zaowocowała stworzeniem na przestrzeni lat grupy płytek z układami ATmega należącymi do rodziny AVR:
- ARDUINO UNO z mikrokontrolerem ATmega328P
- ARDUINO LEONARDO oraz ARDUINO MICRO, obie z mikrokontrolerem ATmega32u4
- ARDUINO NANO oraz ARDUINO ETHERNET, obie z mikrokontrolerem ATmega328
- ARDUINO MEGA z mikrokontrolerem ATmega2560
Idąc z duchem czasu w roku 2012 Arduino wprowadziło do użytku pierwszą płytkę uruchomieniową z 32-bitowym mikrokontrolerem opartym na rdzeniu ARM Cortex-M. Obecnie grupa płytek z Cortexowymi układami Atmela liczy 3 sztuki:
- ARDUINO DUE z mikrokontrolerem AT91SAM3X8E (Cortex-M3)
- ARDUINO M0 PRO oraz ARDUINO MKR ZERO, obie z mikrokontrolerem ATSAMD21G18 (Cortex-M0+)
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.
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 pewien 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 jako 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.
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 http://bit.ly/2ItlykE. 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. 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.
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.
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.
Społeczność Arduino
Istotnym filarem uzupełniającym warstwę sprzętową i programową Arduino jest prężnie działająca społeczność skupiona wokół tej platformy. Pierwszym elementem aktywności społeczności jest forum dyskusyjne, gdzie doświadczeni użytkownicy dzielą się wiedzą i odpowiadają na pytania osób rozpoczynających przygodę z Arduino. Kolejnym elementem społeczności jest blog, na którym publikowane są artykuły tematycznie związane z Arduino. Jeszcze innym miejscem aktywności społeczności jest tak zwany Project Hub. Jest to repozytorium projektów, z którymi użytkownicy mogą nie tylko zapoznać się czytając opis lub oglądając film, ale również mogą podjąć się samodzielnego wykonania projektu, gdyż opis niejednokrotnie zawiera instrukcję realizacji krok po kroku. Ostatnim elementem należącym do społeczności jest Arduino Playground, które traktować należy jako kompendium wiedzy o Arduino.
Arduino i STM32
Rok 2017 zmienił oblicze Arduino. Twórcy platformy zawarli porozumienie z firmą ARM, na mocy którego obie instytucje zadeklarowały chęć współpracy. Jak wiadomo firma ARM nie produkuje układów półprzewodnikowych, jednakże projektuje rdzenie mikrokontrolerowe oraz gromadzi wokół siebie wielu partnerów, w tym firmy produkujące mikrokontrolery wykorzystujące architekturę ARM. Dzięki zawartemu z ARMem porozumieniu Arduino zachowało pełną niezależność i jednocześnie otworzyło sobie drzwi do współpracy znacznie szerszej niż historyczne partnerstwo z firmą Atmel. I tak właśnie dzięki wspólnym wysiłkom i zaangażowaniu twórców Arduino, społeczności Arduino oraz firmy STMicroelectronics możliwe stało się pracowanie z mikrokontrolerami STM32 korzystając z platformy Arduino. Schemat blokowy pokazujący w jaki sposób mikrokontrolery STM32 wraz z ekosystemem zostały zespolone z platformą Arduino pokazano na rysunku 4.
Aby zachować przyjętą wcześniej konwencję zacznijmy od warstwy sprzętowej. Dla mikrokontrolerów STM32 firma STMicroelectronics oferuje trzy rodzaje płytek uruchomieniowych:
- płytki Nucleo dysponujące głównie mikrokontrolerem i programatorem/debuggerem. Płytki występują w trzech formatach: Nucleo-32, Nucleo-64 oraz Nucleo-144 (liczba informuje ile wyprowadzeń ma obudowa użytego na płytce mikrokontrolera).
- płytki Discovery będące lepiej wyposażone od płytek Nucleo i dysponujące nie tylko mikrokontrolerem i programatorem/debuggerem, ale w zależności od modelu również dodatkowymi podzespołami takimi jak wyświetlacz, czujniki, gniazda komunikacyjne itp.
- płytkami eval board, które dysponują najbogatszym wyposażeniem.
Wszystkie płytki z serii Nucleo są kompatybilne ze standardem Arduino. Grupa ta liczy obecnie 42 sztuki i pozwala na pracę z każdą rodziną mikrokontrolerów STM32. Modele Nucleo-64 oraz Nucleo-144 dysponują listwami sygnałowymi zgodnymi z typowym systemem połączeń Arduino. Z kolei modele Nucleo-32 wyposażone są w listwy sygnałowe zgodne z systemem połączeń Arduino Nano. Seria płytek Discovery w pewnej części jest zgodna ze standardem Arduino. Starsze płytki z tej grupy nie dysponują listwami kompatybilnymi z Arduino. Sytuacja zmieniła się diametralnie około dwóch lat temu, od kiedy to każda nowa płytka Discovery dysponuje listwami zgodnymi z typowym systemem połączeń Arduino. Takich platform jest obecnie kilkanaście. Ostatni rodzaj płytek, a więc eval board, nie wspiera Arduino. Przykładowe zdjęcie płytek uruchomieniowych STM32 Nucleo i STM32 Discovery kompatybilnych w warstwie sprzętowej z Arduino pokazano na rysunku 5.
Oprócz płytek uruchomieniowych zgodnych z Arduino, a więc STM32 Nucleo i STM32 Discovery, firma STMicroelectronics oferuje szeroką gamę płytek rozszerzeniowych kompatybilnych ze standardem stworzonym przez Włochów. Takich płytek jest na dzień dzisiejszy łącznie 51. Dają one możliwość rozbudowania płytki uruchomieniowej o podzespoły takie jak czujniki środowiskowe/odległości/MEMS, sterowniki silnika DC/BLDC/krokowego/3-fazowego, obwód audio, komunikację Bluetooth/sub-1 GHz (w tym LoRa)/Wi-Fi/USB typ C/NFC/PLC, wzmacniacze operacyjne, czy też kontroler LED. Kilka przykładowych płytek rozszerzeniowych pokazano na rysunku 6.
Przejdźmy teraz do warstwy programowej. Obsługa układów STM32 nie jest aktywna domyślnie w Arduino IDE. W związku z tym osoba chcąca używać mikrokontrolerów firmy STMicroelectronics musi odpowiednio skonfigurować środowisko programistyczne. Czynność ta sprowadza się do zainstalowania pakietu o nazwie STM32duino. Jako że nie jest to oficjalny pakiet Arduino i nie znajduje się on pod adresem internetowym, do którego Arduino IDE się odnosi, użytkownik musi w pierwszym kroku wskazać środowisku adres właściwy dla STM32duino. W tym celu należy z menu głównego wybrać pozycję File, a następnie Preferences. W wyniku tego otworzone zostanie okno Preferences. W pierwszej zakładce o nazwie Settings zlokalizować należy pole Additional Boards Manager URL, a następnie trzeba je wypełnić następującym adresem: http://bit.ly/2OkMbNL. Zatwierdzenie zmian odbywa się naciśnięciem przycisku OK. Opisane czynności zobrazowano na rysunku 7.
Gdy adres STM32duino jest wprowadzony, w drugim kroku użytkownik może zająć się instalacją pakietu. W tym celu z menu głównego należy wybrać kolejno pozycje Tools, Board i na końcu Boards Manager… W ten sposób otworzone zostanie okno Boards Manager, które pozwala na nawigowanie po dostępnych pakietach i instalowanie tych wybranych przez użytkownika. Aby łatwiej zlokalizować pakiet dla mikrokontrolerów STM32 warto wpisać jego nazwę w polu wyszukiwania. Jest to mianowicie nazwa STM32 cores. Po odnalezieniu właściwego pakietu należy na niego kliknąć, co spowoduje wyświetlenie przycisku Install. Po jego kliknięciu proces pobierania i instalowania pakietu rozpocznie się. Gdy czynność ta zostanie ukończona, należy zamknąć okno klikając przycisk Close/OK. Opisane czynności zobrazowano na rysunku 8.
Ten krok kończy etap konfiguracji Arduino IDE. Środowisko programistyczne jest gotowe do pracy z mikrokontrolerami STM32. W tym momencie użytkownik może wskazać płytkę uruchomieniową, którą zamierza używać. Wyboru dokonuje się z poziomu menu głównego. Pozycja Tools, a następnie Board pozwala na wybranie rodzaju płytki tzn. Discovery, Nucleo-32, Nucleo-64 lub Nucleo-144. Z kolei pozycja Tools, a następnie Board Part Numbers umożliwia wybranie konkretnego modelu płytki z wybranej wcześniej grupy. Poniżej zamieszczono listę płytek wspieranych na dzień dzisiejszy przez zainstalowany pakiet:
- STM32F0: Nucleo F030R8, Nucleo F091RC, 32F0308DISCOVERY
- STM32F1: Nucleo F103RB, STM32VLDISCOVERY, BluePill F103C8, MapleMini F103CB
- STM32F2: Nucleo-F207ZG
- STM32F3: Nucleo F302R8, Nucleo F303K8, Nucleo F303RE
- STM32F4: Nucleo F401RE, Nucleo F411RE, Nucleo F429ZI, Nucleo F446RE, STM32F407G-DISC1
- STM32F7: STM32F746G-DISCOVERY
- STM32L0: Nucleo L031K6, Nucleo L053R8, B-L072Z-LRWAN1
- STM32L1: Nucleo L152RE
- STM32L4: Nucleo L432KC, Nucleo L476RG, Nucleo L496ZG, Nucleo L496ZG-P, B-L475E-IOT01A
Na koniec warto wspomnieć, że pakietowi STM32duino poświęcone jest dedykowane forum, którego adres to http://bit.ly/2zECIso. Jest to z pewnością najlepsze miejsce dla osób, które mają pytanie techniczne, szukają konkretnego przykładu lub po prostu chcą dowiedzieć się więcej o wsparciu dla układów STM32 w Arduino IDE.
Podsumowanie
Pierwsza część artykułu stanowi wprowadzenie do platformy Arduino. Druga część materiału prezentuje jak rozpocząć pracę z Arduino i mikrokontrolerami STM32 w warstwie sprzętowej i programowej.
Tematyką kolejnego artykułu z tej serii będą proste projekty programistyczne demonstrujące sposób, w jaki tworzy się aplikacje za pomocą środowiska programistycznego Arduino. Użytymi peryferiami będą porty wejścia/wyjścia (aplikacja: sterowanie diodą LED oraz odczytywanie stanu przycisku), przetwornik A/C (aplikacja: odczytywanie napięcia na pinie mikrokontrolera), interfejs UART (aplikacja: komunikacja szeregowa z komputerem) oraz Timer (wytwarzanie na pinie sygnału PWM).
Szymon Panecki
STMicroelectronics
szymon.panecki@st.com