Configurer le firmware Marlin

Pour fabriquer une imprimante 3d ou bien pour repousser les limites de sont utilisation il est nécessaire de mettre les mains dans le firmware. C’est une étape qui peut en rebuter plusieurs et j’essaierais dans cet article d’expliquer au mieux les étapes requises pour mettre en route une imprimante 3d. Pour vous rassurer nous allons modifier qu’un fichier et nous allons nous concentrer à activer et désactiver des options ainsi que des valeurs de variables. Si vous avez des questions n’hésitez pas à les poser dans la zone de commentaires..

Qu’est ce que le firmware?

Le firmware est un micro-logiciel résidant sur la carte mère de l’imprimante 3D. Les instructions de fabrication du modèle 3d (code G) peuvent être similaires d’une imprimante 3d à l’autre, le firmware s’occupe de les interpréter en mouvements en tenant compte des propriétés spécifiques de la machine. La configuration du firmware est unique pour chaque modèle d’imprimante 3D, c’est le lien entre le logiciel et le matériel.


Réunir les bons outils

Carte mère

Pour cet article, nous utiliserons une carte mère bien répandue chez les amateurs de reprap, c’est à dire une carte arduino mega 2560 ou compatible et un shield RAMPS 1.4. Mais puisque beaucoup de cartes mères sont compatibles avec le firmware marlin, les mêmes principes de configuration s’appliqueront pour la plupart.

Firmware

Télécharger le firmware ici et décompresser le dossier.

Arduino IDE 1.0.5

Nous aurons besoin de l’éditeur arduino pour modifier et installer le firmware sur l’imprimante 3D. C’est un logiciel open source permettant de programmer les cartes de contrôle Arduino. C’est un standard dans le monde des imprimantes 3D de bureau.
Téléchargez la version convenant à votre système d’exploitation ici (window, mac ou linux) et installez-le.


Configuration du firmware.

Les développeurs qui ont conçu le firmware marlin (Erik van der Zalm) ont veillé à placer toutes les variables de configuration dans un seul fichier et ce qui simplifiera notre tâche.

  • Démarrez l’application Arduino.
  • Sélectionnez le bon type de carte mère: Arduino Mega 2560.
  • Ouvrez le fichier pins.h qui se trouve dans le dossier marlin.
  • Activez la ligne suivante si vous utilisez un shield ramps 1.3 ou 1.4.
  • #define RAMPS_V_1_3.
  • Sauvegardez
  • Ouvrez ensuite le fichier Configuration.h.

Sélectionner la vitesse de communication:

La vitesse de transfert entre la carte mère de l’imprimante 3d et l’ordinateur est définie en baud:

#define BAUDRATE 250000
//#define BAUDRATE 115200

La vitesse doit être la même pour le contrôleur, pour le matériel USB et pour le logiciel hôte, ce qui peut parfois limiter la vitesse. Deux vitesses sont plus couramment utilisées: 250000 et 115200 bauds. Si l’une ne fonctionne pas, essayez avec l’autre.

Sélectionner la carte mère:

Au dessus de la ligne #define MOTHERBOARD se trouve une liste des différentes cartes mères disponibles. Il suffit de trouver notre carte et sa configuration s’il y a lieu pour utiliser le bon numéro. Par exemple la carte RAMPS 1.3 / 1.4 (Power outputs: Extruder, Fan, Bed) sera configurée avec le numéro 33.

#define MOTHERBOARD 33

*Utilisez celui-ci même si vous n’utilise pas de ventilateur (fan) ou de plaque chauffante (bed)

Donner un nom à l’imprimante:

En connectant un écran LCD à l’imprimante, on peux faire le faire afficher au démarrage:

#define CUSTOM_MENDEL_NAME « Solid Utopia »

Nombre d'extruders:

Indiquez le nombre d’extrudeurs que vous pensez utiliser.

#define EXTRUDERS 1

