Fabrication de circuits imprimés avec une CNC

De fablab
Aller à : navigation, rechercher

Introduction

Objectif

Notre projet consistait à modifier une fraiseuse à commande numérique pour lui permettre de fabriquer des circuits électroniques. Nous avons essayé d'implémenter au mieux un certain nombre de fonctionnalités, et, lorsque nous nous rendions compte que notre CNC ne nous permettrait pas d'obtenir un résultat satisfaisant, nous avons essayé d'en tirer un maximum d'enseignements, afin d'être capable à terme de concevoir une CNC mieux adaptée.

3 étapes sont nécessaires pour fabriquer un circuit électronique avec une CNC :

  1. Fraiser les pistes conductrices sur une plaque d'epoxy cuivrée
  2. Déposer de la pâte à souder au niveau des connecteurs (pins) des composants électroniques
  3. Placer les composants sur le circuit, par dessus la pâte à souder

Il faut ensuite faire chauffer le circuit dans un four à refusion pour que la soudure se fasse.

Contexte

Térence travaillait depuis l'été dernier sur cette CNC, et a proposé ce projet Fablab pour ne pas être tout seul pour étendre ses fonctionnalités de simple fraiseuse à une machine PNP complète.

Etudiant-entrepreneur au Pépite OZER, le but originel était de fabriquer des tables lumineuses connectées, constituées d'une matrice de LEDs et d'émetteurs/récepteurs infrarouge : le plateau de la table n'est donc rien de plus qu'un grand circuit imprimé, de 60x60cm dans ce cas.

Table led.png

En sous-traitant sur internet, il est impossible de faire des circuits plus grands qu'une feuille A4 (et pour un prix exorbitant), utiliser notre CNC, qui dispose d'une surface utile d'environ 1m par 1m permet de passer outre ce problème. Cela permet aussi de prototyper un circuit électronique rapidement, alors qu'il faut plusieurs semaines pour commander un PCB avec les composants soudés dessus.

Etat de l'Art

Térence a aussi utilisé ce projet dans le cadre du Projet Start-Up à l'ENSIMAG : le but était de voir s'il était envisageable de vendre des CNC spécialisées dans le PNP et le dépôt de pâte à souder à des fablab, start-up, PME, etc. spécialisées dans l'électronique pour répondre à leurs besoins en prototypage. Cela a été l'occasion d'étudier les différentes solutions existantes actuellement pour la fabrication d'un circuit imprimé.

Cncs.png

En effet, il n'existe actuellement que des machines PNP de très grosses capacités, à destination d'usines ayant besoin de produire énormément de circuits (identiques). La seule alternative possible est la sous-traitance, chère et longue, ou l'assemblage manuel, rébarbatif et peu précis. Une CNC plus compacte, moins rapide mais plus simple à configurer, permettrait à de nombreuses entreprises d'accélérer leur développement en prototypant plus rapidement et en leur permettant de produire eux-même des petites séries de leurs circuits.

Equipe

Notre équipe est composée de trois membres :

Suivi & gestion de projet

L'avancement du projet au fur et à mesure des suivis, ainsi qu'un bilan post-mortem sont disponibles sur cette page.

Résultats

Objectifs initiaux

  1. Fraisage des pistes : abandonné
    Nous avons trouvé un outil open source pour "détourer" les pistes d'un circuit à partir d'un fichier Gerber, et qui générait directement le gcode nécessaire au fraisage sur plaque de cuivre. Nous avons néanmoins assez vite renoncé, en partie à cause d'un défaut sur l'axe Z de la CNC, qui donnait du jeu à la fraiseuse et limitait la précision, indispensable dans ce cas, mais surtout car même avec une CNC professionnelle "parfaite", il est impossible d'obtenir la précision nécessaire à certains types de composants CMS. Les composants les plus fins ont des pistes séparées de moins d'un dixième de millimètre, il est donc utopique d'espérer fraiser aussi précisément, et plutôt que de nous limiter aux composants CMS les plus larges, nous avons choisi de nous concentrer sur le Pick & Place et le dépôt de pâte à souder.
  2. Pick & Place (PNP) :
    1. PNP des composants en grille : implémenté à 100%
    2. PNP des composants en rouleaux : implémenté en partie
      Le gcode gère les reel feeders (rouleaux), de même que notre GrblExtended, mais nous n'avons pas pu fabriquer de prototype de feeder fonctionnel.
  3. Dépôt de pâte à souder : implémenté en partie
    Bien que notre interface utilisateur ne permette pas encore d'utiliser cette fonctionnalité efficacement, notre CNC se déplace et dépose la pâte à souder sous les pins des composants. Il se trouve que notre pâte à souder était périmée (un an au lieu de 6 mois, et pas toujours stockée dans un frigo), ce qui fait que la pâte n'adhérait pas au circuit. Nous considérons tout de même que cet objectif est globalement validé, car la génération de gcode et l'asservissement du compresseur sont 100% fonctionnels.

