Fortsetzung des Artikels über das Schreiben Ihrer eigenen Firmware für einen Photopolymer-LCD-3D-Drucker.
In diesem Teil werde ich weiterhin die Phasen meines Projekts beschreiben:
2. Arbeiten mit einem USB-Flash-Laufwerk und Dateien darauf
3. Steuern eines Schrittmotors zum Bewegen der Plattform.
- Teil 1: 1. Benutzeroberfläche.
- Teil 2: 2. Arbeiten mit dem Dateisystem auf einem USB-Stick. 3. Schrittmotorsteuerung für Plattformbewegung.
- Teil 3: 4. Anzeigen von Bildern von Ebenen auf dem Hintergrundbeleuchtungsdisplay. 5. Alles, wie die Steuerung von Beleuchtung und Lüftern, das Laden und Speichern von Einstellungen usw. 6. Zusätzliche Funktionen für Komfort und Bequemlichkeit.
2. Arbeiten mit einem USB-Flash-Laufwerk und Dateien darauf
Ich habe noch nie mit einem USB-Host auf Mikrocontrollern gearbeitet. Als USB-Gerät - Ich habe Firmware sowohl mit der CDC-Klasse (COM-Port-Emulation) als auch mit der HID-Klasse erstellt, aber nicht mit dem Host funktioniert. Um den Prozess zu beschleunigen, habe ich daher die gesamte Initialisierung dieses Peripheriegeräts in STM32CUBE erstellt. Als Ergebnis habe ich einen Host im USB-FS-Modus, der Massenspeichergeräte unterstützt. Im selben Cube habe ich sofort die FatFS-Bibliothek verbunden, um mit dem Dateisystem und den Dateien zu arbeiten. Dann mussten Sie nur noch die empfangenen Quellen in Ihr Projekt kopieren und herausfinden, wie Sie damit arbeiten können. Es stellte sich als einfach heraus und es gibt hier nicht viel zu beschreiben. Die Datei usb_host.c aus Kuba hat eine globale Variable Appli_state vom Typ ApplicationTypeDef:
typedef enum {
APPLICATION_IDLE = 0,
APPLICATION_START,
APPLICATION_READY,
APPLICATION_DISCONNECT
}ApplicationTypeDef;
Diese Variable kann bei verschiedenen Ereignissen des USB-Host-Peripheriegeräts (in Interrupts) einen der aufgelisteten Zustände annehmen und den aktuellen Zustand des Hosts anzeigen. In der Hauptschleife des Programms bleibt es einfach, Änderungen in dieser Variablen zu verfolgen und entsprechend zu reagieren. Wenn sich der Wert beispielsweise in APPLICATION_READY geändert hat, ist das Flash-Laufwerk oder der Kartenleser angeschlossen und erfolgreich initialisiert. Sie können Dateien daraus lesen.
Es gibt auch keine Komplikationen mit FatFS - der Cube konfiguriert es bereits vollständig und "verbindet" sich mit dem USB-Host, sodass Sie unmittelbar nach dem Anschließen des Flash-Laufwerks auf die Funktionen dieser Bibliothek zugreifen können, um mit Dateien zu arbeiten. Der neu aktualisierte Cube enthält zwar die Bibliothek der alten Version. Nachdem ich seine Dateien auf eine neue Version aktualisiert hatte, musste ich die Namen der Definitionen aus der FatFS-Konfiguration an einigen Stellen im kubanischen Quellcode korrigieren, weil Sie haben sich in der neuen Version geändert. Das Update brachte jedoch keine besonderen Probleme mit sich, alles ging schnell und einfach.
Aber damit FatFS mit Kyrillisch in den Namen von Dateien und Verzeichnissen arbeiten konnte, musste ich ein wenig basteln. Damit FatFS kyrillische Namen korrekt lesen kann, müssen Sie Unicode in seiner Konfiguration aktivieren. Danach sollten alle mit FatFS verknüpften Zeichenfolgen nur noch in dieser Codierung enthalten sein - Laufwerksnamen, Dateinamen usw. Gleichzeitig unterstützen der Texteditor in IDE und FatFS Unicode mit unterschiedlichen Positionen des High-Bytes - eine mit Little Endian, die andere mit Big Endian, sodass es unmöglich ist, einfach Quellen mit Unicode-Texten zu schreiben. Und ich will nicht, um ehrlich zu sein. Zu diesem Zeitpunkt musste ich Konverter von ANSI und UTF-8 nach Unicode und umgekehrt schreiben sowie mehrere Funktionen zum Arbeiten mit Zeichenfolgen unterschiedlicher Codierungen in unterschiedlichen Kombinationen. Kopieren Sie beispielsweise eine UTF-8-Zeichenfolge in eine Unicode-Zeichenfolge oder hängen Sie eine ANSI-Zeichenfolge an eine Unicode-Zeichenfolge an. ANSI-Zeichenfolgen scheinen jedoch zu seinNirgendwo bleibt etwas übrig, alle Quellen werden vollständig in UTF-8-Codierung konvertiert.
Das Öffnen einer Datei mit einem bestimmten Namen sieht nun ungefähr so aus:
tstrcpy(u_tfname, UsbPath); // (Unicode) (Unicode)
tstrcat_utf(u_tfname, SDIR_IMAGES); // (Unicode) (UTF-8)
tstrcat_utf(u_tfname, (char*)"\\"); // (Unicode) (UTF-8)
tstrcat(u_tfname, fname); // (Unicode) (Unicode)
Als alles schnell ging, wollte ich die Geschwindigkeit des Lesens von Dateien von einem Flash-Laufwerk überprüfen. Das Lesen einer 10-MB-Datei in 4-KB-Blöcken ergab eine Geschwindigkeit von etwa 9 Mbit / s, was im Allgemeinen ziemlich gut war und zu mir passte.
Ich habe versucht, das Problem der Übertragung dieses Falls an DMA zu untersuchen, aber es stellte sich heraus, dass die Peripheriegeräte des USB-Hosts einfach keinen Zugriff auf DMA haben. Nun, oder ich habe es nicht gefunden :) Daher schien es logisch, alle Lese- / Schreibpuffer für USB-Dateien in CCM (Core Coupled Memory) zu organisieren - einem 64-KB-RAM-Bereich, der auch keinen DMA-Ausgang hat. Im selben Speicherbereich ist es sinnvoll, andere Variablen / Arrays zu platzieren, die nicht mit DMA funktionieren, nur um mehr Speicher im regulären RAM zu belassen. Übrigens schien mir, dass der Kernel selbst mit diesem Speicher etwas schneller arbeitet als mit normalem Speicher.
2.1 Datei-Benutzeroberfläche
Der Anycubic Photon S-Drucker, den ich besitze, zeigt eine Liste von Dateien als Vorschausymbole an, 4 Teile pro Bildschirm. Und im Prinzip ist dies sehr praktisch - Sie können den Dateinamen sehen, im Vorschaubild können Sie ungefähr sehen, welche Art von Modell. Daher bin ich dem gleichen Pfad gefolgt - Dateien werden 4 Stück pro Seite in Form von Vorschaubildern mit dem Dateinamen angezeigt.
Der vertraute gelbe Ordner wird auf den Verzeichnissymbolen und ein Zahnrad auf den Einstellungsdateien gezeichnet. Es werden nur die Dateien angezeigt, für die die Erweiterung unter eine der bekannten Dateien fällt. Derzeit sind dies .pws-Dateien (Dateien, die vom Slicer zum Drucken vorbereitet wurden ) und .acfg-Dateien (Textdateien mit Druckereinstellungen).
Da die Firmware auch mit Verzeichnissen funktioniert, die der Benutzer eingeben kann, habe ich eine Zeile über der Liste der Dateien platziert, in die der aktuelle Pfad geschrieben ist. Schaltflächen zum Verlassen des aktuellen Verzeichnisses oder zum Scrollen nach unten und oben werden nur angezeigt, wenn sie sinnvoll sind, dh wenn Sie das aktuelle Verzeichnis verlassen oder in der Liste nach unten oder oben scrollen können.
Mein Freund, dem ich dies alles zeigte, als die Firmware geschrieben wurde, schlug eine andere Option für die Ausgabe von Dateien vor - in Form einer Liste, einer Tabelle. Erstens passen dann mehr Dateien auf die Seite, und zweitens wird die Liste viel schneller angezeigt, da Sie keine Vorschaubilder aus Dateien lesen und mit Skalierung auf der Anzeige zeichnen müssen, und drittens können Sie neben dem Namen auch tabellarisch anzeigen und die Zeit, zu der die Datei zuletzt geändert wurde, was manchmal sehr praktisch ist. Es ist eine Sünde, eine gute Idee abzulehnen, deshalb habe ich eine Tabellenliste und gleichzeitig eine Schaltfläche hinzugefügt, um zwischen den Ansichten "Symbol" und "Tabelle" zu wechseln. Verzeichnisse in Tabellenform werden mit einem gelben Hintergrund hervorgehoben und die Zeile "DIR" wird anstelle des Zeitdatums geschrieben:
Übrigens gibt es keine Intrigen bei den Vorschaubildern, die für Dateien im Symbolmodus gezeichnet werden. Die Firmware analysiert nicht die gesamte Datei, um ein Bild aus einem 3D-Modell zu erstellen, wie manche meinen :) Dieses Bild wird vom Slicer selbst in der Druckdatei in einem BMP-ähnlichen Format gespeichert - einem Array von 16-Bit-Pixelfarbwerten. Die Größe des Vorschaubildes wird in speziellen Feldern in der Datei gespeichert. Also ist alles sehr einfach.
Die Firmware muss nur das Bild aus der Datei auf die Größe des Symbols auf dem Display skalieren. Die Firmware führt die Skalierung auf sehr einfache Weise durch: Sie berechnet den Skalierungsfaktor k(Bruchzahl) - Die Breite des Originalbilds wird durch die Breite des Anzeigebereichs auf dem Display geteilt (der Höhenkoeffizient wird ebenfalls berechnet und der größte der beiden Werte wird in Arbeit genommen). Anschließend werden Pixel und Linien aus dem Originalbild entnommen, um mit einem Schritt von k auf dem Display angezeigt zu werden .
Auf diese Weise können Sie sowohl in Plus als auch in Minus skalieren. Die Qualität des skalierten Ergebnisses lässt natürlich zu wünschen übrig, da keine Interpolation durchgeführt wird, aber auf einer so kleinen und nicht zu hochwertigen Anzeige ist es nicht wahrnehmbar, aber die Geschwindigkeit eines solchen Algorithmus ist ziemlich hoch.
Wenn Sie auf das Symbol oder die Zeile der .pws-Datei klicken, wird ein Bildschirm zum Anzeigen von Informationen zur Datei geöffnet, in dem Sie mit dem Drucken beginnen können. Wenn auf die .acfg-Datei geklickt wird, wird der Benutzer aufgefordert, die Einstellungen aus dieser Datei zu laden. Wenn ein Verzeichnis gedrückt wird, wird es aktuell und die Liste der Dateien wird aktualisiert.
2.2 Anzeigen von Dateiinformationen vor dem Drucken
Wie Sie in den Kommentaren zum vorherigen Teil richtig bemerkt haben, hat Anycubic bei Auswahl keine Informationen über die Datei. Die Schaltflächen zum Starten des Druckens und Löschens werden nur angezeigt. Dies ist sehr unpraktisch. Um die geschätzte Druckzeit, die Anzahl der Ebenen oder andere Parameter dieser Datei zu ermitteln, müssen Sie mit dem Drucken beginnen. Ich habe beschlossen, diesen Fehler nicht zu wiederholen, und wenn ich auf die ausgeschnittene Datei klicke, wird ein Bildschirm mit den vollständigsten Informationen dazu geöffnet:
Dateiname, Größe, Zeitpunkt der letzten Änderung und fast alle Druckparameter. Hier jedoch spielt die Tatsache, dass das MKS DLP-Display eine Auflösung von 480x320 hat, in meine Hände, während die Enikubiks eine kleinere haben - 320x240, auf diesem kann man nicht wirklich mit einer Menge Text schwingen.
2.2.1 In Bezug auf die Berechnung der Druckzeit werde ich separat schreiben.
Dieser Indikator wird im Gegensatz zu allen anderen Parametern nicht in der Datei gespeichert. Sein Drucker muss basierend auf den ihm bekannten Informationen unabhängig rechnen. Das gleiche Anycubic Photon S hat die Angewohnheit, bei dieser Berechnung zu überschießen und nach unten zu gehen - zum Beispiel verspricht es 5 Stunden Druck, während es in Wirklichkeit 6 Stunden druckt. Und Longer Orange 30 wechselt dieses Mal während des Druckvorgangs fast zweimal hin und her. Ich beschloss, diesen Punkt so sorgfältig wie möglich anzugehen. Woraus besteht diese Zeit?- Die Zeit, die die Plattform benötigt, um mit einer bestimmten Geschwindigkeit auf die Höhe der nächsten Schicht abzusteigen.
- Die Pausenzeit vor dem Beginn der Belichtung.
- Belichtungszeit der Schicht.
- Die Zeit, die die Plattform benötigt, um mit einer bestimmten Geschwindigkeit auf eine bestimmte Höhe zu steigen, nachdem die Schicht freigelegt wurde.
Diese 4 Parameter werden summiert, multipliziert mit der Anzahl der Schichten und die Gesamtdruckzeit wird erhalten. Wenn alles mit Pausen- und Fackelzeiten elementar ist - sie werden mit Millisekundengenauigkeit beibehalten, aber mit der Plattformbewegung ist alles bereits etwas komplizierter.
Die Plattform nimmt die eingestellte Geschwindigkeit nicht sofort auf, sondern verfügt über eine Beschleunigung, die in den Einstellungen festgelegt wird. Darüber hinaus ist dies beim Drucken eine eher geringe Beschleunigung, da die Plattform sehr gleichmäßig ansteigen sollte, damit die letzte ausgehärtete Schicht schmerzlos vom Film am Boden des Bades abfällt (ja, das Polymer haftet leider auch am Film).
Es stellt sich heraus, dass die Bewegung der Plattform aus drei Komponenten besteht: Beschleunigung bis zum Erreichen einer bestimmten Geschwindigkeit, gleichmäßige Bewegung bei einer bestimmten Geschwindigkeit und Verzögerung bis zum vollständigen Stillstand. Und hier beginnen die Optionen - zum Beispiel erlaubt die angegebene Beschleunigungs- und Hubhöhe der Plattform nicht, die angegebene Geschwindigkeit zu erreichen, sie beschleunigt immer noch in dem Moment, in dem sie bereits mit dem Abbremsen beginnen muss, um auf der angegebenen Höhe anzuhalten. Oder die Beschleunigung und Höhe reichen aus, damit die Plattform auf die eingestellte Geschwindigkeit beschleunigt und einen Teil des Pfades in stetiger Bewegung zurücklegt, bevor sie mit dem Abbremsen beginnt. Wir müssen all dies überprüfen, die Zeiten und Entfernungen für jede Komponente berechnen.
Um ehrlich zu sein, drehte sich mein Kopf, als ich die Funktion zur Berechnung der Druckzeit schrieb :) Und als Ergebnis bekam ich immer noch einen kleinen Fehler. Beispielsweise beträgt die tatsächliche Druckzeit 07:43:30 anstelle der geschätzten 07:34:32.
Oder 05:48:43 anstelle der berechneten 05:43:23.
Aber im Prinzip passte dieser Fehler zu mir. Ich habe versucht, einen Fehler in den Berechnungen zu finden, aber dort scheint alles korrekt zu sein. Höchstwahrscheinlich entspricht die tatsächliche Beschleunigung aufgrund der Besonderheiten der Schrittmotorsteuerung geringfügig nicht der angegebenen. So reibungslos kamen wir zur nächsten Stufe :)
3. Schrittmotorsteuerung für Plattformbewegung.
Zuerst hatte ich den Gedanken, meine eigene Schrittmotorsteuerung zu schreiben. Es ist überhaupt nicht schwierig, einen normalen Treiber auf dem Board zu haben - stellen Sie die Drehrichtung an einem Pin ein und treiben Sie die Schrittimpulse zum anderen Pin. Sie müssen sich schnell drehen - Sie erhöhen die Pulsfrequenz, Sie müssen langsam - Sie verringern sie.
Aber als ich anfing, mich diesem Problem genauer zu nähern, wurde mir klar, dass seine Einfachheit täuscht. Nein, Sie können Ihre eigenen schreiben, und es wird funktionieren, aber so zu schreiben, dass es gut funktioniert, ist eine ziemlich große Aufgabe. Schrittmotoren mögen Unregelmäßigkeiten in Schritten nicht sehr, daher ist es notwendig, eine gute Gleichmäßigkeit der Schrittimpulse in einem ziemlich weiten Frequenzbereich sicherzustellen - von einigen Hertz bis zu einigen zehn Kilohertz. Es ist notwendig, eine gleichmäßige Zunahme und Abnahme der Frequenz der Impulse zum Beschleunigen und Abbremsen sicherzustellen. Es ist notwendig, die erzeugten Impulse genau zu zählen, um garantiert zu wissen, in welcher Position sich die Plattform jetzt befindet. Es ist notwendig, die Anzahl der Impulse und die Periode ihrer Frequenzänderung für einen genau definierten Zeitraum zu berechnen, um die erforderliche Beschleunigung bereitzustellen.
Kurz gesagt, die Aufgabe ist zwar machbar, aber sehr, sehr umfangreich, was mehr als einen Tag dauern würde. Also habe ich beschlossen, die Motormanagementfunktionen von Marlin zu übernehmen . Ich dachte, es wäre einfach ...
Zuerst nahm ich die Datei stepper.cpp aus Marlins Quellen - und steuerte direkt den Schrittmotor. Es stellte sich jedoch heraus, dass seine Arbeit stark vom Bewegungsplaner aus der Datei scheder.cpp abhängt, sodass ich ihn auch übernehmen musste. Nun, zum Heap habe ich auch die Datei endstops.cpp von dort genommen - die Achsendschalter zu verarbeiten, da ich noch Ereignisse von ihnen verarbeiten musste, und hier waren der Scheduler und die Motorsteuerung dieser Datei bereits für Endschalter zugeordnet.
Ich habe sehr lange versucht, alles Unnötige aus diesen Dateien zu entfernen und sie vom Rest des Marlin-Ökosystems zu lösen. Tatsache ist, dass Marlin unter der Kontrolle von 6 oder 7 Schritten gleichzeitig geschärft wird, während ihre Arbeit von der Temperatur mehrerer Heizungen, von den Parametern des Kunststoffs usw. abhängen kann. Das System ist dort wirklich kompliziert. Ich musste viel wiederholen, hauptsächlich unnötige Achsen und unnötige Extruder entfernen und eine ganze Reihe von Makros entfernen, die in der Originalversion nützlich, in meiner aber sehr störend waren. Nur zum Verständnis - die Größe der Quellen, die ich Marlin entnommen habe, wurde von 346 auf 121 KB reduziert. Und jede Zeile musste mit Vorsicht gelöscht werden.
Natürlich habe ich mich während dieses harten Schnittes ein wenig eingehender mit der Arbeit des gesamten Systems befasst, wie es funktioniert. Um die Achse zu bewegen, wird die Zielposition der Achse über eine ihrer Funktionen an den Planer übertragen (der Planer speichert die aktuelle Position). Der Scheduler berechnet die Anzahl der Schritte und deren Parameter für Beschleunigung, Geradeausbewegung und Verzögerung und bildet aus diesen Daten ein spezielles Datenpaket für die direkte Motorsteuerungsfunktion (Stepper). Es können mehrere dieser Pakete vorhanden sein. Der Scheduler berechnet und erstellt für jede neue Aufgabe ein neues, nächstes Paket.
Stepper, der in einem Timer-Interrupt in einem freien Zustand arbeitet, fordert das nächste Datenpaket vom Scheduler an. Wenn der Scheduler ein vorbereitetes Paket hat, gibt er es weiter und betrachtet es als fertig. Stepper nimmt das empfangene Paket in Arbeit und beginnt, die Schritte des Motors gemäß den Daten daraus zu erarbeiten. Bis es abgeschlossen ist, wird das nächste Paket nicht angefordert.
Was im Stepper merkwürdigerweise implementiert ist, ist, dass es bei niedrigen Geschwindigkeiten einen Schrittimpuls in jedem Interrupt ausgibt und den Timer so einstellt, dass der nächste Interrupt nach der erforderlichen Zeitspanne auftritt. Wenn die erforderliche Schrittfrequenz einen bestimmten Wert überschreitet, beginnt der Stepper, in jedem Interrupt mehrere Schritte auszugeben. Gleichzeitig sind alle Timings so gut gewählt, dass die Gleichmäßigkeit der Schritte sehr gut ist. Aus Neugier habe ich mir das Oszilloskop angesehen.
Der Scheduler weiß auch, wie benachbarte Pakete "verbunden" werden. Was dies bedeutet: Wenn der Scheduler bereits ein Paket für den Stepper vorbereitet hat und dann eine neue Aufgabe zu ihm kommt, bildet er das nächste Paket und ändert das vorherige, so dass durch die sequentielle Verarbeitung dieser beiden Pakete durch den Stepper eine reibungslose Bewegung erhalten wird.
Lassen Sie mich anhand eines Beispiels erklären. Der Planer ist frei, er erhält die Aufgabe, die Achse mit einer Geschwindigkeit von 30 mm / s um 20 mm vorwärts zu bewegen. Der Planer generiert das erste Paket, in dem er die Beschleunigung von Null auf 30 mm / s, die geradlinige Bewegung bei dieser Geschwindigkeit und die Verzögerung von dieser Geschwindigkeit auf Null beschreibt. Wenn der Stepper, bevor der Stepper dieses Paket vom Scheduler nimmt, eine neue Aufgabe erhält, um diese Achse um weitere 50 mm vorwärts zu bewegen, jedoch bereits mit einer Geschwindigkeit von 40 mm / s, erstellt der Scheduler nicht nur ein neues Paket mit einer Beschleunigung von Null, sondern ändert das erste Paket Durch Entfernen der Verzögerung und Erweitern der geradlinigen Bewegung um ihren Abstand und im erstellten zweiten Paket beginnt die Beschleunigung nicht bei Null, sondern bei der Geschwindigkeit des vorherigen Pakets.
Das Ergebnis ist eine Bewegung, bei der die Achse auf 30 mm / s beschleunigt, 20 mm fährt, dann erneut auf 40 mm / s beschleunigt und weitere 50 mm fährt und am Ende auf Null verlangsamt. Dies ist jedoch nur dann der Fall, wenn es dem Stepper noch nicht gelungen ist, das vorherige Paket aufzunehmen. Andernfalls werden diese beiden Aufgaben als zwei separate Bewegungen mit jeweils null Anfangs- und Endgeschwindigkeit verarbeitet. Wenn Sie bei Druckern mit manueller Plattformsteuerung den Lift mehrmals hintereinander in Schritten von 10 mm drücken, stoppt die Plattform nach dem ersten 10 mm-Lift und bewegt sich dann weiter, ohne bis zur vollen Höhe anzuhalten, auf die die Taste klickt.
In der neuen Version von Marlin ist bereits ein Mittel gegen eine solche "ruckartige" Bewegung aufgetaucht - jetzt gibt der Scheduler für eine bestimmte Zeit nach seiner Bildung kein Schrittpaket mehr, wenn dieses Paket das einzige ist, das bereit ist. Diese Zeit ist für das Warten vorgesehen - kommt die nächste Aufgabe an, damit Sie sie an die vorhandene ankoppeln können.
3.1 Plattform-Bewegungssteuerungsschnittstelle
Hier ist im Allgemeinen alles Standard und üblich für Fotopolymerdrucker. Oben befindet sich die Auswahl des Schritts der Achsenbewegung, rechts die Schaltflächen zum Verschieben der Achse mit dem ausgewählten Schritt nach oben oder unten.
Mit der Taste "Home" wird die Plattform auf Null gestellt (Parken, Home). Wenn diese Taste gedrückt wird, beginnt sich die Plattform in Richtung des Endschalters "Home" zu bewegen. Wenn die Plattform erreicht ist, stoppt sie, bewegt sich ein wenig zurück und läuft wieder langsam (für eine größere Genauigkeit) in den Endschalter. Danach kennt die Firmware definitiv die genaue aktuelle Hubhöhe der Plattform.
Set-Taste Mit Z = 0 ”wird die Plattformhöhe über dem Display kalibriert. Ein solches Kalibrierungssystem wird beispielsweise in Anycubic-Druckern verwendet, wenn der Nullpunkt der Plattform (seine optimale Höhe über dem Display) 1-2 mm unter der Auslösung des Endschalters "Home" liegt. Und dieses Kalibrierungssystem scheint mir korrekter zu sein als die Systeme, die in letzter Zeit populär geworden sind, wenn die Höhe der Endschalterbetätigung gleichzeitig die Nullhöhe der Plattform ist.
Nun, der letzte Knopf ist "Stop!" Ist ein bedingungsloser und sofortiger Stopp der Plattformbewegung. Übrigens, während die Plattform in Bewegung ist, können Sie diesen Bildschirm nicht verlassen, die Schaltfläche "Zurück" funktioniert nicht. Dies geschieht nur, damit die Stop-Taste sofort verfügbar ist, während sich die Plattform bewegt.
3.2 Weitere Punkte zur Plattformbewegung
Es gibt einige Dinge, die mich in Anycubic Photon schrecklich nerven.
Die erste ist, warum die manuelle Bewegung der Plattform mit der gleichen Schneckenbeschleunigung wie im Druckmodus erfolgt. Beim Tippen ist eine so kleine Beschleunigung nützlich, aber bei manueller Steuerung der Achse wird sie 2 Sekunden lang beschleunigt - es ist nur ein Albtraum. Und die Bewegungsgeschwindigkeit ist mittelmäßig.
Der zweite Punkt: Warum steigt die Plattform beim Anhalten des Druckvorgangs mit der in den Druckparametern angegebenen Geschwindigkeit auf die Pausenhöhe an? Verdammt, 15 Sekunden darauf zu warten, dass die Plattform zwei (nur) Zentimeter ansteigt, ist mehr als gut. Aber danke fürs Aufstehen. In Orange 30 bedeutet eine Pause keineswegs ein Anheben der Plattform um einen Millimeter, sodass nicht einmal klar ist, warum sie überhaupt vorhanden ist.
Und der dritte Moment, der nur wütend macht - nach dem Ende des Druckvorgangs steigt die Plattform ganz nach oben. Bei der gleichen Geschwindigkeit, die in den Druckparametern angegeben wurde - 1 mm / s. Das Aufsteigen aus einer Höhe von 5 cm dauert 100 Sekunden!
Daher habe ich in meiner Firmware einstellbare Geschwindigkeiten und Beschleunigungen separat für den Druckmodus und separat für die manuelle Plattformsteuerung vorgenommen. Aber mit zwei Einschränkungen:
- Bis die Achse mit der Home-Taste zurückgesetzt wird, wird die Fahrgeschwindigkeit um das Dreifache reduziert. Dies liegt daran, dass der Drucker zwar die genaue aktuelle Plattformhöhe nicht kennt, jedoch die Gefahr besteht, dass das Display gequetscht wird, ohne mit hoher Geschwindigkeit (Trägheit usw.) anzuhalten oder den Anschlag der Oberachse zu beschädigen. Nach dem Nullstellen der Achse kennt der Drucker die Position der Plattform bereits genau und die Software-Höhenbeschränkungen werden wirksam, die ebenfalls in den Einstellungen festgelegt werden.
- Bei einer Höhe von weniger als 30 mm wird die Geschwindigkeit ebenfalls um das Dreifache reduziert, unabhängig davon, ob die Achse auf Null gestellt ist oder nicht. Dies soll verhindern, dass das Photopolymer aus dem Bad spritzt, wenn die Plattform zu schnell in das Bad abgesenkt wird. Oder wenn man zu schnell herausklettert.
Natürlich gibt es andere Standardachsenparameter in den Einstellungen - die Anzahl der Schritte pro 1 mm, die Bewegungsrichtung, die Arbeit der Endschalter usw. Wenn jemand interessiert ist, gibt es unter dem Spoiler eine Textkonfigurationsdatei mit allen unterstützten Parametern. Eine solche Datei mit der Erweiterung .acfg wird von der Firmware direkt aus der Dateiliste aufgenommen, lädt die Parameter, speichert sie im EPROM und wendet sie sofort an, ohne neu zu starten:
Inhalt der Konfigurationsdatei
# Stepper motor Z axis settings
[ZMotor]
# .
# : 0 1. : 1.
# .
invert_dir = 1
# .
# : -1 1. : -1.
# -1,
# , . 1
# .
home_direction = -1
# Z . ,
# 0, - .
home_pos = 0.0
# .
# : -32000.0 32000.0.
# : -3.0
# .
# , .
min_pos = -3.0
# .
# : -32000.0 32000.0.
# : 180.0
# .
# , .
max_pos = 180.0
# .
# : 0 1. : 1.
# ,
# 1, - 0.
min_endstop_inverting = 1
# .
# : 0 1. : 1.
# ,
# 1, - 0.
max_endstop_inverting = 1
# 1 .
steps_per_mm = 1600
# ,
# , /. : 6.0.
homing_feedrate_fast = 6.0
# ,
# , /. : 1.0.
homing_feedrate_slow = 1.0
# , /2.
acceleration = 0.7
# , /.
feedrate = 5.0
# ( ,
# ..), /2.
travel_acceleration = 25.0
# ( ,
# ..), /. 30
# ,
# 5 /.
travel_feedrate = 25.0
# , .
current_vref = 800.0
# , .
current_hold_vref = 300.0
# ,
# . . 0
# .
hold_time = 30.0
# ,
# . .
# hold_time. 0 .
# , .
off_time = 10.0
# General settings
[General]
# (0.001 )
# .
# : 0 15000. : 700 (0.7 ).
buzzer_msg_duration = 700
# (0.001 )
# , .
# : 0 15000. : 70 (0.07 ).
buzzer_touch_duration = 70
# 180 .
# .
# : 0 1. : 0.
rotate_display = 0
# , .
# LCD-. -
# .
# : 0 15000. : 10. 0 .
screensaver_time = 10
Und damit werde ich diesen Teil beenden, und schon gibt es zu viel Text :)
Wie zuvor - ich werde gerne Fragen beantworten und Kommentare annehmen.
- Teil 1: 1. Benutzeroberfläche.
- Teil 2: 2. Arbeiten mit dem Dateisystem auf einem USB-Stick. 3. Schrittmotorsteuerung für Plattformbewegung.
- Teil 3: 4. Anzeigen von Bildern von Ebenen auf dem Hintergrundbeleuchtungsdisplay. 5. Alles, wie die Steuerung von Beleuchtung und Lüftern, das Laden und Speichern von Einstellungen usw. 6. Zusätzliche Funktionen für Komfort und Bequemlichkeit.
Links
MKS DLP-Kit auf Aliexpress
Original-Firmware-Quellen des Herstellers auf GitHub
Schemes vom Hersteller von zwei Versionen des Boards auf GitHub
Meine Quellen auf GitHub