Produire un circuit imprimé avec des zones de Voronoï

Je voulais faire un circuit imprimé pour le CoreXY, pour pouvoir ranger mon petit bazar dans un boitier propre et libérer ma plaque d’essais.

Le truc, c’est que ma fraiseuse CNC souffre d’imprécision… Et comme je dois tracer des pistes et pastilles pour les Pololu (connecteurs espacés de 2.54mm), j’ai un peu peur du résultat…

Et je n’ai toujours pas envie d’utiliser des produits chimiques.

Alors j’ai investigué et j’ai trouvé une technique redoutable de production de PCB, qui devrait être capable de compenser l’imprécision de la machine : les diagrammes de Voronoï.

L’idée est, plutôt que de tracer les contours précis de chaque piste et pastille, d’aller « au plus large », et isoler uniquement les zones nécessaires. Un dessin vaut mieux qu’une longue histoire:

voronoi pcb
Le circuit à graver

Les lignes fines qu’on voit entre les pistes sont celles qui vont être fraisées. Après tout, on n’a pas besoin de faire le tour de toutes les pistes avec précision pour les isoler les unes des autres.

1. Conception du circuit

J’ai tout d’abord conçu mon petit montage avec Fritzing.fritzingJ’y ai mis mes deux pololu, des connecteurs pour les moteurs, les alimentations et le signal.

On bascule en mode « circuit imprimé », simple couche. Avec l’autoroutage (ou pas… mon circuit était autorouté d’une façon très bizarre), on met en place les pistes de cuivre.

fritzing-pcb
Je n’ai pas pu éviter un jumper…

2. Export au format Gerber

Depuis le menu fichier>exporter pour la production>gerber étendu, nous pouvons exporter le circuit imprimé au format Gerber. On obtient un répertoire avec une tapée de fichiers, dont deux nous intéressent particulièrement : pcb_corexy_copperBottom.gbl et pcb_corexy_drill.txt.

Le premier contient les traces du circuit imprimé, et le second les coordonnées des trous à percer (en pouces… sympa les gars).

3. Traitement du fichier Gerber avec Visolate

Traumflug, un membre très actif de la communauté Reprap et coauteur de Teacup, a écrit un programme en java qui permet de générer des zones de Voronoi à partir d’un fichier Gerber.

Après avoir téléchargé Visolate, ouvrons notre fichier gbl.

visolate-1

Les pistes et les pastilles apparaissent, avec des couleurs j’te dis même pas. Bariolées. Chaque couleur correspondra à une zone de Voronoi. La première étape est donc de réunir ce qui doit être réuni, avec le bouton « fix topology ». Avant de cliquer, il faut zoomer un peu avec le slider « dpi ». Le programme va scanner le circuit et réunir les zones de notre circuit imprimé.

visolate-2Cool! Maintenant, cliquons sur « make toolpaths »: Visolate génère les parcours d’outil pour fraiser les zones de Voronoi. Il n’y a plus qu’à enregistrer le fichier avec « save G-Code » et on est paré. Enfin presque.

visolate-3

4. Génération du G-Code de perçage

Comme je le disais au-dessus, Fritzing génère les coordonnées des perçages en pouces. Il faut faire la conversion en mm. Ou basculer la machine en mode pouces. J’ai opté pour la conversion en mm.

Le fichier des perçages a cette allure:

[code]

; NON-PLATED HOLES START AT T1 ; THROUGH (PLATED) HOLES START AT T100 M48 INCH T100C0.038000 T101C0.041667 T102C0.035000 % T100 X015681Y004991 X017681Y012991 X015681Y014991 X017681Y009991 X015681Y005991 X017681Y013991 X015681Y015991

etc.

[/code]

J’ai fait un programme qui convertit cette suite de coordonnées en G-Code, et en millimètres s’il vous plait : GerberDrill.

Désolé pour l’interface utilisateur toute pourrie… Le principe est simple: parcourir pour aller chercher le fichier drill.txt, définir le code à générer pour chaque trou et cliquer sur « Process drill file ». Le programme génère du G-Code pour se rendre à l’emplacement du trou, et percer à la profondeur indiquée.

