Compensation du jeu dans le G-Code (backlash compensation)

S’il y a quelque chose qui m’agace avec cette machine, c’est le petit jeu sur les axes.

J’ai bien mon système d’écrou/contre-écrou serrés l’un vers l’autre, mais un jeu subsiste malgré tout.

Si je serre trop les vis de réglage, il y a trop de frottement. Le serrage est donc un compromis entre le jeu tolérable et le frottement induit par ce serrage.

Le jeu est mis en évidence lors des changements de direction, et on s’en rend compte quand on cherche à avoir du détail dans les dessins (1mm d’écart entre deux lignes par exemple, ou bien dessiner des petits cercles).

Pour le mesurer, j’ai fait les choses très simplement:

  • Positionner le X sur une origine arbitraire
  • « Précharger » l’axe dans le sens positif en le faisant avancer de quelques millimètres.
  • Faire un point au laser
  • Avancer en X de 100mm
  • Reculer en X de 100mm
  • Refaire un point au laser

Résultat : le second point est légèrement décalé du premier à cause du jeu lié au changement de direction.

Mesuré à la truelle, l’écart est d’un peu moins de 1mm.

J’ai commencé par chercher au niveau de Marlin s’il y avait possibilité de configurer une compensation. Pas évident visiblement.

Alors j’ai fait un programme qui analyse un fichier G-Code, et injecte la compensation directement dans le G-Code.

Le processus est le suivant: quand un changement de direction est détecté sur un axe,

  1. On passe en mode relatif
  2. On déplace l’axe de la valeur de la compensation (en positif ou en négatif, selon la direction)
  3. On repasse en mode absolu
  4. On met à jour la position de l’axe au niveau du firmware (sinon ça ne sert à rien)

Exemple : je veux compenser mon axe X de 0.5mm. Si j’ai le G-Code suivant : [code] G0 X0   ;on commence à l’origine G0 X10  ;déplacement positif G0 X15  ;déplacement dans la même direction -> pas de compensation G0 X0   ;changement de direction -> on doit compenser avant d’exécuter cette ligne [/code]

Avant la ligne 4, on va donc injecter les instructions selon le processus décrit plus haut: [code] G0 X0 G0 X10 G0 X15 ;Compensation X : G91;passage en mode relatif G1 X-0.5;compensation négative de 0.5mm G90;retour en mode absolu G92 X15;update de la position X dans le contrôleur. ;Fin de compensation G0 X0 [/code]

En vrai, mon programme génère des commentaires en anglais; je me dis que c’est mieux pour la communauté internationale 🙂

La commande G92 est très importante. En fait, le contrôleur (Marlin) a dans sa mémoire les positions de chaque axe, qu’il incrémente ou décrémente son compteur interne.

Par conséquent après le G1 X-0.5, pour Marlin, la position actuelle de l’axe est à 14.5mm. Normal en même temps. Hé bien le G92 permet de de à Marlin: « Oublie la position que tu connais, et prends celle là à la place ». De cette manière, pour les futures commandes, Marlin n’y verra que du feu et ne saura même pas qu’on a ajouté artificiellement des mouvements.

Quelle interface!
Quelle interface de malade!

Le hic, c’est que cette approche ne pourra pas fonctionner sur des commandes d’arcs (G02 et G03).

C’est pourquoi dans le post processeur, j’ai ajouté une instruction

<ArcOutput>ConvertToLines</ArcOutput>, qui transforme les arcs en une suite de segments.

Les sources sont ici : https://github.com/toxnico/CNC-Backlash-Compensator

L’exécutable est dispo ici

2 pensées sur “Compensation du jeu dans le G-Code (backlash compensation)”

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Es-tu capable de répondre à ça? * Time limit is exhausted. Please reload the CAPTCHA.