Z-Endstop-Falle und Workaround

Firmware Veröffentlichungen und Einstellungen können hier angekündigt und diskutiert werden.
Quant
Frischling
Frischling
Beiträge: 2
Registriert: Mo 6. Apr 2015, 20:44
Hat sich bedankt: 1 Mal

Z-Endstop-Falle und Workaround

Beitrag #1 von Quant » Di 9. Jun 2015, 01:51

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

Benutzeravatar
rf1k_mjh11
Developer
Developer
Beiträge: 1692
Registriert: Di 6. Jan 2015, 19:44
Wohnort: Autriche
Hat sich bedankt: 214 Mal
Danksagung erhalten: 430 Mal

Re: Z-Endstop-Falle und Workaround

Beitrag #2 von rf1k_mjh11 » Di 9. Jun 2015, 09:43

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
Merke, am PC gibt es immer einen Weg!
Schafft es der Mensch, einmal etwas idiotensicher zu machen, kontert die Natur sofort mit einem besseren Idioten.

astra
Frischling
Frischling
Beiträge: 3
Registriert: Di 7. Apr 2015, 07:36

Re: Z-Endstop-Falle und Workaround

Beitrag #3 von astra » Di 9. Jun 2015, 11:38

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.

Benutzeravatar
rf1k_mjh11
Developer
Developer
Beiträge: 1692
Registriert: Di 6. Jan 2015, 19:44
Wohnort: Autriche
Hat sich bedankt: 214 Mal
Danksagung erhalten: 430 Mal

Re: Z-Endstop-Falle und Workaround

Beitrag #4 von rf1k_mjh11 » Di 9. Jun 2015, 14:39

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
Merke, am PC gibt es immer einen Weg!
Schafft es der Mensch, einmal etwas idiotensicher zu machen, kontert die Natur sofort mit einem besseren Idioten.

Benutzeravatar
Husky
Globaler Moderator
Globaler Moderator
Beiträge: 259
Registriert: Mi 10. Sep 2014, 11:56
Danksagung erhalten: 17 Mal

Re: Z-Endstop-Falle und Workaround

Beitrag #5 von Husky » Di 9. Jun 2015, 14:41

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
Upgrades: Dual Extruder, Platinenkühlung, Not-Aus, besserer Z-Endschalter, Filamentführungsröhrchen, Dauerdruckplatte, Schleppketten erhöhung, Schnellwechselsystem, Fräse, Einhausung.

„Probleme kann man niemals mit derselben Denkweise lösen, durch die sie entstanden sind.“
Albert Einstein

Benutzeravatar
rf1k_mjh11
Developer
Developer
Beiträge: 1692
Registriert: Di 6. Jan 2015, 19:44
Wohnort: Autriche
Hat sich bedankt: 214 Mal
Danksagung erhalten: 430 Mal

Re: Z-Endstop-Falle und Workaround

Beitrag #6 von rf1k_mjh11 » Di 9. Jun 2015, 14:53

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
Merke, am PC gibt es immer einen Weg!
Schafft es der Mensch, einmal etwas idiotensicher zu machen, kontert die Natur sofort mit einem besseren Idioten.

Benutzeravatar
Husky
Globaler Moderator
Globaler Moderator
Beiträge: 259
Registriert: Mi 10. Sep 2014, 11:56
Danksagung erhalten: 17 Mal

Re: Z-Endstop-Falle und Workaround

Beitrag #7 von Husky » Di 9. Jun 2015, 15:05

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
Upgrades: Dual Extruder, Platinenkühlung, Not-Aus, besserer Z-Endschalter, Filamentführungsröhrchen, Dauerdruckplatte, Schleppketten erhöhung, Schnellwechselsystem, Fräse, Einhausung.



„Probleme kann man niemals mit derselben Denkweise lösen, durch die sie entstanden sind.“

Albert Einstein

Quant
Frischling
Frischling
Beiträge: 2
Registriert: Mo 6. Apr 2015, 20:44
Hat sich bedankt: 1 Mal

Re: Z-Endstop-Falle und Workaround

Beitrag #8 von Quant » Mi 10. Jun 2015, 14:48

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


Zurück zu „Firmware / Tweaks“