Marlin et Gen7

J’utilise maintenant Marlin comme firmware, en remplacement de Teacup, pour sa gestion bien meilleure des températures (extrusion et éventuellement plateau) qui sont régulées en PID. L’impression des courbes est aussi améliorée, ce sont de « vraies » courbes et non des segments de droites assez visibles. Marlin peut aussi gérer un afficheur LCD et un lecteur de carte SD, rendant l’imprimante indépendante pendant l’impression (une possibilité que je n’utilise pas).

Ce firmware est plus gros que Teacup. Il tient dans l’Atmega 644 de la Gen7 s’il est compilé sans le support de l’afficheur et de la carte SD, installer un Atmega 1284 (plus grosse mémoire vive) pour ce support.

Cette page décrit les modifications à faire sur les Gen7 1.3 et 1.4 pour y faire fonctionner Marlin, modifications inutiles avec la version 1.5. Elle décrit aussi deux modifications du code, l’une permettant la mise en veille de l’alimentation hors impression (le microcontrôleur et les thermistances restent seuls alimentés), l’autre permettant une bonne utilisation de la thermistance Epcos B57560G104F (un standard dans le monde de la RepRap). Pour finir, réglage des valeurs PID pour la tête d’impression et le plateau.

On peut choisir la version en cours de Marlin ou la version en cours de développement.

Modifications des Gen7 1.3 et 1.4

Deux modifications doivent être faites sur la Gen7 1.3 et une seule sur la 1.4.

Sur la Gen7 1.3 une modification permet la mesure des températures imprimante éteinte, en alimentant en permanence les thermistances par le +5VSB (standby) plutôt que par le +5V de l’alimentation ATX. L’opération consiste à supprimer la connection en cuivre en trois endroits de la carte et à réaliser deux straps (fils conducteurs). Elle est évoquée sur la page de la Gen7 1.3 et décrite dans un thread du forum RepRap. Cette modification est inutile sur les Gen7 1.4 et 1.5, les thermistances y étant alimentées en +5VSB.

Photo de la carte Gen7 1.3 avec modifications dessinées

Pictogramme HDGen7 1.3, photo et dessin des modifications par terramir.
Les traits verts indiquent les connections à réaliser, les traits noirs le cuivre à enlever.

Une autre modification évite des resets de l’électronique rendant Marlin inutilisable, la self L1 de 100µH entraînant des irrégularités d’alimentation du microcontrôleur (brown out detections). Sur les Gen7 1.3 et 1.4 il s’agit de remplacer cette self par une autre de 10µH, ou bien de remplacer la self par un strap en ajoutant un condensateur de 100µF en parallèle au condensateur C19. Attention à la polarité de ce condensateur (de 100µF), on doit s’aider du dessin de la Gen7 1.3 ou de celui de la Gen7 1.4, où le bleu le plus clair représente la masse. Le condensateur C19 n'est pas polarisé. La Gen7 1.5 comporte d’origine une self de 10µH.

Version de l’IDE Arduino

Je n’ai pas réussi à compiler Marlin avec Arduino 0022, cela a marché avec Arduino 1.0.5, en mettant dans le dossier hardware de l’IDE la version 2.1 des fichiers de configuration des Atmega.

Baudrate

La vitesse de communication entre l’hôte et la Gen7 est de 115200 bauds, je n’ai pas essayé de vitesse plus (trop ?) rapide. Dans Configuration.h :

  #define BAUDRATE 115200 // et non la valeur par défaut de 250000 bauds

Mise en veille hors impression

Marlin ne met pas en veille le bloc ATX, qui est allumé en permanence l’imprimante fonctionnant ou non. Sur la Gen7, le microcontrôleur est alimenté par le rail +5VSB et non par le rail +5V, ce qui permet une mise en veille hors impression.

Il faut légèrement modifier les fichiers Configuration.h et Marlin_main.cpp pour permettre cette mise en veille. L’allumage et l’extinction de l’alimentation se feront ensuite par le Gcode. On définit une constante POWER_ON_AT_STARTUP dans Configuration.h dont on examine la valeur true ou false dans Marlin_main.cpp pour allumer ou non l’ATX lors du démarrage de Marlin.

Ajouter dans Configuration.h :

  #define POWER_ON_AT_STARTUP false

Cet ajout peut être fait n’importe où dans le fichier, mais il est logique de le faire après la ligne #define POWER_SUPPLY 1 qui définit le type d’alimentation.

Dans Marlin_main.cpp remplacer la ligne 346 (ce numéro peut varier à l’avenir) :

  #if defined(PS_ON_PIN) && PS_ON_PIN > -1

par :

  #if defined(PS_ON_PIN) && PS_ON_PIN > -1 && POWER_ON_AT_STARTUP == true

La fonction setup_powerhold(), dans laquelle figure cette ligne de code, allume ou non l’alimentation au démarrage. Comme nous avons défini POWER_ON_AT_STARTUP à false cet allumage ne se fera plus. Mettre POWER_ON_AT_STARTUP à true pour qu’il se fasse à nouveau.

