Arduino IDE – co zamiast?

Arduino IDE moim zdaniem było (jest?) jednym z głównych źródeł sukcesu całego ekosystemu. Prosty program do pisania kodu na Arduino. To było główne założenie – łatwość wejścia w programowanie dla ludzi nie mających doświadczenia z tą dziedziną. To się kapitalnie udało, jednak gdy pracuje się z Arduino nieco bardziej intensywnie, to co było źródłem sukcesu, zaczyna irytować i uwierać.

Co mam przeciwko Arduino IDE?

Największy problem to zarządzanie bibliotekami. W każdym projekcie korzysta się z różnych bibliotek. Sęk w tym, że gdy pracujesz nad wieloma projektami to zwykle się okazuje, że niektóre z nich wymagają różnych wersji tej samej biblioteki.

Drugą bolączką jest próba uruchomienia projektu, który był napisany dawno temu. Czasem nam zdarza się wracać do kodu, który powstał 2, 3 albo i więcej lat temu. I nagle – projekt napisany w Arduino IDE, działający 2 lata temu nie może się nawet skompilować. Bo zmieniła się wersja Arduino IDE a wraz z nią wersja kompilatora. Biblioteki instalowane przez menadżera bibliotek są w najnowszych wersjach, a projekt potrzebował starych. I co gorsza nikt nie zapisał, które to były wersje. Trzeba przeglądać historie wydań konkretnych bibliotek by ustalić która to była ta “aktualna” w momencie tworzenia projektu.

Trzecie “przeciw” to nakładka nałożona na C++, dzięki której kod jest prostszy (nie trzeba deklarować nagłówków funkcji, wystarczy ją napisać i można używać w każdym miejscu kodu). Jeśli Twój projekt się rozrasta, okazuje się że nie da się go skutecznie podzielić na mniejsze części, bo ta nakładka zaczyna wariować i pojawiają się problemy z kompilacją kodu.

Co w takim razie zamiast?

Niemal od samego początku można było używać innych edytorów do programowania Arduino. Szybko pojawiły się rozszerzenia do Eclipse czy Visual Studio od Microsoftu. No cóż, rozwiązywały one pewnie większość problemów opisanych wyżej, ale stopień skomplikowania tych edytorów powoduje, że ciężko się na nie przenieść. Zwłaszcza jeśli mówimy jednak o osobach, które nie będą pracować w tych programach na okrągło.

Dlatego, gdy poznaliśmy Platformio, szybko się w nim zakochaliśmy i stało się dla nas podstawowym narzędziem pracy z kodem na Arduino.

Platformio składa się z dwóch głównych części. Pierwsza to Platformio Core. Zestaw skryptów napisanych w Pythonie. Przez interfejs CLI możemy kompilować, wgrywać programy korzystając z rożnych platform i środowisk.

Kluczem do rozwiązania ograniczeń Arduino IDE jest plik platformio.ini. Jest on rejestrem zawierającym informacje o projekcie. Zapisuje się w nim wszystkie informacje niezbędne do skompilowania. Na dodatek można tworzyć różne warianty środowisk z wykorzystaniem innych platform. I tak na przykład Twój projekt może kompilować się zarówno dla Arduino UNO jak i dla Arduino Mega. Tworzy się dwa środowiska w platformio.ini, można podać zestaw dyrektyw define przekazywanych do kompilatora i w prosty sposób można przełączyć się z jednej płytki na inną, skompilować i wgrać kod, a np piny do obsługi SPI “same” zostaną odpowiednio zdefiniowane. Różnice mogą być praktycznie dowolne, czyli np możesz utrzymywać dwa warianty kodu np dla ESP8266 i Arduino UNO.

W platformio.ini można zawrzeć informacje z których bibliotek korzysta Twój projekt. Nie tylko z których bibliotek ale możesz też wskazać które konkretnie wersje bibliotek. Nie tylko bibliotek, ale też samych frameworków. I tak możesz “zamrozić” wersję Arduino SDK i nie przejmować się, że wraz z nowym IDE wyszło nowe Arduino SDK z nowszą wersją kompilatora.

