Gestions de deux servomoteur sur portique linuxcnc

N

NovA

Nouveau
Bonjour à tous,

Voilà plusieurs semaines que je bosse sur une CNC 3 axes à rétrofiter:
- Drivers commandés en +-10Vdc
- Moteurs brushless avec codeurs intégrés
- Le pont est déplacé par 2 moteurs à synchroniser
La machine fera principalement de la découpe plasma, avec la pose d'une broche de temps à autre.
J'ai choisi LinuxCNC, avec un kit MESA 5i25+7i77.

Aujourd'hui j'en suis au stade où les moteurs tournent bien, mes boucles PID sont certainement à affiner mais les mouvements sont corrects.
Problème: Je ne parviens pas à comprendre comment jumeler les deux moteurs de mon portique.

Je ne dois pas chercher correctement, je ne trouve pas d'explication (et des exemples surtout) de configurations de portiques autre qu'avec moteurs pas-à-pas.
J'ai fait différents essais avec "GANTRY", mais je ne parviens pas à charger le module (erreur au démarrage), et de toutes façon la structure de la gestion de ce couple de moteur dans HAL est bien trop floue pour moi pour l'instant, pour que je puisse aller plus loin.

SVP, quelqu'un aurait un exemple de fichier .HAL à me communiquer pour ce type de moteur? ou des explications claires? ou des liens que je n'aurais pas trouvé?

D'avance, merci beaucoup!
 
G

gaston48

Compagnon
Bonjour,
Il faut que tu joignes ton fichier .INI et .HAL pour que je puisse essayer d'intégrer la modif.

pour insérer du code sans que ça interfère avec le code html de la page de ce forum
tu cliques sur la touche + au dessus et tu as les balises code </>

 
N

NovA

Nouveau
Bonjour Gaston48,

D'abord merci beaucoup pour ce retour si rapide!
Je ne suis pas à proximité de la machine ce matin, je te joins un des essais que j'ai fait, une archive un peu brouillon (toutes mes excuses) mais je ne veux pas y toucher à l'aveugle, sans pouvoir la réessayer sur la machine avant de te l'envoyer. Du coup tu y verra entre autre:
- "Y1 et Y2" que j'ai mis sous cette forme pour suivre une piste
- Toutes les parties inutilisés pour l'instant (spindle, capteurs homing) en commentaires
- PID simplifiées juste pour essai (les moteurs tournent)

En espérant que tu n'y perde pas trop de temps:




...et:




Une nouvelle fois: merci beaucoup!
 
G

gaston48

Compagnon
Je vois que tu es déjà à l'aise avec les éditions de fichier ini et hal .

INI configure l'interface graphique d'axis ainsi que le planificateur de trajectoire qui va
interpréter le gcode. Tu as une machine 3 axes, donc il ne faut déclarer que 3 axes.

