Auto-bedleveling mit Marlin Firmware und induktivem Sensor, capazitivem Sensor oder Servo-Endschalter
Um das ständige ausrichten des Druckbetts bei RepRap Druckern und Bausätzen zu verhindern, unterstützt die Marlin Firmware das sog. Auto-bedleveling.
Höhenabweichungen in Z-Richtung werden dann mit vertikal Bewegungen während des
Druckprozess über die Software ausgeglichen.
Die Prozedur funktioniert gut und hat meinen Druckprozess deutlich
verbessert und beschleunigt. Im Folgenden werden drei Varianten dargestellt, dass Auto-bedleveling umzusetzen.
Die Auto-bedleveling Funktion in Aktion mit einem a.) induktiven Sensor, b.) kapazitiven Sensor und c.) Endschalter und Servo.
Hier die Vor -und Nachteile und die Videos:
Variante | Ind. Sensor | Kap. Sensor | Servo |
---|---|---|---|
Genauigkeit | + | + | 0 (mech. Teile) |
Preis | 0 (mit Alu Heizbett) | + (Glasplatte oder MK3 | + |
Variante a: Auto bedleveling mit ind. Sensor. | Variante b: Auto bedleveling mit cap. Sensor. | Variante c: Auto bedleveling mit Servo-Endschalter. |
Variante a.: Alle Hardware Komponenten als Paket (Sensor + MK3 inkl. SMD Thermistor + Spannungsteiler + 2Pol Kabel)
können bei Ebay als Bausatz bestellt werden.
Variante b.: Alle Hardware Komponenten als Paket (Sensor + Spannungsteiler + 2Pol Kabel)
können bei Ebay als Bausatz bestellt werden.
1.) Änderung der Hardware bei Variante a und b.
Variante a. und b.): Ein aktiver Abstandssensor kann für die Abmessung der Normalen an vier Punkten des Heizbeds genutzt werden.
Vorraussetzung hierfür ist bei Variante a. die Verwendung einer leitfähigen Druckbett-Oberfläche (z.B. das Aluminium MK3) während
Varinate b. auch auf einer Glasplatte funktioniert.
Beide Abstandssensoren müssen über einen Spannungsteiler an das Printerboard angeschlossen werden, um die Ausgangsspannung zu reduzieren.
Geeignete Halterung für den jeweiligen Sensor kann selbst gedruckt
werden (stl-file für einen Sensor mit M12 Gewinde) und sollte ca. 1mm oberhalb
der Hotend-Düsenspitze liegen.
Beim MK3 Alu Heizbett kann oftmals der Thermistor in SMD direkt auf die Platine gelötet werden.
Empfohlen wir hier der Epcos B57621C104J62 in der Größe 1206.
Die passende Kennlinie für Marlin (thermistortables.h) findet ihr hier.
Einfach eure aktuelle thermistortables.h Datei damit überschreiben und in Configuration.h die Kennlinie 8 wählen.
#define TEMP_SENSOR_BED 8 //in thermistortables.h ist hier B57621C104J62 abgelegt
Variante c.) Mit einem Servo-Motor für das Auto-bedleveling (z.B. der Tower Pro SG90 (Pinnbelegung: Rot-5V, Orange-PWM, Braun-GND).
Der SG90 wird bereits mit geeigneten Schrauben zur Montage eines Endstopp-Halters geliefert.
Dieser Servo-Motor kann außerdem an das genutzte Printerboard direkt angeschlossen werden.
Während beim RAMPS 1.4-Board eine der Servo-Pinreihe direkt genutzt werden kann (5V muss hierbei
durch einen Jumper für die Servo-Reihe "freigeschaltet" werden)
muss beim Rumba Board umgepinnt werden (GND und 5V auf dem Stecker tauschen).
Der Endschalter für die Z-Achse (bestenfalls mit Rollen-Kipphebel) muss nun mit einer geeigneten Halterung
(für einen Makerfarm Prusa i3 gibt es das stl-file
hier)
an den Servo-Motor befestigt werden. Der Servo-Motor wird dann an den X-Schlitten montiert, so dass das Endstopp bei
ausgefahrenem Arm (90° Sollwinkel) unter dem Hotend liegt und bei
eingefahrenen Arm (0° Sollwinkel) im rechten Winkel zum Hotend absteht.
2.) Software Anpassung in der Marlin Firmware:
Generelle Freischaltung der Routine in der Firmware (Datei "Configuration.h")
Variante a., b. und c.
#define ENABLE_AUTO_BED_LEVELING // Delete the comment to enable
Für Variante a. und b. mit den aktiven induktiven oder capazitiven Abstandssensor wird kein Pull-up für den z-Endstop benötigt.
Bei Variante c., dem passiven Mikroschalter mit zwei Anschlüssen (Sig, GND) benötigen wir unbetätigt einen definierten High-Pegel.
Daher darf die Zeile #define ENDSTOPPULLUP_ZMIN nicht auskommentiert werden.
#define ENDSTOPPULLUPS // Comment this out (using // at the start of the line) to disable the endstop pullup resistors
#ifdef ENDSTOPPULLUPS
...
...
...
//#define ENDSTOPPULLUP_ZMIN //Variante a. und b. auskommentiert
#endif
Die nächste Codezeile hängt von der Sensor oder Schaltervariante ab. Alle Sensoren gibt jeweils als Öffner (NC) und Schließer (NO).
Variante a.: Ind. Sensor LJ12A3-4-Z/BX ist ein NPN-Schliesser -> "true"
Variante b.: Cap. Sensor LJC18A3-BZ/AX ist ein NPN-Öffner -> "false"
Variante c.: 2 Pinniger Endschalter als Öffner (Sig, GND) -> "false"
const bool Z_MIN_ENDSTOP_INVERTING = true; // "true" Variante a., "false" bei Var. b. und c.
Definition der Testpunkte (in mm) für die Prozedur (passt für ein Druckbett mit 200x200mm Fläche). Diese werden angefahren und
ausgemessen:
#define LEFT_PROBE_BED_POSITION 0 //Erster Testpunkt bei Null-Position
#define RIGHT_PROBE_BED_POSITION 150 //Dann 150 mm nach rechts fahren
#define BACK_PROBE_BED_POSITION 150 //Dann 150mm in y-Richtung fahren
#define FRONT_PROBE_BED_POSITION 0
XY-Geschwindigkeit sollte verringert werden, um keine Geschwindigkeitsbegrenzung zu erreichen.
1mm Anhebung zwischen den
Messpunkten reicht vollkommen für Variante a. und b. aus. Für Variante c. sollte hier ein Wert von 3mm gewählt werden.
#define Z_RAISE_BEFORE_HOMING 2
#define XY_TRAVEL_SPEED 2000
#define Z_RAISE_BEFORE_PROBING 2 //How much the extruder will be raised before traveling to the first probing point.
#define Z_RAISE_BETWEEN_PROBINGS 2 //How much the extruder will be raised when traveling from between next probing points
Variante a. und b.: In Configuration_adv.h muss folgendes geändert werden, damit der induktive oder kapazitive Sensor beim Drucken unbeachtet bleibt.
Ebenso kann sonst der Z-Offset zwischen Hotend und Sensorschaltpunkt sonst nicht ermittelt werden.
#define ENDSTOPS_ONLY_FOR_HOMING // Variante a. und b., Variante c. auskommentiert
Abstand des ind. oder cap. Sensors zum Hotend abmessen und im folgenden eintragen.
Dabei kann für den Z-Offset die folgenden Prozedur angewendet werden:
1.) Mit "G28" alle Achsen zurücksetzen. (Home all axis)
2.) Mit "G92 Z10" die Z-Achsen Position auf 10mm Höhe setzen ohne die Achse zu bewegen.
3.) In 0,1mm Schritten den Abstand vom Hotend zum Heizbett verringern bis nur noch ein Papierblatt dazwischen passt.
4.) Mit "M114" aktuelle Z-Position abfragen und das Delta als negativen Wert im folgenden eintragen
z.B. Z_PROBE_OFFSET_FROM_EXTRUDER = -(10mm - 9,2mm):
#define X_PROBE_OFFSET_FROM_EXTRUDER -25 //in mm
#define Y_PROBE_OFFSET_FROM_EXTRUDER 0
#define Z_PROBE_OFFSET_FROM_EXTRUDER -0.8 //Hier das gerade ausgemessene Delta eintragen.
Nach dem Homing nicht in das Bettzentrum fahren, um beim Nullpunkt mit der Prozedur zu beginnen. Sonst kann es sein, dass das Hotend während dessen außerhalb des Druckbetts fährt:
#define Z_SAFE_HOMING_X_POINT (0) // 3d-proto (X_MAX_LENGTH/2) : X point for Z homing when homing all axis (G28)
#define Z_SAFE_HOMING_Y_POINT (0)
Für Variante c.) mit Endschalter und Servo zusätzlich noch folgendes anpassen:
Offset in mm von der Spitze des Hotends zum ausgefahrenen Z-Endstop-Arm. Diese Werte müssen unbedingt genau ermittelt werden. Da der ausgefahrene
Endschalter unterhalb des Hotends liegt muss der letzte Wert negativ sein.
Zum Ausmessen kann Befehl M280 P0 S90 genutzt
werden (Servo 0 um 90° schwenken, d.h. Arm ausfahren):
#define X_PROBE_OFFSET_FROM_EXTRUDER -25 //in mm
#define Y_PROBE_OFFSET_FROM_EXTRUDER 0
#define Z_PROBE_OFFSET_FROM_EXTRUDER -1.8 //Hier auf 0.1mm genau messen
Anzahl der verwendeten Servos festlegen und den eingefahrenen und ausgefahrenen Winkel festlegen:
#define NUM_SERVOS 3 // Servo index starts with 0 for M280 command
#define SERVO_ENDSTOPS {-1, -1, 0} // Servo index for X, Y, Z. Disable with -1
#define SERVO_ENDSTOP_ANGLES {0,0, 0,0, 70,0} // X,Y,Z Axis Extend and Retract angles
Servo ist während des Drucks abgeschaltet. Sonst zappelt der Servo beim Druckvorgang.
#define PROBE_SERVO_DEACTIVATION_DELAY 300
Anzahl der verwendeten Servos festlegen und den eingefahrenen und ausgefahrenen Winkel festlegen:
#define NUM_SERVOS 3 // Servo Index, startet mit 0 für den M280 Befehl
#define SERVO_ENDSTOPS {-1, -1, 0} // Servo Index X, Y, Z. Abgeschaltet mit -1
#define SERVO_ENDSTOP_ANGLES {0,0, 0,0, 80,0} // X,Y,Z Paar Achsen Winkel (Ausgefahren, Eingefahren)
Kontrollieren, ob in pins.h die richtigen Servos gemappt wurden, z.B. Serov0 auf Pin 11 für das RAMPS-Board:
#ifdef NUM_SERVOS
#define SERVO0_PIN 11
#if NUM_SERVOS > 1
#define SERVO1_PIN 6
#endif
#if NUM_SERVOS > 2
#define SERVO2_PIN 5
#endif
#if NUM_SERVOS > 3
#define SERVO3_PIN 4
#endif
#endif
3.) Änderung des Start G-Codes in Slic3r für alle Varianten
Zu Beginn des G-Codes muss nun G28 (Home all axis) und G29 (Auto-Bed-Leveling) durchgeführt werden.
Unter Slic3r kann dies über den Custom G-Code im Fenster Start G-Code umgesetzt werden. Und fertig!
G28; home all axes: Unbedingt vorher durchführen.
G29; Auto bed level
Kommentare zum Tipp - Comments