Aller au contenu

Difficultés avec macro «M600» sous Klipper


Jorael

Messages recommandés

Bonjour à tous,

ça fait un moment que ma X1 tourne sous klipper et Octoprint grâce au forum, mais aujourd'hui pour la première fois j'ai eu besoin d'imprimer un objet en 2 couleurs et donc implémenter la macro pour gérer le M600. De base j'avais copier coller ce qu'on trouve dans les fichiers exemples de klipper (https://github.com/Klipper3d/klipper/blob/master/config/sample-macros.cfg).  A force de chercher et de tester des choses j'en suis à ça:

[pause_resume]
recover_velocity: 50.

# Filament change
[gcode_macro M600]
gcode:
    PAUSE_MACRO
    #UNLOAD

[gcode_macro PAUSE_MACRO]
gcode:
    PAUSE
    #RESPOND TYPE=command MSG=action:paused
    PARK_MACRO
    #SET_IDLE_TIMEOUT TIMEOUT=3600

[gcode_macro RESUME_MACRO]
gcode:
    SET_IDLE_TIMEOUT TIMEOUT=600
    RESUME
    #RESPOND TYPE=command MSG=action:resumed

[gcode_macro PARK_MACRO]
gcode:
    {% set X = params.X|default(50)|float %}
    {% set Y = params.Y|default(0)|float %}
    {% set Z = params.Z|default(10)|float %}
    SAVE_GCODE_STATE NAME=PARK_MACRO_state
    G91                     ; relative positioning
    G1 E-2 F1000            ; retract filament
    G1 Z10                  ; lift z slightly             
    G90                     ; absolute positioning
    G1 X{X} Y{Y} Z{Z} F3000 ; park the head
    SET_IDLE_TIMEOUT TIMEOUT=3600
    RESTORE_GCODE_STATE name=PARK_MACRO_state

 

Seulement les problèmes que j'essaye de résoudre depuis le début  :

1. à la reprise via le bouton d'octoprint, l'extruder se repositionne bien en position x et y mais pas en Z il fait une première couche dans le vide au dessus comme si la position du Z n'était pas sauvegardé

2. la mise en pause via M600 ne fonctionne que sur le premier print après un restart de klipper (p-e meme que sur le premier M600: c'est à tester tiens)  les prints suivants il exécute la macro puis reprendre direct le print (donc pas le temps de changer le filament)

Si vous avez des idées, elles sont bienvenues :)

Lien vers le commentaire
Partager sur d’autres sites

@Jorael

J'ai déplacé ton intervention dans un nouveau sujet et dans la section correspondant à ta machine (qui n'est d'ailleurs pas renseignée sous ton pseudo).

🙂

Lien vers le commentaire
Partager sur d’autres sites

J'en fait appel a quelqu'un qui utilise sa X1 sous klipper et qui maitrise mieux le sujet : @M1K3D0

Autant sous Marlin je t'aurais volontiers aidé, autant sous Klipper je dois y passer sur la CR10s Pro ou la prochaine mais pas encore fait.

Lien vers le commentaire
Partager sur d’autres sites

A quoi te sert la macro RESUME_MACRO et quand est-elle appelée / activée ? 😉

🙂

Lien vers le commentaire
Partager sur d’autres sites

Alors désolé j'ai pas le temps aujourd'hui de t'aider à debug ta macro

Mais je peux te passer la mienne qui fonctionne.

Juste bien vérifier la température de ton extrudeur à la reprise il m'arrive de temps en temps (c'est très aléatoire qu'il refroidisse après la reprise de l'impression et j'ai pas pris le temps de chercher pourquoi et je n'ai eu le soucis que avec les slice IM et pas avec Susie)

