Driver de puissance maison pour moteur pas à pas.

  • Auteur de la discussion mdog
  • Date de début
F

freedom2000

Compagnon
UPDATE DU TUTORIAL

Voila, je cherchais à refaire la carte µstep pour laquelle j'ai un typon, le fichier pdf de Mdog mais pas "la CAO" sous eagle (ou autre)... Ayant déjà percé pendant plus de deux heures les quelques 500 trous du circuit imprimé, j'ai recherché une solution moderne : que ma CNC le fasse pour moi :-D
Ce que j'ai voulu faire était donc à partir du fichier pdf arriver à générer le fichier Gcode de perçage.

Le principe est simple :
- extraire l'image du pdf
- repérer les trous sur l'image [rainbow]Trutti Frutti [/rainbow]
- importer les trous sous eagle
- lancer le plugin "pcb-gcode"
et c'est tout :-D

Bon ça c'est la théorie; mais la pratique est encore plus simple !!

extraire l'image du pdf :
ça c'est facile il suffit d'ouvrir le pdf avec un outil de traitement d'image tel que :
  • The Gimp
    Photoshop
    ou autre

par exemple sous photoshop, il suffit d'ouvrir un fichier avec l'option "tous les formats". S'ouvre alors une fenêtre dans laquelle vous pouvez choisir la valeur de zoom à appliquer sur le pdf lors de sa conversion en image. Choisissez jusqu'à résolution = 1000 pixel/pouce

drill19.jpg


Voila le plus dur est fait :-D

préparer l'image
sous photoshop (ou équivalent) il suffit de prendre la baguette magique et de sélectionner la zone blanche de l'image, puis de la "couper" en la remplaçant par du noir. Il ne reste alors que les pastilles en blanc sur fond noir.
Un coup de seuillage pour ne vraiment garder que deux niveaux (noir et blanc)
drill01.jpg

et on sauvegarde cette image (au format PNG)

repérer les coordonnées des trous
Un trou dans le circuit se traduit par un cercle sur l'image.
Guol nous a fait un superbe outil d'une rare simplicité d'utilisation : téléchargez Troutti Frutti et lancez le :-D
Ouvrez l'image png précédemment enregistrée (cliquez sur le premier bouton "fichier image")

drill20.jpg


Pour détecter les trous cliquez sur le bouton "export vers Eagle (scr)" et le fichier script est automatiquement créé au bout de quelques secondes.
Par défaut il porte le même nom que le fichier image seule l'extension .scr est changée.

Un message sympa vous donne le nombre de trous détectés :-D

drill21.jpg



import sous Eagle

Eagle est un programme (un peu complexe) de CAO pour circuit imprimés. Une version freeware existe et est largement suffisante pour faire ce qu'on souhaite :-D . Téléchargez là et installez là en mode "freeware".

Lancez Eagle, créez un nouveau projet et une nouvelle carte (new board)

drill07.jpg



et importer le fichier script

drill08.jpg


Vous avez (enfin) tous les trous de votre pcb sur l'écran :-D

Il n'y a pas besoin de la moindre calibration --> les trous "tombent où il faut".

Pour vérifier une astuce consiste à positionner sur votre pcb un Circuit Intégré

drill09.jpg



Le résultat est excellent comme vous pouvez en juger :

Les trous sont accompagnés de leur diamètre, le perçage devra en tenir compte "automatquement" :-D .
Les plus petits trous font 0,5mm de diamètre... et il y en a beaucoup :!:

Ils sont tous aussi bien centrés que ceux ci !

drill18.jpg




Convertir en Gcode

Il existe un plugin d'Eagle qui a également le bon goût d'être freeware et qui fait du Gcode parfaitement (pratique aussi pour la gravure anglaise).
Il s'agit de pcb-Gcode. Téléchargez le, dézippez le et copiez le contenu dans le dossier "ulp" d'Eagle.
Il suffit de le configurer en tapant run pcb-gcode --setup

drill13.jpg


et votre Gcode est enfin généré. Il est accessible dans le dossier "projet" d'Eagle

drill10.jpg


et s'ouvre tout seul avec le logiciel de FAO que vous voulez :-D