Ponieważ biblioteki instalowane są lokalnie w projekcie, dla każdego środowiska oddzielnie, więc nie ma już kolizji wersji – każde środowisko może mieć inną wersję i inny zestaw zainstalowanych bibliotek. Nie tylko różne projekty mogą mieć różne wersje bibliotek, ale również w jednym projekcie możesz mieć wersję np stabilną już nie rozwijaną i wersję testową, która korzysta z nowego SDK czy bibliotek.

Jako że Platformio Core napisany w Pythonie, można też swoje skrypty “podczepić” przed kompilacją albo po – to się już przydaje w bardziej skomplikowanych scenariuszach. Ale nie ukrywamy, że intensywnie z tego korzystamy przy kompilacji NAMF, firmware do naszych sensorów powietrza.

Może przykład

Aby unaocznić jakie to daje możliwości, spójrzcie na firmware do Pogodełka (repozytorium z oprogramowaniem: https://github.com/nettigo/pogodelko). Najnowsza wersja ma obsługę dwóch czujników od Boscha – BMP280 i BME280. Przykładowo można zrobić tak dwie wersje oprogramowania. W platformio.ini jest jedna wspólna sekcja [env] określająca wspólne parametry – procesor, framework, biblioteki.

platform = espressif8266
framework = arduino
board = nodemcuv2

Teraz to co najlepsze, czyli definicje bibliotek. Użycie zapisu @ oznacza konkretną wersję:

lib_deps =
    Adafruit Unified Sensor@1.1.4
    Adafruit BMP280 Library@2.0.1
    Adafruit BME280 Library@2.1.0
    LiquidCrystal_PCF8574@1.2.0

Tutaj jest baza danych bibliotek które można w ten sposób zainstalować, lista jest imponująca: https://platformio.org/lib. Ale nie jesteś skazany na listę gotowych bibliotek z bazy. Wpis w lib_deps może być linkiem do repozytorium git (np na GitHub) wraz z tagiem, więc może to być konkretna wersja biblioteki. Również URL do pliku ZIP zostanie zaakceptowany.

Potem są dwa warianty środowisk o nazwie [env:nodemcuv2_bmp] oraz [env:nodemcuv2_bme].

[env:nodemcuv2_bmp]
build_flags = -DBMP

[env:nodemcuv2_bme]
build_flags = -DBME

Jedyną różnicą są przekazywane do kompilatora flagi -DBMP oraz -DBME. Oznacza to, że w pierwszym przypadku będzie zdefiniowana etykieta BMP a drugim BME. Dzięki temu kod:

#ifndef BME
Adafruit_BMP280 bme(BMP_CS); // hardware SPI
#else
Adafruit_BME280 bme(BMP_CS); // hardware SPI
#endif

jeśli nie ma etykiety BME zdefiniuje sensor BMP (choć nadal będzie używał nazwy zmiennej bme). Dzięki temu w kodzie będzie wkompilowana obsługa właściwego sensora. Wystarczy wybrać właściwe środowisko i wgrać. Na moim laptopie może to być taka komenda:

pio run --target=upload -e nodemcuv2_bme --upload-port=/dev/ttyUSB1

Zmiana na

pio run --target=upload -e nodemcuv2_bpe --upload-port=/dev/ttyUSB1

Skompiluje i wgra wersję dla sensora BMP.

Core to nie wszystko

Nie musisz instalować w swoim systemie Platformio Core i potem korzystać z wiersza poleceń by kompilować i wgrać kod. Nie ukrywam, tak możliwość jest bardzo przydatna, ale w codziennej pracy nad kodem znaczeni lepiej korzystać z jakiegoś IDE. W Platformio sugerowanym rozwiązaniem jest VSCode. To edytor od Microsoftu, jednak jego stopień skomplikowania jest nieco mniejszy niż pełne Visual Studio. Rozpoczęcie pracy nie jest takie trudne.

VSCode jest sugerowanym edytorem – wystarczy zainstalować sam VSCode a potem skorzysać z instrukcji installacji Platformio IDE i gotowe.

Jeśli masz zaś swój jakiś ulubiony edytor, to jest szansa że znajdziesz do niego intergację z Platformio.