Montag, 14. Juli 2014

Acceleration und Jerk

Zwei Einstellungen der Firmware beeinflussen das Verhalten des 3D Druckers erheblich, und die möchte ich jetzt etwas genauer analysieren.

Acceleration

Wenn man Beschleunigung nicht berücksichtigt, dann erzeugt das Slicer Programm einfach GCode der quasi von 0-100 in 0 sekunden beschleunigen müsste. Das ganze läßt sich zwar in Software leicht realisieren, aber wenn es um physikalische Bewegungen geht, wie etwa die Steuerung eines Schrittmotors ist das eigentlich nicht möglich. Der Schrittmotor, bzw. die ganze Achse hat nun einmal eine gewisse Trägheit die eine unedliche Beschleuinigung verhindert.
Zu diesem Zweck gibt es folgende Parameter in der Marlin Firmware, die unbedingt geändert werden müssen, da sie in der Default Einstellung viel zu hoch sind:

#define DEFAULT_MAX_ACCELERATION      {180,180,10,200}    // X, Y, Z, E maximum start speed for...
#define DEFAULT_ACCELERATION          60    // X, Y, Z and E max acceleration in mm/s^2 for printing moves
#define DEFAULT_RETRACT_ACCELERATION  60   // X, Y, Z and E max acceleration in mm/s^2 for retracts

DEFAULT_ACCELERATION definiert die Standardbeschleunigung und  DEFAULT_MAX_ACCELERATION die obere Grenze.
Bei einer Suche im Internet habe ich auch User gefunden welche die Werte noch wesentlich niedriger angesetzt haben.
Sind die Werte zu hoch, so kann es durchaus sein, dass der Motor Schritte ausläßt und deshalb Fehler im Druck passieren, sind die Werte zu niedrig, so beeinträchtigt das die Druckgeschwindigkeit. Es bleibt also durchaus Raum für Trial and Error.
Will man die obigen Werte als GCODE dann sind folgende M-Codes zu verwenden

M201 X180 Y180 Z10 E200 # DEFAULT_MAX_ACCELERATION
M204 S60 T60 # DEFAULT_ACCELERATION and DEFAULT_RETRACT_ACCELERATION

Die M-Codes können übrigens auf http://reprap.org/wiki/G-code#M201_-_Set_max_printing_acceleration nachgelesen werden.

Jerk

Jerk ist der maximale Geschwindigkeitsunterschied, der ohne Beschleunigung ausgeführt werden kann. Wenn JERK zum Beispiel 20.00 mm/s wäre und eine Geschwindigkeitsänderung von 0-20 mm/s benötigt wird, dann kann dies ohne Beschleunigung ausgeführt werden.

// The speed change that does not require acceleration (i.e. the software might assume it can be done instantaneously)
#define DEFAULT_XYJERK                20.0    // (mm/sec)
#define DEFAULT_ZJERK                 0.4     // (mm/sec)
#define DEFAULT_EJERK                 5.0    // (mm/sec)

Wie üblich ist die Z-Achse die Trägste und kann nicht so schnell bewegt werden, der Extruder ist ebenso unabhängig einstellbar.
Der Begriff JERK kommt aus den GRBL Wurzeln von Merlin.
Bei mir sind diese Werte (noch) default.

Montag, 7. Juli 2014

Der 3D Print Software Stack

Was ich zu Beginn meiner 3D Druck Karriere noch nicht wußte, war welche Software Produkte man in welcher Abfolge für das Erzeugen eines Drucks benötigt. Hier nochmal eine grobe Übersicht, welche Schritte und welche Produkte notwendig sind.

Ich beschränke mich hier ausschließlich auf OpenSource Software.

Zeichnen

Grundlegend für einen 3D Drucke ist eine CAD Zeichnung, die man in einem x-beliebigen 3D CAD Programm erstellen kann.
Einige Beispiele sind:
Es gibt sicher noch etliche Programm die 3D Modelle erzeugen können, alle sollten aber zumindest die Möglichkeit haben eine Zeichnung im STL Format zu exportieren.
Die nicht CAD geübten sollten sich auf Thingiverse umschauen und fertige Zeichnungen suchen.

