Seite 1 von 1

Z-Endstop-Falle und Workaround

Verfasst: Di 9. Jun 2015, 01:51
von Quant
Liebe RF1000-ler,

ich lese hier zwar schon seit ca. 2 Monaten eifrig mit, das ist aber mein erstes Posting.
Vielen Dank an Udo für das Hosting des Forums und an euch Tüftler, die mir den Einstieg in die Materie wesentlich erleichtert haben.

Nach temporärem Umbau auf Fräse bin ich bald in die Z-Endstop-Falle getappt:
Schaltet man den Drucker aus, während der Z-Max-Endstop betätigt ist, glaubt er nach dem neuerlichen Einschalten, dass er auf Z min ist. Und man kann deshalb die Platte nicht mehr rauf fahren.
Da die beiden Endschalter sich einen Pin teilen, kann die Firmware hier keine definitive Aussage treffen.
Das passiert bei mir regelmäßig, wenn ich nach einem erfolgten "Output Object" ausschalte.
Möglicherweise gibt's eh einen Workaround, aber wenn, dann konnte ich ihn partout nicht finden - habe dann immer die Z-Achse von Hand hochgekurbelt.

Als bequemere Lösung habe ich mir jetzt eine kleine Erweiterung in die Firmware 0.91.55 gebastelt:
Falls der Drucker unmittelbar nach dem Einschalten feststellt, dass ein Z-Endstop aktiv ist, fragt er einfach welcher.

In Repetier.ino, gleich nach den includes (Zeile 130):

Code: Alles auswählen

#define FIX_AMBIGUOUS_Z_ENDSTOP // fix for wrong endstop detection, if Z max endstop is already hit at startup
#ifdef FIX_AMBIGUOUS_Z_ENDSTOP
void ui_check_keys(int &action);
#endif
In Repetier.ino am Ende von setup(), unmittelbar nach "initRF1000();":

Code: Alles auswählen

#ifdef FIX_AMBIGUOUS_Z_ENDSTOP
  // fix for wrong endstop detection, if Z max endstop is already hit at startup
  #if MIN_HARDWARE_ENDSTOP_Z
  #if MAX_HARDWARE_ENDSTOP_Z
  #if Z_MIN_PIN==Z_MAX_PIN
  #if UI_HAS_KEYS
    if (READ(Z_MIN_PIN) != ENDSTOP_Z_MIN_INVERTING) {
      uid.printRowP(0, PSTR("Z endstop is hit"));
      uid.printRowP(1, PSTR("Is bed up or dn?"));
      #if UI_ROWS >= 4
        uid.printRowP(2, PSTR("                "));
        uid.printRowP(3, PSTR("Press up or down"));
      #endif
      HAL::stopWatchdog();
      int nextAction = 0;
      while (1) {
          ui_check_keys(nextAction);
          if (nextAction == UI_ACTION_PREVIOUS) {
            Printer::endstopZMinHit = ENDSTOP_IS_HIT;
            Printer::endstopZMaxHit = ENDSTOP_NOT_HIT;
            #if UI_ROWS >= 4
              uid.printRowP(2, PSTR("       UP       "));
            #endif
            break;
          } else if (nextAction == UI_ACTION_NEXT) {
            Printer::endstopZMinHit = ENDSTOP_NOT_HIT;
            Printer::endstopZMaxHit = ENDSTOP_IS_HIT;
            #if UI_ROWS >= 4
              uid.printRowP(2, PSTR("      DOWN      "));
            #endif
            break;
          }
      }
      #if UI_ROWS >= 4
        uid.printRowP(3, PSTR(" (release key)  "));
      #endif
      do {
        nextAction = 0;
        ui_check_keys(nextAction);
      } while (nextAction != 0);
      delay(200);
      HAL::startWatchdog();
    }
  #endif
  #endif
  #endif
  #endif
#endif
Ich hoffe, das ist für den ein oder anderen mit dem gleichen Problem nützlich.
Achtung, getestet habe ich das ausschließlich an meinem RF1000.

lg
Alex

Re: Z-Endstop-Falle und Workaround

Verfasst: Di 9. Jun 2015, 09:43
von rf1k_mjh11
Alex/Quant,

Ich vermute, das Ausschalten bei "Z-Max" ist eine Folge des OUTPUT_OBJECT_SCRIPTs, der am Ende des Druck-, bzw. Fräsjobs aufgerufen wird.
Könnte man dem Problem nicht auch damit begegnen, dass man "1mm opfert" und mittels Skript einfach zum Schluss wieder 1mm mit dem Bett nach oben fährt, damit der Endschalter wieder frei ist?

Skript-Beispiel (direkt aus der "Configuration.h", v.0.91.49):

Code: Alles auswählen

/** rief The following script allows to configure the exact behavior of the automatic object output
*/

#define	OUTPUT_OBJECT_SCRIPT				"G21
G91
G1 E-10
G1 Z210 F5000
G1 X0 Y220 F7500
"
Hier den Skript ändern in:

#define OUTPUT_OBJECT_SCRIPT "G21
G91
G1 E-10
G1 Z210 F5000
G1 X0 Y220 F7500
M400
G1 Z-1
"


Mit "M400" wartet der Drucker sicherheitshalber, dass alle Bewegungen abgeschlossen sind (das langsame Hinunterfahren, inklusive). Dann, mit "G1 Z-1", fährt das Bett wieder 1mm hoch.

Theoretisch kann man auch denselben Trick mittels End-GCode erreichen. Dort sollte man sicherheitshalber in den "relativen" Modus wechseln ("G91"), bevor man nach oben fährt.
Damit würden die letzten 3 Zeilen im End-GCode so aussehen:

