VS Code

Arduino Programmieren wie die Profis mit VS Code und Platform IO

In diesem Beitrag soll einerseits gezeigt werden warum es sich lohnt eine Alternative zur klassischen Arduino IDE anzuschauen und andererseits eine Step-by-Step Anleitung zur Installation von VS Code mit dem Arduino Plugin Platform IO vorgestellt werden.

Warum eine IDE ?

Grundsätzlich ist eine IDE (Integrated-Development-Environment) eine Ansammlung bzw. Bündelung von Werkzeugen um den Prozess der Softwareentwicklung zu vereinfachen. Anstatt vieler einzelner Programme für die unterschiedlichen Aufgaben des Entwicklungsprozesses sind alle wichtigen Werkzeuge in einem Programm integriert bzw. können von diesem aus angestoßen werden.

Zu den wichtigsten Funktionen gehört unter anderem:

  1. Spezieller Texteditor, der Schlüsselwörter etc. einer Programmiersprache hervorhebt (Syntax-Highlighting)
  2. Autovervollständigung von Schlüsselwörtern und Variablennamen während der Eingabe (Intellisense)
  3. Einfügen vorgefertigter Codeschnipsel, z.B. eines if-else Blocks oder einer for-Schleife (Code-Snippets)
  4. Anzeigen von Funktionsdefinitionen bei Eingabe oder Mouse-Hover.
  5. Springen zu Definitionen oder Deklarationen in externen Dateien, z.B. Bibliotheken
  6. Eine Übersichtsliste mit Funktionen (Outline)
  7. Fehlersuche mittels Einzelschritten und Haltepunkten (Debugging). Stellt jedoch auch Anforderungen an den Controller und deren Schnittstelle und ist bei den Arduino-Modulen generell nicht ohne Weiteres möglich.
  8. Anbindung an Versionsverwaltung z.B. github

Es gibt für jede Programmiersprache eine spezialisierte IDE. Einige IDE’s „beherrschen“ mehrere Sprachen oder es lassen sich Sprachen mithilfe von Erweiterungen ergänzen. Es gibt viele IDE’s die spezialisiert sind oder in Bezug auf bestimmte Programmiersprachen herausragende Eigenschaften haben (wie z.B. PyCharm für Python). Ohne jetzt zu sehr auf unterschiedliche IDE’s einzugehen, wollen wir im Weiteren die beliebte IDE VS Code mit der Arduino IDE näher betrachten. Da ich euch jedoch keine IDE’s verheimlichen möchte hier eine Liste auf Wikipedia.

Viele dieser Funktionen werden durch die V1.x Versionen der Arduino IDE nicht abgedeckt, was das Programmieren oft unkomfortabel und teilweise mühsam macht. Hier kommt VS Code ins Spiel.

Inzwischen wurde eine nicht kompatible V2.x Version der Arduino IDE von Grund auf neu entwickelt. Sie bringt einige der oben genannten Funktionen mit und ist in Bezug auf Komfort deutlich besser als die V1.x. Andererseits hat sie aber noch ein paar Kinderkrankheiten (siehe Issues auf github und Feedback im Forum).

VS Code

Visual Studio Code (VS Code) ist die IDE meiner Wahl, da es kostenlos, für mehrere Betriebssysteme verfügbar und dank vieler verfügbarer Plugins bzw. Extensions unheimlich flexibel ist. VS Code ist 2015 erschienen und in Javascript programmiert. Quelle: VS Code auf wikipedia.de.

Im Top-IDE-Ranking belegt VS Code aktuell den zweiten Rang, was ebenfalls ein Argument ist es zumindest mal auszuprobieren. Aber genug des Vorgeplänkels wir wollen ihn nun mit Arduino zum Laufen bringen.

Installation unter Linux

Zunächst die Installation unter Linux, denn ich arbeite gern mit einer virtuellen Linux Maschine. Das hat für mich alleine schon den Vorteil, dass man seinen „Haupt-Windows-Rechner“ nicht mit allen möglichen Programmen -die man vielleicht auch nur mal kurz ausprobiert- zumüllt, wodurch im Laufe der Zeit der Rechner immer langsamer und langsamer wird. Außerdem gibt es einige Dinge die unter Linux auch einfach besser laufen bzw. einfacher sind als unter Windows. Zudem hat man mit Lizenzen kein Problem, da das Linux open source ist und es kostenlose Images gibt.

Für die Virtualisierung nutze ich das ebenfalls kostenlose VirtualBox von Oracle. Wie man eine virtuelle Maschine aufsetzt ist in diesem Beitrag beschrieben.

Die eingesetzte Linux Version ist Linux Mint 21.2 „Victoria“ mit dem XFCE Desktop der besonders sparsam mit Ressourcen umgeht.