Slicen

Die vorhandene CAD Zeichnung im STL Format, kann noch nicht als Eingabe für den 3D Drucker gebraucht werden, da sie keinen Schichtenaufbau beschreibt. Die Aufgabe des Slicers besteht nun darin aus einem in der Zeichnung definierten Volumen einzelne Schichten zu extrahieren, und jede Schicht in GCODE zu übersetzen, der direkt als Eingabe für die Firmware verwendet werden kann.
Die gängigsten Programm sind
Als Ausgabe erhalten wir vom Slicer eine GCODE Datei. Wer sich dafür interessiert, sollte die Datei einfach mal mit einem Editor aufmachen. Die einzelnen Befehle beschreiben direkt die Bewegungen der einzelnen Achsen (X, Y, Z) und der Extruder (E) in Millimetern. Zusätzlich gibt es noch eine Fülle an M-Codes die spezielle Funktionen des Druckers, wie z.B. das Heatbed ausfzuheizen, auslösen.

Hostsoftware

Die Hostsoftware dient dazu die Gcode Befehle meist über eine virtuelle serielle Schnittstelle an die Firmware auf dem Controller zu senden. Diese Software verfügt meist aber auch noch über eine grafische Darstellung und Kontrollmöglichkeiten um die Motoren und den Extruder auch ohne GCODE zu steuern. Das ist wichtig um z.B. das Heatbed zu kalibrieren, oder einen Filament Stau zu beheben indem man einfach den Extruder einige Millimeter rückwärts fahren läßt.
Die Vertreter die ich kenne
Es wäre aber durchaus machbar einfach die bestehende GCODE Datei an die Serielle Schnittstelle zu schicken.


Firmware

Die Firmware ist am Microcontroller installiert und kommuniziert über die serielle Schnittstelle mit der Hostsoftware. Primäre Aufgabe der Firmware ist die Steuerung der 5 Motoren(X, Y, 2*Z, Extruder), des Hotends, des Heatbed, der Überwachung der Endstops und die Temperaturüberwachung.

Aus den empfangenen GCODES erzeugt die Firmware STEP + DIRECTION Impulse für die Stepper Motor Treiber, die Umrechnung ist nicht ganz trivial und der Interessierte sollte sich mal auf der GRBL Seite schlau machen.
Die gängigste Firmware bei REPRAP basierten Druckern ist wohl Marlin.

Wie man die Firmware auf den Arduino Controller bekommt beschreibe ich in einem anderen Artikel, das ist als Voraussetzung auch nur einmal zu erledigen und reicht dann für viele Drucke.

E3D V5 Coldend wird zu warm - Filament Stau

Ich bin einem Problem auf der Spur, das mich die letzten Tage beschäftigte. Immer wenn ich mehrere Stücke oder ein einzelnes großen Stück drucken wollte, quittierte mein Drucker den Dienst, kein Plastik kam mehr aus dem Hotend.
Nach einigen Recherchen habe ich einen Verdächtigen:
Das Coldend meines Hotends

Hotend, hatte ich ja schon einmal gehört, aber was zu Geier ist denn das Coldend.

Das E3D V5 Hotend besteht aus einem Teil der heiß sein soll, da an dieser Stelle das Filament geschmolzen und durch die Nozzle gedrückt werden soll. Hier soll die eingestellt Temperatur erreicht werden, bei PLA ist das bei mir so ca. zwischen 195 und 215 Grad Celsius.
Der Zuleitungskanal, in dem das Filament transportiert wird, soll aber keineswegs heiß werden, da sonst das FIlament nicht mehr so gut vom Extruder transportiert werden kann, deshalb hat das E3D V5 auch oberhalb des kubischen Heizblocks den runden Kühlkörper mit einem Lüfter drauf.

Ein Hotend besteht also aus zwei Bereichen, einem kalten und einem warmen und am besten sollte das thermisch getrennt sein, was natürlich nicht ohne Aufwand geht. Beim E3D gibt es keine thermische Isolierung sondern eine aktive Kühlung mit einem Lüfter.
Wichtig ist dabei, dass die Kühlung knapp oberhalb der Nozzle beginnt.