Code: Alles auswählen

M400 	; warte bis alle Bewegungen fertig sind
G91 	; wechsle in den relativen Modus
G1 Z-1 	; fahre mit Bett 1mm hoch, damit der (untere) Endschalter nicht betätigt wird
Ich weiss nicht, ob es beim Fräsen auch so einen "End-GCode" gibt - ist sicher so eine Software Sache.

mjh11

Re: Z-Endstop-Falle und Workaround

Verfasst: Di 9. Jun 2015, 11:38
von astra
mjh11 hat mit seiner Vermutung wohl Recht. Nach dem Abschluss des Druckvorgangs führt der Tisch ganz nach unten bis zur Betätigung des Z-Schalters. Verstärkt wird der Effekt noch bei der Verwendung des 8mm Untertisches, weil die Startposition dadurch bereits 4mm tiefer ist.

Ich würde zur Lösung also zum Abschluss des Drucks mindestens 5, eher 10 mm nach oben fahren.

Sympathischer wäre mir aber, im Slicer den möglichen Z-Weg zu begrenzen, weil diese Änderungen der Firmware beim nächsten Update wieder weg sind.

Re: Z-Endstop-Falle und Workaround

Verfasst: Di 9. Jun 2015, 14:39
von rf1k_mjh11
ACHTUNG!!

Ich muss zur End-GCode-Lösung in meinem Post # 6417 korrekterweise hinzufügen, dass die angegebenen drei Zeilen nur dann verwendet werden dürfen, wenn auch das Bett nach unten gefahren wurde, z.B. durch den OUTPUT_OBJECT_SCRIPT. Der Skript wird durch den M3079-Befehl gestartet.
Wurde das Bett nicht mindestens 1mm nach Druckfertigstellung nach unten gefahren, könnte es zu einem Crash mit der Extruderdüse kommen :schock: .

mjh11

Re: Z-Endstop-Falle und Workaround

Verfasst: Di 9. Jun 2015, 14:41
von Husky
Hi,

ich würde dir auch empfehlen einfach die Config.h anzupassen. Allerdings braucht du nicht wie mjh11 geschrieben hat den Code zu erweitern, das macht doch keinen Sinn wenn der Tisch erst ganz nach unten fährt und dann wieder ein stück hoch.
Änderen einfach den Wert von Z210 auf z.B. Z200 dann fährt der Tisch 10mm weniger nach unten.
Beispiel:

Code: Alles auswählen

#define	OUTPUT_OBJECT_SCRIPT				"G21
G91
G1 E-10
G1 Z200 F5000
G1 X0 Y220 F7500
"
Alternativ kannst du auch die gewünschten XYZ Koordinaten ans Ende in den G-Code schreiben dann braucht du nichts an der FW zu ändern.

Gruß,
Husky

Re: Z-Endstop-Falle und Workaround

Verfasst: Di 9. Jun 2015, 14:53
von rf1k_mjh11
Husky,

Der OUTPUT_OBJECT_SCRIPT fährt das Bett nicht an die absolute Z-Position von 210, sondern fährt das Bett von der augenblicklichen Position (da im relativen Modus, siehe "G21") um 210mm nach unten. Meist wird dann die Firmware eingreifen und die Fahrt stoppen, oder, bei der Fräsoption mit einem zweitem Endschalter, eben der untere Endschalter die Fahrt beenden.

Mit deiner Lösung fahre ich immer dann, wenn ich ein Objekt drucke, dass mehr als 15 oder 20mm hoch ist, trotzdem wieder an die Firmware-Grenze (oder an den unteren Endschalter).

mjh11

Re: Z-Endstop-Falle und Workaround

Verfasst: Di 9. Jun 2015, 15:05
von Husky
Stimmt da hast du recht.
Das Problem bei deiner Lösung ist nur das der Tisch im Drucker betrieb in die Extruder fährt, da es leider keine unterschiedlichen Scripte für Drucken und Fräsen gibt.

Es ist wohl am handlichsten das ganze per End-Code im G-Code zu machen. Beim Fräsen einfach ein G28 Z einfügen und fertig, dann fährt der Tisch ganz runter und vorallem wieder aus dem Endschalter nach oben heraus.

Gruß,
Husky

Re: Z-Endstop-Falle und Workaround

Verfasst: Mi 10. Jun 2015, 14:48
von Quant
Das OUTPUT_OBJECT_SCRIPT anzupassen ist sicher eine gute Idee.
Es gibt eh 2 verschiedene Skripte fürs Drucken/Fräsen in der FW 0.91.55:

Code: Alles auswählen

#define OUTPUT_OBJECT_SCRIPT_PRINT "G21
G91
G1 E-10
G1 Z210 F5000
G1 Y250 F7500"
#define OUTPUT_OBJECT_SCRIPT_MILL  "G28 Z0
G21
G91
G1 Y250 F7500"
Jetzt ist mir nur noch aufgefallen, dass bei Output Object zum Schluss die Stepper abgeschaltet werden (hardcoded, nicht Bestandteil des Skripts). Damit ist der Drucker nicht mehr gehomed - und der getriggerte Z-Endstop springt wieder auf zMin. Hier kommt man dann schon nicht mehr mit der Platte wieder rauf, auch ohne dass man den Drucker ausschaltet.

Ich denke fürs Drucken ist im Output-Skript vermutlich ein gesteuerter Move wie G0 Z210 am sinnvollsten, anstatt der relativen Bewegung, um den zMax komplett zu verhindern. Dass das Skript dann nicht geht, wenn der Drucker nicht gehomed ist (zB. Stepper aus waren), ist wohl verschmerzbar.

Bin da noch am tüfteln...

lg Alex