Platformio als IDE

Eines vorweg: Dieses Tutorial richtet sich nicht an blutige Einsteiger. Es wird von den Projektverantwortlichen nicht supportet und eignet sich eher für Leute, die schon ein wenig mit der Arduino IDE (IDE = Entwicklungsumgebung) gearbeitet haben und vielleicht selbst am Code etwas anpassen möchten. Es soll keine vollumfängliche Anleitung für sämtfile Aspekte darstellen, sondern lediglich den Einstieg vereinfachen.
Das Ganze geht aus Software zurückspielen - #22 von biologist hervor. Da das Thema dort sonst off topic wird, mache ich hier einen neuen Thread auf. Dort habe ich groß getönt, also liefere ich jetzt hier :slight_smile:

Die Arduino-IDE ist speziell für den Einstieg ein sehr hilfreiches Tool, da man inbesondere mit den ganzen Code-Beispielen quasi alles „beisammen“ hat. Man lernt erst nach und nach, wie man diese ganzen Quellen selbst im Internet findet, insofern erleichtert dies den Einstieg enorm. Wenn man allerdings selbst anfängt zu programmieren, so wird man recht schnell einen gescheiten Code-Assistenten zu schätzen wissen. Möglicherweise tritt auch die Anforderung einer Code-Versionierung in den Fokus; es gibt verschiedene, jedoch insbesondere git ist hierbei aktuell extrem populär. Diese ist bei der nachfolgenden Software out of the box dabei.

An dieser Stelle möchte ich https://platformio.org/ ins Spiel bringen. Es handelt sich hierbei um ein Plugin/Addon, welches mit diversen Editoren und IDEs benutzt werden kann (Cloud & Desktop IDEs — PlatformIO latest documentation). Arduino wird unterstützt, jedoch auch noch viele andere Frameworks (Frameworks — PlatformIO latest documentation).