Paramètres thermiques

Choix de la sonde de température

Parmi la liste énumérée dans le code, au dessus, il faut choisir le thermistor le plus près du nôtre. En cas de doute il est préférable de demander à son vendeur. Si le thermistor est inconnu, il est possible d’obtenir une erreur de lecture tout en permettant le contrôle de température. À priori un thermistor au repos devrais indiquer la température de la pièce ou en être assez proche. Il est possible d’obtenir de bonne impression en le calibrant correctement, mais il y aura des différences de comparaison avec d’autres imprimantes.

#define TEMP_SENSOR_0 1
#define TEMP_SENSOR_1 0
#define TEMP_SENSOR_2 0
#define TEMP_SENSOR_BED 1

TEMP_SENSOR_0 est utilisé par la première tête d’impression alors que TEMP_SENSOR_BED est connecté à la plaque chauffante. Ulilisez le 0 pour désactiver une sonde.

Température minimum

Définissons la température minimum d’utilisation supérieure à 0°C. La raison étant qu’un capteur de température déconnecté indiquera une température de 0°C. Cette sécurité empêchera le contrôleur de chauffer les têtes d’impressions et la plaque chauffante au maximum de puissance indéfiniment. C’est un paramètre important qui est définit à 5°C par défaut.

#define HEATER_0_MINTEMP 5
#define HEATER_1_MINTEMP 5
#define HEATER_2_MINTEMP 5
#define BED_MINTEMP 5

Température maximum

Tout dépendant des têtes d’impressions choisies, certaines résiste mieux à la température que d’autres. Par exemple un tube de PTFE (teflon) est souvent utilisé dans les têtes d’impression pour guider le filament dans la zone chaude, mais ce matériau résiste à des températures jusqu’à 240°C environ. Il est préférable de laisser un peu de marge ici puisqu’un contrôleur peut dépasser légèrement la température cible avant de la maintenir.

#define HEATER_0_MAXTEMP 235
#define HEATER_1_MAXTEMP 235
#define HEATER_2_MAXTEMP 235
#define BED_MAXTEMP 120

Contrôleur de température PID

Ceci est une option avancée qui pourra être détaillé plus tard, mais pour le moment nous pouvons fonctionner sans toucher à cette option.

Empêcher les extrusions dangereuses:

Ces paramètres sont définis par défaut.
Pour une raison de sécurité nous voulons éviter d’extruder un matériel trop froid et solide. Comme il est impossible d’extruder un matériau solide, l’imprimante pourrait se briser en tentant de le faire.

#define PREVENT_DANGEROUS_EXTRUDE

En cas d’erreur dans les instructions de mouvement de l’imprimante tel que la position d’une virgule ou d’un point, il serait pratique d’empêcher une extrusion trop longue.

#define PREVENT_LENGTHY_EXTRUDE

Ici nous pouvons fixer la température minimum d’extrusion, au dessus du point de fusion du PLA et de l’ABS.

#define EXTRUDE_MINTEMP 170

Paramètres mécaniques

Interrupteurs de fin de course

Les interrupteurs sont destinés à être déclenchés lorsqu’un axe atteint sa limite. En d’autres termes il prévient l’imprimante de sortir de son propre bâtît. Les interrupteurs de fin de course sont utilisés aussi comme position de référence. Lorsqu’on demande à l’imprimante de trouver son repère, elle déplacera chaque axe un par un dans la direction définie jusqu’à ce que l’interrupteur soit déclenché.

Choix du circuit d’interrupteur

Une résistance de rappel est nécessaire entre les bornes de source, signal et le retour à la masse sinon on a de bonnes chances de griller l’électronique avec un court-circuit.
Une résistance de rappel est déjà intégré dans le micro-contrôleur et il est possible de l’activer par le firmware. Il est nécessaire de choisir cette option pour connecter un interrupteur mécanique directement entre le signal et le retour à la masse. Pour tout autre type d’interrupteur (optique, magnétique, mécanique) il est recommandé d’étudier le circuit afin d’éviter les courts-circuits.
Laisser cette ligne sans commentaire // pour activer les résistances de rappel sur chaque interrupteur.