5. Concaténation des deux fichiers G-Code et miroir

Je voulais tout faire d’une traite, c’est à dire fraiser les zones de Voronoi et marquer les points de perçage (puis percer à la main avec une mèche de 1mm avec la Dremel).

Donc dans un fichier texte, j’ai mis à la suite le G-Code généré par Visolate et celui généré par mon programme GerberDrill.

Etape importante : il faut mettre un effet miroir sur le G-Code, car la gravure va se faire sur la face inférieur du circuit. Pour cela, dans le fichier G-Code, remplacer tous les « X » par « X-« .

On enregistre le fichier et zou! balance la purée papa!

Le jeu de ma machine se remarque particulièrement au niveau des points de perçage, lorsqu’ils sont près d’une trace. J’ai dû les arranger à la cochon en en élargissant quelques uns… Hélas je n’ai pas pris de photo de la plaque juste après la gravure, mais voici la vue de dessous une fois les éléments soudés:

Désolé pour les soudures dégueulasses...
Désolé pour les soudures dégueulasses…

La prochaine fois je pense que je marquerai les perçages avant de faire les isolations. En tout cas j’ai bien contrôlé au multimètre et ça a l’air bon.

PCB CoreXY
Les connecteurs soudés
PCB CoreXY avec drivers
Les pololu montés

On peut voir à gauche les connecteurs pour les signaux step et direction. A droite les deux connecteurs de moteurs, et les deux connecteurs d’alimentation (5V en haut pour la logique, et 12V en bas pour les moteurs).

Il n’y a plus qu’à connecter la carte, mettre le jus et en avant!

Gravure d’une image au laser

Bon, j’ai corrigé l’inversion de l’axe Y 🙂

Après une longue, très longue réflexion, j’ai réussi me décider sur une photo à graver pour tester les niveaux de gris:

Charlotte Gainsbourg
La belle Charlotte

 

Après une heure de bzzzzzz bzzzzz bzzzz,  voici le résultat:

Charlotte
Pas très constrasté… 80mm de large. Et de vilaines lignes horizontales… Impulsions de 80ms

Le résultat, malgré une résolution de 4 points par mm, n’est pas sublime.

J’ai modifié mon programme pour tracer des lignes à 45°. Après tout, c’est le mouvement « natif » de la machine: pour avancer à 45°, on n’a qu’un moteur à tourner. Le 2ème effectue seulement les décalages.

Charlotte
L’image fait 50mm de large. Résolution de 4 points par mm. Cliquer sur la molette pour l’image en haute résolution. Impulsions de 120ms.

C’est vachement plus joli et contrasté! Je réessaierai à 100ms pour voir si on distingue mieux les nuances.

Et quelques plans de la bête en activité:

_IMG_0456_1024x682

Les vis d’entrainement avaient tendance à se barrer, alors j’ai ajouté cette pièce, qui permet de les maintenir sur l’axe des moteurs:

capot entrainement

 

Support laser
Un support un peu moins artisanal pour le module laser

 

Faisceau laser
Envie d’y mettre un doigt?

 

L’instant sécurité de tonton Nico

class4Le laser utilisé est une diode laser de longueur d’onde 445nm et de 1.5W. C’est un laser de classe 4, et selon Wikipedia:

Classe 4 : lasers qui sont aussi capables de produire des réflexions diffuses dangereuses. Ils peuvent causer des dommages sur la peau et peuvent également constituer un danger d’incendie. Leur utilisation requiert des précautions extrêmes.

Alors lunettes de protection et surveillance sont de mise!

Première gravure au laser avec le CoreXY

D’abord, les faits :

Jack Daniels gravé au laser
100x67mm

 

Alors je vous vois venir : « Ouiiii m’enfin dis donc, ton étiquette de Jack, elle serait pas à l’envers des fois? »

La réponse est oui…

J’ai écrit un programme qui transforme une image bitmap en instructions G-Code de mouvement et de shoot au laser. Et comme les coordonnées Y sont inversées entre une image numérique (du haut vers le bas) et la machine, ben ça a retourné l’image.

