Firmware selber kompilieren – wie fang ich das an?

Kurze Einführung zum Thema „Wie selber Firmware editieren“ am Beispiel des Original Prusa i3 MK2 bzw. MK2S.. (In Vorbereitung auch für den Haribo Mod, dort müssen wir eine Firmware Änderung vornehmen)

Achtung – das Haltbarkeitsdatum dieses Artikels ist überschritten: Diese Anleitung gilt für Marlin bis 1.1.9 und ist für neuere Versionen größer oder gleich 2.0 so nicht mehr zielführend. Für neuere Marlinversionen wird z.B. Visual Studio und Plattform.io genutzt!

Teil 1: Arduino IDE installieren

Als erstes holen wir uns die Arduino IDE, also die Programmierumgebung für alle möglichen solcher Boards von https://www.arduino.cc/en/Main/Software.

Es wird gelegentlich darauf hingewiesen, dass man nur mit Version 1.6.8 der Arduino IDE die Prusa Firmware selber kompilieren kann, aber irgendjemand hat vergessen, meinem Arduino das zu sagen, die aktuelle 1.8.3 funktioniert nämlich problemlos bei mir.

Die IDE installieren wir nach dem Download ganz normal wie jede andere Windows Anwendung auch. Wer, wie ich z.B., den Drucker nicht direkt an den PC anschließen kann – oder wie ich auch – dieses ganzen USB Treibergeraffel nicht auf seinem PC will (ich habe mit meiner Messtechnik schon genug USB Treiber Chaos hier auf dem PC, da brauch ich nicht noch Drucker Kram dazwischen), der kann bei der Installation die USB Treiber abwählen und füttert seinen Drucker wie gehabt mit den HEX Firmware Dateien ohne Direktanbindung an die Arduino IDE. Bequemer ist natürlich mit dem Drucker an USB und den USB Treibern hier aktiv. Jeder so, wie er es mag. Ich mags nicht und drum ist dieser Teil hier nicht in der Anleitung enthalten.

USB Treiber oder einfach nur die Programmierumgebung offline

Achtet darauf, wo Arduino sich hin installiert, das Verzeichnis brauchen wir gleich. In der Regel ist das C:\Programme (x86)\Arduino:

Besonderheit für die Prusa MK2(S):

Konflikte mit der Prusa Firmware vermeiden – Verzeichnis umbenennen

Nachdem die Installation fertig abgeschlossen ist, gehen wir zunächst mal ins das Arduino Verzeichnis, dort in das Verzeichnis \Libraries und benennen das Verzeichnis \LiquidCrystal um, z.B. nach LiquidCrystal_BAK. Anscheinend gibt (oder gab) es da Namenskonflikte mit Prusas Firmware, darum klemmen wir die mit Arduino mitgelieferte einfach ab. Was nicht mehr da ist macht kein Ärger mehr.

RAMBo Board in der IDE einrichten

Nun starten wir die Arduino IDE über das Symbol auf dem Desktop. Arduino kommt mit vielen Boards bereits vorinstalliert, das von Prusa verwendete Ultimachine RAMBo gehört allerdings nicht dazu. Das müssen wir nun erst mal einrichten. Dazu gehen wir auf Datei > Voreinstellungen und geben hier im Feld „Zusätzliche Boardverwalter-URLs“ folgende URL ein:

https://raw.githubusercontent.com/ultimachine/ArduinoAddons/master/package_ultimachine_index.json

Neue Boardverwalter-URL hinzufügen

Wenn wir schon Mal da sind, merkt Euch ganz oben den „Sketchbook Speicherort“. Da will die Arduino IDE nachher die Firmware Dateien haben.

Kleiner Tipp am Rande: Schaltet am Besten die Funktion „Beim Start nach Updates suchen“ aus. Wenn Ihr beim Start der IDE gefragt werdet, ob Ihr irgendwelche Bibliotheken aktualisieren möchtet, antwortet im Zweifel mal lieber mit Nein. Wir Aktualisieren lieber erstmal nix, wenn es nicht unbedingt nötig ist.

Und dann gehen wir mit Klick auf OK wieder raus aus den Optionen. Nun gehen wir zu Werkzeuge > Board: [irgendwas] > Boardverwalter

Boardverwalter starten

Nun sind wir im Boardverwalter:

RAMBo suchen & installieren

Wir tippen im Feld 1 rambo ein.

