Autoleveling bed

Rien n’est plus désagréable que de rater le début d’une impression, parce que la première couche ne colle pas , ou à l’inverse parce qu’elle est trop tassée et que cela fait un évasement qui se propage sur les deux ou trois premières couches… ( même si votre flow est bien calibré )

Le remède à cela est l’autolevel bed:

cela consiste à palper le bed en plusieurs points juste avant l’impression à l’aide d’un capteur embarqué sur le chariot Z. Le micrologiciel de l’imprimante, à qui on a l’on a donné la distance ( l’offset )  entre le capteur et la buse d’impression calcule alors l’équation exacte du bed dans l’espace et intègre cette position en Z et la corrige en continu pendant l’impression.

Non seulement la position de la buse en Z est exactement celle souhaitée, mais si votre bed n’est pas parfaitement perpendiculaire au Z ( mal dégauchi ) cela sera corrigé en temps réel !

C’est bluffant:  sur plusieurs dizaine d’impression, j’ai mesuré l’épaisseur du skirt  pour une couche de 0.3: le résultat est parfait à un ou deux centièmes d’écart au maxi: 0.29 à 0.31…skirt

Hardware:

Il faut donc ajouter un capteur sur le chariot Z, le plus proche possible de la buse.

Ce capteur est constitué dans mon cas d’une tige coulissante, avec un aimant collé a son extrémité supérieure. cette tige coulisse dans un bâti. Descendue en position basse, l’aimant est devant un capteur a effet hall ( fin de course Reprapdiscount ) qui passe position ON. Quand la tige remonte, cela libère le capteur qui passe en OFF pour le palpage ( remontée d’environ 2mm )   Si on continue de remonter, l’aimant fini par arriver à proximité d’une tête de vis en acier, et l’attraction fait remonter brusquement la tige d’une distance d’environ 5mm lors du collage.  C’est cette distance qui permet d’escamoter le capteur au dessus du plan de la buse.  C’est compliqué à expliquer, mais la vidéo plus bas dans le texte vaut mieux que tout discours…

Mon capteur est très simple et nécessite de tirer sur la tige pour la descendre, mais il en existe des modéles plus « sioux » avec une tirette pour libérer la tige

autolevel (1)autolevel (2)autolevel (0)

Voici le capteur monté sur la machine:

Position parquée, le capteur est collé en position haute par l’aimant ( petit bloc doré tout en haut de la tige ) qui se colle sous une tête de vis acier:

autolevel (5)

Position travail: la tige est descendue a la main, le capteur effet hall détecte l’aimant et attend de palperautolevel (4)

Voici la séquence de palpage / rétractation automatique qui est paramétrée dans le start G-Code de Repetier / slic3R:

Branchement:

Le capteur se branche sur l’entrée fin de course Z mini de la ramps. On peut enlever son fin de course / home Z max ( si c’était le cas) car il devient inutile.

Paramétrage software:

Le premier paramétrage nécessaire est celui du firmware Marlin. L’activation et le paramétrage de la fonction autolevel, active le G-Code spécifique G29 qui devra être incorporé au G-codes d’impression par les Slicers, à l’aide du « start G-Code »

Paramétrage de Marlin:

Il faut tout d’abord utiliser une version récente de Marlin. Le mieux est de télécharger la dernière version sur le site de Eric Zalm. L’auto-level est implémenté depuis plusieurs version.

Voici pour info ma version: Marlin_TM (faux pdf: WP ne gère pas le format:  à renommer en .zip ) Cette version est issue d’un téléchargement du 23/02/14. Elle reprend mes paramétrages perso, et en plus reçoit un couple de Gcodes spéciaux M43 et M44 qui permettent de piloter un ventilo de refroidissement Bed, moyennant un module Reprapdiscound fan extender ( Merci Hugh pour le développement ! ).

voici les éléments a modifier dans l’onglet configuration.H :

Dans mechanical settings, déclarer son capteur en Z- et activer le cas échéant les résistance de pullup:

//===============================================================
//=============================Mechanical Settings====================
//===============================================================