Da der miteglieferte Fan Mount und das Groove Mount Plate bei mir nicht passten, bzw. wackelten habe ich es gegen eine Modell von Thingiverse getauscht, und bin mit der Stabilität durchaus zufrieden.
Was mir jetzt aber bei meinem Hotend Stau Problem erst auffällt, ist dass die Kühlung bei dem Design weiter oben anfängt.

In einem Forum von E3D habe ich gelesen, dass der Kühlkörper nie so heiß werden darf, dass man ihn nicht mehr mit der Hand anfassen kann, bei mir nach längerem Druck definitiv nicht der Fall.
Meine temporäre Lösung ist im Augenblick ein 100cm Lüfter der dem Kühlkörper von hinten ordentlich Luft zukommen läßt.

 Aus dem Forum habe ich auch noch die gängigsten Gründe für einen Filament Stau:
  • Temperatur ist zu niedrig, das Filament ist nicht flüssig genug
  • Das Coldend und der Transportkanal werden zu heiß, das Filament verflüssigt sich zu früh und kommt nicht bis zur Düse
  • Der Extruder ist zu fest eingestellt, sodass das Filament verformt wird, und deshalb im Transportkanal eine zu hohe Reibung verursacht.
  • Der Extruder ist zu locker eingestellt, sodass das Filament nicht mit genügend Kraft weiter transportiert wird
  • Der Motor wird mit zuwenig Leistung versorgt, sodass er nicht genügend Kraft hat das Filament durch das Hotend zu pressen. Man kann dies am Stepper Driver regulieren, ich habe meinen Driver auf 0.50V eingestellt.
  • Die Filament Qualität ist zu schlecht, insbesondere der Durchmessers und die Form des Filaments sollten konstant bleiben.
  • Die Druckgeschwindigkeit ist zu hoch und/oder die Temperatur ist zu niedrig. Je höher die Geschwingikeit, desto heißer muss das Hotend sein um das Plastik schnell genug zu erhitzen.
Ich starte einen größeren Druckjob, der lt. Pronterface 1:36:00 dauern wird. Wenn meine Kühlung nicht ausreicht, so sollte der Druck nach ca. 30-40 Minuten ins Leere.

Samstag, 5. Juli 2014

Prusa I3 Achatz Edition Slic3r Einstellungen

Hier zur Dokumentation meine Slic3r Einstellungen wie ich sie derzeit verwende, und einigermaßen zufrieden bin.

# generated by Slic3r 1.1.5 on Sat Jul  5 15:11:58 2014
avoid_crossing_perimeters = 1
bottom_solid_layers = 3
bridge_acceleration = 0
bridge_flow_ratio = 1
bridge_speed = 60
brim_width = 0
complete_objects = 0
default_acceleration = 0
dont_support_bridges = 1
external_perimeter_speed = 70%
external_perimeters_first = 0
extra_perimeters = 1
extruder_clearance_height = 20
extruder_clearance_radius = 20
extrusion_width = 0
fill_angle = 45
fill_density = 20%
fill_pattern = honeycomb
first_layer_acceleration = 0
first_layer_extrusion_width = 200%
first_layer_height = 90%
first_layer_speed = 30%
gap_fill_speed = 20
gcode_comments = 0
infill_acceleration = 0
infill_every_layers = 1
infill_extruder = 1
infill_extrusion_width = 0
infill_first = 0
infill_only_where_needed = 1
infill_speed = 60
interface_shells = 0
layer_height = 0.4
min_skirt_length = 0
notes =
only_retract_when_crossing_perimeters = 1
ooze_prevention = 0
output_filename_format = [input_filename_base].gcode
overhangs = 1
perimeter_acceleration = 0
perimeter_extruder = 1
perimeter_extrusion_width = 0
perimeter_speed = 30
perimeters = 2
post_process =
raft_layers = 0
resolution = 0.1
seam_position = aligned
skirt_distance = 6
skirt_height = 1
skirts = 1
small_perimeter_speed = 80%
solid_fill_pattern = rectilinear
solid_infill_below_area = 70
solid_infill_every_layers = 0
solid_infill_extrusion_width = 0
solid_infill_speed = 100%
spiral_vase = 0
standby_temperature_delta = -5
support_material = 0
support_material_angle = 0
support_material_enforce_layers = 0
support_material_extruder = 1
support_material_extrusion_width = 0
support_material_interface_extruder = 1
support_material_interface_layers = 3
support_material_interface_spacing = 0
support_material_interface_speed = 100%
support_material_pattern = honeycomb
support_material_spacing = 2.5
support_material_speed = 60
support_material_threshold = 0
thin_walls = 1
threads = 2
top_infill_extrusion_width = 0
top_solid_infill_speed = 80%
top_solid_layers = 3
travel_speed = 80