[gcode_macro M600]
variable_hotend_temp: 0
gcode:
##### read E from pause macro #####
    {% set E = printer["gcode_macro PAUSE"].extrude|float %}
    ##### set park positon for x and y #####
    # default is your max posion from your printer.cfg
    {% set x_park = printer.toolhead.axis_minimum.x|float - 5.0 %}
    {% set y_park = printer.toolhead.axis_minimum.y|float - 5.0 %}
    ##### calculate save lift position #####
    {% set max_z = printer.toolhead.axis_maximum.z|float %}
    {% set act_z = printer.toolhead.position.z|float %}
    {% if act_z < (max_z - 2.0) %}
        {% set z_safe = 2.0 %}
    {% else %}
        {% set z_safe = max_z - act_z %}
    {% endif %}
    ##### end of definitions #####
    SAVE_GCODE_STATE NAME=M600_state
    SET_IDLE_TIMEOUT TIMEOUT=36000
    PAUSE
    G91
    G1 E-5 F2100
    G1 Z{z_safe} F900
    G90
    G1 X0 Y0 F6000
    G91
    G1 E-20 F1000
    SET_GCODE_VARIABLE MACRO=M600 VARIABLE=hotend_temp VALUE={printer.extruder.target}
    M109 S0
    RESTORE_GCODE_STATE NAME=M600_state

En espérant que ça t'aide

Lien vers le commentaire
Partager sur d’autres sites

Bizarre mais si ça fonctionne.

Tu mets en PAUSE mais tu ne RESUME pas 🤔 ?

A quoi te servent tes variables x_park et y_park ?

C'est volontaire ton arrêt de chauffe ( M109 S0 ) avant de restaurer l'état avant la mise en pause ?

Ma macro M600 (j'imprime très rarement voire jamais à la hauteur max du Z donc pas besoin de «sécurité») :

[gcode_macro M600]
gcode:
    {% set X = params.X|default(30)|float %}
    {% set Y = params.Y|default(30)|float %}
    {% set Z = params.Z|default(10)|float %}
    SAVE_GCODE_STATE NAME=M600_state
    PAUSE
    G91
    G1 E-.8 F2700
    G1 Z{Z}
    G90
    G1 X{X} Y{Y} F3000
    G91
    G1 E-50 F1000
    RESUME
    RESTORE_GCODE_STATE NAME=M600_state MOVE=1

Pour que l'état sauvegardé permette de reprendre correctement, il faudrait compléter le RESTORE… avec MOVE=1 (extrait de https://github.com/Klipper3d/klipper/blob/master/docs/G-Codes.md#extended-g-code-commands ) :

Citation

RESTORE_GCODE_STATE [NAME=<state_name>] [MOVE=1 [MOVE_SPEED=<speed>]]: Restore a state previously saved via SAVE_GCODE_STATE. If "MOVE=1" is specified then a toolhead move will be issued to move back to the previous XYZ position. If "MOVE_SPEED" is specified then the toolhead move will be performed with the given speed (in mm/s); otherwise the toolhead move will use the restored g-code speed.

🙂

Lien vers le commentaire
Partager sur d’autres sites

Oula j'ai pas été averti des réponses  😄

Alors j'ai bien essayé le RESTORE avec MOVE=1 mais il revient à la position  de départ avant de faire la pause. Donc c'est un peu gênant.

Demain j'essaye celle de M1K3D0 pour voir

pour répondre en vrac : Il y a des macros qui ne servent plus ( commenté ). Mais tout ce que j'ai essayé a toujours eu le même résultat. Au début j'ai un truc plus simple juste le M600 😄. Il n'y a pas de RESUME car c'est Octoprint qui l’envoie qu'en je clique sur le bouton resume ( mon erreur est p-e à ce niveau d'ailleurs)

Je n'ai pas essayé sans faire le move en Z, c'est fait pour plus de sécurité mais il y en a p-e pas besoin.

Dans le dernier test j'ai fait exprès  de faire monter le Z de 10cm, et c'est bien ça quand je resume depuis Octoprint , l'extruder ne revient qu'en x et y, il ne restaure pas la position du Z.

 

J'essaye demain vos propositions enfin pas demain mais tout à l'heure 😄

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

J'ai testé la solution @fran6p bin ça ne fonctionne pas comme je souhaite, l'extruder se parque puis repart aussitot terminer le print il ne fait pas vraiment de pause.

 

Edit: En supprimant le RESUME et le MOVE=1 je retrouve exactement le même fonctionnement que j'avais avec ma solution la pause fonctionne mais la premiere couche après le resume le Z ne redescend pas à la bonne hauteur.

 

Je vais essayer la solution de M1K3D0

Avec la Solution @M1K3D0 même soucis une couche est faite en l'air il n'y a pas de restauration de l'axe Z.

Et pour une raison que j'ignore le retour à X,Y se fait à 2 à l'heure...