// Uncomment the following line to enable CoreXY kinematics
// #define COREXY

// coarse Endstop Settings
#define ENDSTOPPULLUPS // Comment this out (using // at the start of the line) to disable the endstop pullup resistors

#ifndef ENDSTOPPULLUPS
  // fine endstop settings: Individual pullups. will be ignored if ENDSTOPPULLUPS is defined
  #define ENDSTOPPULLUP_XMAX
  #define ENDSTOPPULLUP_YMAX
  #define ENDSTOPPULLUP_ZMAX
  #define ENDSTOPPULLUP_XMIN
  #define ENDSTOPPULLUP_YMIN
  #define ENDSTOPPULLUP_ZMIN
#endif

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

Il peut être nécessaire de modifier la logique de votre capteur selon qu’il est NO ou NF

// The pullups are needed if you directly connect a mechanical endswitch between the signal and ground pins.
const bool X_MIN_ENDSTOP_INVERTING = false; // set to true to invert the logic of the endstop.
const bool Y_MIN_ENDSTOP_INVERTING = false; // set to true to invert the logic of the endstop.
const bool Z_MIN_ENDSTOP_INVERTING = false; // set to true to invert the logic of the endstop.
const bool X_MAX_ENDSTOP_INVERTING = false; // 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 = false; // set to true to invert the logic of the endstop.
//#define DISABLE_MAX_ENDSTOPS
//#define DISABLE_MIN_ENDSTOPS

Dans la partie autolevel bed, il faut déclarer le type de palpage choisi : cartésien ou en 3 points, la zone de palpage, les offsets du palpeur.  Comme toujours on active en supprimant les // qui mettent en commentaires

#define ENABLE_AUTO_BED_LEVELING // Delete the comment to enable (remove // at the start of the line)  Activation de la fonction

#ifdef ENABLE_AUTO_BED_LEVELING

// There are 2 different ways to pick the X and Y locations to probe:

//  – « grid » mode
//    Probe every point in a rectangular grid
//    You must specify the rectangle, and the density of sample points
//    This mode is preferred because there are more measurements.
//    It used to be called ACCURATE_BED_LEVELING but « grid » is more descriptive

//  – « 3-point » mode
//    Probe 3 arbitrary points on the bed (that aren’t colinear)
//    You must specify the X & Y coordinates of all 3 points

  #define AUTO_BED_LEVELING_GRID  Activation du mode Grid
  // with AUTO_BED_LEVELING_GRID, the bed is sampled in a
  // AUTO_BED_LEVELING_GRID_POINTSxAUTO_BED_LEVELING_GRID_POINTS grid
  // and least squares solution is calculated
  // Note: this feature occupies 10’206 byte
  #ifdef AUTO_BED_LEVELING_GRID

    // set the rectangle in which to probe
    #define LEFT_PROBE_BED_POSITION 5
    #define RIGHT_PROBE_BED_POSITION 150
    #define BACK_PROBE_BED_POSITION 190
    #define FRONT_PROBE_BED_POSITION 5

Défini les extrémités de la zone à palper. A définir en tenant compte des offsets XY du palpeur. Mon palpeur est aligné avec la buse en Y. Je peux donc palper de 5 à 190 mm soit toute la zone d’impression. Il est décalé à 40 mm en x coté mini, je peux donc palper de 5 à 150mm maxi seulement. Mes courses sont de 195 / 195, et je garde 5 mm de sécurité à chaque extrémité. Il n’est pas gênant de ne pas palper sur tout le bed,car le calcul extrapole l’équation du plan sur la zone totale

     // set the number of grid points per dimension
     // I wouldn’t see a reason to go above 3 (=9 probing points on the bed)
    #define AUTO_BED_LEVELING_GRID_POINTS 3

