Die 4.4.0 BETA2 Firmware für den Original Prusa MINI/MINI+ ist auf unserer GitHub Seite verfügbar und die wichtigste neue Funktion ist die Unterstützung für Wi-Fi Verbindungen. Man kann es nicht anders sagen: Wir haben lange gebraucht, um zu liefern, was versprochen wurde. Es war eine lange, komplizierte Reise. Wir sind auf mehrere Sackgassen gestoßen, wir mussten Umgehungen für Hardwarebeschränkungen finden – und wir sind immer noch nicht fertig. Aber die Unterstützung für das drahtlose Hochladen von G-Codes und die Fernverwaltung des MINI funktioniert und wir können endlich darüber sprechen, was wir tun mussten, um es zu diesem Stadium zu bringen.
Wi-Fi zum MINI+ hinzufügen
Der Original Prusa MINI+ ist eine erschwingliche und dennoch sehr leistungsfähige Maschine. Als das Hardware-Team ihn entworfen hat, war es wichtig, ein Gleichgewicht zwischen der Anzahl der Funktionen und dem Preis zu finden. Außerdem wäre es auf der aktuellen CPU des MINI unmöglich, alle Verschlüsselungsmodelle moderner Access Points zu unterstützen. Deshalb wurde der Wi-Fi-Chip nicht in die Hauptplatine integriert.
Stattdessen hatten wir die Idee, einen einfachen Header auf der Hauptplatine hinzuzufügen, der den Anschluss einer billigen ESP-01-Platine ermöglichen würde, die den externen Mikrocontroller zu einer Brücke zwischen dem drahtlosen Netzwerk und dem USB-Stick macht. Wir haben recherchiert und mehrere Open-Source-Projekte gefunden, die sich mit den Netzwerkfähigkeiten des ESP-01 befassen, und so war das Projekt ein Selbstläufer.
Was ist ein ESP-01? Es ist ein preiswertes Wi-Fi-Modul, das aus einem TCP/IP-Stack und einem eingebauten Mikrocontroller besteht. Seine Hauptfunktion besteht darin, drahtlose Kommunikation in Embedded-Projekte zu bringen. Es fungiert als eigenständiger Mikrocontroller und benötigt keinen anderen Mikrocontroller (wie Arduino oder Atmel), um seine I/O-Pins zu nutzen. Im Grunde handelt es sich um eine Drahtlos-Seriell-Brücke mit 1 MB Flash-Speicher, einer stromsparenden 32-Bit-CPU und Unterstützung für 802.11 b/g/n Wi-Fi-Netzwerke. Es ist seit 2014 eine unglaublich beliebte und erschwingliche Lösung. Der Original Prusa MINI/MINI+ unterstützt sowohl den ESP-01 als auch die leicht modifizierte Version ESP-01S – weitere Informationen finden Sie im Changelog.
Wir begannen die Arbeit an der WLAN-Unterstützung des MINI gegen Ende 2020 mit der Absicht, die Programmierung von Anfang an richtig zu machen, anstatt nur einen Haufen Code zusammenzuklatschen und ihn in aller Eile zu veröffentlichen, denn das würde bedeuten, dass wir früher oder später sowieso alles von Grund auf neu schreiben müssten. Wir stellten ein engagiertes Team zusammen, das mit einer gründlichen Analyse des gesamten Projekts und der Entwicklung eines Prototyps für die drahtlose Lösung beauftragt wurde.
Lasst es uns richtig machen
Von Anfang an waren wir auf der Suche nach einer komplexen Lösung, die nicht nur einfache Übertragungen von G-Codes über das lokale Netzwerk unterstützt, sondern auch mit unserer (damals aufkommenden) PrusaLink und Prusa Connect Farm Management Software kompatibel ist. Der Plan war, einen stabilen TCP/IP-Stack für Ethernet und Wi-Fi zu erstellen, die Möglichkeit zu haben, BSD-Sockets zu verwenden und eine Anwendungsschicht zu nutzen – eine Webseite mit Fernsteuerungsfunktionen, die auf einem HTTP-Server direkt auf dem Drucker läuft. Das Team erhielt den gesamten Auftrag und begann mit der Arbeit.
Eine der wichtigsten Ideen war, die aktuelle Firmware des ESP-01 beizubehalten. Es gibt eine Reihe verschiedener ESP-01-Varianten und die Programmierung (und Pflege) einer eigenen Firmware für diese Mikrocontroller wurde als zu aufwendig angesehen. Es gibt bereits einen LwIP-Stack für den ESP-01, der sich um SLIP (Serial Line IP via UARTs), NTP und statisches Routing kümmert. Zunächst haben wir versucht, einen parallelen IP-Stack und LwESP, eine leichtgewichtige ESP AT-Befehlsparser-Bibliothek, hinzuzufügen. Die Verwendung einer Open-Source-Lösung schien der richtige Weg zu sein.
Doch hier stießen wir auf Sackgassen. Es gibt verschiedene Firmware-Versionen für den ESP-01, jede mit einem etwas anderen Funktionsumfang und unterschiedlichem Maß an Qualität/Zuverlässigkeit. Außerdem mussten wir wegen der LwESP-Bibliothek eine Menge Code in die Firmware des Buddy (MINI-Motherboard) einfügen. Letztendlich würde das bedeuten, dass wir zwei parallele IP-Stacks (einen LwIP für Ethernet und einen weiteren, der zwischen Buddy und ESP aufgeteilt ist) haben und je nach Bedarf zwischen ihnen umschalten müssten.
Und es gab noch mehr Probleme – nur 5 Verbindungen, fehlende Unterstützung für einen UDP-Server und verschiedene andere Probleme. Theoretisch könnten wir es irgendwie zum Laufen bringen, aber Testen und Fehlersuche wären ein Alptraum. Unser Kollege aus dem SLA-Team fand jedoch eine ziemlich geniale Lösung – er stellte eine spezielle, leichtgewichtige, maßgeschneiderte Firmware für den ESP-01 zusammen.
Der Heureka! Moment
Endlich hatten wir also einen Prototyp einer winzigen Spezial-Firmware, die den ESP-01 in eine Netzwerkschnittstelle verwandelte, ähnlich wie der Ethernet-Chip auf dem Buddy-Motherboard. Das war etwas, das wir wirklich brauchten: ein Schritt in die richtige Richtung.
Und dann bekam unser Team eine neue Verstärkung. Um einen Filmklassiker zu zitieren: eine Person, die mehr über Netzwerke vergessen hat, als wir alle je wissen werden. Und außerdem ein hochqualifizierter C++-Architekt! Er machte dort weiter, wo die vorherigen Versuche endeten und begann mit einer brandneuen Analyse. Er brauchte nur einen Monat, um einen flexiblen und effektiven HTTP-Server zu implementieren, der in der Lage ist, Antworten auf Anfragen zu streamen (d.h. er passt in den begrenzten Arbeitsspeicher, egal wie lang die Antwort ist).
Sein Kollege nahm die maßgeschneiderte Firmware in die Hand und begann mit der Entwicklung des ESP-acting-like-a-network-card-Prototyps. Zunächst begann er mit der drahtlosen Verbindung und verband den ESP über UART (serielle Schnittstelle) mit einem Standard-Laptop. Auf diese Weise erreichten wir Geschwindigkeiten von bis zu 9/6 Mbit (Download/Upload). Endlich hatten wir eine zuverlässige drahtlose Verbindung mit einer Geschwindigkeit, die den maximalen Durchsatz der UART-Schnittstelle des MINI übertraf, nämlich 4,6 Mbaud.
Die Verbindung des ESP mit der Schnittstelle der physikalischen Schicht im LwIP-Stack der Buddy-Firmware brachte nicht nur Code-Einsparungen, sondern beseitigte auch die bereits erwähnte Schizophrenie der gemischten IP-Stacks für zwei verschiedene Schnittstellen. Die Dinge begannen wirklich gut auszusehen.
Verfluchte USB-Sticks
Wir machten große Fortschritte. Der HTTP-Server machte gute Fortschritte und wir begannen, weitere Funktionen hinzuzufügen – wie das Hochladen von G-Codes aus PrusaSlicer und das Herunterladen von G-Codes aus dem Drucker. Wir fügten einen neuen Dateibrowser mit Miniaturansichten in die Weboberfläche ein und implementierten Funktionen zum Starten und Stoppen des Drucks (und einige andere).
Im April 2022 hatten wir eine stabile drahtlose Verbindung und die Firmware war fast fertig zur Veröffentlichung. Es gab nur noch eine Sache zu lösen. Leider war dies ein großes Problem: die Sicherstellung der Stabilität und Kompatibilität der verschiedenen USB-Sticks – von den billigsten chinesischen No-Name-Modellen bis hin zu Marken-USB-Disks. Nur eine kleine Kuriosität: viele der billigen chinesischen No-Name-Disks funktionierten tatsächlich zuverlässiger als teurere Modelle 🙂 Wie auch immer, wir mussten zuerst die fehlerhaften Timeouts im USB-Treiber lösen. Das haben wir in Zusammenarbeit mit STM in Angriff genommen. Aber dann gab es da noch eine andere Sache, etwas wahrhaft Teuflisches. Während SD-Karten ganz klar spezifizierte Reaktionszeiten haben, gibt es das bei den USB-Datenträgern nicht. Sie können sogar für Dutzende von Sekunden „schweigen“, und dann gibt es da noch etwas, das man „Housekeeping“ nennt.
Um es einfach auszudrücken: USB-Sticks sind vor allem für Standard-Computer gemacht – wie Laptops, Media-Player und Videospielkonsolen. Diese Geräte haben wahnsinnig viel RAM (mehr als 1 MB :-)). Wenn Sie also beginnen, Dateien auf einen USB-Stick zu kopieren und dieser für ein paar Sekunden nicht mehr reagiert, gibt es immer noch einen großen Puffer, der hilft, diese Verzögerung zu überwinden. „Es handelt sich um eine Routine, die für das interne Kopieren von Datenblöcken verantwortlich ist, um den Grad der Abnutzung mehr oder weniger gleichmäßig über den Flash-Speicher zu verteilen und so die Lebensdauer des Speichermediums zu verlängern. Allerdings dauert dieses „Sortieren“ einige Zeit.
Bestimmte USB-Sticks sind so schlecht konstruiert, dass sie bis zu 10 Sekunden nicht mehr reagieren können. Wir haben 10 kB RAM auf der Buddy-Hauptplatine zugewiesen, die als Puffer dienen und so dieses Problem unterdrückt. Obwohl es theoretisch möglich ist, G-Codes auch während eines aktiven Druckauftrags hochzuladen, wird diese Funktion aufgrund von Leistungsproblemen nicht empfohlen.
Und schließlich mussten wir das Problem mit der FATfs-Bibliothek lösen. Diese Bibliothek wird hauptsächlich für eingebettete Geräte verwendet und versucht, das Dateisystem so konsistent wie möglich zu halten. Das bedeutet, dass der Chip des Laufwerks jedes Mal, wenn ein Fragment einer Datei geschrieben wird, damit beginnt, die Haupt- und Backup-FAT-Tabelle zu aktualisieren. Dies ist ein weiterer Leistungskiller, der schließlich die Lebensdauer des USB-Sticks verkürzt. Glücklicherweise haben wir eine Lösung gefunden: Sobald Sie mit dem Hochladen einer G-Code-Datei beginnen, kennen wir bereits die Gesamtgröße der Datei – also bitten wir einfach das Dateisystem, zunächst Platz für die gesamte Datei zu reservieren. Sobald das Hochladen abgeschlossen ist, wird erst dann die FAT-Tabelle aktualisiert.
Der Weg, der vor uns liegt
Die aktuelle 4.4.0 BETA-Firmware bietet bereits erweiterte Netzwerkfunktionen und einen zuverlässigen G-Code-Upload. Allerdings haben wir noch einiges zu tun. Wir prüfen, ob wir G-Code-Dateien zuverlässig streamen können, wenn der MINI/MINI+ druckt. Wie bereits erwähnt, sind wir durch die Technologie der USB-Sticks eingeschränkt und obwohl das Streaming theoretisch möglich ist, gibt es immer noch eine Menge potenzieller Probleme.
Wir sind noch dabei, den Code zu verbessern, so dass die aktuellen Geschwindigkeiten bei etwas über 100 kB/s liegen, abhängig von der Qualität der drahtlosen Verbindung, und bei 300 kB/s über Ethernet. Da ist noch einiges an Spielraum vorhanden. Theoretisch könnten wir etwa 460 kB/s Rohgeschwindigkeit auf dem UART/ESP erreichen. Wir erwarten, dass die endgültige Geschwindigkeit irgendwo zwischen 250-350 kB/s liegt, wenn wir sie richtig optimieren.
Wir möchten uns auch darauf konzentrieren, die ganze Sache noch benutzerfreundlicher zu machen. Im Moment müssen Sie eine spezielle INI-Datei auf den USB-Stick kopieren, was eine etwas dürftige Lösung ist. Das funktioniert, aber es gibt definitiv noch Raum für Verbesserungen. Und wir wollen weitere Verbesserungen der Funktionalität einführen, wie z.B. eine Anzeige der tatsächlichen Signalstärke. Lassen Sie uns wissen, was Sie noch gerne sehen würden!
Es gibt viele verschiedene USB-Sticks und verschiedene Modelle des ESP-01-Moduls, die die Geschwindigkeit auf die eine oder andere Weise beeinflussen können. Wir wären Ihnen sehr dankbar, wenn Sie sich entschließen, die neue MINI-Firmware zu testen und uns mitteilen, welche Geräte (ESP und USB) Sie verwenden und welche Erfahrungen Sie damit gemacht haben!
Natürlich ist die gesamte Firmware einschließlich der Wi-Fi-ESP-Technologie vollständig quelloffen und die Quellcodes sind auf GitHub frei verfügbar. Wenn Sie also mit dem ESP herumspielen möchten, können Sie sich die Quellcodes hier holen!
Und Sie können sich die aktuelle Firmware-Version auf unserer Github-Seite ansehen.
Wird es eine solche Erweiterung auch für den i3 MK3S+ geben irgendwann?
Für den i3 MK3S+ gibt es eine sehr viel schönere Möglichkeit:
https://help.prusa3d.com/de/article/prusaprint-rpi-zero-und-octoprint_2180
Schau dir den Artikel mal an! Für den Pi gibt es Octoprint oder Prusa Link.