Objectifs supplémentaires

Nous nous sommes rajoutés un certain nombre d'objectifs supplémentaires, au fur et à mesure de l'avancement du projet. Certains objectifs ne consistaient qu'à valider la faisabilité technique d'une nouvelle fonctionnalité, le but n'était pas toujours de l'implémenter sur notre CNC.

  1. Interface utilisateur personnalisée : implémenté à 100% pour le PnP, en partie pour le dépôt de pâte à souder
    Nous pensions initialement utiliser OpenPnP, un outil Open-Source pour contrôler les CNC PnP. Néanmoins ce logiciel gère mal le dépôt de pâte à souder (ce n'est pas vraiment son but), et est assez peu adapté à GRBL (bien qu'au final notre GrblExtended est parfaitement compatible avec OpenPnP), et comme notre projet manquait d'informatique pure, nous avons choisi de développer notre propre application, dédiée à notre CNC. La gestion de la pâte à souder est fonctionnelle seulement en partie, mais la partie PNP fonctionne parfaitement.
  2. Bottom Vision : implémenté à 100%

Nous avons décidé de faire du traitement d'image, combiné à un peu d'IA, pour détecter l'absence ou la présence d'un composant sous la pompe, ainsi que sa position exacte et son orientation. Nous n'avons pas trouvé de bon outils permettant de faire couvrir fonctionnalité. Nous avons donc décidé de le faire nous même avec openCV. Le but était uniquement de voir si c'était faisable, et nous avons montré que oui, mais le programme n'a pas été implémenté dans notre interface, ce qui fait qu'il ne fonctionne qu'avec des photos statiques (prises néanmoins en conditions réelles).

L'ensemble du code écrit est disponible ici pour une semaine.

Description détaillée

CNC

Cnc1.jpg Cnc4.jpg Cnc5.jpg Cnc2.jpg Cnc3.jpg Elec1.JPG

Fonctionnalités

  • Surface utile : 950 x 900 x 250 mm
  • Précision : ~0.05mm (possibilité d'augmenter la précision en baissant la vitesse maximale)
  • Homing automatique sur les axes X et Y
  • Contrôle des pompes/compresseur avec relais et électrovannes

Architecture & choix techniques

  • Structure en aluminium, acier et plexiglas. Plateau en pin, plan de travail en MDF
  • Axes X et Y sur galets à rainure en U et courroies 15mm avec âme en fibre de verre ; axe Z avec blocs linéaires et vis à bille
  • Moteurs Nema 23
  • Alimentations 600 + 500W ; bouton d'arrêt d'urgence et disjoncteur intégré
  • Pompe (capacité inconnue mais suffisante même pour les plus gros composants)
  • Compresseur 7 bars

Cnc.png

Difficultés, erreurs, conseils

  • Manque d'un homing automatique en Z
  • Poser le circuit sur un plateau à ressort, ou utiliser un stylo-pompe de type Juki pour éviter tous les problèmes liés à l'axe Z (surfaçage, adhérence de la pâte, etc.)
  • Essayer d'utiliser toujours les même tensions de fonctionnement (nous avions besoin d'alimentations 36V, 12V et 5V)
  • Beaucoup de soucis avec le compresseur : ampérage insuffisant, pression trop faible ou trop forte, etc.
  • Beaucoup de soucis de bruits électromagnétique, et utiliser des câbles blindés ne suffit pas toujours, il faut bien séparer les différents GND et éloigner le plus possible les câbles avec des tensions différentes

Améliorations possibles

  • Remplacer les arbres X et Y par de guides linéaires pour diminuer le jeu
  • Surfacer correctement le martyr pour avoir un plan de travail parfaitement plat

GrblExtended

Elec2.JPG

Fonctionnalités

  • Contrôle de 11 relais et 8 feeders
  • Permet de retourner des messages pour suivre au plus prêt l'avancée d'un job

Architecture & choix techniques

L'ordinateur communique par USB (Serial) avec l'Arduino Mega. Lorsque ce dernier recoit un gcode standard, il transmet à l'Arduino Uno, sur lequel tourne la version standard de Grbl. Si au contraire il s'agit d'un gcode spécial, c'est le Mega qui s'occupe de commander les sorties correspondantes.

GrblExtended.png

Les mcode supplémentaires sont :

  • M100 -> M121 : relay on/ff
  • M200 component : send back <done:component>
  • M300 pitch -> M307 pitch : advance feeder depending on pitch

Difficultés, erreurs, conseils

  • Nous avons grillé deux Arduino en branchant mal les pins RX et TX et en envoyant en même temps un nouveau programme sur l'un des microcontrôleurs
  • Clone chinois dont le silkscreen ne correspond pas aux vrais sorties (pins RX et TX inversés)
  • Toujours ajouter un délai après un gcode qui implique le contrôle d'un relai (bruit électromagnétique qui reset Grbl)