Modifié (le) par Jorael
Lien vers le commentaire
Partager sur d’autres sites

Ah oui si tu utilises pas la mise à 0 de la température extrudeur tu peux enlever la ligne que signale @fran6p

Pour le reste se sont les définitions que j'utilisais au début et finalement remplacé par des coordonnées X Y en dur.

si je coupe la chauffe de l'extrudeur c'est tout simplement que si le m600 se produit et que je ne suis pas là, le plateau reste chaud et la buse arrête la chauffe par sécurité. C'est utile sur les longs print et que tu sais pas exactement à quelle heure il va se déclencher.

tiens nous au courant @Jorael

T'es macro pause et resume elles ressemblent à quoi @Jorael?

Voilà les miennes

 

[gcode_macro PAUSE]
rename_existing: BASE_PAUSE
# change this if you need more or less extrusion
variable_extrude: 1.0
gcode:
    ##### read E from pause macro #####
    {% set E = printer["gcode_macro PAUSE"].extrude|float %}
    ##### set park positon for x and y #####
    # default is your max posion from your printer.cfg
    {% set x_park = printer.toolhead.axis_minimum.x|float - 5.0 %}
    {% set y_park = printer.toolhead.axis_minimum.y|float - 5.0 %}
    ##### calculate save lift position #####
    {% set max_z = printer.toolhead.axis_maximum.z|float %}
    {% set act_z = printer.toolhead.position.z|float %}
    {% if act_z < (max_z - 2.0) %}
        {% set z_safe = 2.0 %}
    {% else %}
        {% set z_safe = max_z - act_z %}
    {% endif %}
    ##### end of definitions #####
    SAVE_GCODE_STATE NAME=PAUSE_state
    BASE_PAUSE
    G91
    G1 E-5 F2100
    G1 Z{z_safe} F900
    G90
    G1 X0 Y0 F6000

[gcode_macro RESUME]
rename_existing: BASE_RESUME
gcode:
    ##### read E from pause macro #####
    {% set E = printer["gcode_macro PAUSE"].extrude|float %}
    SET_IDLE_TIMEOUT TIMEOUT=600
    ##### end of definitions #####
    M109 S{printer["gcode_macro M600"].hotend_temp}
    G91
    G1 E50 F100
    RESTORE_GCODE_STATE NAME=PAUSE_state
    BASE_RESUME
  • J'aime 1
Lien vers le commentaire
Partager sur d’autres sites

Dans quel cas tu utilises le resume ?

Mon erreur est p-e à ce niveau là , je pensais que le resume d'octoprint suffisait je n'ai donc pas de macro resume.

[pause_resume]
recover_velocity: 50.

[gcode_macro M600]
variable_hotend_temp: 0
gcode:
##### read E from pause macro #####
    #{% set E = printer["gcode_macro PAUSE"].extrude|float %}
    ##### set park positon for x and y #####
    # default is your max posion from your printer.cfg
    {% set x_park = printer.toolhead.axis_minimum.x|float - 5.0 %}
    {% set y_park = printer.toolhead.axis_minimum.y|float - 5.0 %}
    ##### calculate save lift position #####
    {% set max_z = printer.toolhead.axis_maximum.z|float %}
    {% set act_z = printer.toolhead.position.z|float %}
    {% if act_z < (max_z - 2.0) %}
        {% set z_safe = 2.0 %}
    {% else %}
        {% set z_safe = max_z - act_z %}
    {% endif %}
    ##### end of definitions #####
    SAVE_GCODE_STATE NAME=M600_state
    SET_IDLE_TIMEOUT TIMEOUT=36000
    PAUSE
    #G91
    G1 E-5 F2100
    #G1 Z{z_safe} F900
    G90
    G1 X0 Y0 F6000
    G91
    G1 E-20 F1000
    #SET_GCODE_VARIABLE MACRO=M600 VARIABLE=hotend_temp VALUE={printer.extruder.target}
    #M109 S0
    RESTORE_GCODE_STATE NAME=M600_state

Voilà ce que j'ai pour le moment

Lien vers le commentaire
Partager sur d’autres sites

 Le résumé est utilisé quand tu a enlevé l'ancien filament et que le nouveau est prêt à être chargé. 