Défini le nombre de palpages sur chaque axe. si 2: 2×2=4 points. Si 3: 3×3=9 points. Inutile d’aller au delà...

  #else  // not AUTO_BED_LEVELING_GRID
    // with no grid, just probe 3 arbitrary points.  A simple cross-product
    // is used to esimate the plane of the print bed

      #define ABL_PROBE_PT_1_X 15
      #define ABL_PROBE_PT_1_Y 180
      #define ABL_PROBE_PT_2_X 15
      #define ABL_PROBE_PT_2_Y 20
      #define ABL_PROBE_PT_3_X 170
      #define ABL_PROBE_PT_3_Y 20

Autre méthode en 3 points que je n’utilise pas

  #endif // AUTO_BED_LEVELING_GRID

  // these are the offsets to the probe relative to the extruder tip (Hotend – Probe)
  #define X_PROBE_OFFSET_FROM_EXTRUDER -40
  #define Y_PROBE_OFFSET_FROM_EXTRUDER 0
  #define Z_PROBE_OFFSET_FROM_EXTRUDER -11.76

Offsets entre la pointe de palpage et la buse. A mesurer en X et Y, et à calibrer en Z: Voir § réglage

  #define Z_RAISE_BEFORE_HOMING 4       // (in mm) Raise Z before homing (G28) for Probe Clearance.  // Be sure you have this distance over your Z_MAX_POS in case

Remontée du Z lors des palpages G28 Z ( palpage origine Z )

  #define XY_TRAVEL_SPEED 10000         // X and Y axis travel speed between probes, in mm/min

VItesse entre les palpages lors du G29

  #define Z_RAISE_BEFORE_PROBING 20    //How much the extruder will be raised before traveling to the first probing point.

Remontée sécurité avant G29

  #define Z_RAISE_BETWEEN_PROBINGS 4 //How much the extruder will be raised when traveling from between next probing points

Remontée entre les palpages lors du G29

Nota: ces 4 valeurs sont exprimées en cotes absolues. il faudra avoir fait un G28 Z au préalable. Voir § Start.G- code

  //If defined, the Probe servo will be turned on only during movement and then turned off to avoid jerk
  //The value is the delay to turn the servo off after powered on – depends on the servo speed; 300ms is good value, but you can try lower it.
  // You MUST HAVE the SERVO_ENDSTOPS defined to use here a value higher than zero otherwise your code will not compile.

//  #define PROBE_SERVO_DEACTIVATION_DELAY 300

//If you have enabled the Bed Auto Leveling and are using the same Z Probe for Z Homing,
//it is highly recommended you let this Z_SAFE_HOMING enabled!!!

  //#define Z_SAFE_HOMING   // This feature is meant to avoid Z homing with probe outside the bed area.// When defined, it will:
                          // – Allow Z homing only after X and Y homing AND stepper drivers still enabled
                          // – If stepper drivers timeout, it will need X and Y homing again before Z homing
                          // – Position the probe in a defined XY point before Z Homing when homing all axis (G28)
                          // – Block Z homing only when the probe is outside bed area.

  #ifdef Z_SAFE_HOMING

    #define Z_SAFE_HOMING_X_POINT (X_MAX_LENGTH/2)    // X point for Z homing when homing all axis (G28)
    #define Z_SAFE_HOMING_Y_POINT (Y_MAX_LENGTH/2)    // Y point for Z homing when homing all axis (G28)

Fonction de sécurité  » safe homing ». Perso je l’ai désactivée n’en voyant pas l’intérêt. A creuser si vous êtes des gars prudents

  #endif

#endif // ENABLE_AUTO_BED_LEVELING  Fin de la section autolevel

Start.Gcode:

Le start G-code est la séquence qui est mise par le slicer ( slic3R embeded Repetier pour moi ) en début de toute impression.

Le mien fait une prise d’origine en xy, se pose au dessus du bed, demande de descendre le palpeur, fait une origine Z, le G29, rétracte le palpeur, puis positionne la buse en avant de bed, et fait une purge.