Mais à vrai dire, ce n’est pas le sujet 🙂

Ce que je vois, c’est que la machine a shooté plus de 10’000 points en une trentaine de minutes, et ça, ça fait plaisir!

Voici l’image en haute résolution (cliquez avec la molette de la souris pour l’ouvrir, sinon elle s’ouvre en mode galerie… Je ne sais pas comment le désactiver :). C’est intéressant de voir que les points du laser son en fait des traits, et on y voit aussi la variation de puissance sur les bords des lettres.

La résolution est de 2 points par mm, soit 50 dpi.

On voit quelques lignes qui ont un léger décalage, mais je suis plutôt content du résultat.

jack
L’image d’origine : 135×200 pixels

 

Si vous êtes curieux, voici le G-Code généré par le programme à partir de l’image ci-dessus.

A part ça, j’ai arrangé un peu mes points d’attache de ficelle sur le chariot. C’est maintenant parallèle aux barres, ça va mieux!

Chariot CoreXY Chariot CoreXY

Des barres, des roulements, des poulies et des ficelles : le Core XY avance

« Prendre des p’tits bouts d’truc et puis les assembler ensemble… »

J’ai enfin monté tout mon petit bazar, et voici l’histoire du Core(X,Y) fishing line édition! Enfin plutôt « butcher line » parce que c’est de la ficelle de boucher.

Core(X,Y) vue de dessus

En bougeant les moteurs à la main, tout a l’air bon, alors j’attaque l’électronique.

Au départ, je voulais utiliser grbl sur mon arduino uno, mais hélas il ne gère pas nativement le CoreXY. Alors j’ai opté pour Teacup, qui le gère et qui propose des sorties PWM (qui vont me permettre de contrôler la puissance de mon laser).

Les Pololu

Bon j’avoue, j’en ai un peu chié avec ces pololu. Au premier essai, j’ai consulté ce schéma, et j’ai laissé flottantes les broches ENABLE, MS1, MS2 et MS3. Mauvaise idée.