A Ce moment là la buse est purgée a sa position de parking pour être prêt à partir directement sur la nouvelle couleur et après cette purge le print redémarrer.

 

Sur mainsail ou klipper screen je clique sur le bouton de reprise (play 🤔) et ça s'active.

je n'utilise plus octoprint mais le comportement doit être le même je suppose sinon il faut que tu lance la macro résume je pense

@Jorael

Lien vers le commentaire
Partager sur d’autres sites

Bon j'ai plus ou moins réussi mon test avec ça :

[pause_resume]
recover_velocity: 150.
#   When capture/restore is enabled, the speed at which to return to
#   the captured position (in mm/s). Default is 50.0 mm/s.


[gcode_macro M600]
gcode:
    {% set X = params.X|default(30)|float %}
    {% set Y = params.Y|default(30)|float %}
    {% set Z = params.Z|default(10)|float %}
    SAVE_GCODE_STATE NAME=M600_state
    PAUSE
    G91
    G1 E-.8 F2700
    #G1 Z{Z}
    G90
    G1 X{X} Y{Y} F6000
    G91
    #G1 E-50 F1000
    #RESUME
    RESTORE_GCODE_STATE NAME=M600_state

mais j'ai du supprimer le déplacement en Z et la mega rétractation pour enlever le filament et là ça a fonctionné une fois.

Je suis en train d'imprimer le vrai objet ou j'avais besoin des 2 couleurs. Je croise les doigts.

Par contre je reste bloqué avec le fait de devoir redemarrer Klipper après la premiere impression car sinon la pause se "resume" tout de suite par klipper ....

Modifié (le) par Jorael
Lien vers le commentaire
Partager sur d’autres sites

  • 1 month later...

Bon depuis je suis passé à Fluidd et j'ai réussi mon impression en 2 couleurs sans problème !

edit : Je ne suis pas passé à Fluidd à cause de ça ^^ mais j'ai des soucis de plantage aléatoire de mon pi4 sans explication ( j'ai checké pas mal de choses déjà) du coup pour tester et "enlever mon SSD USB chinois" de l'équation, et aussi un éventuel problème avec octoprint et mon install) je suis passé sur un autre SSD  et j'ai testé fluid + moonraker et klipper dessus 😄

Modifié (le) par Jorael
  • Confus 1
Lien vers le commentaire
Partager sur d’autres sites

  • 4 months later...

Salut, je viens de finir ma voron 2.4 R2 350x350.
Je suis un peu perdu avec les macros pour le changement de filament en cours d'impression.
Serait-il possible de me dire ce qu'il faut ajouter au printer.cfg et les macros à creer?
Je vous remercie par avance !!

Lien vers le commentaire
Partager sur d’autres sites

@Bouli_68salut

Il te faut rajouter (ou tu as envi)

Une macro

pause

Resume

Et M600

Pause et resume sont utilisés par m600. 

Tu as un fichier dédié pour les macros ? 

Sur ma 2.4 j'utilise les mêmes que j'ai mi plus haut sur ma X1 à part la position de Park 

J'espère que ça t'aide. 

🤞

Lien vers le commentaire
Partager sur d’autres sites

@M1K3D0merci pour ta réponse.

J'ai directement mis dans le printer.cfg pour le moment pour tester.
Le chariot se "parc" bien dans le coin devant a gauche et repart directement...
Me rétracte pas le filament en place et ne demande pas d'extrusion pour le nouveau filament.
Le print repart direct, fait semblant d'imprimer une couche à quelques cm du print sans extruder puis viens à la hauteur du print et la plus rien ne se passe ! mdr

[gcode_macro M600]
variable_hotend_temp: 0
gcode:
##### read E from pause macro #####
    {% set E = printer["gcode_macro PAUSE"].extrude|float %}
    ##### set park positon for x and y #####
    # default is your max posion from your printer.cfg
    {% set x_park = printer.toolhead.axis_minimum.x|float - 5.0 %}
    {% set y_park = printer.toolhead.axis_minimum.y|float - 5.0 %}
    ##### calculate save lift position #####
    {% set max_z = printer.toolhead.axis_maximum.z|float %}
    {% set act_z = printer.toolhead.position.z|float %}
    {% if act_z < (max_z - 2.0) %}
        {% set z_safe = 2.0 %}
    {% else %}
        {% set z_safe = max_z - act_z %}
    {% endif %}
    ##### end of definitions #####
    SAVE_GCODE_STATE NAME=M600_state
    SET_IDLE_TIMEOUT TIMEOUT=36000
    PAUSE
    G91
    G1 E-5 F2100
    G1 Z{z_safe} F900
    G90
    G1 X0 Y0 F6000
    G91
    G1 E-20 F1000
    SET_GCODE_VARIABLE MACRO=M600 VARIABLE=hotend_temp VALUE={printer.extruder.target}
    M109 S0
    RESTORE_GCODE_STATE NAME=M600_state

