Skip to content

Howto: Firmware mit PlatformIO selbst kompilieren

Oliver Köster edited this page Oct 14, 2023 · 15 revisions

Inhalt:

1. Vorwort

Um diese Hybrid-Firmware selbst zu kompilieren, also den Quellcode in Maschinencode für den Drucker zu übersetzen, ist es leider nicht mehr so ohne weiteres möglich, die simple Arduino IDE zu verwenden. Mit dem vorliegenden Quellcode wird nämlich nicht nur eine einzelne Firmware für genau einen Drucker gebaut, sondern unter Verwendung von Profilen jeweils eine eigene Umgebung erzeugt, in der sich der Quellcode an den jeweiligen Drucker anpasst.

Das hat den Vorteil, dass man nur eine Code-Basis pflegen muss und sich alle Änderungen (die nicht Drucker-spezifisch sind) direkt auf alle anderen Drucker auswirken. Möchte man z.B. grundsätzlich die Maximaltemperatur des Hotends ändern, so kann man dies gobal tun, ohne es für jeden Drucker und jede Firmware einzeln anpassen zu müssen. Man ändert einfach die Temperatur im Quellcode und kompiliert dann einfach alle gewünschten Druckerkonfigurationen.

Aus dem Grund verwende ich eigene Profile und Compiler Direktiven und eine IDE (Entwicklungsumgebung), welche dies unterstützt. Ich habe mich hierbei für das kostenlose Visual Studio Code von Microsoft mit der zugehörigen Erweiterung PlatformIO entschieden.

2. Installation von PlatformIO

PlatformIO ist keine eigenständige Entwicklungsumgebung, sondern ein Aufsatz/Zusatz, um mit Visual Studio Code einfach und bequem für eine Vielzahl von Mikrocontrollern zu entwickeln.

2.1 Installation von Visual Studio Code

Zuerst brauchen wir Visual Studio Code. Dies können wir direkt von https://code.visualstudio.com/Download herunterladen. Da ich einen Mac verwende, zeigen alle folgenden Screenshots die Mac-Variante. Jedoch unterscheidet sich der Inhalt kaum und lediglich die Menüs befinden sich vielleicht an anderer Stelle.

2.2 Installation von PlatformIO

Für PlatformIO brauchen wir nicht (wie meistens angenommen) irgendwas Neues herunterladen oder manuell installieren. Stattdessen lässt sich diese Erweiterung direkt innerhalb der IDE installieren.

Hierzu klicken wir links auf das Symbol, welches wie ein Quadrat, bestehend aus 4 Quadraten aussieht und geben in die Suchleiste oben "platformio" ein. Der erste Treffer sollte das Plugin zeigen, welches wir dann mit einem Klick auf "Installieren" direkt herunterladen und installieren.

Wer will, kann hier auch gleich das Sprachpaket seiner Wahl installieren (z.B. Deutsch).

Nach der Installation sollte der blaue Button auf "uninstall" wechseln und links in der Leiste ein neues Symbol auftauchen, welches wie ein Alien aussieht.

Die Installation ist damit abgeschlossen. Eventuell tauchen unten rechts noch Meldungen über Updates von Komponenten auf. Diese kann man bestätigen und dann einmal die gesamte IDE neustarten.

3. Herunterladen des Firmware-Quellcodes

Ich empfehle, immer eine bestimmte Version des Quellcodes herunterzuladen, da es sein kann, dass der Master, also der wirklich aktuelle Stand der Firmware, sich in einem instabilen Zustand befindet. Man kann natürlich auch den Master nutzen, doch dann muss einem bewusst sein, dass hier Änderungen vorhanden sind, die bisher noch nicht für die Öffentlichkeit bestimmt sind sich somit von den .hex Releaseversionen unterscheiden.

Um eine bestimmte Version herunterzuladen, klicken wir links oben auf "switch branches/tags" und dort auf den Reiter "Tags". Hier suchen wir die gewünschte Version und klicken sie an. Daraufhin wechselt die gesamte Quellcodeseite auf den Stand zu diesem Zeitpunkt und man kann oben rechts auf den grünen Button klicken, der mit Code beschriftet ist und hier beispielsweise den Code als .zip-Datei herunterladen.

Alternativ liegt übrigens jedem Release auch der zugehörige Quellcode als Zip und tar.gz schon bei. Dies dient als Sicherheit, falls irgendwann doch mal Tags gelöscht werden oder sich das Repository ändert. Das ist unwahrscheinlich, aber man weiß ja nie ;)

4. Quellcode in Visual Studio Code / PlatformIO laden

Haben wir unseren gewünschten Quellcode heruntergeladen, muss dieser natürlich entpackt werden. Am besten an einen Ort, den man leicht wiederfindet, und der nicht zu tief auf der Festplatte vergaben ist, da auch die Pfadlänge gerade unter älteren Windows-Versionen zu einem Problem werden kann.