Dans le Gcode, M80 allumera l’alimentation et M81 la mettra en veille. Ces codes doivent figurer au tout début de start.gcode pour M80 et à la fin de end.gcode pour M81. Il faut laisser un petit délai pour que l’alimentation s’allume, sans lequel le début du code suivant M80 est mal exécuté. Mon fichier start.gcode commence ainsi :

  M80 (allumage)
  G4 P1000 (délai d’une seconde)

Thermistance Epcos B57560G104F

Dans la partie Thermal Settings de Configuration.h, le choix des thermistances n’est pas suffisamment documenté, leur désignation précise manque parfois et notamment pour l’Epcos B57560G104F que j’utilise pour le plateau et la tête d’impression. Si le choix 1 semblait le bon (« 1 is 100k thermistor - best choice for EPCOS 100k (4.7k pullup) »), j’ai préféré utiliser la table de températures fournie par Nophead pour cette thermistance, dans sa distribution de Marlin pour la Mendel90.

J’ai ajouté cette table à thermistortables.h. Ce fichier, à télécharger, doit remplacer le thermistortables.h original. On sélectionne cette table avec le choix 80 dans Configuration.h :

  #define TEMP_SENSOR_0 80     // 1re tête d’impression
  #define TEMP_SENSOR_1 0      // pas de 2e…
  #define TEMP_SENSOR_2 0      // … ni de 3e tête
  #define TEMP_SENSOR_BED 80   // plateau

Régulation PID et « Autotune » de la tête d’impression

Attention, il faut empêcher la tête de se vider de son plastique pendant ces manipulations qui peuvent être un peu longues. Si la tête est chauffée trop longtemps alors qu’elle contient de l’air, le plastique peut s’oxyder et finir par brûler, ce qui entraînerait un bouchage. On peut utiliser un morceau de carton légèrement comprimé entre la buse et le plateau.

Il faut que la ligne #define PIDTEMP soit décommentée, ce qui est le cas par défaut, pour que la régulation de la température de la tête par PID soit active. Sinon la régulation se fait par seuil (bang-bang en anglais).

La régulation PID demande que les trois valeurs proportionnelle, intégrale et dérivée (ne me demandez pas plus de précisions… !) soient déterminées en fonction de la tête d’impression. Marlin permet de faire ce calcul automatiquement. Dans une console Arduino, le firmware ayant été compilé et téléchargé une première fois, commencer à chauffer la tête d’impression à une température courante :

  M80 (si l’alimentation est en veille)
  M109 S190 (chauffage de la tête à 190°)

On peut suivre la progression de la température sur la console. Une fois la température atteinte, lancer le calcul des valeurs P, I et D :

  M303 S190 C5 (5 cycles successifs à 190°)

On peut également suivre la progression sur la console, qui affiche les trois valeurs à la fin de chaque cycle. Celles du dernier sont les bonnes, exemple pour ma tête d’impression :

  bias: 80 d: 80 min: 186.55 max: 193.74
   Ku: 28.30 Tu: 32.69
   Clasic PID
   Kp: 16.98
   Ki: 1.04
   Kd: 69.40
  PID Autotune finished! Put the Kp, Ki and Kd constants into Configuration.h

Ces valeurs peuvent être reportées dans Configuration.h avant nouvelle compilation et nouveau téléchargement du firmware :

  #define DEFAULT_Kp 16.98
  #define DEFAULT_Ki 1.04
  #define DEFAULT_Kd 69.40

Sans modification du firmware, elles peuvent aussi être mises en EEPROM, la mémoire du microcontrôleur :

  M301 P16.98 I1.04 D69.40 (remplacement des valeurs PID)
  M500 (enregistrement en EEPROM)

Il faut pour cela que la ligne #define EEPROM_SETTINGS soit décommentée dans Configuration.h. Les paramètres enregistrés dans le microcontrôleur remplacent ceux définis dans Configuration.h jusqu’au prochain allumage de l’électronique si M500 n’est pas utilisé, moins provisoirement et jusqu’à une nouvelle écriture en EEPROM si M500 est utilisé.

Régulation PID du plateau

Pour que la température du plateau soit régulée en PID, cette ligne doit être décommentée :

  #define PIDTEMPBED

Trouver les valeurs PID pour le plateau se fait de la même manière que pour la tête, la commande étant modifiée par un E-1 désignat le plateau :

  M303 E-1 C5 S55 (5 cycles successifs à 55°)

On renseigne ensuite les valeurs P, I et D trouvées, ici les valeurs du plateau d’une de mes Mendel :

  #define DEFAULT_bedKp 315.64
  #define DEFAULT_bedKi 22.89
  #define DEFAULT_bedKd 1087.93

• Publié le 29/08/2013 - modifié le 26/11/2013