[gcode_macro PAUSE]
rename_existing: BASE_PAUSE
# change this if you need more or less extrusion
variable_extrude: 1.0
gcode:
    ##### read E from pause macro #####
    {% set E = printer["gcode_macro PAUSE"].extrude|float %}
    ##### set park positon for x and y #####
    # default is your max posion from your printer.cfg
    {% set x_park = printer.toolhead.axis_minimum.x|float - 5.0 %}
    {% set y_park = printer.toolhead.axis_minimum.y|float - 5.0 %}
    ##### calculate save lift position #####
    {% set max_z = printer.toolhead.axis_maximum.z|float %}
    {% set act_z = printer.toolhead.position.z|float %}
    {% if act_z < (max_z - 2.0) %}
        {% set z_safe = 2.0 %}
    {% else %}
        {% set z_safe = max_z - act_z %}
    {% endif %}
    ##### end of definitions #####
    SAVE_GCODE_STATE NAME=PAUSE_state
    BASE_PAUSE
    G91
    G1 E-5 F2100
    G1 Z{z_safe} F900
    G90
    G1 X0 Y0 F6000

[gcode_macro RESUME]
rename_existing: BASE_RESUME
gcode:
    ##### read E from pause macro #####
    {% set E = printer["gcode_macro PAUSE"].extrude|float %}
    SET_IDLE_TIMEOUT TIMEOUT=600
    ##### end of definitions #####
    M109 S{printer["gcode_macro M600"].hotend_temp}
    G91
    G1 E50 F100
    RESTORE_GCODE_STATE NAME=PAUSE_state
    BASE_RESUME

Modifié (le) par Bouli_68
Lien vers le commentaire
Partager sur d’autres sites

C'est bon, ca marche !!
En faite, j'avais pas vu que la température baissait.
Il faut juste que j'extrude le nouveau filament avec mainsail .

La distance de rétractation de filament est courte en "automatique", sur quelle ligne faut t il augmenter l'extrusion?
Que faut il supprimer pour que la température ne baisse pas? ou on peu mettre apres 5minutes par exemple?

Lien vers le commentaire
Partager sur d’autres sites

dans les macro que tu as recopié plus haut tu as 

    G1 E-20 F1000
    SET_GCODE_VARIABLE MACRO=M600 VARIABLE=hotend_temp VALUE={printer.extruder.target}
    M109 S0


change le 20 par la valeur que tu veux pour la distance

c'est le M109 S0 qui coupe la chauffe de la buse

enlève le si tu veux pas refroidir la buse

c'est le timeout qui donne le délais j'ai mi 10h pour garder le plateau chaud et je coupe la buse par sécurité.

normalement ma RESUME doit remettre l'extrudeur en chauffe à la dernière valeur avant la pause

tu as gardé les macro que j'ai donné ou tu as gardé les par defaut de mainsail ? 

Lien vers le commentaire
Partager sur d’autres sites

Tu es un chef !!! Merci à toi.

C'est peut être pas plus mal de mettre la buse a arrêté de chauffer, surtout si on est pas à coté !!

J'ai rien toucher à mainsail.cfg et mis les tiens dans printer.cfg

Je vais faire propre maintenant à faire un macro pour RESUME, PAUSE et M600 et les inclure dans printer.cfg 

Modifié (le) par Bouli_68
Lien vers le commentaire
Partager sur d’autres sites

Créer un compte ou se connecter pour commenter

Vous devez être membre afin de pouvoir déposer un commentaire

Créer un compte

Créez un compte sur notre communauté. C’est facile !

Créer un nouveau compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant
×
×
  • Créer...