G90 ; Passage coordonnees absolues
G28 X Y ; Home X Y
G1 Y100 F4000 ; Avance palpeur sur bed
M300 s1000 p100 ; Beep pour avertir d’appuyer sur le bouton
M300 s1500 p100
M300 s1000 p100
M300 s1500 p100
M0 ; Attente appui sur bouton pour continuer
G28 Z ; home Z
G91 ; Passage coordonnées relatives
G1 Z8 F4000 ; Remonte la tete de 8 mm par sécurité
M117 Palpage ; Message sur afficheur
G29 ; Palpage
G90 ; Passage coordonnées absolues
G1 Z2 F4000 ; rétractation palpeur
G1 Z30 F4000 ; remonte de 30 pour dégager buse
G1 X100 Y0  F8000 ; Avance avant bed
G92 E0                  ;mise a zéro extrudeuse
G1 F600 E20         ;extrude 20 mm
G92 E0                  ;mise a zéro extrudeuse
G1 F600 E-1         ;retract extrudeuse 1mm
G92 E0                  ;mise a zéro extrudeuse
M300 s1000 p100 ; Beep pour avertir d’appuyer sur le bouton
M300 s1500 p100
M300 s1000 p100
M300 s1500 p100
M0 ; Attente appui sur bouton pour continuer et lancer impression

Ce start ne fait pas de remontée en préalable, car en fin d’impression, j’ai une remontée programmée suffisante. Il peut être prudent d’en programmer une… Attention  toutefois de ne pas taper en haut…

Exemple le Start  de Laurent :

G91 ; Passage coordonnees relatives
G1 Z15 F4000 ; Remonte la tete de 15 mm par securite
G90 ; Passage coordonnees absolues
M300 s1000 p100 ; Beep pour avertir d’appuyer sur le bouton
M300 s1500 p100
M300 s1000 p100
M300 s1500 p100
M0 ; Attente appui sur bouton pour continuer
G28 X Y ; home axes X & Y
M117 Palpage ; Message sur afficheur
G29 ; Palpage miroir
G91 ; Passage coordonnees relatives
G1 Z5 F4000 ; Remonte la tete de 5 mm par securite
G90 ; Passage coordonnees absolues
G1 X35 Y55 F8000 ; Position XY de rentree du palpeur
G1 Z1 F8000          ; Rentree palpeur
;M0 ; Attente appui sur bouton pour continuer
G1 Z13 F6000
; Nettoyage Buse
M109 S200
G92 E0                  ;zero the extruded length
G1 F100 E5           ;extrude 5 mm of feed stock
G92 E0                  ;zero the extruded length again
G1 Z16 F4000
G1 x10 y0 F4000
G1 x60 y0 F5000
G1 X60 Y55 F5000

Son start promène la buse sur une brosse pour la nettoyer avant impression: le top confort  😉

Réglage:

Le seul réglage à faire est celui de l’offset buse en Z. Perso je procède ainsi:

je met d’abord une valeur approximative relevée au réglet ( Mettre plutôt plus que pas assez… )

Mettre la machine en chauffe bed et hot end pour intégrer les dilatations  qui sont non négligeables.

A partir de la console manuelle de Repetier ou via Pronterface, positionner au centre du bed, et faire un G28 Z. Mesurer la distance avec des cales, et saisir cette valeur plus précise dans Marlin

Ensuite après un nouveau G28 Z, prendre une cale d’épaisseur connue, par exemple 10. envoyer à 10 de haut avec un G1 Z10

Tenter de passer la cale sous la buse et monter descendre selon le constat jusqu’à passer la cale pile à 0.1 prés. Noter la valeur affichée en Z ,  9.8 par exemple et corriger la valeur de l’offset de la différence constatée avec la cote théorique de la cale. ( -0.2 dans ce cas )

Une fois ceci effectué, pour aller dans le centième, je fais une ou deux impression par exemple en couche de 0.3. Je mesure les skirt en plusieurs points, et si je trouve par exemple 0.28 en moyenne, je corrige des deux centièmes qui manquent.

Voila, en suivant tout cela, vous devez arriver à un résultat parfait !! 🙂

Hope that helps…

PS, Merci à Pascal qui le premier a tester cette fonction et a publié sur la liste yahoo imprimante3D, ainsi qu’aux autres testeurs: Laurent, Loic … vos post m’ont convaincu !