Dann erscheint, wenn wir die „zusätzliche Boardverwalter-URL“ vorhin korrekt eingetragen haben, bei 2) der Eintrag für das RAMBo Board des Prusa. Da klicken mal so in die Nähe, dann erscheint der „Installieren“-Knopf (3), den wir ebenfalls anklicken.

Nun läuft unten ein blauer Ladebalken durch und wenn das Board fertig hinzugefügt wurde, steht zusätzlich der Hinweis „Installed“ da bei der Markierung 2 und wir können mit Schließen wieder raus.

Das RAMBo Board wurde nun zur Arduino IDE hinzugefügt und wir können es nun auswählen: Werkzeuge > Board > das RAMBo auswählen (ganz unten in der Liste meistens).

RAMBo als aktives Board festlegen

So, Teil 1 wäre abgeschlossen. Wir haben die Arduino IDE installiert,das RAMBo Board hinzugefügt und ausgewählt.

Wir beenden die Arduino IDE jetzt erst mal wieder.

Teil 2: Prusa Firmware holen & einrichten

Nun müssen wir uns den Quelltext bzw. die unkompilierte Firmware des Prusa MK2(S) besorgen. Die liegt normalerweise auf dem Prusa GitHub, nämlich hier:

https://github.com/prusa3d/Prusa-Firmware/releases

Auf dieser Seite suchen wir die letzte, zu unserem Drucker passende „Latest Release“ Version der Firmware, zum Zeitpunkt als ich diese Anleitung schrieb ist das 3.0.11. Die 3.0.12 ist noch im Beta („Release Candidate“) Stadium und für das MultiMaterial Upgrade gedacht. Wir nehmen daher im Moment lieber die 3.0.11.

Wir suchen die „Latest Release“ für unseren Drucker, aktuell 3.0.11 für MK2(S) ohne MMU

Etwas weiter unten finden wir den Download Link für den Source Code. Als Windows User ist mir ZIP lieber, die downloaden wir gleich mal:

Quellcode der Firmware gezippt, geau das wollen wir

Nach dem Download entpacken wir diese Datei in den sog. Sketch Ordner (das, wo ich vorhin sagte, sollt Ihr Euch merken) der Arduino IDE
(Default ist C:\Dokumente\Arduino), schaut dann so aus:

Entpacken in den Sketch Ordner

(Den Ordner libraries hat Arduino bei der Installation schon selber angelegt).

Wieder eine kleine Prusa Besonderheit: Datei umkopieren

Nun gehen wir in das eben entpackte Verzeichnis, dort weiter zu …\Prusa-Firmware-3.0.11\Firmware\variants. Hier im Firmware\variants Verzeichnis finden wir 2 Dateien:

Eine der der 2 muss umbenannt und ins übergeordnete Verzeichnis kopiert werden

Je nachdem, welches Board in Eurem Drucker steckt, müssen wir nun eine der 2 Dateien umbenennen und verschieben. Meines Wissens sind alle MK2 und MK2S RAMBo13a, also ist die 2. Datei 1_75mm_MK2-RAMBo13a-E4Dv6full.h die Richtige. Die benennen wir nun um in Configuration_prusa.h und kopieren sie ins das übergeordnete Verzeichnis ..\Firmware.

Achtung: Groß-/Kleinschreibung beachten!

Fertig umbenannt und an der richtigen Stelle – Configuration_prusa.h

Firmware in der Arduino IDE laden

So, nun gehen wir wieder in die Arduino IDE und laden uns mal die Firmware mit Datei -> Öffnen. Und zwar laden wir im Verzeichnis, wo wir die Firmware entpackt haben im Unterverzeichnis Firmware die Datei „firmware.ino“.

Alternativ hätten wir da oben auch einfach ein Doppelklick auf die Firmware.ino machen können, da wir das Verzeichnis ja eh grad offen hatten. Wichtig ist: wir öffnen so ein Firmware „Projekt“ immer über die dazugehörige firmware.ino Datei.

So, da ham wir nun die Prusa Firmware in der Arduino IDE geladen. Wir sehen nicht viel, einfach nur nen Stapel Textdateien in vielen unterschiedlich benannten Reitern:

Prusa Firmware in Arduino IDE geöffnet

Für uns interessant sind erst mal nur 2 Dateien, die da als Reiter angezeigt werden: Configuration.h und Configuration_prusa.h. Aber dazu später mehr.