#define ENDSTOPPULLUPS

Dans le cas contraire, Marlin permet de configurer chaque interrupteur individuellement. Il est possible d’utiliser différents types d’interrupteurs sur la même imprimante (optique, magnétique, mécanique, etc.).

#ifndef ENDSTOPPULLUPS
#define ENDSTOPPULLUP_XMAX
#define ENDSTOPPULLUP_YMAX
// #define ENDSTOPPULLUP_ZMAX
#define ENDSTOPPULLUP_XMIN
#define ENDSTOPPULLUP_YMIN
// #define ENDSTOPPULLUP_ZMIN
#endif

Inversion de la logique des interrupteurs.

Certains interrupteurs laissent normalement passer le courant et l’interrompent lorsqu’ils sont déclenchés (NC). D’autres ne laisse passer le courant que lorsqu’ils sont déclenchés (NO). Certains offrent les deux types de comportement et il suffit de souder les bons connecteurs (NC ou NO). Un circuit (NC, normally closed) laisse passer le courant et un circuit ouvert (No, normally open) ne le laisse pas passer au repos. L’avantage de laisser passer le courant en situation normale est que lorsque les fils sont coupés ou que l’interrupteur est brisé, l’imprimante interprétera cette erreur comme un signal de fin de course et ne bougera pas plus loin.

  • NO = true.
  • NC = false.
const bool X_MIN_ENDSTOP_INVERTING = false;
const bool Y_MIN_ENDSTOP_INVERTING = false;
const bool Z_MIN_ENDSTOP_INVERTING = false;
const bool X_MAX_ENDSTOP_INVERTING = false;
const bool Y_MAX_ENDSTOP_INVERTING = false;
const bool Z_MAX_ENDSTOP_INVERTING = false;

Utiliser 3 ou 6 interrupteurs.

Dans des circonstances normales, la position prévue par l’imprimante serait toujours adéquate. Dans ce cas, un interrupteur de fin de course serait suffisant pour déterminer la position de référence (origine de l’imprimante). Mais lorsqu’un incident survient et empêche le moteur de suivre la commande (collision, manque de puissance, pas manquée) la position prévue n’est plus la position réelle et il est possible en théorie que l’imprimante commande un mouvement au-delà de la fin des axes. L’utilisation d’interrupteurs de fin de course au début et à la fin de chaque axe empêche ce genre de comportement.
Enlever les symboles de commentaires // sur les lignes suivantes pour désactiver les interrupteurs maximums et minimums.

//#define DISABLE_MAX_ENDSTOPS
//#define DISABLE_MIN_ENDSTOPS

Inverser la direction des moteurs

La meilleure façon de savoir si les moteurs sont branchés à l’endroit ou à l’envers est de les essayer. Pour ce faire il est préférable d’attendre que la configuration soit complété et que le firmware soit envoyée au contrôleur. On reviendra à cet sujet plus loin.

#define INVERT_X_DIR false
#define INVERT_Y_DIR true
#define INVERT_Z_DIR true
#define INVERT_E0_DIR true
#define INVERT_E1_DIR true
#define INVERT_E2_DIR false

Définir le point de repère

La position de repère est le point vers lequel l’imprimante ira toucher les interrupteurs pour trouver sa position réelle. Elle sera ensuite « aveugle » et elle calculera sa position par rapport à ce point.
Il faut penser que l’imprimante puisse rejoindre sa position de référence à partir de n’importe quel emplacement possible. Comme les interrupteurs de fin de course se situent aux extrémités, il reste à définir dans quelle direction l’imprimante devra se déplacer pour atteindre les trois que l’on aura choisi.
-1 pour un déplacement en direction négative et 1 en direction positive.