Pololu A4988 (https://www.pololu.com/product/1182)
Câblage du Pololu A4988 (https://www.pololu.com/product/1182)

Je vais vous donner la solution directement, c’est plus pratique:

  • ENABLE -> 0V de l’arduino
  • MS1, MS2, MS3 : leur combinaison donne la valeur du microstepping (voir lien au dessus)
  • RESET et SLEEP : les raccorder ensemble
  • DIR et STEP -> sur l’arduino (j’y reviendrai)
  • VDD : +5V de l’arduino
  • GND (celui du bas) : 0V de l’arduino
  • VMOT : +12V de l’alimentation de puissance (alimentation de PC dans mon cas)
  • GND (celui du haut) : 0V de l’alimentation de puissance
Joyeux bordel : arduino uno et pololu
Joyeux bordel : arduino uno et pololu

Teacup

Alors Teacup, c’est d’abord un poil de configuration. Il faut avant tout renommer l’un des modèles de fichiers de config en config.h. Dans mon cas, je n’ai pas de ramps, ni de gen7, ni quoi que ce soit : juste une arduino et deux pololu A4988 pour piloter mes deux moteurs. Je copie donc le config.default.h en config.h.

Pour que ça compile, il faut aussi renommer ThermistorTable.single.h en ThermistorTable.h. On n’utilisera pas de thermistance (enfin pour l’instant… hé hé) donc on s’en fout.

Dans le config.h, il y a un paramètre pour indiquer qu’on utilise une mécanique CoreXY:

[code]

define KINEMATICS KINEMATICS_COREXY

[/code]

Zoom sur l'entrainement
Zoom sur l’entrainement

Après, il faut calculer le nombre de pas par mètre (comme je suis gentil je vous ai fait un calculateur sur une page web), et indiquer les vitesses maximales; là, on peut y aller franco:

[code]

define    MAXIMUM_FEEDRATE_X        20000

define    MAXIMUM_FEEDRATE_Y        20000

define ACCELERATION 2500.

[/code]

Après avoir configuré Teacup, premier test avec les connexions par défaut:

Moteur A AIO0 : X_STEP_PIN (broche STEP du Pololu A) AIO1 : X_DIR_PIN (broche DIR du Pololu A)

Moteur B AIO3 : Y_STEP_PIN (broche STEP du Pololu B) AIO4 : Y_DIR_PIN (broche DIR du Pololu B)

Surprise : seul le moteur B tourne. Bon…

Je modifie les sorties du moteur A dans la config de Teacup (qui deviennent respectivement DIO2 et DIO3) et les deux moteurs tournent. Youpi!

Petit test de mouvement X et Y avec Repetier-host, et je constate que le X+ et X- sont bien, mais Y+ et Y- sont inversés.

J’intervertis les deux moteurs : Moteur A sur les pins Y, et moteur B sur les pins X. Ça marche!

Trop bien 🙂

Vue d'ensemble
Vue d’ensemble

Vitesse

Maintenant, petit test de vitesse et d’accélération en envoyant des commandes G-Code en direct.

Vitesse : 20’000 mm/min (soit 333 mm/s)

Accélération : 2’500 mm/s²

J’aime autant vous dire que ça envoie le pâté, comparé à ma CNC qui monte poussivement à 3 ou 3.5mm/s !

Débattement

  • Y : 300mm
  • X : 250mm, que je vais pouvoir augmenter en arrangeant mes attaches de ficelle.
Le chariot et ses attaches à la one again
Le chariot et ses attaches à la one again

Conclusion

Il me reste donc à arranger mon chariot pour que les fixations des ficelles soient à la même hauteur que les poulies.

Ensuite, faire un support pour le module laser, et contrôler la précision et la répétabilité selon la vitesse.

Enfin, réfléchir à un plateau Z et un support de moteur qui me permettrait de graver des circuits imprimés.

Et ajouter deux endstops pour la mise à zéro, ce ne serait pas un luxe.

Je viens de réaliser que contrairement à grbl et Marlin, Teacup ne supporte pas les arcs (G2 et G3). Dommage…

Première vision du Core(X,Y) : pièces imprimées

Voici les premières pièces!

Les roulements sont emboités en force dans les poulies. Diamètre du roulement : 22mm, diamètre intérieur de la poulie : 22.10mm. Ça rentre sans trop forcer et ça tient correctement.

Sur le moteur, la pièce est imprimée avec des couches de 0.15mm, pour avoir un filet bien propre. J’imprime les autres pièces à 0.28mm.

Poulies montées sur des 608ZZ
Poulies montées sur des 608ZZ

 

La tranche d'une poulie
La tranche d’une poulie

 

Une poulie sur un axe de 8mm
Une poulie sur un axe de 8mm

 

Le sandwich de guidage Y
Le sandwich de guidage Y

 

La vis pour l'entrainement, montée sur le moteur
La vis pour l’entrainement, montée sur le moteur

Plateau Core(X,Y)

J’ai toujours dans l’idée de diminuer au maximum le jeu sur ma machine CNC…

Le système CoreXY m’a semblé super intéressant (vitesse et précision) et relativement simple à mettre en œuvre, avec du contreplaqué et des pièces imprimées (bon ben, comme d’hab finalement!)

J’ai modélisé le bazar en fonction de ce que j’ai sous la main (à savoir notamment des roulements 608zz et LM8UU. Je vais partir là dessus pour les poulies et le guidage.

Je compte utiliser du fil pour l’entrainement, plutôt que des courroies (question de budget). J’essaierai déjà avec de la ficelle toute bête, et on verra comment ça se passe!

Il me reste la pièce du moteur, qui devrait ressembler à ça.

 

Vue de dessus
Vue de dessus
Vue en perspective
Vue en perspective
Détail de la jonction XY
Détail de la jonction XY
Une poulie montée sur un 608ZZ
Une poulie montée sur un 608ZZ

Ça promet! Je pourrai monter le laser là-dessus, ou bien un petit moteur DC équipé d’un mandrin pour graver des PCB avec une meilleure précision (note à moi-même : prévoir un axe Z pour ça…)