Bravo Guol :smt038


JP
 
G

guol64

Compagnon
Merci freedom et bravo pour le tuto

Pour le soft pas besoin d'installer : l'exe doit fonctionner tout seul. :wink:
 
F

freedom2000

Compagnon
guol64 a dit:
Merci freedom et bravo pour le tuto

Pour le soft pas besoin d'installer : l'exe doit fonctionner tout seul. :wink:

Exact ! --> corrigé :oops:

JP
 
F

freedom2000

Compagnon
Et voici le résultat : sur une carte µstep :-D


Bref ça marche nickel : il m'a juste fallu rajouter un petit facteur de zoom en x et en y (j'ai modifié le proto du code de Guol) pour prendre en compte la micro déformation induite par le tirage du pcb à partir d'une impression laser puis positif typon puis négatif typon...

Le résultat une fois percé est nickel même si on distingue encore un très léger dés-alignement sur quelques trous (mais ça c'est du à un "mauvais" positionnement du pcb sur la fraiseuse...

CNC_JPG_57.jpg
perçage carte µstep avec CNC V2
 
B

Bth

Ouvrier
CI Cnc

Bonjour à tous,

C'est un travail magnifique !! La chaine des outils est vraiement complète.

Bravo et merci pour la démo.

Thierry
 
P

phil916

Compagnon
bravo :-D

pour avoir percer ma mdog j'en suis vert de jalousie, il me faut une cn ! :lol:
 
F

freedom2000

Compagnon
Comme je vois que ça vous plait, j'ai changé la vidéo pour mettre celle de la deuxième carte que je fais et qui est beaucoup plus nette !

Merci pour les encouragements ça fait plaisir :oops:
JP

Il y a un truc de rigolo dans la vidéo (au moins pour moi) :
comme j'ai posé mon petit appareil photo directement sur ma table mobile, on pourrait croire que j'ai un portique mobile... Tout est relatif :wink:
 
H

horsot

Compagnon
Chapeau bas :smt023

Sur la photo, j'ai l'impression que ton forêt n'est plus trop affuté (epoxy abrasif) et qu'il créé une petite crevasse avant perçage, c'est le cas?

De nouveau bravo!

Xavier
 
F

freedom2000

Compagnon
horsot a dit:
Sur la photo, j'ai l'impression que ton forêt n'est plus trop affuté (epoxy abrasif) et qu'il créé une petite crevasse avant perçage, c'est le cas?

Xavier

Oui c'est le cas ... Les forets HSS s'émoussent en un temps record.
A ça il faut ajouter une dremel un peu vieille qui ne tourne pas très très rond...

JP
 
F

freedom2000

Compagnon
Sur une idée originale de Guol j'ai un peu modifié son code pour générer automatiquement le Gcode...

Pourquoi ?

1) parce que ce n'est pas dur :-D
2) parce que le Gcode généré par pcb-Gcode sous Eagle n'est pas optimisé. La fraiseuse passe son temps à bouger dans tous les sens selon une logique que je ne m'explique pas (voir la vidéo plus haut)
3) parce que le prog est maintenant autonome --> on peut se passer de l'étape sous Eagle :-D

Guol, je te fais passer le source pour que tu puisses le modifier et publier l'exe !

Pas besoin de mode d'emploi pour comprendre (voir le film pour apprécier les modifications)
Sur l'IHM :
Z Up = position de changement d'outil
Z down = postion de survol entre deux trous
Z drill = profondeur de perçage
Feed rate = feedrate de perçage


JP

CNC_JPG_58.jpg
Trouti Frutti + Génération du Gcode
 
H

horsot

Compagnon
J'y ai réfléchi aujourd'hui même.
Le soucis de ce problème (optimisation du parcours) est du type "voyageur de commerce" qui peut être optimisé par un "algorithme des fourmis", une lecture assez intéressante :
http://www.i3s.unice.fr/~crescenz/publications/travaux_etude/colonies_fourmis-200605-rapport.pdf

La mise en œuvre en C (ou autre) peut se trouver ça et là sur internet, le principal souci est de trouver les différents paramètres pour que cet algo converge rapidement pour cette application.