Améliorations possibles

Ajout de nouveaux mcodes de types M2xx pour retourner différents types de message (composant posé, job terminé, etc.)

PnpTerminator

App job.png App feeders.png App console.png

Fonctionnalités

  • Connexion automatique à la CNC (pas besoin de spécifier le port COM)
  • Contrôle manuel de la CNC (déplacements, homing, pick/place, dispense paste, etc.)
  • Console, log des commandes envoyées/reçues, affichage de l'état de la machine (position, statut, etc.)
  • Visualisation des flux des deux caméras (Top Vision & Bottom Vision)
  • Ouverture d'un fichier de Pick & Place :
    • Support des logiciels Eagle (exports mount-smd et mount), Kicad (csv et ascii)
    • Un fichier de configuration formats.xml permets d'ajouter de nouveaux formats facilement et sans recompiler
  • Visualisation en direct de l'état d'un job :
    • Vérifie la présence des composants dans les feeders
    • Indique les composants placés et la progression globale du job
  • Ouverture d'un fichier Gerber : permet de lancer l'étape du dépôt de pâte à souder
  • Configuration des feeders (voir la spécification) :
    • ReelFeeder : feeders de types rouleaux, avec un seul type de composant
    • TrayFeeder : composants divers alignés sur une grille
    • Indique les références des composants manquants pour lancer les jobs en attente
    • Possibilité d'importer/exporter un feeder


Architecture & choix techniques

  • Langage Java
  • Interface JSwing
  • Librairies JSSC et SLF4J (communications Serial) et Webcam-Capture (caméras)
  • Design Patterns :
    • MVC simplifié (séparation complète des Views et des Controlers)
    • Observer : listeners entre Views et Controlers et entre différents Controlers

Difficultés, erreurs, conseils

  • Faire une interface User-Friendly est très rébarbatif
  • Mais pas de soucis dans l'ensemble, nous avons réussi à faire un programme de 4000 lignes propre et clair

Améliorations possibles

  • Ajout d'une GUI pour le dépôt de pâte à souder (suivi de l'avancement, etc.)

Parser Gerber

Output gerber.png

Fonctionnalités

  • Conversion gerber vers png
  • Retourne les positions où déposer la pâte à souder

Architecture & choix techniques

  • Langage Java
  • Sous-ensemble de la norme Gerber RS-274-D : pins de forme rectangulaire seulement

Difficultés, erreurs, conseils

  • Long et peu intéressant
  • Difficile de tester tous les cas possibles sans avoir une grande bibliothèque de fichiers gerber à tester
  • Impossible d'utiliser un parser open source existant digne de ce nom (très mal codé, incompatible avec Windows, etc.)

Améliorations possibles

  • Subdivision des zones de taille importante en petites sous-zone / quantité de pâte à souder à déposer relative à la surface de la zone
  • Extension du sous-ensemble que l'on parse

Bottom Vision

CannyCircleVide.png PetitComp.png GrosComp.png

Fonctionnalités

  • Détection d'absence/présence d'un composant sous la pompe
  • Calcul de la position exacte du composant
  • Calcul de le l'orientation du composant (à plus ou mois 90/180°)


Architecture & choix techniques

Difficultés, erreurs, conseils

  • Il a fallu un certain temps avant d'obtenir des résultats probants mais notre ressenti final est positif
  • Prendre les photos dans les meilleurs conditions possibles : nous n'avions pas utilisé d'éclairage par LEDs ni de fond vert au départ, et cela nous a fait perdre du temps

Améliorations possibles

  • Passage au C++ pour gagner en performance
  • Implémentation dans PnpTerminator


Vidéos de démonstration

  • Déplacement en boucle de deux composants :
    Montre que la précision est suffisante pour placer un même composant à plusieurs reprises au même endroit (plus d'une vingtaine de cycles sans problème).
  • Exemple de vrai job PNP :
    Tout a été fait depuis PnpTerminator : ouverture du fichier PNP (conçu avec Eagle), configuration d'un TrayFeeder, et suivi en direct de l'avancement du job.
  • Dépôt de pâte à souder :
    La qualité de la vidéo ne permet pas de voir grand chose, d'autant plus que la pâte adhère peu au plateau, mais il s'agit là aussi d'un job lancé à 100% depuis PnpTerminator.
  • Dépôt de pâte à souder - accéléré :
    Le temps de distribution de pâte a été réduit pour cette vidéo, et le compresseur est éteint, ce qui permet de mieux entendre le relai qui contrôle la distribution. Il s'agit du même fichier que pour la deuxième vidéo, un cercle de LEDs RGB : chaque LED dispose de 4 pins, et on voit bien que la machine descends 4 fois à des positions très proches, avant de s'éloigner plus loin pour passer à la LED suivante.