C'est au niveau du hard, dans HAL, qu'on pourra brancher une unique commande d'axe
vers 2 servo-moteurs mais qui auront chacun leurs propre PID.
Donc un principe à respecter dans HAL, un emeteur, (une sortie) peut être branché sur
plusieurs récepteurs, (des entrées) mais pas l'inverse. Dans ce cas le récepteur ne doit
être branché que sur une unique sortie d'un aiguillage: logique comme un OU ou
analogique comme un multiplexer MUX.
HAL accepte beaucoup de valeurs de paramètres [entres crochets] qui proviennent de INI
ça n'est pas obligatoire, tu peux rentrer directement des valeurs numériques ou logiques
au bout des lignes "setp" comme par exemple les valeurs de PID l'avantage es que tu peux
les changer "à la volée" quand axis est lancé avec son popup dédié.
Donc les valeurs de PID de l'axe unique Y déclaré dans INI vont être transmises
aux 2 PID individuelles Y1 et Y2 déclarées dans HAL. Si tu veux imposer des
valeurs différentes pour les 2 moteurs en // il faudra les écrire dans HAL et supprimer
les variables entre [].
De la même façon, dans HAL on ne va activer que l'index d'un seul moteur pour
initialiser la POM de précision (après l'activation d'un switch) ainsi que le retour
de position courante vers axis: net y-pos-fb => axis.1.motor-pos-fb
les fichiers ont été modifier avec un éditeur windows, les fins de ligne ne sont pas
compatible avec linux, tu les recharges dans gedit et les sauve en paramétrant bien
"fin de ligne linux".
Ca devrait donner ceci: (non testé car j'ai une 5i20 pas 5i25.)

Ici tu dois pouvoir ne déclarer que num_encoders=4
et les pwm à 0 car sauf erreur, il ne sont pas à déclarer, ils le sont d'une façon implicite avec la 7i77

loadrt hm2_pci config=" num_encoders=6 num_pwmgens=0 num_stepgens=0 sserial_port_0=000xxx"

on doit gagner quelques thread inutiles et donc de la rapidité ?




 
Dernière édition:
N

NovA

Nouveau
:smt107
Quelle réactivité!!!

Et un grand merci pour ces détails, ça me paraît assez clair dans l'ensemble, faut que je vois sur la machine (j'y arrive un peu mieux avec du concret).
Pour ce qui est du nombre d'encodeurs, effectivement je peux rester à 4 (je n'avais pas envisagé que ça bouffe de la ressource), mais pour les PWM, il me semblait que c'était la génération de PWM par la 5i25 qui permettait à la 7i77 de me fournir ces signaux analogiques +-10V...
Oui je suis sur W7 à la maison, j'ignorait que d'ouvrir les fichiers avec un éditeur Windows les dégraderait, mais ce n'est pas un problème, le ferai les modifs sur la machine directement.
Je vais bucher encore la dessus dès demain après-midi et je te tiens au courant.

Je me répète encore mais, vraiment, un très grand merci pour tes lumières et ton aide précieuse.:prayer:
Bonne fin de journée.
 
G

gaston48

Compagnon
mais pour les PWM, il me semblait que c'était la génération de PWM par la 5i25 qui permettait à la 7i77 de me fournir ces signaux analogiques +-10V...
Oui c'est toujours le cas, mais ça ne passe pas par hostmot2 et hm2_pci config.
Tout dépend du firmware qui est chargé ici on a habituellement 5i77X2 et si tu regardes
le fichier .pin, toutes les voies des 2 connecteurs de la 5i25 sont des liaisons séries ou des voies multiplexées
Si tu déclares des pwm, tu ne les vois pas apparaître dans halmeter et donc tu ne peux pas configurer
leur fréquence, le type pwm ou pdm et les brancher etc. donc ça se passe automatiquement entre la 5i25
et la 7i77
C'est d'ailleurs pour ça que je ne suis par certain qu'on gagne du temps en simplifiant hm2_pci config ? mais bon ...

Si tu changes de firmware pour une 7i77 et une autre carte compatible sur l'autre connecteur libre de la 5i25
là tu peux activer au besoin des stepgen par exemple.
 
N

NovA

Nouveau
Bonjour Gaston,

J'avoue que sur le papier, je pense comprendre où tu veux aller, mais qu'en réalité j'ai encore quelques difficultés...

J'ai testé ce que tu m'as indiqué plus haut, et je pense qu'il y a un souci avec les dénominations y, y1, et y2 dans hal.
Tel quel, l'axe y ne tourne pas (aucun des deux moteurs), et je n'ai pas non plus de réponse à l'écran lorsque j'actione les moteurs y1 ou y2 en manuel.
Un essai (certe pas très intelligent:roll:) en remplaçant les "y" par "y1" fait tourner les deux moteur mais ne surveille que y1 en retour.
J'avoue que je saturé un peu à force de retourner le problème dans tous les sens.... Et je crains de m'être un peu embrouillé.
Une petite idée de ton côté par hasard?

D'autre part tu as effectivement raison, la suppression des déclarations de PWM ne gêne en rien le bon fonctionnement.

Je continue la fouille...
 
N

NovA

Nouveau
Un peu plus sérieusement, les PID sont elles autonomes, ou ont-elles besoin d'axis pour tourner?
La question est peut-être bête, mais si je résume ce que tu m'as expliqué, on envoi la même commande aux deux PID, on les laisse gérer chacun leur moteur en fonction de cette consigne, et on se sert d'une des deux boucles pour remonter l'information de position à axis... Et les deux moteur sont correctement asservis, indépendamment l'un de l'autre mais synchronisés sur le même mouvement.