Ich persönlich verwende Platformio als Plugin für Visual Studio Code (VSC) von Microsoft (https://code.visualstudio.com/). Dies ist eine IDE für zahlreiche Programmiersprachen - entsprechender Support ist entweder nativ vorhanden bzw. kommt über Unmengen von verfügbaren Plugins optional rein. Von Natur ist VSC jedoch gar nicht so sehr projektgetrieben, wie man das z.B. von Eclipse kennt - man kann es auch einfach als Editor benutzen. Installiert man Platformio für VSC, so ändert sich daran erstmal nichts, jedoch erkennt man schnell die Projektstruktur, die Platformio für sich einführt und propagiert.

Hat man Platformio installiert in VSC so öffnet sich ein Management-Interface - das wird fortan bei jedem Start von VSC so sein. Dort legt man mit Klick auf „New Project“ ein neues Projekt an.

Diesem gibt man einen Namen - z.B. „Tonuino“ und wählt anschließend unter Board „Arduino Nano ATmega328“ (ggf die Variante mit neuem Bootloader) aus - für meinen Nano hier habe ich die neue Variante verwenden müssen. Das Framework lässt man auf Arduino stehen und klickt auf Finish.
Bildschirmfoto 2020-04-17 um 20.27.25

Beim ersten Mal wird hier erstmal einiges runtergeladen - insbesondere die gesamte Toolchain (Compiler zB), die man für diesen Mikrocontroller benötigt (AVR-Plattform). Wenn dies abgeschlossen ist, sieht man das neu angelegte Projekt. Links sind mehrere Icons übereinander angeordnet - das Oberste davon ist die Projekt/Datei/Ordner-Ansicht. Das neu angelegte Projekt sieht dann z.B. so aus:
Bildschirmfoto 2020-04-17 um 21.05.06

Die main.cpp öffnet man - anschließend sieht man im Editor ein paar vorbereitete Zeilen. Nun kann man sich den Code von Tonuino beispielsweise von hier https://raw.githubusercontent.com/xfjx/TonUINO/DEV/Tonuino.ino mittels Copy’n’Paste reinkopieren - anschließend speichert man die Datei erstmal ab. Hinweis: #include <Arduino.h> darf dabei nicht überschrieben werden, andernfalls hagelt es später beim Kompilieren diverse Fehler! Der Rest kann jedoch überschrieben werden.

Es werden nun im oberen Bereich diverse Includes rot unterkringelt, was damit zu tun hat, dass es sich um verwendete Bibliotheken handelt, die aktuell noch nicht vorhanden sind. Wie auch in der Arduino-IDE müssen diese hier installiert werden. Hier gibt es verschiedene Wege diese einzubinden. Einer davon ist, die Seite PlatformIO Registry zu besuchen, um dort nach Libaries zu suchen. Man kann es jedoch auch direkt in Platformio machen. Dazu geht man zurück in diese Ansicht, in der man initial das Projekt angelegt hat und klickt ein bisschen tiefer auf Libraries. Dort gibt es nun ein Feld, in dem man nach Libraries suchen kann. Hier starten wir mit DFMiniMp3. Es wird nun eine Library gefunden. Klickt man diese an, so gibt es einige Infos und einen Install-Button. Neben dem Install-Button gibt es Punkte. Klickt man hier auf „Install to“ kann man auswählen, ob man eine Library global installieren möchte - das kann dann künftig von allen Projekten genutzt werden, die man anlegt. Oder eben nur lokal gültig für ein Projekt. Für beide Varianten gibt es triftige Gründe - für die projektgetrennte Variante spricht z.B., dass man mit unterschiedlichen Library-Version zwischen den Projekten arbeiten kann. Es ist die weniger komfortable Variante, aber dafür die sicherere.

So lassen sich nach und nach die notwendigen Libraries (nachfolgend Libs) installieren. Was mir persönlich an dieser Variante nicht so gut gefällt ist die Tatsache, dass man ein bisschen den Überblick verliert, was alles schon an Libs installiert ist und verliert vielleicht auch Abhängigkeiten aus dem Auge. Der andere Weg, den ich persönlich daher favorisiere (auch im Sinne der Portabilität, auf die ich ganz am Ende nochmal zu sprechen komme), ist die explizite Angabe der Libs in der Datei platformio.ini. Und zwar wird mit jedem neuen Projekt eine solche Datei angelegt - öffne sie am besten mal über die Projektansicht. In dieser steht nun z.B. Folgendes drin:
Bildschirmfoto 2020-04-17 um 22.32.53

Die alte Bootloader-Variante sähe z.B. so aus:
Bildschirmfoto 2020-04-17 um 21.26.29
Das sind Angaben, die für die interne Verwaltung von Platformio notwendig sind - darüber wird das Handling und z.B. auch die Auswahl des notwendigen Compilers gesteuert. Doch diese ini-Datei lässt sich mit diversen Kommandos erweitern.

Im Code von Thorsten ist mit dem Kommando Serial.begin(115200); festgelegt, dass die Geschwindigkeit der seriellen Schnittstelle mit 115.200 bit/s arbeitet. Dies muss man der Arduino-IDE mitteilen - gleiches gilt für Platformio. Es muss also als weiterer Eintrag in platformio.ini in einer neuen Zeile Folgendes hinzugefügt werden: monitor_speed = 115200. Was man auch noch benötigt wird ist der Port, über den die USB-Kommunikation stattfindet. Da müsste vielleicht ein Windows-User mal Feedback geben - auf dem Mac sieht das bei mir so aus: upload_port = /dev/cu.wchusbserial1410

Nun zurück zu den Libs, denn diese lassen sich hier auch einbinden und zwar über die Direktive lib_deps. Es gibt mehrere Arten und Weisen, wie man diese einbinden kann. Welche das genau sind, kann man hier schön sehen: Redirecting...
So kann man z.B. URLs angeben, Namen und Zahlen - wobei sich die zwei Letztgenannten auf die Lib-Suche von Platformio beziehen, die ich oben schon erwähnt habe: PlatformIO Registry
Auch hat man die Möglichkeit festzulegen, welche Version einer Lib man installieren möchte. Zu einer Library gibt es dort sogar noch detaillierte Infos, wie diese zu installieren ist. Beispiel: PlatformIO Registry

Wir arbeiten uns halt durch die notwendigen Libs durch und erhalten für jede einen Eintrag in lib_deps. Das Ganze sieht dann am Ende für das offizielle Tonuino-Projekt z.B. so aus:

lib_deps =
DFPlayer Mini Mp3 by Makuna
JC_Button
MFRC522

Bei mir sieht die platformio.ini insgesamt nun so aus:
Bildschirmfoto 2020-04-17 um 22.35.36

Das könnte jedoch auch komplett anders aussehen - hier mal ein Beispiel aus meinem eigenen Tonuino-Projekt, welches auf dem Mikrocontroller ESP32 basiert (Achtung: 3rd Party, dient nur der Veranschaulichung und hat mit dem Originalprojekt Tonuino nichts zu tun!):
Bildschirmfoto 2020-04-17 um 22.19.41

Nun kann der Code kompiliert werden. Dazu klickt man ganz links auf das Platformio-Icon (Alien-Kopf) und im Anschluss auf „Build“.
Bildschirmfoto 2020-04-17 um 21.59.37
Tut man das, so öffnet sich unterhalb des Editor-Fensters ein kleines Fenster, in dem man sehen kann, wie der Code kompiliert wird. Allerdings ist hier die Freude ziemlich schnell vorbei, da der Compilevorgang in zahlreichen Warnungen (gelb) und Fehlern (rot) endet, die z.B. so aussehen:

Die Fehler resultieren daher, dass Funktionsaufrufe gemacht werden, bevor die eigentliche Funktion deklariert wurde. Dies kann der Programmierer umschiffen, in dem er eben zuerst eine Funktion deklariert bevor er sie benutzt oder indem er relativ weit oben eine sog. Prototypen-Deklaration macht. Das sind lediglich die Köpfe der einzelnen Funktionen samt Signaturen (Übergabeparameter), jedoch ohne weiteren Inhalt. Oberhalb der ersten Klassendeklaration, aktuell ca. bei Zeile 80, sind verschiedene Deklarationen bereits vorhanden. Hier habe ich, Stand April 2020 (das kann sich ändern, wenn sich der Code ändert!), folgende Zeilen unterhalb von bool knownCard = false; eingefügt:

void setstandbyTimer();
void playFolder();
void playShortCut(uint8_t shortCut);
bool readCard(nfcTagObject * nfcTag);
void setupCard();
bool askCode(uint8_t *code);
void resetCard();
bool setupFolder(folderSettings * theFolder);

Führt man nun via Build den Compile-Vorgang erneut durch, dann sollte dieser (zumindest bei mir klappt das so - gerne Feedback, wenn dem nicht so ist) nun kompilierbar sein. Das sieht dann am Ende z.B. so aus:

Wie kriegt man das Ganze nun auf den Arduino drauf? Nun, man schließt ihn, den Arduino, wie auch in der Arduino-IDE, per USB an und lädt den Sketch hoch. Dort, wo es Build zur Auswahl gab, gibt es noch zahlreiche andere Optionen:
Bildschirmfoto 2020-04-17 um 22.13.24
Ich persönlich wähle gerne „Upload and Monitor“. Denn das führt in einem Schritt dazu, dass der Code frisch kompiliert wird, hochgeladen und sich auch gleich die serielle Konsole öffnet (das ist mit Monitor gemeint). Erfolgreich gebaut und hochgeladen sieht das dann so aus:

Man wird dann gefragt, welchen Port man benutzen möchte für die serielle Konsole. Bei mir sieht das so aus (können bei euch ganz andere Ports sein):

Und nachdem ich dann die für mich richtige (3) ausgewählt hatte, hatte ich die gewohnte Konsolenansicht, die ihr bestimmt kennt:

So, das war es für’s Erste. Probiert das einfach mal aus, ob das bei euch funktioniert. Wenn Interesse besteht, kann auch auch ein bisschen was zu Git schreiben. Sollte das nicht der Fall sein, dann lasse ich es :slight_smile: Dazu noch eine Anmerkung: Lädt man seinen Code per git hoch und macht ihn z.B. via Github verfügbar, so beinhaltet dies auch die platformio.ini (außer man schließt es explizit aus). Der Nächste, der den Code benutzt und Platformio verwendet, braucht sich die Arbeit mit den Libs nicht mehr machen, denn alles Notwendige steht in platformio.ini bereits drin. Das Ganze ist also schön portabel.

Ansonsten: Gerne her mit den Fehlerkorrekturen und Hinweisen.

11 „Gefällt mir“

Vielen Dank. Vielleicht starte ich dann doch noch einen Versuch mit Platformio.
Freue mich auf die Möglichkeit die Klassen in separate files zu zerlegen um einen besseren Überblick zu bekommen.

1 „Gefällt mir“

In Windows sieht das einfach so aus:
monitor_port = COM14 bzw. upload_port = COM14

Und noch ein Tip von meiner Seite. Falls man die Startseite von Platform.io einmal geschlossen hat, kann man diese einfach über das kleine Häuschen ganz unten im Fenster wieder öffnen.

Unter Linux (Mint) ist der Port dann:
monitor_port = /dev/ttyUSB0 bzw. upload_port = /dev/ttyUSB0
Das kann auch eine andeere Endnummer sein wenn mehrere Geräte angeschlossen sind.
Am einfachsten ist man schaut einfach in die Arduino-IDE unter Werkzeuge.

Hier gibt’s übrigens noch eine schöne Step-by-Step-Anleitung für Platformio habe ich gerade gesehen: Getting Started with VS Code and PlatformIO IDE for ESP32 and ESP8266 | Random Nerd Tutorials

1 „Gefällt mir“

Vielen Dank für die super Anleitung @biologist.
Einzig den Debugger bekomme ich nicht zum laufen. Ich habe in der Platformio.ini den debug_port angegeben. Wenn ich jetzt aber einen Breakpoint setzte, bleibt er dort nicht stehen.

Hat jemand einen Tip?

Da bin ich überfragt. Habe ich nie was mit gemacht. Ich habe bei meinem ESPuino-Projekt im Prinzip alle GPIOs belegt. Da ist gar kein Platz mehr, das anzuschließen. Zumindest mal nicht, wenn alles dran ist :slight_smile:

Aber schön, dass die Anleitung hier viel gelesen wird :slight_smile:

Das geht nucht mit den Arduinos.
Großes Manko im Vergleich zu anderen Controlerboards

ah ok. Denn hier (Arduino Nano ATmega328 — PlatformIO latest documentation) heißt es unter Debugging:

Arduino Nano ATmega328 has on-board debug probe and IS READY for debugging. You don’t need to use/buy external debug probe.