#define X_HOME_DIR -1
#define Y_HOME_DIR -1
#define Z_HOME_DIR 1

À noter que la position de repère peut être différente du centre du plan cartésien.
L’axe Z est celui de la surface d’impression et elle sera placée très près de la buse. Il faut que le signal d’interruption soit très précis et très rapide pour signaler à l’imprimante le moment d’arrêter le mouvement sans risquer de collision. Dans certains cas, il est préférable de prendre la référence au maximum de la course en Z pour ramener ensuite la surface près de la buse lorsque l’imprimante sait où s’arrêter.

Volume d’impression

C’est ici que nous pouvons dire au contrôleur la plage de déplacement maximum pour chaque axe en partant du point de référence. Par exemple, si l’imprimante permet d’imprimer un volume de 200x200x200mm on dira que la position maximum en X est de 200 et le minimum est 0.
*À noter que l’imprimante n’as pas encore été calibrée et on ne sait pas si elle se déplacera bien de 200mm lorsqu’on lui demandera ou bien si elle dépassera légèrement. Pour éviter tout dépassement ou collision, il est donc préférable de réduire légèrement la distance maximum pour le moment. Nous pourrons y revenir après la calibration.

#define X_MAX_POS 190
#define X_MIN_POS 0
#define Y_MAX_POS 190
#define Y_MIN_POS 0
#define Z_MAX_POS 190
#define Z_MIN_POS 0

Paramètres de mouvements

Définir le nombre de mouvements

Il s’agit de définir combien de mouvements l’imprimante peut contrôler. Il s’agit du nombre d’axes (3) en plus du nombre d’extrudeurs.

#define NUM_AXIS 4

*À noter que lorsqu’on utilise plus de 1 extrudeur (défaut) il faut ajouter une virgule pour chaque variable contenant des mouvements dans les lignes qui suivent.
ex: variable {X, Y, Z, E1, E2, E3, etc.}

Vitesse d’avance vers le point de repère

C’est la vitesse de l’imprimante lorsque qu’elle se déplace vers sont point de repère. Attention aux unités. Plusieurs vitesses ou accélérations dans marlin sont exprimé en [mm/s] ou [mm/s2], mais il s’agit ici de [mm/min].

#define HOMING_FEEDRATE {50*60, 50*60, 4*60, 0}

Nombre d’impulsions par unité

Les moteurs pas à pas se déplacent par impulsions, les moteurs couramment utilisés sont des NEMA 17 ayant une résolution de 200 impulsions par rotation. Les contrôleurs envoient aussi des impulsions partielles (microsteps) pour augmenter la résolution de contrôle. Tout dépendamment du mécanisme, le contrôleur doit savoir le nombre d’impulsions à envoyer aux moteurs pour effectuer un déplacement d’un mm sur un axe donné.
La façon de le calculer est de diviser le nombre d’impulsions par le nombre de mm pour la même distance parcourue, dans ce cas une rotation complète du moteur. Le nombre d’impulsions total vu du firmware est le nombre d’impulsions par révolution du moteur multiplié par le nombre de microsteps par impulsion du contrôleur.

Poulie et courroie (habituellement axes xy):

impulsion_par_mm = (impulsions_par_rev * microsteps) / (pas de la dent * nombre_de_dents_de_la_poulie)

Vis mère (axe z)

impulsion_par_mm =(impulsions_par_rev * microsteps) / pas_du_filetage

Extrudeur à entrainement direct:

impulsion_par_mm = (impulsions_par_rev * microsteps) / (diamètre_effectif_de_l’entrainement * pi)

Voir l’exemple de l’extrudeur bowden

Extrudeur avec réduction par engrenage:

impulsion_par_mm = (impulsions_par_rev * microsteps) *
(dents_du_grand_engrenage) / dents_du_petit_engrenage /
(diamètre_effectif_de_l’entrainement * pi)
DEFAULT_AXIS_STEPS_PER_UNIT {X, Y, Z, E1, E2}