Bonne lecture

Xavier
 
G

guol64

Compagnon
Bonjour,


J'ai commencé la modification du programme, et en effet se pose le problème de l'optimisation du parcours.
Horsot, j'ai lu avec plus ou moins d'attention ton lien sur le voyageur de commerce, et la démarche est très instructive, mais je pense à un autre algorithme un peu plus simple, bien sûr moins performant, mais peut-être suffisant pour nos applications :
1°/ Ne travailler que sur la liste des trous de diamètre identique.
2°/ Choisir arbitrairement un trou (le premier) et définir le parcours qui passe par le trou le plus proche (la distance étant la plus grande des deux valeurs (|X1-X0| ; |Y1-Y0|) en effet travail en temps masqué sur l'axe le plus court si bien sûr les paramètres de vitesse des deux axes sont identiques) et jusqu'au dernier trou.
3°/ On répète la manip pour tous les trous de la série et on choisi le chemin le plus court ->> on tri la liste en fonction.
 
H

horsot

Compagnon
Bonjour,
Des remarques :

1 - Ok
2- Dans l'algo des fourmis il y a aussi cette notion de "distance proche" pour aller d'un trou à l'autre. Pourquoi ne prend tu pas simplement la distance sqrt((X0-X1)²+(Y0-Y1)²)? Si tu veux être rigoureux il ne faut pas comparer les distances mais les temps de déplacements (accélération, vitesse constante, décélération) mais ça devient plus lourd et n'apportera pas forcément un gain significatif.
3- Ce n'est pas parce que tu auras une liste de trous qui 2 à 2 sont les plus proches que tu auras un parcours optimisé. Je pense que cela va créer des trous isolés ce qui, en fin de programme, va faire des déplacements énormes.

Un autre algo (génétique) et son implémentation en python :
http://www.pythonfrance.com/codes/ALGORITHMIME-GENETIQUE-PROBLEME-VOYAGEUR-COMMERCE_51015.aspx

En tout cas bravo pour l'initiative et ce partage!

Xavier
 
Z

Zorg

Compagnon
question surement bête et on n'obtiendra pas le parcours le plus court, loin de la, mais on limitera les déplacemnt inutiles.

en restreignant les déplacement juste en dimension X et Y indépendant.

trier les coordonnées des points selon mettons un des axes. (par exemple X) puis pour chacun des trous ayant un X commun, trié selon Y croissant.
déterminer le parcours en ne prennant en compte que les points ayant un X commun

puis passer à la valeur de X suivante.

ce nest pas optimum, loin de la. on aura un déplacemnt de type allez retour sur l'un des axes avec balayage le long de celui ci selon les valuers des Y de points.

ce que j'en dit !


sinon en effet c'est le yoyageur de commerce. et si mes souvenir (lointains) sont bon c'est un problème NP complet :-D
entre une solution rapide peu efficace et une solution parfaite mais dont le temps de calcul peut être infini. je choisi vite :D
 
F

freedom2000

Compagnon
Hello,

Pour y avoir réfléchi un peu , je ne suis pas sûr qu'un algo "fourmi" soit le plus efficace ...
En général les trous sont "alignés" il faut donc parcourir un chemin vertical et des déplacements "horizontaux"...
Donc le plus simple (je pense) serait de :
trier le tableau en Y croissant
trier le tableau en X croissant (ce qui préserve au mieux le tri précédent)
trier le tableau par diam de trous croissant (pour pouvoir changer les mèches si on veut )

Jusque là c'est ce que fait le dernier code dont j'ai montré le résultat sur le film.

Là où "ça merde" c'est que quand on est en bas d'une colonne on remonte tout en haut pour recommencer. Il faut juste parcourir l'axe des Y en zig zag (boustrophédon pour ceux qui ont des origines paysannes !)

Comment faire ça ??
ben voila en gros (pas testé sauf dans ma tête...)
on descend la liste triée précédente (dans l'ordre des X croissants)
Dès qu'on détecte une forte discontinuité en Y (de l'ordre de Y max), on repère où on est, et on commence à extraire les points jusqu'à une nouvelle "forte discontinuité" en Y? On inverse la liste extraite et on continue.

ça ne marchera pas pour tous les trous mais ça devrait en optimiser un grand nombre surtout si le pcb est "bien rempli" sur les bords. Et en plus si on n'inverse pas une colonne ça ne sera pas bien grave puisque ça voudra dire que la suivante n'est pas "loin en y" de la première... (suis-je clair ?)

Comme ça on doit faire un beau labour en zig zag comme nos anciens avec leurs chars à bœufs :-D

JP
 
Z

Zorg

Compagnon
les grands esprits (en toute modestie hein :-D) se rencontrent.

en effet pas besoin de remonter tout en haut, parcourir la liste des points dans le sens du déplacement
on a une liste sur 2 qu'on parcours dans le sens croissant et l'autre quon parcours dnas le sens décroissant.

testé et validé sur une autre problématique
 
F

freedom2000

Compagnon
guol64 a dit:
Bonjour,


1°/ Ne travailler que sur la liste des trous de diamètre identique.
2°/ Choisir arbitrairement un trou (le premier) et définir le parcours qui passe par le trou le plus proche (la distance étant la plus grande des deux valeurs (|X1-X0| ; |Y1-Y0|) en effet travail en temps masqué sur l'axe le plus court si bien sûr les paramètres de vitesse des deux axes sont identiques) et jusqu'au dernier trou.
3°/ On répète la manip pour tous les trous de la série et on choisi le chemin le plus court ->> on tri la liste en fonction.

1°) --> oui (optionnellement car souvant il suffit de percer à un seul diam !!!)
2°) pas sûr que cet algo conduise à une solution optimale par raprot à un balayage systématique (mais sous optimal localement).
Pour quoi ? parce qu'il y a des chances de passer au trou le plus proche en "laissant tomber" un trou "pas trop loin" qui va progressivement s'éloigner de plus en plus et se retrouver en fin de liste (avec un paquet d'autres) qui seront traités en "ramasse miette" à la fin du parcours...

JP
 
F

freedom2000

Compagnon
Zorg a dit:
les grands esprits (en toute modestie hein :-D) se rencontrent.

en effet pas besoin de remonter tout en haut, parcourir la liste des points dans le sens du déplacement
on a une liste sur 2 qu'on parcours dans le sens croissant et l'autre quon parcours dnas le sens décroissant.

testé et validé sur une autre problématique

+1 Zorg (y compris sur les grands esprits :oops: ) :wink:

JP
 
G

guol64

Compagnon
Que de posts pour une fourmi :smt082

Je reviens sur mon calcul des distances entre deux points trous: je continue d'affirmer que c'est le plus grand de (X1-X0; Y0-Y0) et non pas ((X1-X0)²+(Y1-Y0=²) ^1/2 : dans la plupart des cas sur une CNC l'axe X et Y ont les mêmes caractéristiques de vitesse, donc c'est bien le plus grand déplacement suivant un axe qui sera limité par la vitesse de déplacement max et l'autre moteur tournera à une vitesse moindre.

Je crois que la meilleure méthode (celle qui aura un résultat optimisé) est bien celle de Horsot, cependant pour avoir une solution convenable avec 1000 trous, je ne sais pas combien de temps celà va prendre.

Je crois cependant que le principal est de supprimer l'étape Eagle : c'est déjà pas mal.
 
H

horsot

Compagnon
guol64 a dit:
Que de posts pour une fourmi :smt082
C'est plus celui des fourmis, c'est un "algo génétique" (repose sur le principe d'évolution de darwin) :wink:

guol64 a dit:
Je reviens sur mon calcul des distances entre deux points trous: je continue d'affirmer que c'est le plus grand de (X1-X0; Y0-Y0) et non pas ((X1-X0)²+(Y1-Y0=²) ^1/2 [...]
Bien vu! pour le raisonnement, il faut faire attention que ça suppose que tu fasses marcher ta machine aux limites de ses capacités et que c'est la vitesse d'un axe qui limite la vitesse de déplacement de la broche et non pas un consigne fixé (inférieure). Tu peux aussi prendre en compte les temps d'accélérations/décélérations qui sont loin d'être négligeables dans le cas de petits parcours mais le deviennent lors des grands.
On peut prendre tout ceci en compte dans l'algo génétique qui nécessite en fait la """distance""" de chacune des villes par rapport aux autres (distance réelle, temps du trajet,...).

guol64 a dit:
Je crois que la meilleure méthode (celle qui aura un résultat optimisé) est bien celle de Horsot, cependant pour avoir une solution convenable avec 1000 trous, je ne sais pas combien de temps celà va prendre.
Ce n'est pas ma méthode, j'ai déjà eu du mal à la comprendre moi même! En fait c'est un classique de la résolution de ce genre de problème je me suis juste documenté.
En 2-3 minutes, on a une solution déjà largement optimisé (changez le nombre de gènes pas 1000 dans le lien de mon dernier post, lancez et admirez). Je pense que pour percer 1000 trous on peut bien passer 5 minutes à générer le parcours ce n'est pas du temps de perdu :wink: . De plus c'est du java, je pense qu'il existe des librairies C qui feront ça en beaucoup moins de temps (je pense d'un facteur 3) sans parler des techniques avancés pour faire converger la solution plus vite.

guol64 a dit:
Je crois cependant que le principal est de supprimer l'étape Eagle : c'est déjà pas mal.
+1

Xavier
 
F

freedom2000

Compagnon
Hello,

Finalement j'aurais tendance à dire que la solution "Horsot" avec la "distance Guol" est sûrement celle qui donnera le meilleur résultat en terme de minimisation des distance et donc du temps de positionnement.

La solution "zorg + freedom" est celle qui est de loin la plus simple à implémenter (simple fusion de deux listes triées) mais elle suppose que les trous sont sur une grille orthogonale (ou quasi orthogonale) ce qui n'est pas forcément le cas si l'image d'origine provient d'un simple scan mal aligné... En pratique cette solution doit revenir quasiment à celle de Xavier (moyennant l'hypothèse d'alignement sur grille) et puis j'aime bien son origine paysanne : http://fr.wikipedia.org/wiki/Boustrophédon

Je suis également d'accord que le pricipal intérêt est de virer Eagle d'autant sur le plugin pcb-Gcode, même s'il fonctionne très bien, n'optimise pas les déplacements pour le perçage...

JP
 
H

horsot

Compagnon
Bonsoir,

Je suis tombé sur un site intéressant sur notre sujet :
http://labo.algo.free.fr/index.html

L'algo génétique est très (trop) long et surtout une usine à gaz à implémenter et à régler correctement!

J'ai pu faire des tests avec ce programme (projet éclipse):
http://www.javafr.com/codes/ALGORITHME-PROBLEME-VOYAGEUR-COMMERCE-PVC_15503.aspx :shock: impressionnant!

J'ai remarqué que 2 algo très simples utilisés de manière successives donne déjà de très bons résultats :
1- Algo "plus proche voisins" : trace un parcours en cherchant son plus proche voisin.
2- Algo "2-opt" : échange 2 villes ou 2 parcours de manière aléatoire (parcours proches?).

toto.png
2500 points, temps de calcul 0.668s
 
F

freedom2000

Compagnon
horsot a dit:
Bonsoir,

Je suis tombé sur un site intéressant sur notre sujet :
http://labo.algo.free.fr/index.html

L'algo génétique est très (trop) long et surtout une usine à gaz à implémenter et à régler correctement!

J'ai pu faire des tests avec ce programme (projet éclipse):
http://www.javafr.com/codes/ALGORITHME-PROBLEME-VOYAGEUR-COMMERCE-PVC_15503.aspx :shock: impressionnant!

J'ai remarqué que 2 algo très simples utilisés de manière successives donne déjà de très bons résultats :
1- Algo "plus proche voisins" : trace un parcours en cherchant son plus proche voisin.
2- Algo "2-opt" : échange 2 villes ou 2 parcours de manière aléatoire (parcours proches?).

Salut Xavier,

J'étais tombé sur le même site (très clair d'ailleurs)

Je pense tester le 2opt qui m'a l'air assez simple à coder et qui devrait sortir ma solution "boustrophédon" assez naturellement à partir de la liste triée par X croissant !

JP
 
F

freedom2000

Compagnon
Avec l'ami Guol on a bossé comme des bêtes sur l'optimisation des parcours.

Est-ce vraiment utile ???

réponse : OUI

La différence est énorme en distance de déplacement et donc en temps...

Voici dessous la distance initiale sur la carte µstep 4Axis, la distance avec l'optimisation 2-Opt telle que proposée par Xavier et expliqué sur le lien.

J'ai initialisé le parcours avec mon parcours trié en X croissant tel que présenté sur le post du film du perçage. A l'arrivée toutes les combinaisons de retournement de chemin dans ce parcours sont testées. Seules celles qui "apportent un gain en distance" sont conservées.
L'algo est étonnamment très rapide et le chemin de perçage est franchement plus beau :wink:

J'avoue qu'on est très loin du parcours boustrophédon... mais bon, seul le résultat compte !

Maintenant ce facteur 4 est -il rentable en temps ?

J'ai testé les deux parcours sur la même fraiseuse "réaliste" avec des accélérations normales et des vitesses de déplacement max d l'ordre de 2,8m/min.

On passe de 10 min 10s à 6 min 40s

Le gain en temps n'est donc pas directement proportionnel au gain en distance. Ça doit s'expliquer par les rampes d'accélération et décélération sur les axes et par les temps de perçage qui restent constants.


JP

CNC_JPG_61.jpg
le parcours final

CNC_JPG_60.jpg
après optimisation

CNC_JPG_59.jpg
avant optimisation

CNC_JPG_62.jpg
Le parcours avant optimisation
 
F

freedom2000

Compagnon
L'algorithme 2-opt est-il optimal par rapport à un "boustrophédon" tel que je l'imaginais ??

J'ai modifié un poil le code pour ne "retourner des parcours" que s'ils apportent un "grand" gain en distance (70% de la largeur du pcb).
Le résultat est un chemin qui évite les grandes traversées inutiles et qui ressemble au chemin d'un laboureur "boustrophédon"

Le parcours fait 6000 mm de distance et dure 7 min 53 d'usinage... Donc pas rentable :???:

Pourtant il est beau à voir percer : la fraiseuse part d'un côté et fait tous les trous dans l'ordre en quasi zig zag :-D

JP

CNC_JPG_63.jpg
perçage boustrophédon
 
F

freedom2000

Compagnon
Une toute dernière optimisation pour faire prendre en compte au prog le départ et le retour à la position "home" de la fraiseuse (ici 0,0 en haut à droite).

distance totale = 2637 mm (record battu) :-D

Mais pour un gain de temps vraiment minimal de 4s ... soit 6min et 34s

Le tracé sous NCPlot est joli (plus que sous Mach3) :wink:

CNC_JPG_65.jpg
2637 mm

CNC_JPG_64.jpg
High score !
 
H

horsot

Compagnon
Bravo à vous 2!

Dites moi, qu'utilisez vous pour le calcul des distances, la norme 2 (distance) ou la norme infinie (max de X et Y)?

Je n'ai pas tout compris, le 2-opt est-il mieux ou pas en temps?

J'ai codé un algo glouton après l'2-opt qui permet encore de gagner 10% du parcours. Le principe regarder si chaque points ne seraient pas "mieux" dans un autre arc (évite les détours pour un points).

Je trouve curieux le grand déplacement au dessus du PCB. Vous avez forcé le premer point? Sinon je pense que votre algo le 2-opt ne prends pas en compte la distance [premier point; dernier point]. il y a peut être des optimisation à faire de ce coté.

En tout cas bon boulot bravo à vous 2. :smt023

@Freedom : peux-tu me donner le fichier Gcode pour que je teste si mon algo se débrouille bien avec 600 perçages (il se débrouille bien avec 271 de la breakout board de "PetitPas")? Merci d'avance.

Xavier
 

Sujets similaires

N
Réponses
15
Affichages
958
Doctor_itchy
D
D
Réponses
33
Affichages
1 235
dh42
J
Réponses
34
Affichages
2 428
nicolasdu61000
N
françois44
Réponses
174
Affichages
5 058
jacounet
jacounet
Haut