Der entpackte Ordner sieht nun nicht mehr sehr übersichtlich aus und beinhaltet sowohl sichtbare als auch versteckte Dateien. (Dazu später mehr).

Jetzt öffnen wir Visual Studio Code und klicken oben links auf das Symbol mit den zwei Seiten Papier und danach auf Open Folder. Hier wählen wir einfach den Ordner aus, den wir eben entpackt haben und warten ein bisschen, bis VSCode alle Erweiterungen geladen hat. Danach begrüßt uns die Oberfläche mit einer Liste auf der linken Seite mit Dateien, die wir eben schon im Ordner gesehen haben.

5. Das erste mal kompilieren

Der erste Schritt nach dem Öffnen sollte sein, einmal eine Variante der Firmware zu bauen, also zu kompilieren. Hier klicken wir links auf das Alien, scrollen in der Liste herunter, bis wir unseren Drucker und die passende Konfiguration gefunden haben (hier im Beispiel ein Mega S mit DGUS Clone Display und TMC2208 Treibern). Dort reicht es, diesen Eintrag "aufzuklappen" und dort auf build zu klicken. Das Kompilieren kann je nach Geschwindigkeit des PCs zwischen einigen Sekunden und mehreren Minuten dauern.

Nach einem erfolgreichen Kompilieren der Firmware, steht unten in dem Terminalbereich ein grüner SUCCESS Schriftzug und links daneben unsere gewählte Konfiguration.

Herzlichen Glückwunsch! Du hast das erste Mal eine Firmware kompiliert! :)

6. Firmware auf dem Drucker installieren

Hier gibt es zwei Möglichkeiten. Entweder, man schließt den Drucker direkt an dem PC an, auf dem auch VSCode installiert ist und klickt statt auf "build" diesmal auf Upload. PlatformIO kümmert sich um den Rest und die Firmware wird direkt auf den Drucker geladen.

Die zweite Möglichkeit ist das Sichern der .hex-Datei, um diese dann über Cura oder Octoprint zu installieren. Hierzu gehen wir genau in den Ordner, in dem sich der Quellcode befindet. Möglicherweise müssen versteckte Dateien angezeigt werden, doch der Ort, an dem sich die Firmware befindet, ist immer derselbe: /Firmwareordner/.pio/build/[VARIANTE]/firmware.hex

7. Beispiel

Da wir jetzt wissen, wie man die Firmware selbst kompiliert, können wir auch Änderungen vornehmen.

Als Beispiel ändere ich hier den Sensor-Pin, welcher normalerweise für den BLTouch Sensor verwendet wird. Wenn man nach dieser Anleitung vorgeht, wird der PIN 2 verwendet, doch oftmals besteht der Wunsch z.B. PIN 21 zu verwenden, da dieser auf dem Mainboard frei zugänglich ist.

Also navigieren wir zu /Marlin/src/pins/ramps/ und suchen hier nach der Datei pins_ramps.h. Dort befindet sich ein define Z_MIN_PROBE_PIN, welchem man von 2 auf 21 ändern kann. Danach nur noch mit STRG+S abspeichern und die Firmware wie in Abschnitt 5 beschrieben kompilieren.

ACHTUNG! Seit Version 1.5.0 sind die Pin-Definitionen für die Trigorilla-Mainboards in separaten Dateien zu finden. In unserem Fall ist das die pins_TRIGORILLA_14.h.

8. Beispiel Fortsetzung: Buildflags

Eine letzte wichtige Eigenschaft dieser Hybrid Firmware sind die oben genannten Profile, über welche die einzelnen Druckerkonfigurationen angesteuert werden. An vielen Stellen im Quellcode sind diese Definitionen zu finden, oftmals mit einem #IF ENABLED(<Konfigurationsname>). Hierüber werden zur Zeit der Kompilierung verschiedene Pfade ein- und ausgeschaltet oder an Bedingungen geknüpft.

So hat beispielsweise der Bondtech Mini Geared (BMG) Extruder gewisse Eigenschaften und eine entgegengesetzte Laufrichtung im Vergleich zum MK8 oder Titan Extruder. Um diese Eigenschaften zu aktivieren reicht es, das Build-Flag KNUTWURST_BMG zu setzen. Um es als Buildflag zu deklarieren, muss vor dem Namen noch ein -D stehen. Also wird für den Mega Pro, welcher mit einem BMG Extruder ausgeliefert wird, das Flag -DKNUTWURST_BMG gesetzt, welches all diese Einstellungen im Quellcode dann übernimmt.

Das funktioniert auch mit allen anderen Konfigurationen/Buildflags und kann auch in andere Druckerkonfigurationen übernommen werden. So ist es einfach, neue Drucker in das bestehende Projekt einzubinden, oder den eigenen Drucker den Bedürfnissen anzupassen.

Clone this wiki locally