#define DEFAULT_AXIS_STEPS_PER_UNIT {80,80,200.0*8/3,760}

Décalage de plusieurs têtes d’impression (optionnel)

Dans le cas où l’on voudrait utiliser plus d’une tête d’impression, il faudrait instruire le firmware de la distance à déplacer pour bien positionner la seconde buse. Normalement la distance entre les buses sont mesuré à partir de la première. On a donc les coordonnées 0, 0 pour la première. Dans notre exemple, la seconde buse est décalé de 25mm en X et reste aligné sur la première en Y. Poursuivre de la même manière pour les buses successives.

#define EXTRUDER_OFFSET_X {0.0, 25}
#define EXTRUDER_OFFSET_Y {0.0, 0}

Il est aussi possible d’effectuer le changement de position lors du changement de buse à partir du code G. Cependant en laissant le firmware prendre en charge cette opération on a pas à définir le décalage ailleur et le code G est un peu plus universel.
Cette dernière ligne met fin à la configuration! Il reste encore quelques étapes avant de commencer à imprimer dont la calibration.

Envoyer le firmware à la carte mère de l’imprimante.

  • Dans l’application Arduino IDE, sauvegarder les modifications faites au fichier Configuration.h.
  • (save).
  • Vérifier le code.
  • (Verify).

Si tout est en ordre, la vérification devrait retourner « Done compiling » sinon vous devriez avoir un ou plusieurs messages d’erreur. Habituellement la ligne de l’erreur est indiquée et il s’agit souvent d’erreur de frappe ou un manque de délimitation des commentaires //.
Une fois que la vérification est passée, il est temps de brancher la carte mère de l’imprimante au port USB de l’ordinateur.
Sélectionner port correspondant à l’imprimante 3d.

  • Téléchargez le code compilé sur la carte mère.
  • (upload).

Maintenant l’imprimante est prête à bouger!! Il reste à vérifier que les moteurs tournent dans le bon sens.

C’est la dernière étape avant de commencer à imprimer les pièces de calibration.
Garder l’imprimante 3d connectée au port USB de l’imprimante.


  1. Positionner manuellement l’imprimante au centre de chaque axe. Il faut qu’elle puisse bouger dans un sens ou dans l’autre.
  2. Sur l’ordinateur démarrer un logiciel tel que Pronterface ou Repetier pour piloter l’imprimante 3d.
  3. Appuyer sur le bouton connecter.
  4. Garder votre doigt prêt à intervenir sur bouton reset de la carte mère de l’imprimante. (juste au cas…).
  5. Envoyer la commande pour déplacer l’axe X d’une petite distance tel que +1 ou +10mm.
  6. Si l’imprimante se déplace dans l’autre direction, il faudra inverser le sens du moteur.
  7. Répéter pour chaque axe.

Pour tester le mouvement des extrudeurs, il faut passer par dessus la protection. La commande M302 permet de faire tourner l’extrudeur même si la buse n’est pas à la température d’extrusion.Il faut être certain d’effectuer le test sans filament.
Envoyer la commande pour extruder 10mm de matériel et vérifier le sens de rotation du moteur.
Il ne fait pas de différence si on inverse la direction des moteurs dans le firmware ou en inversant le branchement des moteurs. Par contre il faut faire attention de bien éteindre l’alimentation de l’imprimante et débrancher le câble USB avant de débrancher/rebrancher les moteurs.

#define INVERT_X_DIR false
#define INVERT_Y_DIR true
#define INVERT_Z_DIR true
#define INVERT_E0_DIR true
#define INVERT_E1_DIR true
#define INVERT_E2_DIR false
Pour plus d’information sur les résistances de rappel: wikipedia, arduino Laisser cette ligne sans commentaire // pour activer les résistances de rappel sur chaque interrupteur.