Aller au contenu

GO Print

Impression en 2 couleurs ou plus !


inteloide

Messages recommandés

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) par Halph
Lien vers le commentaire
Partager sur d’autres sites

@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...

 

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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.

Lien vers le commentaire
Partager sur d’autres sites

  • 3 weeks later...
  • 2 weeks later...

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é.

Lien vers le commentaire
Partager sur d’autres sites

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) par inteloide
Erreur dans le code
  • J'aime 1
Lien vers le commentaire
Partager sur d’autres sites

@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.

Lien vers le commentaire
Partager sur d’autres sites

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à !

Lien vers le commentaire
Partager sur d’autres sites

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.

Lien vers le commentaire
Partager sur d’autres sites

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.

@+

Lien vers le commentaire
Partager sur d’autres sites

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 ;-)

Lien vers le commentaire
Partager sur d’autres sites

  • 2 weeks later...

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 ???large.IMG_0659.JPG

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

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 ???large.IMG_0659.JPG

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.

Lien vers le commentaire
Partager sur d’autres sites

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.

@+

Lien vers le commentaire
Partager sur d’autres sites

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 ?

Lien vers le commentaire
Partager sur d’autres sites

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.

Lien vers le commentaire
Partager sur d’autres sites

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	
		
    }
Lien vers le commentaire
Partager sur d’autres sites

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) par #pierrot
Lien vers le commentaire
Partager sur d’autres sites

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 ?

Lien vers le commentaire
Partager sur d’autres sites

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.

Lien vers le commentaire
Partager sur d’autres sites

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

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
  • Sur cette page :   0 membre est en ligne

    • Aucun utilisateur enregistré regarde cette page.
  • YouTube / Les Imprimantes 3D .fr

×
×
  • Créer...