Schritt 1: VS Code herunterladen und installieren

Zunächst muss unter https://code.visualstudio.com/download das für das Betriebssystem passende Paket ausgewählt werden. In unserem Fall also .deb

Die heruntergeladene .deb Datei kann (im Ordner Downloads stehend) mit

sudo apt install ./code_1.80.1-1689183569_amd64.deb

installiert werden. Der Dateiname muss natürlich angepasst werden. Anschliessend kann mit dem Befehl code VS Code gestartet werden. Zu Beginn wird man begrüßt, nach einem Theme (dem Aussehen) gefragt und ob man das Sprachpaket installieren möchte falls erkannt wird dass das Betriebssystem z.B. in deutsch installiert ist.

VS Code

Wir wählen das deutsche Sprachpaket und bleiben bei den „Dark Modern“ Farben (Als erledigt markieren) und haben damit die Installation und den ersten Start abgeschlossen.

Schritt 2: PlatformIO IDE Plugin installieren

Für die Arduino Programmierung setzen wir das Plugin PlatformIO ein. Das ist mit inzwischen knapp doppelt sovielen Installationen deutlich beliebter als das originale Arduino Plugin (3,5 zu 1,8 Millionen Installation, Stand 24.07.23). Außerdem ist die Installation von PlatformIO komfortabel, da man dort nicht separat die Arduino IDE bzw. CLI installieren muss. Die Installation erfolgt komfortabel über den VS Code Marketplace.

Während der Installation kam bei mir die Meldung „PlatformIO: Can not find working Python 3.6+ Interpreter.“ Das konnte ich mit folgendem Befehl lösen

sudo apt install python3-venv

Damit dieses Problem gar nicht erst auftritt könnt ihr diesen Befehl also am Besten ausführen, bevor anschließend dann das Plugin installiert wird. Dazu einfach in den Marketplace wechseln und nach „Arduino“ oder direkt „PlatformIO“ suchen.

Sobald die Meldung kommt, dass das Plugin erfolgreich installiert worden ist und man VS Code neustarten soll kommen wir dem nach.

Bei dieser Fehlermeldung müssen noch die Python Virtual Environments installiert werden (s.o.).

Schritt 3: Erstes Projekt mit Blink und seriellem Monitor

Nach der Installation und dem Neustart hat man einen neuen Menüpunkt über den man ein neues Projekt mit PlatformIO anlegen kann:

Es öffnet sich der Projekt-Wizard in dem man den Projektnamen, das verwendete Board und das Framework (= Programmiergerüst) auswählt:

Ist der Wizard mit „Finish“ bestätigt öffnet sich, nachdem der Sicherheitsdialog mit „Ja, ich vertraue den Autoren“ beantwortet wurde, die Projektansicht mit der platformio.ini-Konfigurationsdatei.

Die Projektstruktur die PlatformIO automatisch angelegt hat ist ein Vorschlag. Für unseren ersten Test ist die Datei main.cpp im Ordner src wichtig und dort finden wir unsere gewohnte Arduino-Code-Struktur, die auch durch PlatformIO etwas erweitert ist mit einem exemplarischen Funktionsaufruf von myFunction(). Die können wir löschen und Blink einbauen erweitert um eine serielle Ausgabe damit wir uns den seriellen Monitor auch anschauen können. Übersetzt und mit dem Haken-Icon oben rechts:

Bevor jedoch hochgeladen werden kann müssen zunächst noch udev-Regeln installiert werden. Das hat bei mir mit folgenden Befehlen geklappt:

curl -fsSL https://raw.githubusercontent.com/platformio/platformio-core/develop/platformio/assets/system/99-platformio-udev.rules | sudo tee /etc/udev/rules.d/99-platformio-udev.rules
sudo service udev restart
sudo usermod -a -G dialout $USER
sudo usermod -a -G plugdev $USER

Falls diese Befehle bei euch nicht klappen kann in der PlatformIO-Doku vielleicht eine Lösung gefunden werden.

Wie üblich müssen wir noch vor dem Hochladen den passenden COM-Port auswählen (wenn Auto nicht klappt oder mehrere Arduinos verbunden sein sollten). Bei mir wird /dev/ttyUSB0 durch Auto erkannt. Durch die „Project Task“ Upload and Monitor wird unser Testprogramm hochgeladen und anschließend direkt der serielle Monitor gestartet:

Noch ein Hinweis / Tipp:

Der USB-Port /dev/ttyUSB0 wurde bei mir zunächst nicht angezeigt. Ich musste erst sudo apt remove brltty ausführen und den Arduino entfernen und wieder verbinden.