Im Augenblick habe ich nur mehr ein Problem:
Bei größeren, bzw. längeren Ausdrucken verstopft mir die Düse nach ca. 40 min, aber auch das werde ich noch rausfinden.

Wie genau sind 3D Ausdrucke

Nachdem ich nun mit meinem 3D Drucker die ersten Hürden genommen habe, möchte ich herausfinden, wie genau ein Ausdruck ist, d.h. die Diemensionen zur Zeichnung vergleichen.Ich habe dazu ein Kalibrierungsobjekt aus Thingieverse verwedent, das ihr hier finden könnt: http://www.thingiverse.com/thing:382453
Ich versuche hier gar nicht zu erklären, wie man kalibrieren muss, es geht mir diesmal nur um eine Feststellung.


Bottom : 29.96 x 29.88
Top: 29.95 x 30.12
Height: 29.58
Thickness : 5.08 - 5.2

Alle Angaben sind in mm.
Mit Ergebnis bin ich einstweilen sehr zufrieden, ich halte mal PI x Daumen fest, dass der Drucker +/- 0.2mm Toleranz besitzt.

Es wäre interessant ob andere User diese Toleranz akzeptieren, oder ihren Drucker noch weiter kalibrieren.

Fehler: Ausdruck seitenverkehr

Endlich habe ich meinen Drucker soweit, dass Ausdrucke in einer annehmbaren Qualität gedruckt werden, und ich beginne als erstes eingie Teile meines Druckers nachzudrucken, damit ich Ersatzteile habe, doch als ich das erste Zahnrad ausdrucke, stimmt was nicht
Das rechte Zahnrad entspricht dem original, aber das linke ist Seitenverkehrt, aber warum. Zuerst dachte ich an eine Einstellung in Slic3r oder Protnerface, die fälschlicherweise aktiviert habe, wäre ja kein Wunder bei dem Trial and Error Spiel das ich bis jetzt gemacht habe.
Die Software ist nicht schuld, es war die Hardware. Ich habe meinen Achatz mangels besserem Wissens falcsh aufgebaut und den Y-Motor hinten angebracht, vorne befindet sich der Endstop. Als ich den Drucker in Betrieb genommen habe, stellte ich Marlin einfach so ein, dass sich der Drucker richtig bewegt, und das Homing funktioniert. Bei den ersten Ausdrucken bemerkte ich auch noch nicht, dass sie spiegelverkehrt waren, es handelte sich auch keist um symmetrische Bauteile.
Hier ein Bild meines Prusa I3 Achatz Edition.
Wie man am Bild sieht, befindet sich der Y-Motor hinten, der Endstop vorne.
Da ich die Kabelführung nicht neu machen wollte, habe ich kurzerhand die Einstellung in Marlin folgendermaßen geändert.

-#define INVERT_X_DIR true    // for Mendel set to false, for Orca set to true
+#define INVERT_X_DIR false    // for Mendel set to false, for Orca set to true
 #define INVERT_Y_DIR false    // for Mendel set to true, for Orca set to false
-#define INVERT_Z_DIR true     // for Mendel set to false, for Orca set to true
+#define INVERT_Z_DIR false     // for Mendel set to false, for Orca set to true
 #define INVERT_E0_DIR false   // for direct drive extruder v9 set to true, for geared extruder set to false
 #define INVERT_E1_DIR false    // for direct drive extruder v9 set to true, for geared extruder set to false
 #define INVERT_E2_DIR false   // for direct drive extruder v9 set to true, for geared extruder set to false
