Halph Posté(e) Avril 30, 2016 Posté(e) Avril 30, 2016 (modifié) Bonjour tous le monde, J'utilise cura classique, et j'ai deux problème, dont le premier doit pouvoir être résolu sur ce fil. Lorsque j'insère une pause avec le plugin fournis dans cura 15, l'imprimante effectue la pause, mais seulement 5 secondes. C'est un peu court pour changer le fil [emoji39]. Que faut-il modifier pour allonger cette pause ? En vous remerciant par avance pour votre aide, Halph. P.S. : je n'ai pas trouve la réponse dans le fil de discussions Modifié (le) Avril 30, 2016 par Halph
Invité Posté(e) Avril 30, 2016 Posté(e) Avril 30, 2016 @Halph il n'y as pas de tempo dans ce plugin, il attends que tu appuie sur le bouton de l'écran que tu n'as pas, et comme il doit être configuré en normalement fermé, l'impression reprends toute seul. Donc soit tu triches en installant un BP sur la bonne broche (A0,A1,A2 ou A3) oublie ça peut pas marcher Soit tu essayes d'installer l'usine à gaz proposer par je sais plus qui Soit tu trouves une autre solution parceque il y en a...
piccolini Posté(e) Avril 30, 2016 Posté(e) Avril 30, 2016 Halph, Pour la pause, tu edit ton fichier Dago, tu cherches la ligne de la pause, et tu change la valeur, c'est tout
Invité Posté(e) Avril 30, 2016 Posté(e) Avril 30, 2016 @piccolini quel valeur tu veut qu'il change, il n'y as pas de tempo dans il y a une heure, Halph a dit : le plugin fournis dans cura 15,
Invité Posté(e) Avril 30, 2016 Posté(e) Avril 30, 2016 Bon aller je suis d'humeur joueur @Halph tu telecharge notepad++ tu ouvre le plugin pauseAtZ.py que tu vas trouver dans le repertoire plugin de cura au début du fichier tu rajoute ça : #Param: tempo(int:60) Tempo(s) tu cherches les lignes #Wait till the user continues printing f.write("M0\n") que tu remplace par #Tempo f.write("G4 S%\n" % (str(tempo))) tu sauves le fichier sous un autre nom, pis tu test oui je me suis inspiré de l'existant
Halph Posté(e) Avril 30, 2016 Posté(e) Avril 30, 2016 merci a tous pour vos réponses, La solution de @plexy a l'air d'etre la plus simple a mettre en oeuvre. Donc @plexy, le code que tu m'as donnée rajoute bien un bloc "Tempo(s)" au plugin, mais le problème est que le trancheur n'affiche pas la pause via ce "nouveau" plugin. En revanche avec celui par défaut, Pause at height, le trancheur affiche la pause. Quel est le remède à cela ? Je ne peux pas encore tester avec l'imprimante, je suis en week-end . Je testerai donc Lundi.
Picaboubx Posté(e) Mai 30, 2016 Posté(e) Mai 30, 2016 Bonjour @inteloide , Encore merci pour cette option d'impression en plusieurs couleurs que j'utilise couramment, c'est top et vraiment pratique même sur Mac. Voici ma question : J'envisage d'équiper ma D200 de cette option d'écran de contrôle vendu en BOX sur le site de Dagoma http://www.dagoma.fr/produit/box-disco-affichage-by-dumnac/ Tes motifs sont elles compatibles avec ce système ? A première vu et n'y connaissant rien, je dira non, mais donne moi ton avis s'il te plait ? Dans la négative, est-il envisageable pour un noob comme moi de transposer (copier/coller de morceaux de code par exemple) ces motifs du Firmware dans les Firmwares liés à cet écran et proposés en chargement ? Merci de ton avis éclairé.
inteloide Posté(e) Mai 30, 2016 Auteur Posté(e) Mai 30, 2016 (modifié) Salut ! Normalement pas de soucis. Je n'ai pas l'écran, mais pour le firmware 1 (avec inductif embout blanc), il faut modifier dans l'ordre, dans le fichier Marlin_main.cpp, le code de la façon suivante : 1- à la ligne 6184, le texte suivant : case 601: //Pause for filament by Inteloide gcode_M601(); break; 2- à la ligne 5426, le texte suivant : inline void gcode_M601() { // Pause pour changer de filament (Par Inteloide) // Syntaxe (l'ordre des lettre n'a pas d'importance): // X[pos] Y[pos] Z[relative lift] : Position parking (par défaut en absolu) // R : déplacement X et Y de la position parking en relatif (attention Z est toujours en relatif) // B[pin of the beep] : Pin du beeper (défaut = 27 => Broche A4 sur la carte électronique) // E[initial retract] : longueur de filament retiré juste avant la pause (doit être négatif !) // L[later retract] : longueur de filament (doit être négatif !) // T[time to wait] : Durée de l'attente (en secondes) // P[pin input] : Entrée sur laquelle on attent le changement d'état (par défaut 18=fin de course axe X) // I[Interval beep] : Intervale entre deux beeps (en secondes, défaut = 5 sec) // D[Beep duration] : Durée de chaque beep (en secondes, défaut = 0.5 sec) // H[time in sec] : Durée de la tempo après changement d'état sur la pin (pour retirer la main) // // Syntaxe préconisée : M601 X20 Y20 Z5 P18 // ="On remonte la tête de 5 mm, on la déplace dans un coin du plateau, on attend l'appui // sur le capteur de l'axe X, puis on relance l'impression après 2 secondes" // // Exemples de syntaxes : // Avec une tempo : // M601 Z5 T300 E-5 : Remonte de 5mm, attends 300 secondes et relance l'impression // M601 X10 Y10 Z5 T300 E-5 : Remonte de 5mm, va dans un coin du plateau (X=10,Y=10mm), attends 300 secondes et relance l'impression // // Sans tempo : // M601 Z5 P18 E-5: Remonte de 5mm, attend appui sur capteur axe X et relance l'impression après 2 secondes // M601 X10 Y10 R Z5 P18 N5 I2 D0.8 B27 E-5: Remonte de 5mm, va dans un coin du plateau en relatif (X+10,Y+10mm), attend appui sur capteur axe X et relance après 5 secondes // Save positions float target[4]; float lastpos[4]; target[X_AXIS]=current_position[X_AXIS]; target[Y_AXIS]=current_position[Y_AXIS]; target[Z_AXIS]=current_position[Z_AXIS]; target[E_AXIS]=current_position[E_AXIS]; lastpos[X_AXIS]=current_position[X_AXIS]; lastpos[Y_AXIS]=current_position[Y_AXIS]; lastpos[Z_AXIS]=current_position[Z_AXIS]; lastpos[E_AXIS]=current_position[E_AXIS]; //retract by E if(code_seen('E')) { target[E_AXIS]+= code_value(); } else { #ifdef FILAMENTCHANGE_FIRSTRETRACT target[E_AXIS]+= FILAMENTCHANGE_FIRSTRETRACT ; #endif } plan_buffer_line(target[X_AXIS], target[Y_AXIS], target[Z_AXIS], target[E_AXIS], feedrate/60, active_extruder); //lift Z if(code_seen('Z')){ target[Z_AXIS]+= abs(code_value()); } else { #ifdef FILAMENTCHANGE_ZADD target[Z_AXIS]+= FILAMENTCHANGE_ZADD ; #endif } plan_buffer_line(target[X_AXIS], target[Y_AXIS], target[Z_AXIS], target[E_AXIS], feedrate/60, active_extruder); //move xy float distance; if(code_seen('X')) { distance=code_value(); if(code_seen('R')) { target[X_AXIS]+= distance; } else { target[X_AXIS] = distance; } } else { #ifdef FILAMENTCHANGE_XPOS target[X_AXIS]= FILAMENTCHANGE_XPOS ; #endif } if(code_seen('Y')) { distance=code_value(); if(code_seen('R')) { target[Y_AXIS]+= distance; } else { target[Y_AXIS] = distance; } } else { #ifdef FILAMENTCHANGE_YPOS target[Y_AXIS]= FILAMENTCHANGE_YPOS ; #endif } plan_buffer_line(target[X_AXIS], target[Y_AXIS], target[Z_AXIS], target[E_AXIS], feedrate/60, active_extruder); // More retract ? if(code_seen('L')) { target[E_AXIS]+= code_value(); } else { #ifdef FILAMENTCHANGE_FINALRETRACT target[E_AXIS]+= FILAMENTCHANGE_FINALRETRACT ; #endif } plan_buffer_line(target[X_AXIS], target[Y_AXIS], target[Z_AXIS], target[E_AXIS], feedrate/60, active_extruder); //finish moves st_synchronize(); //disable extruder steppers so filament can be removed disable_e0(); disable_e1(); disable_e2(); delay(100); // Variables générales unsigned long currentMillisBeeper = 0; // Top de depart pour le chrono du beeper unsigned long previousMiliBeeper = 0; // Précédent top unsigned long startMiliBeeper = 0; // Top de départ pour l'attente unsigned long temps=180000; // Durée d'attente unsigned long intervalBeeper = 5000; // Intervale entre chaque beep (en ms) unsigned long durationBeeper = 500; // Durée du beep (en ms) unsigned long temp_after_break=2000; // Tempo après le changement d'état de la pin int etatBeeper = LOW; // Etat du beeper int pinBeeper = 27; // Pin pour le beeper int pin_number = 18; // Pin pour fin attente bool wait_for_time=true; int pin_target; // On récupère les paramètres if(code_seen('I')) intervalBeeper = code_value()*1000; // Intervale entre chaque beep (en ms) if(code_seen('D')) durationBeeper = code_value()*1000; // Durée du beep (en ms) if(code_seen('B')) pinBeeper = code_value(); // Pin pour le beeper if(code_seen('T')) temps = code_value()*1000; // Le temps à attendre en ms if(code_seen('P')) {pin_number = code_value(); wait_for_time=false;}; // La pin à attendre if(code_seen('H')) {temp_after_break = code_value()*1000;}; // Tempo après le changement d'état de la pin // On active les entrées/sorties pinMode(pinBeeper, OUTPUT); // On active la sortie du beeper if (!wait_for_time){ // On active l'entrée si on n'est pas en temps pinMode(pin_number, INPUT); pin_target = !digitalRead(pin_number); } // On démarre l'attente startMiliBeeper = millis(); bool stop_la_boucle=false; while(!stop_la_boucle){ manage_heater(); //manage_inactivity(); //=> mis en commentaire pour éviter que les moteurs se désactive et qu'on puisse bouger la tête par erreur. enable_x();enable_y();enable_z(); // on fait aller le beeper currentMillisBeeper = millis(); if ((etatBeeper == LOW) && (currentMillisBeeper - previousMiliBeeper >= intervalBeeper)) { previousMiliBeeper = currentMillisBeeper; // On garde le moment où on a changé d'état etatBeeper = HIGH; // On change l'état du beeper digitalWrite(pinBeeper, etatBeeper); // On applique le nouvel état = on fait sonner } if ((etatBeeper == HIGH) && (currentMillisBeeper - previousMiliBeeper >= durationBeeper)) { previousMiliBeeper = currentMillisBeeper; // On garde le moment où on a changé d'état etatBeeper = LOW; // On change l'état du beeper digitalWrite(pinBeeper, etatBeeper); // On applique le nouvel état } // On regarde si on doit stopper la boucle if (!wait_for_time) {//On regarde un changement d'une entrée if (digitalRead(pin_number) == pin_target) { stop_la_boucle=true; } } else {// On regarde si la tempo est finie if (currentMillisBeeper-startMiliBeeper>=temps) { stop_la_boucle=true; } } } // Finalisation de la boucle d'attente digitalWrite(pinBeeper, LOW); // pour remettre au niveau bas (0V) après la boucle d'attente pinMode(pinBeeper, INPUT); // pour remettre en entrée qui est la valeur par défaut // Tempo pour retirer sa main if (!wait_for_time) { delay(temp_after_break); } //return to old position the extruder if(code_seen('L')) { target[E_AXIS]+= -code_value(); current_position[E_AXIS]=target[E_AXIS]; //the long retract of L is compensated by manual filament feeding plan_set_e_position(current_position[E_AXIS]); } else { #ifdef FILAMENTCHANGE_FINALRETRACT target[E_AXIS]+=(-1)*FILAMENTCHANGE_FINALRETRACT ; current_position[E_AXIS]=target[E_AXIS]; //the long retract of L is compensated by manual filament feeding plan_set_e_position(current_position[E_AXIS]); #endif } //return to old position plan_buffer_line( target[X_AXIS], target[Y_AXIS], target[Z_AXIS], target[E_AXIS], feedrate/60, active_extruder); //should do nothing plan_buffer_line(lastpos[X_AXIS], lastpos[Y_AXIS], target[Z_AXIS], target[E_AXIS], feedrate/60, active_extruder); //move xy back plan_buffer_line(lastpos[X_AXIS], lastpos[Y_AXIS], lastpos[Z_AXIS], target[E_AXIS], feedrate/60, active_extruder); //move z back plan_buffer_line(lastpos[X_AXIS], lastpos[Y_AXIS], lastpos[Z_AXIS], lastpos[E_AXIS], feedrate/60, active_extruder); //final unretract } Ensuite, on recompile le tout via la procédure de Dagoma et ça devrait fonctionner ! Pour les autres firmware (2, 3 , 4...) le fichier Marlin_main.cpp devrait être le même (je n'ai pas vérifier). Si besoin, dis moi la version du firmware que tu as et j'enverai le Marlin_main.cpp correspondant. Modifié (le) Mai 30, 2016 par inteloide Erreur dans le code 1
Picaboubx Posté(e) Mai 30, 2016 Posté(e) Mai 30, 2016 @inteloide Ok donc cela est possible. Merci, je vais acheter la chose et ensuite je m'occupe de faire la modif. Je te tient au courant. Par contre, je commence a être perdu sur la version du Marlin qu'il faut que je récupère. Va falloir que je cherche entre le NO et le NC. Merci à toi.
inteloide Posté(e) Mai 30, 2016 Auteur Posté(e) Mai 30, 2016 Pour le NO (= normalement ouvert) ou NC (= NF = normalement fermé), un simple multimètre te permet de le dire : tu le met sur la position "qui beep quand on touche les deux fils du multimètre" et tu le branche sur les fils d'un des capteurs fin de courses. Si sans appuyer sur le capteur le multimètre beeper, alors le capteur est normalement fermé (NC) sinon il est normalement ouvert (NO). Sinon regarde le fichier Configuration.h dans le Marlin de ta dernière mise à jour et repère les lignes suivantes : const bool X_MIN_ENDSTOP_INVERTING = true; // set to true to invert the logic of the endstop. const bool Y_MIN_ENDSTOP_INVERTING = true; // set to true to invert the logic of the endstop. const bool Z_MIN_ENDSTOP_INVERTING = true; // palpeur banggood orange=False / palpeur blanc= true const bool X_MAX_ENDSTOP_INVERTING = true; // set to true to invert the logic of the endstop. const bool Y_MAX_ENDSTOP_INVERTING = true; // set to true to invert the logic of the endstop. const bool Z_MAX_ENDSTOP_INVERTING = true; // set to true to invert the logic of the endstop. DISCO si tu as const bool X_MIN_ENDSTOP_INVERTING = true; (comme au dessus) alors ce sont des capteurs type NO Par contre si tu as const bool X_MIN_ENDSTOP_INVERTING = false; (comme au dessous) alors ce sont des capteurs type NC const bool X_MIN_ENDSTOP_INVERTING = false; // set to true to invert the logic of the endstop. const bool Y_MIN_ENDSTOP_INVERTING = true; // set to true to invert the logic of the endstop. const bool Z_MIN_ENDSTOP_INVERTING = true; // set to true to invert the logic of the endstop. const bool X_MAX_ENDSTOP_INVERTING = true; // set to true to invert the logic of the endstop. const bool Y_MAX_ENDSTOP_INVERTING = false; // set to true to invert the logic of the endstop. const bool Z_MAX_ENDSTOP_INVERTING = true; // set to true to invert the logic of the endstop. const bool Z_MIN_PROBE_ENDSTOP_INVERTING = true; // set to true to invert the logic of the endstop. Voilà !
Picaboubx Posté(e) Juin 5, 2016 Posté(e) Juin 5, 2016 Le 30 mai 2016 at 22:36, inteloide a dit : Pour le NO (= normalement ouvert) ou NC (= NF = normalement fermé), un simple multimètre te permet de le dire : tu le met sur la position "qui beep quand on touche les deux fils du multimètre" et tu le branche sur les fils d'un des capteurs fin de courses. Si sans appuyer sur le capteur le multimètre beeper, alors le capteur est normalement fermé (NC) sinon il est normalement ouvert (NO). Sinon regarde le fichier Configuration.h dans le Marlin de ta dernière mise à jour et repère les lignes suivantes : const bool X_MIN_ENDSTOP_INVERTING = true; // set to true to invert the logic of the endstop. const bool Y_MIN_ENDSTOP_INVERTING = true; // set to true to invert the logic of the endstop. const bool Z_MIN_ENDSTOP_INVERTING = true; // palpeur banggood orange=False / palpeur blanc= true const bool X_MAX_ENDSTOP_INVERTING = true; // set to true to invert the logic of the endstop. const bool Y_MAX_ENDSTOP_INVERTING = true; // set to true to invert the logic of the endstop. const bool Z_MAX_ENDSTOP_INVERTING = true; // set to true to invert the logic of the endstop. DISCO si tu as const bool X_MIN_ENDSTOP_INVERTING = true; (comme au dessus) alors ce sont des capteurs type NO Par contre si tu as const bool X_MIN_ENDSTOP_INVERTING = false; (comme au dessous) alors ce sont des capteurs type NC const bool X_MIN_ENDSTOP_INVERTING = false; // set to true to invert the logic of the endstop. const bool Y_MIN_ENDSTOP_INVERTING = true; // set to true to invert the logic of the endstop. const bool Z_MIN_ENDSTOP_INVERTING = true; // set to true to invert the logic of the endstop. const bool X_MAX_ENDSTOP_INVERTING = true; // set to true to invert the logic of the endstop. const bool Y_MAX_ENDSTOP_INVERTING = false; // set to true to invert the logic of the endstop. const bool Z_MAX_ENDSTOP_INVERTING = true; // set to true to invert the logic of the endstop. const bool Z_MIN_PROBE_ENDSTOP_INVERTING = true; // set to true to invert the logic of the endstop. Voilà ! Merci beaucoup @inteloide pour ce rappel sur le NO ou le NC de sa machine. Cela va m'être très utile. J'ai une autre question pour toi : Au moment de la pose, le plateau part vers l'arrière, hors il couvre l'extrudeur et il devient alors difficile de maintenir ouvert celui-ci pour retirer ou enfilé le filament. Y a t'il un paramètre a changer ou a intégrer dans le M601 qui permet de régler cela pour que le plateau, soit reste ou il est soit parte vers l'avant plutôt que vers l'arrière ? J'ai lu ton tuto et je n'ai rien vu dans les options possibles.
inteloide Posté(e) Juin 5, 2016 Auteur Posté(e) Juin 5, 2016 Salut ! La position de la tête d'impression pendant la pause (= position parking dans mon tuto) peut être réglé dans la commande M601 en changeant les paramètres X et Y. Ainsi, le M601 X20 Y20 Z5 P18 peut être changé en M601 X20 Y180 Z5 P18 pour faire partir le plateau vers l'avant. Si tu veux le faire rester à la même position, la commande M601 Z5 P18 sera suffisante Sinon, j'ai commandé et reçu l'écran. Après une petite déception quant à sa taille (c'est ma faute, j'aurais du mieux lire le descriptif plutôt que de me jeter sur le bouton "acheter"), leur est à l'intégration dans mon futur caisson spécial Dagoma. ça fera tout de même l'affaire. Dommage cependant qu'aucun bouton ne soit prévu avec cet écran. Je n'ai pas encore eu le temps de vérifier que ma modif de firmware fonctionne mais j'y regarderai le weekend prochain. @+
Picaboubx Posté(e) Juin 5, 2016 Posté(e) Juin 5, 2016 Je vais essayé cette version de la commande M601 merci. J'ai commandé aussi l'écran, mais pas encore reçu. J'ai aussi vu sur le forum que certains on un pb d'impression après instal de l'engin. On verra à l'usage ;-)
fragator Posté(e) Juin 18, 2016 Posté(e) Juin 18, 2016 (modifié) teste en deux couleur plutôt concluant. merci @inteloide pour le tuto vraiment complet. petite question : comme sur la photo, vous remarquerez que la deuxième couleur (bave) pas mal. Quand j ai changer la bobine pour la deuxième couleurs, j avais oublier que le gris etais du chromatik, du coup, pas les même paramètre de température que l octofiber (en blanc sur la photo) y a t il une astuce a ca ??? Modifié (le) Juin 18, 2016 par fragator
Picaboubx Posté(e) Juin 18, 2016 Posté(e) Juin 18, 2016 il y a 39 minutes, fragator a dit : teste en deux couleur plutôt concluant. merci @inteloide pour le tuto vraiment complet. petite question : comme sur la photo, vous remarquerez que la deuxième couleur (bave) pas mal. Quand j ai changer la bobine pour la deuxième couleurs, j avais oublier que le gris etais du chromatik, du coup, pas les même paramètre de température que l octofiber (en blanc sur la photo) y a t il une astuce a ca ??? A ma connaissance il n'y a pas de combine pour des filaments très différents. De mon coté les filaments ont des paramètres relativement similaires même entre des marques différentes (EmotionTech, Octofiber) et cela permet de passer à l'impression. Je n'ai pas encore testé ma bobine de Chromatik. Cependant j'ai testé du Octofiber avec du PolyFlex et en dehors d'un problème de collage entre les 2, due aux matériaux eux mêmes, l'impression c'est faite sans problème.
inteloide Posté(e) Juin 18, 2016 Auteur Posté(e) Juin 18, 2016 Bonjour ! Pour changer de température, il suffit de rajouter la ligne M109 S205 (en remplaçant le 205 par la température voulue) juste après l'instruction qui fait la pause (le fameux M601). Par exemple : M601 X20 Y180 Z5 P18 M109 S205 Voilà, je n'ai pas testé, mais ça ne devrait pas être plus compliqué que ça. Au besoin je pourrais modifier l'instruction M601 pour intégrer directement cette notion de température. @+
#pierrot Posté(e) Juin 19, 2016 Posté(e) Juin 19, 2016 Peut-être même placer la consigne de nouvelle température AVANT ton instruction M601 pour qu'elle soit atteinte pendant l'opération de changement de filament, afin de redémarrer l'impression avec cette nouvelle température stabilisée ?
inteloide Posté(e) Juin 19, 2016 Auteur Posté(e) Juin 19, 2016 Pas de soucis normalement : l'instruction M601 n'a aucune influence sur la température (afin de pouvoir retirer le filament). Par contre, je ne pense pas que ce soit le plus judicieux, car si tu change la consigne de température avant, la buse de l'imprimante va rester en contact avec la pièce imprimé le temps de faire la régulation de température => tu risques d'avoir un défaut d'aspect. Remarque que c'est la même chose si on met l'instruction après la pause : l'imprimante va revenir au point de départ, puis va réguler la température ! => donc il faut que je modifie le firmware pour faire la régulation de température après la pause quand l'imprimante n'est pas encore revenue à sa position initiale.
inteloide Posté(e) Juin 19, 2016 Auteur Posté(e) Juin 19, 2016 Pour la version avec l'écran, voici le code à mettre aux environs de la ligne 5426, en replacement de tout le code de l'instruction "inline void gcode_M601() {" PS : attention certaines options de l'instruction ont changées (option R devient V et B devient A), mais la ligne à mettre dans le gcode reste : M601 X20 Y180 Z5 P18. Pour modifier la température, il faut rajouter S205 en remplaçant 205 par la température voulue (ex : M601 X20 Y180 Z5 P18 S205) Note : je ne l'ai pas testé. Une fois testé, je posterai le fichier marlin directement inline void gcode_M601() { // Pause pour changer de filament (Par Inteloide) // Syntaxe (l'ordre des lettre n'a pas d'importance): // X[pos] Y[pos] Z[relative lift] : Position parking (par défaut en absolu) // V : déplacement X et Y de la position parking en relatif (attention Z est toujours en relatif) // A[pin of the beep] : Pin du beeper (défaut = 27 => Broche A4 sur la carte électronique) // E[initial retract] : longueur de filament retiré juste avant la pause (doit être négatif !) // L[later retract] : longueur de filament (doit être négatif !) // T[time to wait] : Durée de l'attente (en secondes) // P[pin input] : Entrée sur laquelle on attent le changement d'état (par défaut 18=fin de course axe X) // I[Interval beep] : Intervale entre deux beeps (en secondes, défaut = 5 sec) // D[Beep duration] : Durée de chaque beep (en secondes, défaut = 0.5 sec) // H[time in sec] : Durée de la tempo après changement d'état sur la pin (pour retirer la main) // S[température] : Température de la buse souhaitée après la pause // // Syntaxe préconisée : M601 X20 Y20 Z5 P18 // ="On remonte la tête de 5 mm, on la déplace dans un coin du plateau, on attend l'appui // sur le capteur de l'axe X, puis on relance l'impression après 2 secondes" // // Exemples de syntaxes : // Avec une tempo : // M601 Z5 T300 E-5 : Remonte de 5mm, attends 300 secondes et relance l'impression // M601 X10 Y10 Z5 T300 E-5 : Remonte de 5mm, va dans un coin du plateau (X=10,Y=10mm), attends 300 secondes et relance l'impression // // Sans tempo : // M601 Z5 P18 E-5: Remonte de 5mm, attend appui sur capteur axe X et relance l'impression après 2 secondes // M601 X10 Y10 R Z5 P18 N5 I2 D0.8 B27 E-5: Remonte de 5mm, va dans un coin du plateau en relatif (X+10,Y+10mm), attend appui sur capteur axe X et relance après 5 secondes // Save positions float target[4]; float lastpos[4]; target[X_AXIS]=current_position[X_AXIS]; target[Y_AXIS]=current_position[Y_AXIS]; target[Z_AXIS]=current_position[Z_AXIS]; target[E_AXIS]=current_position[E_AXIS]; lastpos[X_AXIS]=current_position[X_AXIS]; lastpos[Y_AXIS]=current_position[Y_AXIS]; lastpos[Z_AXIS]=current_position[Z_AXIS]; lastpos[E_AXIS]=current_position[E_AXIS]; //retract by E if(code_seen('E')) { target[E_AXIS]+= code_value(); } else { #ifdef FILAMENTCHANGE_FIRSTRETRACT target[E_AXIS]+= FILAMENTCHANGE_FIRSTRETRACT ; #endif } plan_buffer_line(target[X_AXIS], target[Y_AXIS], target[Z_AXIS], target[E_AXIS], feedrate/60, active_extruder); //lift Z if(code_seen('Z')){ target[Z_AXIS]+= abs(code_value()); } else { #ifdef FILAMENTCHANGE_ZADD target[Z_AXIS]+= FILAMENTCHANGE_ZADD ; #endif } plan_buffer_line(target[X_AXIS], target[Y_AXIS], target[Z_AXIS], target[E_AXIS], feedrate/60, active_extruder); //move xy float distance; if(code_seen('X')) { distance=code_value(); if(code_seen('V')) { target[X_AXIS]+= distance; } else { target[X_AXIS] = distance; } } else { #ifdef FILAMENTCHANGE_XPOS target[X_AXIS]= FILAMENTCHANGE_XPOS ; #endif } if(code_seen('Y')) { distance=code_value(); if(code_seen('V')) { target[Y_AXIS]+= distance; } else { target[Y_AXIS] = distance; } } else { #ifdef FILAMENTCHANGE_YPOS target[Y_AXIS]= FILAMENTCHANGE_YPOS ; #endif } plan_buffer_line(target[X_AXIS], target[Y_AXIS], target[Z_AXIS], target[E_AXIS], feedrate/60, active_extruder); // More retract ? if(code_seen('L')) { target[E_AXIS]+= code_value(); } else { #ifdef FILAMENTCHANGE_FINALRETRACT target[E_AXIS]+= FILAMENTCHANGE_FINALRETRACT ; #endif } plan_buffer_line(target[X_AXIS], target[Y_AXIS], target[Z_AXIS], target[E_AXIS], feedrate/60, active_extruder); //finish moves st_synchronize(); //disable extruder steppers so filament can be removed disable_e0(); disable_e1(); disable_e2(); delay(100); // Variables générales unsigned long currentMillisBeeper = 0; // Top de depart pour le chrono du beeper unsigned long previousMiliBeeper = 0; // Précédent top unsigned long startMiliBeeper = 0; // Top de départ pour l'attente unsigned long temps=180000; // Durée d'attente unsigned long intervalBeeper = 5000; // Intervale entre chaque beep (en ms) unsigned long durationBeeper = 500; // Durée du beep (en ms) unsigned long temp_after_break=2000; // Tempo après le changement d'état de la pin int etatBeeper = LOW; // Etat du beeper int pinBeeper = 27; // Pin pour le beeper int pin_number = 18; // Pin pour fin attente bool wait_for_time=true; int pin_target; // On récupère les paramètres if(code_seen('I')) intervalBeeper = code_value()*1000; // Intervale entre chaque beep (en ms) if(code_seen('D')) durationBeeper = code_value()*1000; // Durée du beep (en ms) if(code_seen('A')) pinBeeper = code_value(); // Pin pour le beeper if(code_seen('T')) temps = code_value()*1000; // Le temps à attendre en ms if(code_seen('P')) {pin_number = code_value(); wait_for_time=false;}; // La pin à attendre if(code_seen('H')) {temp_after_break = code_value()*1000;}; // Tempo après le changement d'état de la pin // On active les entrées/sorties pinMode(pinBeeper, OUTPUT); // On active la sortie du beeper if (!wait_for_time){ // On active l'entrée si on n'est pas en temps pinMode(pin_number, INPUT); pin_target = !digitalRead(pin_number); } // On démarre l'attente startMiliBeeper = millis(); bool stop_la_boucle=false; while(!stop_la_boucle){ manage_heater(); //manage_inactivity(); //=> mis en commentaire pour éviter que les moteurs se désactive et qu'on puisse bouger la tête par erreur. enable_x();enable_y();enable_z(); // on fait aller le beeper currentMillisBeeper = millis(); if ((etatBeeper == LOW) && (currentMillisBeeper - previousMiliBeeper >= intervalBeeper)) { previousMiliBeeper = currentMillisBeeper; // On garde le moment où on a changé d'état etatBeeper = HIGH; // On change l'état du beeper digitalWrite(pinBeeper, etatBeeper); // On applique le nouvel état = on fait sonner } if ((etatBeeper == HIGH) && (currentMillisBeeper - previousMiliBeeper >= durationBeeper)) { previousMiliBeeper = currentMillisBeeper; // On garde le moment où on a changé d'état etatBeeper = LOW; // On change l'état du beeper digitalWrite(pinBeeper, etatBeeper); // On applique le nouvel état } // On regarde si on doit stopper la boucle if (!wait_for_time) {//On regarde un changement d'une entrée if (digitalRead(pin_number) == pin_target) { stop_la_boucle=true; } } else {// On regarde si la tempo est finie if (currentMillisBeeper-startMiliBeeper>=temps) { stop_la_boucle=true; } } } // Finalisation de la boucle d'attente digitalWrite(pinBeeper, LOW); // pour remettre au niveau bas (0V) après la boucle d'attente pinMode(pinBeeper, INPUT); // pour remettre en entrée qui est la valeur par défaut // Tempo pour retirer sa main if (!wait_for_time) { delay(temp_after_break); } // On met la bonne température if(code_seen('S')) { gcode_M109(); } //return to old position the extruder if(code_seen('L')) { target[E_AXIS]+= -code_value(); current_position[E_AXIS]=target[E_AXIS]; //the long retract of L is compensated by manual filament feeding plan_set_e_position(current_position[E_AXIS]); } else { #ifdef FILAMENTCHANGE_FINALRETRACT target[E_AXIS]+=(-1)*FILAMENTCHANGE_FINALRETRACT ; current_position[E_AXIS]=target[E_AXIS]; //the long retract of L is compensated by manual filament feeding plan_set_e_position(current_position[E_AXIS]); #endif } //return to old position plan_buffer_line( target[X_AXIS], target[Y_AXIS], target[Z_AXIS], target[E_AXIS], feedrate/60, active_extruder); //should do nothing plan_buffer_line(lastpos[X_AXIS], lastpos[Y_AXIS], target[Z_AXIS], target[E_AXIS], feedrate/60, active_extruder); //move xy back plan_buffer_line(lastpos[X_AXIS], lastpos[Y_AXIS], lastpos[Z_AXIS], target[E_AXIS], feedrate/60, active_extruder); //move z back plan_buffer_line(lastpos[X_AXIS], lastpos[Y_AXIS], lastpos[Z_AXIS], lastpos[E_AXIS], feedrate/60, active_extruder); //final unretract }
#pierrot Posté(e) Juin 20, 2016 Posté(e) Juin 20, 2016 (modifié) Il y a 23 heures, inteloide a dit : si tu change la consigne de température avant, la buse de l'imprimante va rester en contact avec la pièce imprimé le temps de faire la régulation de température => tu risques d'avoir un défaut d'aspect. => donc il faut que je modifie le firmware pour faire la régulation de température après la pause quand l'imprimante n'est pas encore revenue à sa position initiale. Oui c'est ce que je voulais dire : profiter du délai nécessité par le changement manuel pour laisser le temps à la buse de chauffer ou refroidir pour s'adapter au nouveau filament. Je n'avais pas vu que la tête n'avait pas bougé, il faut bien sûr qu'elle ne soit pas au contact de la pièce pendant l'opération. Modifié (le) Juin 20, 2016 par #pierrot
Ben_k2 Posté(e) Juin 20, 2016 Posté(e) Juin 20, 2016 Bonjour, D'abord un grand merci à @inteloide pour ton tuto très efficace, pas de blabla inutile, des images, des exemples, bref, bravo. J'ai cependant une question, serait-il possible d'utiliser la butée X comme bouton pause ? Je ne m'y connais pas en automatisme, cela dit n'y aurait-il pas un moyen d'intégrer une autre fonction à la butée X (même manuellement dans le G code) comme c'est le cas lors de la manip de changement de fil ?
inteloide Posté(e) Juin 21, 2016 Auteur Posté(e) Juin 21, 2016 Bonjour, Si tu veux faire une simple pause en l'ajoutant dans le fichier GCODE (c'est à dire que l'imprimante fera la pause quand elle atteindra cette instruction, et non quand tu appuieras à n'importe quel moment durant l'impression, alors tu peux ajouter l'instruction suivante : M601 P18 L'imprimante ne bougera pas jusqu'à l'appui sur le capteur de l'axe X. Maintenant, si tu veux que l'imprime à n'importe quel moment (avec le risque de s'arrêter si pendant l'impression elle s'approche trop près du bord et déclenche le capteur), alors c'est une autre paire de manche. Si tel est ton besoin, je peux y regarder.
fragator Posté(e) Juin 21, 2016 Posté(e) Juin 21, 2016 salut @inteloide, et merci pour ton option 2 couleurs (voir +) vraiment fantastique. petite question : je vient d installer la box discoevo350 + la box discoled. j ai fait la demande auprès de dagoma pour le firmware adapter pour les 2 box, (1 firmware pour les 2 d un coup) que j ai reçus d ailleurs très rapidement. quel et la demarche a suivre pour continuer a utiliser ton option ? merci d avance
inteloide Posté(e) Juin 21, 2016 Auteur Posté(e) Juin 21, 2016 Envoi mon ton firmware, je te le modifirai directement ! 1
Messages recommandés
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 compteSe connecter
Vous avez déjà un compte ? Connectez-vous ici.
Connectez-vous maintenant