C'est ça? Ou est-ce que je suis complètement à côté?

Là en l'état, le meilleur comportement que je puisse avoir, c'est les deux moteurs qui tourne en même temps mais un seul des deux est réellement asservi, l'autre ne tourne qu'en fonction des ordres du premier.
 
G

gaston48

Compagnon
C'est ça? Ou est-ce que je suis complètement à côté?
C'est tout à fait ça !! :-D

j'ai corrigé le fichier HAL posté précédemment
je n’écris pas mon code comme le présente pncconf, je suis plus compacte

j’écris une ligne de branchement net avec mon nom de variable, l’émetteur et le récepteur quand j'en ai besoin
puis une nouvelle ligne si ma variable doit entrer dans une autre récepteur
pncconf déclare toutes les variables utiles ou pas

J'ai branché aussi la sortie vitesse d'un encodeur vers l'entrée feedback-vitesse de sa PID
on doit pourvoir minimiser FF1 dans ce cas
 
G

gaston48

Compagnon
Pour la compréhension, il faudrait peut être mieux nommer y1 y tout court, le rendre
opérationnel comme x et z et ensuite insérer yesc comme esclave avec ses propres
branchement: pid, encodeur, commande analogique etc et une seule commande commune
à y en provenance de axis.1.
c'est à toi de voir
 
N

NovA

Nouveau
Oui c'est ce que j'ai attaqué à faire cet aprem... J'ai y et y2. Mais pour le reste il y a visiblement encore un détail qui m'échappe. Ça va bien venir!:smt108
Je m'y remets demain matin.
 
G

gaston48

Compagnon
:smt043 Je voulais dire que mon message posté précédemment avait été réédité avec un nouveau fichier
hal. (Si plus tard, quelqu'un s'en inspire, il n'y en a qu'un dans ce post et mise à jour).
 
N

NovA

Nouveau
:smt089
Tu as raison, et le prochain post c'est pour moi, avec un vrai bon fichier HAL qui marche tout bien!
 
N

NovA

Nouveau
Bonjour Gaston48, bonjour tout le monde,

J'ai pas mal avancé de mon côté et suis en train de peaufiner mon fichier hal, mais il me reste quelques soucis.

D'abord ça y est, la machine tourne, et relativement bien d'ailleurs.
Mais (outre les petits soucis de réglage à affiner ou autre capteurs fin de course à raccorder) il me reste un souci assez important:

- Je démarre la machine, actionne les axes.
- Machine OFF, mais je reste sur AXIS
- Je déplace le moteur Y2 du portique manuellement (pid.y2.error augmente tandis que pid.y.error reste à 0, logique)
-ou-
- L'un des deux moteur du portique s'est arrêté un peu à la limite de la zone morte, et linuxcnc envoi une légère tension sur les drivers de cet axe, qui crois petit-à-petit avec le temps (visible au voltmètre ou sur Hal scope)
- Au bout de quelques minutes, Machine ON
- Le moteur Y2 (sur lequel la boucle ne renvoi pas d'info de position) se lance, seul, sans que rien ne l'arrête.
- obligé de redémarrer linuxcnc pour reprendre un fonctionnement normal.

Gaston48, dans l'ensemble ta solution me convient, ne serait-ce que parce-qu'elle m'a permis de mieux comprendre le fonctionnement de HAL et de sa gestion des PID (un grand merci, de nouveau). Mais n'y existe-t-il pas d'outil spécifique pour la gestion de deux moteur pour un seul axe?

Et Gantrykins par exemple, ça ne permet pas de faire office? tu connais ce composant?

Bonne journée
 
G

gaston48

Compagnon
Bonjour,
Gantrykins ne changera rien, tu as un ordre de positionnement qui concerne 1 axe, Y ici, dans axis
axis.1.motor-pos-cmd
tu as un retour de la position courante suite à cet ordre (tu as le choix de l'affichage commande ou courante).
axis.1.motor-pos-fb
Des paramètres permettent de déclencher une alarme et de stopper axis quand l'erreur entre cmd et fb dépasse une limite.
Les organes qui ont produit la position courante peuvent être de n'importe quel type comme un bras de robot
multiaxe les équations qui gèrent le pilotage de ces axe se font par kinematics mais c'est à toi de concevoir gérer des
protection individuelles pour chaque axe du bras

Si tu manipules un servo-moteur à l'arret, tu décales sa position feedback: hm2_5i25.0.encoder.01.position
Si tu actives la PID avec une commande: axis.1.motor-pos-cmd complétement décalé par rapport à
hm2_5i25.0.encoder.01.position tu déclanches une reaction violente.

Ce qu'on pourrait faire, par exemple, pour déclencher un arrêt en cas de panne d'un moteur,
c'est de faire la moyenne des positions courantes avant de la brancher à axis.1.joint-pos-fb
(y1-pos-fb + y2-pos-fb) / 2
cela revient à faire un test OU des 2 positions courantes.
Bien entendu, au niveau de chaque PID les 2 retours sont bouclés individuellement.

Tu charges et branches directement ce composant qui fait la somme de chaque valeur que tu
affectes préalablement d'un gain de 0.5

http://linuxcnc.org/docs/2.7/html/man/man9/sum2.9.html

loadrt sum2 count=1
addf sum2.0 servo-thread
setp sum2.0.gain0 0.5
setp sum2.0.gain1 0.5
net totoy1 y1-pos-fb => sum2.0.in0
net totoy2 y2-pos-fb => sum2.0.in1
net moyenne sum2.0.out => axis.1.motor-pos-fb
 
Dernière édition:
N

NovA

Nouveau
Bonjour Gaston48, et bonjour à tous,

Désolé pour ce silence radio, j'ai dû mettre tout ça de côté quelques temps pour pb familiaux mais me revoilà, et je reprends où j'en étais.

Gaston48, la somme des deux moyennes fonctionne bien et à l'immense avantage de permettre à axis de surveiller les deux moteurs de y. MERCI! :prayer: moi je commençais à m'empêtrer avec des or...:smt017

Mais dans ce cas j'ai encore à peu près le même problème, avec la pom cette fois. Une fois l'origine faite avec le fin de course qui va bien, y se met bien à la valeur configuré pour la pom (ici 0, c'est simple) mais y2 lui conserve sa valeur et ne se réinitialise pas. Résultat, idem: dès la pom faite et le retour vers la position d'offset, arrêt ✋, erreur, etc.
La pom n'agit que sur un axe? (axis.1 = y donc y2 non concerné?) je ne trouve pas l'information dans le guide de hal ou dans le manuel de l'intégrateur...
J'ai un semblant de résultat en créant un axis.4 pour y2 en amont, puis en utilisant la moyenne de la somme des deux retours pour y en aval.
Mais j'avoue que ce n'est pas très "propre" comme architecture, et j'ai l'impression de compliquer la structure pour pas grand-chose...
Je suppose qu'à la lecture de ces lignes tu souris ou lève les yeux au ciel en te disant "pauvre débutant!...":smt012

D'autre part, concernant ta réponse sur gantrykins, je crains de ne pas tout comprendre... Ce que tu veux dire c'est que c'est plus indiqué dans le cas d'un bras multi-axes par exemple où chaque moteur a sa PID indépendante, course et limites propres? C'est donc inutile dans mon cas du fait que les deux moteurs sont de paramètres identiques? Et quel est la différence avec gantry?
Je suis désolé si mes questions sont un peu stupides mais je ne parviens pas à vraiment comprendre l'intérêt de ces outils... Ou pourquoi faut-il que je m'en désintéresse.

Merci
 
G

gaston48

Compagnon
Bonjour,
Oups, j'ai écrit une bêtise depuis le début, à priori ...
Ce n'est pas: axis.N.motor-pos-cmd et axis.N.motor-pos-fb

mais: axis.N.joint-pos-cmd et axis.N.joint-pos-fb

http://linuxcnc.org/docs/2.7/html/man/man9/axis.9.html

Je ne sais pas finalement, j'ai toujours utilisé "motor" ainsi que tous les exemples
qui tournent sur le forum
 
Dernière édition:

Sujets similaires

grandioso
Réponses
7
Affichages
469
grandioso
grandioso
D
Réponses
8
Affichages
329
Doctor_itchy
D
N
Réponses
27
Affichages
536
J
N
Réponses
32
Affichages
2 814
Coyote94
Coyote94
M
Réponses
6
Affichages
1 106
MitchCanon
M
Haut