Jetzt vergewissern wir uns erst nochmal, dass das RAMBo Board ausgewählt ist.

Board: RAMBo schaut gut aus.

Und dann klicken wir erst mal beherzt auf das Häkchen Links im Menü:

Kompilieren / Überprüfen – der Testlauf sozusagen

Nun beginnt die Arduino IDE die Firmware zu prüfen. Keine Sorge, es kann nix passieren. Egal was passiert. Das dauert ein Moment, scheint anchmal auch zu hängen – unten rechts ist ein grüner Fortschrittsbalken und im schwarzen Balken werden vermutlich 2 Meldungen in Rot erscheinen.

Einmal, dass er die Firmware gecached hat in Eurem Temp Ordner (darf er gerne)

Kein Fehler, nurn Hinweis

und eine 2. Meldung, dass ihm ein Bootloader fehlt und wo er den Bootloader denn gerne hätte (in der Regel innerhalb appdata\local\arduino\..\schlagmichtod.

Fehlermeldung zum Bootloader

Den Fehler könnt ihr entweder ignorieren..

(das Rambo Mini Board des Prusa MK2(S) hat den Bootload bereits drauf, es ist unnötig, ihn mit zu kompilieren und bei Firmware Updates mit hochzuladen)

Oder aber, Ihr holt Euch schnell den Bootloader von hier:

https://raw.githubusercontent.com/arduino/Arduino/master/hardware/arduino/avr/bootloaders/stk500v2/stk500boot_v2_mega2560.hex

und kopiert ihn exakt an die in der Fehlermeldung angegebene Stelle.

Ansonsten sollte da sonst nix groß passieren, die Prüfung müsste erfolgreich abgeschlossen sein. Wenn dem nicht so ist, fragt nicht mich, ich weiß es im Zweifel auch nicht. Ich bin Firmwareverweigerer aus Gewissensgründen: Don’t fix what ain’t broken.

Hex Datei erstellen zum Drucker flashen

Prüfen ist schön, nun wollen wir uns eine Firmware tatsächlich erstellen, dazu wählen wir nun aus dem Menü Sketch den Punkt „Kompilierte Binärdatei exportieren“.

HEX Datei erstellen

Im Grunde ist das genau dasselbe wie der Prüfen Vorgang von vorhin, nur, dass wir dieses Mal eine Firmware Datei tatsächlich erstellen. Wenn wir nach Abschluss des Kompilierens in unser Prusa Firmware Verzeichnis gucken, dann sehen wir die auch:

1 oder 2 HEX Dateien wurden erstellt

Einmal:

Firmware.ino.rambo.hex

und wenn wir einen funktionierenden Bootloader bereitgestellt haben (den wir allerdings gar nicht brauchen) auch noch zusätzlich eine

Firmware.ino.with_bootloader.rambo.hex.

Diese Hex Dateien sind die fertig kompilierten Firmware Dateien, wie wir sie bisher mit dem Prusa Firmware Update Tool genutzt haben. Nur eben unsere eigenen, selbst erstellten.

ACHTUNG AUF EIGENE GEFAHR! ICH HAFTE FÜR NIX!

Nehmt die Firmware.ino.rambo.hex (die ohne Bootloader) und das Firmware Update Tool, das ihr bisher genutzt habt und ladet die neue Firmware auf Euren Drucker. Fertig.

NOCHMAL: AUF EIGENE GEFAHR! ICH HAFTE FÜR NIX!

Bequemer wäre es allerdings, wenn Ihr die Firmware direkt an den per USB angeschlossen Drucker schickt, das geht, wenn Ihr die USB Treiber zu Beginn habt installieren lassen und die korrekten Verbindungsparameter eingetragen habt, ebenfalls über das Sketch Menü mit dem Punkt „Hochladen“, allerdings steht mein Drucker im Keller und so ein langes USB Kabel hab ich nicht und ich will das USB Treiberzeug nicht haben. Daher kann ich diesen Weg hier nicht zeigen.

Wenn es total in die Binsen geht, flasht einfach die original Firmware aus dem Download Bereich von Prusa (also die fertige HEX) wieder drüber. Dann sollte alles wieder in Ordnung sein. Wenn Ihr Euch dabei irgendwie den Drucker bricked, bin ich es nicht gewesen und weiß von nix.

Soweit so gut..

Schön, wir haben hoffentlich erfolgreich eine Firmware selber kompiliert. In dem Fall ist das Ganze zwar noch etwas sinnlos, weil wir ja gar nix geändert haben. Ein Trockenlauf sozusagen, zum schauen ob alles korrekt eingerichtet ist. Aber das ist die Vorgehensweise, wie man eine Firmware erstellt.

7 Kommentare

  • Hallo Ich habe ein Problem mit Arduino Software ich muss eine Firmware eines 3D Druckers ändern. Leider liegt die Datei nur im hex Format vor. Wie kann ich sie lesbar machen und editieren dann wieder im Hex Format speichern und hochladen mit dem Xloader.

    Danke Gruß Peter

    • Es gibt keinen Weg, eine hex-Datei zu editieren. Das ist eine Einbahnstraße.

      • Naja, stimmt nicht ganz 😉 Natürlich kann man eine hex-Datei auch editieren. Allerdings müsste man dazu ziemlich gut wissen was man tut und Assembler und so Zeugs beherrschen damit da hinterher auch noch was funktioniert. Also, ich geb zu, nur ein „Klugscheißmodus-Einwurf“ den wir als Otto-Normalcomputerfreak schnell wieder vergessen können 😉

  • Gerhard Werth

    Hallo Stephan,
    erst mal Gratulation zu diesem ausführlichen und verständlichen Beitrag. Für mich als Softwareabsolutnichtswisser ein Segen. Ich habe eine Frage zur Fortsetzung, sprich Änderung der Firmware. gibt es dazu schon eine Anleitung und wenn ja, wo bitte. Vielen Dank für die Mühen.

    LG Gerhard

    • Moin Gerhard,

      Ändern ist dann ein sehr weites Feld. Was genau möchtest Du ändern?
      Im Grunde sind das einfache Textdateien, zur Änderung werden einfach nur die entsprechenden Werte übertippt. Im Grunde ist das gar kein Programmieren in dem Sinne, sondern einfach nur die Einstellung bestimmter Werte ändern und dann wieder abspeichern / auf den Drucker laden.

  • Hendrik,

    Sorry für die ewig späte Antwort. Ich bekomme keine Mails mehr komischerweise. 🙁

    Ich kanns dir spontan nicht beantworten. Den Bootloader hab ich weggelassen ja. An mehreren Stellen hies es, den brauchts nicht. Woran die anderen Unterschiede liegen kann ich so spontan auch nicht sagen, vielleicht sollte man mal ein Diff über die Ordner machen.. 3.0.12 dürfte ja auch bald kommen..

  • Hallo Stephan!

    Ich habe einen ähnlichen Weg gemacht um mir die Firmware zu kompilieren.

    Ich verwende allerdings die RAMBo definition die mit den Prusa Firmware Sourcen kommt.

    Ich habe es mit Arduino 1.6.8, 1.6.13 und 1.8.3 gebaut. Ich frage mich warum die Prusa soviel grösser ist.

    627385 bytes 1_75mm_MK2-RAMBo13a-E3Dv6full.hex (PR offiziell)
    600528 bytes Firmware.ino.rambo.hex (Deine)

    ARDUINO_IDE_VERSION 1.6.8

    Sketch uses 222,124 bytes (86%) of program storage space. Maximum is 258,048 bytes.
    Global variables use 5,490 bytes of dynamic memory.

    624791 bytes Firmware.ino.hex
    631440 bytes Firmware.ino.with_bootloader.hex

    ARDUINO_IDE_VERSION 1.6.13

    Sketch uses 222,154 bytes (86%) of program storage space. Maximum is 258,048 bytes.
    Global variables use 5,490 bytes of dynamic memory.
    624877 bytes Firmware.ino.hex
    631524 bytes Firmware.ino.with_bootloader.hex

    ARDUINO_IDE_VERSION 1.8.3

    Sketch uses 222178 bytes (86%) of program storage space. Maximum is 258048 bytes.
    Global variables use 5498 bytes of dynamic memory.

    624951 bytes Firmware.ino.hex
    631596 bytes Firmware.ino.with_bootloader.hex

    Das Deine Version so klein ist, liegt vermutlich daran, dass Du nicht den PR RAMBo Code verwendest? Aber warum ist meine soviel kleiner (und Deine erst)? Linkt PR den Bootloader vielleicht rein? Dann ist frage warum sind meine soviel grösser … Hmmm …

Kommentar hinterlassen

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