Library hinzufügen

Eine Aufgabe mit der man häufig konfrontiert ist, ist das Hinzufügen einer Bibliothek. Das geht mit platform.io auch recht einfach:

In dem Suchfeld einfach die gewünschte Lib eingeben (hier: max6675 von adafruit) und dann das Projekt auswählen zu dem die Lib hinzugefügt werden soll:

Dies führt zu einem Eintrag in der platformio.ini:

lib_deps = adafruit/MAX6675 library@^1.1.0

Und zu einem Ordner .pio/libdeps/megaatmega2560/MAX6675 library innerhalb des Projektordners in dem die automatisch heruntergeladene Lib gespeichert ist.

Dann kann die Lib über #include max6675.h in das Arduino Programm eingebunden und benutzt werden.

Weitere Boards wie D1 mini hinzufügen

Boards wie der D1 Mini müssen (ähnlich wie bei der Arduino IDE) einmal installiert werden. Dies geschieht über PlatformIO -> Platforms -> Embedded -> esp8266 suchen -> installieren.

IDE Funktionen im Detail

Nachdem das erste Testprogramm erfolgreich hochgeladen wurde wollen wir noch einmal kurz darauf zurückkommen warum wir uns die Mühe überhaupt gemacht haben und greifen die oben genannten IDE-Funktionen noch einmal auf.

Syntax Highlighting

Die Schlüsselwörter werden durch den Editor farblich hervorgehoben. Das ist auf den obigen Bildern bereits zu sehen. Dieses Feature bietet die Arduino IDE selbst zum Teil und ist daher hier nicht der große Game-Changer.

Intellisense

Hier wird es schon interessanter, denn mir geht es oft so, dass ich zwar noch ungefähr weiß wie die Funktionen oder Variablen heißen, aber bezüglich der genauen Schreibweise bin ich mir manchmal nicht mehr sicher. Hier kommt Intellisense ins Spiel denn hat man die ersten Buchstaben getippt kann mit der Tastenkombination STRG+Leertaste eine Liste mit Vorschlägen angezeigt werden. Daraus kann man den richtigen Treffer auswählen und mit TAB oder Enter eintragen lassen. Je nach Einstellung wird die Liste auch automatisch während der Eingabe angezeigt.

Code-Snippets

Mit Code-Snippets lässt sich Tipparbeit sparen in dem fertige Ausschnitte für if, for, while, etc einfügen lassen:

Anzeige von Funktionsdefinitionen

Oft kann man teilweise schwer auffindbare Fehler vermeiden, das Programm bezüglich Laufzeit und Speicher optimieren und / oder einen sauberen Programmierstil anwenden wenn man z.B. einer (Bibliotheks-)Funktion direkt den passenden Datentyp übergibt. Mit der Arduino IDE sieht man aber auf Anhieb nicht welchen Datentyp die Funktion denn erwartet. Dies sieht man mit VS Code bereits während der Eingabe oder wenn man mit der Maus über der Funktion stehen bleibt:

Springen zu Definition/Deklaration

Mit der Anweisung Gehe zu Definition kann man schnell mal zur Umsetzung innerhalb einer Bibliotheksfunktion springen, was gelegentlich mal ganz nützlich ist (Wird Wire.begin() schon dort aufgerufen oder muss ich es im Programm machen?). Es hilft auch bei dem eigenen Projekt sollte das mal etwas größer werden.

Hier sieht man nebenbei auch das zweigeteilte Editorfenster. Das ist (bei größeren Projekten) auch extrem praktisch.

Outline (Gliederung)

Mit einem Outline kann man sich schnell einen Überblick über alle Funktionen (und globalen Variablen), die in einer Datei vorkommen, verschaffen. Damit lässt sich auch schnell navigieren.

Es gibt noch viele, viele weitere Funktionen, die aber zweifelsohne den Inhalt dieses Artikels sprengen würden. Für weitere Recherche lohnt sich ein Blick in die Doku von VS Code und PlatformIO:

https://code.visualstudio.com/docs

https://docs.platformio.org/en/latest/integration/ide/pioide.html

Fazit

Mit einer „professionellen“ IDE lässt sich durch die vielen zusätzlichen und komfortablen Funktionen viel Zeit sparen und der Programmcode eleganter gestalten. Die Zeit für die einmalige Installation und Einrichtung der IDE hat man sehr schnell wieder reingeholt. Ebenso lohnt es sich meist sich mit weiteren Features zu beschäftigen, denn die Produktivität beim Programmieren lässt sich in der Regel um ein Vielfaches steigern und lohnt sich selbst für Hobbyprogrammierer 🙂


Beitrag veröffentlicht

in

von

Kommentare

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert