Drawbot 🤖

12/2021 Ce robot dessine sur une feuille de papier à l'aide d'un crayon déplacé via de 2 courroies entraînées par 2 moteurs pas à pas. Les traits sont dessinés comme nous le faisons à la main. Un mini servo permet de lever le crayon lorsqu'il faut passer d'une ligne à une autre.


Ce système positionne le crayon à l’aide d’un système de double triangulation : le robot connaît la distance séparant les moteurs, la longueurs des courroies ainsi que le déplacement de la courroie lorsqu'un tour de moteur est fait. En conséquence avec quelques équations mathématiques, hors de ma portée :S, le positionnement du stylo est calculable.


Pour réaliser ce joujou, j'ai imprimé de nombreuses pièces, utilisé des composants d'imprimante 3D comme des moteurs, carte électronique et installé le tout sur une grande planche en bois.

Drawbot

Pour commencer, la carte électronique de pilotage des moteurs est un clone chinois d'une Ramp 1.4 dont le design est libre et open source. Elle est fréquemment utilisée dans les imprimantes 3D DIY : basée sur un Arduino Mega 256 et surmontée d'un shield, elle est capable de piloter 5 moteurs pas à pas, un lit chauffant, 2 buses, des capteurs de fin de courses et pleins de GPIOs…

Arduino Mega 256   Ramp 1.4

Pour piloter ces moteurs, il faut des “drivers” installés sur le shield de l'Arduino. Ces composants transforment les ordres de commandes sortant de l'Arduino en signaux de puissance vers les moteurs. Il existe de nombreux modèles sur le marché, j'ai choisi des modèles basiques : DRV8825. Ils coûtent quelques euros pièces et gèrent les microsteps pour effectuer des rotations plus fines que le pas de base du moteur.

Driver DRV8825

Ils s'insèrent dans les connecteurs femelles du shield, il y autant de driver que de moteurs à piloter, donc 2.

Makelangelo, le programme que j'utilise pour faire dessiner le robot, préconise de mettre des capteurs de fin de course pour faciliter le positionnement de la position initiale du stylo. Je reviendrais plus tard sur la partie logicielle. Ceux ci sont utilisés pour déterminer la position la plus basse du stylo, c'est à dire, les valeurs maximales de X et Y. A noter la différence avec les imprimantes 3D où ce sont les valeurs minimums qui sont recherchées lors de la phase d'initialisation.

Le modèle de capteur que j'ai utilisé est largement utilisé dans les imprimantes 3D et est libre et open source. Une caractéristique intéressante de ce design est la présence d'une LED qui s'allume lorsque le contact est appuyé : c'est très pratique pour vérifier leur bon fonctionnement. Ils sont de type Normaly Closed, c'est à dire fermé lorsque l'interrupteur n'est pas

Capteur de fin de course

Les endstops sont montés sur les pins X-MAX et Y-MAX de la RAMPS, voir la doc pour plus de détails.

L'alimentation électrique de l'ensemble est réalisée avec un adaptateur secteur de 12V, 1A.

Lors de la connexion en USB, il faut d'abord connecter le câble USB puis l'adaptateur secteur. Dans le cas contraire, macOS ne reconnaît pas l'Arduino.

2 moteurs pas à pas entrainent des courroies pour déplacer le crayon sur la feuille de dessin.

Les moteurs sont des modèles NEMA 17, avec un pas de 1.8° :

Moteur pas à pas Nema 17

Ils entrainent des courroies crantées de type GT2 :

Courroie GT2

Des poulies à 20 dents sont montées sur les axes des moteurs pour déplacer sans glissement les courroies :

Poulie crantée

La fixation des moteurs est composée d'un support pour les butées de fin de course que j'ai dessiné et d'un bloc se vissant sur la planche dans les coins supérieurs droit et gauche. Les moteurs chauffent un peu lorsque le robot dessine mais la chaleur dégagée n'est pas très importante et sur une courte période, le choix du PLA pour imprimer ces pièces est suffisant.

Support de moteur Nema 17

Sur la photo ci dessous, les pièces suivantes sont visibles :

  • bleu : courroie crantée GT2
  • jaune : plaque de support de la butée de fin de course
  • vert : support du moteur vissé sur la planche
  • violet : moteur Nema 17

Zoom sur le support de moteur Nema 17

Le support de butée ne sont pas symétriques, le support de gauche est plus étroit que le droit :

Support de butée gauche et droit

La pièce liant le stylo aux courroies s'appelle la gondole. Je l'ai imprimée en 3D à partir de ce modèle.

Vue de dessus de la gondole

 

Vue de profil de la gondole

 

Le stylo ou crayon est bloqué à l'aide d'une petite vis se trouvant en dessous du trou du stylo. Ce dernier est de taille importante pour accueillir n'importe quel type de crayon. Idéal pour différents types de dessins 8-).

La dernière pièce électronique est un servo miniature qui permet de lever et baisser le crayon contre la feuille de papier à l'aide d'une petite pièce en plastique appelé doigt. Elle est composée d'un moteur qui asservit un position : un ordre électrique lui indique de quel angle il doit tourner et il appliquera un effort pour garder cette position si elle venait à bouger. Ce moteur ne tourne pas en continu contrairement à ce que nous avons l'habitude de voir. Cette pièce est extrêmement utilisée en modélisme pour piloter la direction d'une voiture ou un gouvernail de bateau.

Mini servo

A chaque changement de crayon, il faut réajuster l'enfoncement de la mine du stylo. En effet, si celle ci (le triangle vert sur la photo ci dessous) est trop avancée, le doigt du servo (en magenta ci dessous) ne sera pas suffisamment long pour la soulever de la feuille, si elle est trop reculée, elle ne touchera pas la surface à dessiner.

profil de la gondole

La vis de serrage du stylo est entourée en rouge sur la photo ci-dessus.

Afin que les poulies ne patinent pas en entrainant les courroies, des contrepoids sont installés sur la gondole ainsi qu'au bout des courroies. Ceux-ci sont réalisés avec des piles LR20 (les très grosses piles rondes) installées dans des supports imprimés en 3D. Un disque rond est fixé à la base de la courroie afin d'appuyer sur la lame du capteur de fin de course lorsque le robot recherche sa position initiale.

J'ai modifié et dessiné quelque pièces pour adapter le support initial à une courroie crantée et à la butée de fin de course.

Contre poids de courroies

L'assemblage des pièces imprimées est le suivant. Une vis M3 permet de fixer le support de pile, la bague de butée et la fixation de courroie.

assemblage des pièces imprimées   pièces du contrepoids

L'ensemble est fixé sur une planche d'aggloméré mesurant 47,5×68.5 cm. La surface à dessiner est une feuille A4, donc 21×29.7cm.

L'Arduino seul ne sait pas dessiner, il faut utiliser un logiciel sur un ordinateur pour transformer les svg ou images en ordre de déplacement pour le micro-contrôleur.

Plusieurs solutions logicielles existent, j'ai testé dans un premier temps polargraphcontroller avec le firmware associé : l'interface est très riche mais fouillis et difficile à prendre en main. Les dessins sont longs à réaliser car l'ordinateur attend la fin de chaque mouvement de la tête pour indiquer le suivant ce qui produit des déplacements saccadés ainsi qu'un temps de dessin long.

Puis je me suis interressé à Makelangelo-software qui présente une interface plus simple et s'appuie sur le firmware Marlin utilisé dans les imprimantes 3D : les déplacements sont beaucoup plus fluides et rapides car les ordres sont notamment envoyés à l'avance ce qui permet au micro controleur d'optimiser les vitesses des moteurs, leurs accélérations etc… la littérature sur le sujet est très intérressante !

Makelangelo-software

La compilation de Marlin est un peu plus compliquée que pour polargraphcontroller mais offre une configurabilité bien supérieure. L'auteur de Makelangelo-software décrit sur son site comment paramétrer Marlin pour un robot dessinateur. Plutôt que de paraphraser son article, je vais décrire mon paramétrage en fonction des dimensions de mon robot. Pour commencer, le type de carte Reprap utilisé se déclare avec :

#define MOTHERBOARD BOARD_RAMPS_14_EFB

Les drivers utilisés pour les moteurs sont de type DRV8825, valoriser alors le bloc suivant :

#define X_DRIVER_TYPE  DRV8825
#define Y_DRIVER_TYPE  DRV8825
#define Z_DRIVER_TYPE  DRV8825

Les endstops sont de type NC, le paramétrage est le suivant :

#define X_MAX_ENDSTOP_INVERTING true
#define Y_MAX_ENDSTOP_INVERTING true

J'ai diminué la vitesse et l'accélération par défaut car les contrepoids ne sont pas suffisement lourds pour éviter que la courroie ne saute lors des changements d'allure :

#define DEFAULT_AXIS_STEPS_PER_UNIT   { 160, 160, 160 }
#define DEFAULT_MAX_FEEDRATE          { 200, 200, 200 }
#define DEFAULT_MAX_ACCELERATION      { 300, 300, 300 }
#define DEFAULT_ACCELERATION          300
#define DEFAULT_RETRACT_ACCELERATION  3000
#define DEFAULT_TRAVEL_ACCELERATION   300

La partie la plus compliquée est le paramétrage de la taille du “plateau” en définissant la largeur, hauteur du plateau ainsi que la longueur des courroies :

  • X_BED_SIZE : distance entre les 2 axes des moteurs, en vert sur la photo ci contre ⇒ 355 mm sur mon installation;
  • Y_BED_SIZE : mesure entre l'axe du moteur et le haut de la gondole dans la position la plus basse, il faut prendre en compte la taille du contre poids de la gondole, en violet ⇒ 510 mm;
  • POLARGRAPH_MAX_BELT_LEN : longueur de la courroie entre la poulie et le crayon, en orange ⇒ 450 mm

J'ai essayé plusieurs dimensions avant de réussir à faire un trait droit et un rond rond, cette FAQ m'a permis de régler ma machine.

Dimensions

Voici les valeurs finales que j'ai :

#define POLARGRAPH_MAX_BELT_LEN 450
#define X_BED_SIZE 328
#define Y_BED_SIZE 500

#define X_MIN_POS ( - (X_BED_SIZE/2) )
#define Y_MIN_POS ( - (Y_BED_SIZE/2) )
#define X_MAX_POS ( X_BED_SIZE/2 )
#define Y_MAX_POS ( Y_BED_SIZE/2 )

#define MANUAL_X_HOME_POS 0
#define MANUAL_Y_HOME_POS -169

la valeur de MANUAL_Y_HOME_POS se calcule avec la formule suivante : Y_MAX_POS - ( sqrt(POLARGRAPH_MAX_BELT_LEN^2-(X_BED_SIZE/2)^2 ) )

Dans Makelangelo-software, il faut configurer la taille de la feuille de papier A4 avec une marge de 10% :

Makelangelo-software A4

Maintenant que tout est configuré, les dessins peuvent commencer !

Charger dans Makelangelo un SVG pour le dessiner tel quel ou ouvrir une image pour appliquer dessus différents filtres et lancer l'impression.

Boxxy   Random