@@ -318,7 +318,7 @@ const bool Z_MAX_ENDSTOP_INVERTING = true; // set to true to invert the logic of
 // ENDSTOP SETTINGS:
 // Sets direction of endstops when homing; 1=MAX, -1=MIN
 #define X_HOME_DIR -1
-#define Y_HOME_DIR -1
+#define Y_HOME_DIR 1
 #define Z_HOME_DIR -1

Ich habe also einfach eingestellt, dass Y nicht invertiert ist.

Fehler: Ausdrucke sind zu nieder

Jetzt habe ich meinen Drucker soweit kalibriert, sodass eigentlich alles passen sollte, aber bei dem Versuch ein kleines Zahnrad zu drucken, habe ich immer das Problem, dass das Stück einfach zu klein rauskommt, irgendwie gequetscht.Zusätzlich macht mein Drucker beim Start eines Ausrucks komische Geräusche, die wahrscheinlich dadurch verursacht werden, dass die Z Achse zu schnell bewegt wird.
Wie beides zusammenhängt werde ich gleich noch erklären hier zuerst mal ein Bild von einem Zahnrad wie es nicht sein sollte.
Gestaucht, wäre wohl der richtige Ausdruck, aber warum.
Nach langem stöbern bin ich dann doch auf des Rätsels Lösung gekommen.

Da ich Merlin selbst installiert habe und damit auch die Basiskonfiguration verwendet, spricht die Firmware die Motoren mit einer zu hohen Bsschleunigung an, insbesondere die Z-Achse die beim Achatz bei weitem nicht dieses Tempo mithalten kann. Ich denke auch alle anderen 3D Drucker hätten mit diesen Werten ein Problem.

Hier der Diff zur Originalkonfiguration

+#define DEFAULT_AXIS_STEPS_PER_UNIT   {80, 80, 3970.588235294, 602.898453333}  // default steps per unit for Ultimaker
+#define DEFAULT_MAX_FEEDRATE          {300, 300, 3, 25}    // (mm/sec)
+#define DEFAULT_MAX_ACCELERATION      {1000,1000,5,10000}    // X, Y, Z, E maximum start speed for accelerated moves. E default values are good for Skeinforge 40+, for older v

-#define DEFAULT_AXIS_STEPS_PER_UNIT   {78.7402,78.7402,200.0*8/3,760*1.1}  // default steps per unit for Ultimaker
-#define DEFAULT_MAX_FEEDRATE          {500, 500, 5, 25}    // (mm/sec)
-#define DEFAULT_MAX_ACCELERATION      {9000,9000,100,10000}    // X, Y, Z, E maximum start speed for accelerated moves. E default values are good for Skeinforge 40+, for older
-
-#define DEFAULT_ACCELERATION          3000    // X, Y, Z and E max acceleration in mm/s^2 for printing moves
-#define DEFAULT_RETRACT_ACCELERATION  3000   // X, Y, Z and E max acceleration in mm/s^2 for retracts
+#define DEFAULT_ACCELERATION          500    // X, Y, Z and E max acceleration in mm/s^2 for printing moves
+#define DEFAULT_RETRACT_ACCELERATION  500   // X, Y, Z and E max acceleration in mm/s^2 for retracts


Insbesondere die DEFAULT_MAX_ACCELERATION muss drastisch verringert werden, damit alles klappt. Eigentlich hat mein 3D Drucker nicht das Werkstück gestaucht, sondern eigentlich nur Steps verloren, weil das Tempo nicht umgesetzt werden konnte.
Und als netter Nebeneffekt verschwand damit auch das komische Geräusch beim starten eines Druckes. Slic3r baut bei jedem Start standardmäßig eine Z +5 Bewegung ein, die bei dem Tempo einfach nicht richtig umgesetzt werden konnte.

So schaut meine Werkstücke nun aus:
Auch sie Maße passen jetzt +/- 0.2 mm, damit bin ich vorerst zufrieden.
Wer jetzt genau hinsieht, erkennt auch gleich noch ein zweites Problem, das ich gelöst habe, aber dazu mehr im nächsten Artikel.