Table of Contents
As of 2011-01-16, the French version of the EMC2 documentation is 2 years out of date due to not having a translator available.
It’s recommended to use the English documentation whenever possible.
If you wish to provide updated French translation of EMC2, please contact us.
Au 2011-01-16, la version française de la documentation EMC2 est de 2 ans à la date d'échéance pour ne pas avoir un traducteur disponible.
Il est recommandé d’utiliser la documentation en anglais chaque fois que possible.
Si vous souhaitez fournir des mises à jour traduction française d’EMC2, s’il vous plaît contactez-nous.
This handbook is a work in progress. If you are able to help with writing, editing, or graphic preparation please contact any member of the writing team or join and send an email to emc-users@lists.sourceforge.net.
Copyright (c) 2000-9 LinuxCNC.org
Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.1 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and one Back-Cover Text: This EMC Handbook is the product of several authors writing for linuxCNC.org. As you find it to be of value in your work, we invite you to contribute to its revision and growth.A copy of the license is included in the section entitled GNU Free Documentation License. If you do not find the license you may order a copy from Free Software Foundation, Inc. 59 Temple Place, Suite 330 Boston, MA 02111-1307
Un des problèmes les plus souvent évoqués par les utilisateurs à propos d’EMC2 a été qu’il ne s’installait pas de lui-même. Il fallait qu’ils récupèrent les sources, les compilent eux-mêmes, essaient d’appliquer un noyau Linux patché RT, etc. Les développeurs d’EMC2 ont donc choisi une distribution standard appelée Ubuntu[1].
Ubuntu a été choisi parce-qu’il est parfaitement dans l’esprit Open Source d’EMC2:
Vous pouvez trouver l’annonce des plus récentes versions publiées d’EMC2 sur le site www.linuxcnc.org. Les versions d’EMC2 sont fournies de deux manières (sources et paquets binaires). Les sources (décrites dans le manuel du développeur) consistent en un tarball (emc2-<version>.tar.gz), que vous devez charger et décompacter dans votre répertoire home.
Le présent document (plus orienté utilisateur final) expliquera seulement comment installer les paquets binaires sur une distribution Ubuntu[2].
Les développeurs d’EMC2 ont créé un Live-CD basé sur Ubuntu 6.06 qui vous permet d’essayer EMC2 avant de l’installer, c’est également une manière facile d’installer ensemble Ubuntu et EMC2.
Téléchargez l’image image ISO (Miroir EU) et gravez la sur un CD. (la somme MD5 du CD est vérifiable)
Quand vous bootez avec ce CD dans le lecteur de votre machine, vous pouvez voir et expérimenter un environnement identique à celui d’EMC2 qui sera le vôtre si vous choisissez de l’installer.
Si cette démonstation vous a convaicu, cliquez sur l’icône Install du bureau, répondez à quelques questions (votre nom, fuseau horaire, mot de passe) et l’installation terminera en quelques minutes.
Cette installation vous apportera tout les avantages du support de la communauté Ubuntu avec la configuration automatique d’EMC2. Quand une mise à jour d’EMC2 sera publiée, le gestionnaire de paquets vous le fera savoir et vous permettra une mise à jour aisée.
Il est également possible d’utiliser un simple script d’installation d’emc2 sur Ubuntu pour les utilisateurs ayant déjà une installation existante d’Ubuntu. Il lance la commande expliquée dans [sec:Installation manuelle avec apt].
Pour l’utiliser vous devez:
Cette petite section décrira comment installer EMC2 sur Ubuntu 6.06 “Dapper Dreake” en utilisant les commandes apt dans une console. Si vous connaissez un peu Linux et Debian, ça va être facile. Sinon, vous devriez peut être lire [sec:Script d-installation d-EMC2].
Premièrement, ajoutez le dépôt à /etc/apt/sources.list:
Puis faites les mises à jour et l’installation d’emc2 avec:
Ces commandes vont installer correctement les paquets emc2 avec toutes leurs dépendances[3].
Vous pourriez avoir une alarme indiquant que les paquets proviennent d’une source non vérifiée (ce qui voudrait dire que votre ordinateur ne reconnaît pas la signature GPG des paquets). Pour corriger cette situation, appliquez les commandes suivantes:
[1] Le mot “Ubuntu” est un ancien mot Africain, signifiant “humanité aux autres”. Ubuntu signifie aussi “Je suis ce que je suis à cause de ce que nous sommes tous”. La distribution Ubuntu Linux amène l’esprit d’Ubuntu au monde du logiciel. Vous pouvez en lire plus à ce propos ici: http://www.ubuntu-fr.org/
[2] Pour plus d’informations sur les autres variantes Linux, lisez le Manuel du développeur ou demandez de l’aide sur la Liste de diffusion.
[3] Les dépendances sont un des atouts majeurs des distributions basées sur Debian. Elles assurent que vous avez la totalité de ce qui doit être installé. Même dans un cas comme emc2 qui nécessite un noyau de Linux patché pour travailler en temps réel, ainsi que toutes les librairies indispensables.
Quelques difficultés sont à surmonter quand vous commencez à installer EMC2, son téléchargement et l’installation du software proprement dit. L’ensemble des fichiers d’EMC2 sont placés dans le dépôt git.linuxcnc.org. EMC2 est également disponible en paquets pré-compilés (pour différentes plateformes) pour téléchargement depuis ce site.
L’installation peut être une tâche compliquée pour quelqu’un de nouveau sous Linux. La partie la plus dure étant d’appliquer le patch temps réel (Real Time Linux) au noyau. Après ça, installer EMC2 est assez facile. Celà dit, il est dorénavant possible aux utilisateurs de profiter d’une possibilité totalement nouvelle, il leur suffit d’installer Ubuntu (une distribution Linux vraiment conviviale), puis d’exécuter un simple script d’installation, et ils auront alors un EMC2 directement en état de marche sur un noyau temps réel. Les informations pour accéder à cette solution sont diponibles sur www.linuxcnc.org à la page Download.
Vous pouvez trouver l’annonce des versions les plus récentes d’EMC2 sur www.linuxcnc.org. Les versions d’EMC2 sont fournies de deux manières, sources et paquets binaires. Les sources (described furtheron) sont sous forme de fichiers tarball (emc2-version.tar.gz), que vous devez télécharger et décompacter dans votre répertoire home.
EMC2 utilise un modèle de versions similaire (bien que simplifié) à celui utilisé par Debian. Il y a tout le temps trois versions d’EMC2. Debian utilise "stable", "testing" et "unstable". Nous utilisons "Released", "Testing" et "Head". Pour les dernières informations, cliquez sur la version qui vous intéresse.
Released est exactement ça, une version publiée d’EMC2 avec un numéro de version. Elle a été testée par beaucoup de développeurs et de béta testeurs avant d'être publiée, elle est utilisable par la moyenne des utilisateurs. Les développeurs et réguliers des IRC/mailing list sont prêts à aider ceux qui démarrent avec une version “released”. "Released" est disponible sous plusieurs formes, incluant .debs pour Ubuntu et tarballs de sources pour une compilation locale. Il y a un dépôt Debian qui a toujours la dernière version “released” (elle permet donc de faciliter les mises à jour d’une version stable).
Testing est une version d’EMC2 qui est prête pour le "beta testing" mais pas pour une publication générale. Avant qu’une version soit labellisée testing elle doit d’abord être compilée et doit démarrer sur différentes plateformes, mais il y aura probablement des limitations et divers problèmes. La page Testing du wiki est prévue pour lister les problèmes connus et leurs solutions, mais il reste probablement aussi des bugs non découverts. Puisque la version Testing est un software "beta", il ne doit pas être utilisé pour tout ce qui est critique. Les utilisateurs de la version Testing doivent comprendre qu’il s’agit d’un software en beta et qu’ils doivent être disposés à donner des rapports de bugs détaillés si quelque chose ne va pas. Testing est disponible principalement comme une balise en git, toutefois pour la commodité des testeurs, un dépôt "testing" debian et/ou des tarballs peuvent aussi être disponibles. C’est le conseil d’administration d’EMC qui décide quand une version "Testing" est digne de devenir "Released". C’est une décision formelle, présentée par voix de motion aux votes du conseil d’administration ou votes par la mailing liste de l’IRC.
master est un terme pour indiquer l’emplacement des versions en début de développement. Une version TRUNK peut souvent être non fonctionnelle. Lorsque la version TRUNK sera réputée digne par de nombreux testeurs soit un grand nombre de personnes, la balise "Testing" lui sera appliquée. C’est une décision informelle, prise par consensus à la tête des développeurs, habituellement sur l’IRC. Le développement continue immédiatement et un autre TRUNK diverge de cette nouvelle version Testing. TRUNK n’a pas de numéro de version, au cours d’un veek-end chargé il peut changer littéralement toutes les 10 minutes.
Les quelques sections suivantes décriront comment se procurer les sources d’EMC2 et les compiler.
Pour les télécharger, allez simplement sur www.linuxcnc.org à la page “Download” et prenez les tarballs de la dernière version “release” ou “testing”.
Quand vous les avez dans votre répertoire home, il faut les extraire, ouvrez une console et faites:
$ cd ~/
Puis vous devez décider quel type d’installation vous voulez. Il y a deux possibilités pour essayer EMC2:
Si vous souhaitez utiliser la version git d’EMC2, veuillez suivre les instructions de notre wiki pour obtenir le code source:: http://wiki.linuxcnc.org/cgi-bin/emcinfo.pl?Git
EMC2 suit la manière standard de la compilation de logiciel sous linux. Pour compiler il suffit de se rendre dans le répertoire des sources:
$ cd ~/emc2/src
et d’y lancer ces commandes:
$ ./configure
Pour le lancer, tapez emc.
Si vous voulez seulement tester le logiciel avant de l’installer, ou
si vous avez peur d'écraser une version déjà existante, vous pouvez
essayer le mode Run-In-Place (RIP). Dans ce mode, il n’y a aucune
installation et aucun fichier ne sera placé en dehors du répertoire
~/emc2
.
Faites juste:
$ cd ~/emc2/src
puis tapez ces commandes:
$ ./configure --enable-run-in-place
Dans une console, où vous voulez utiliser EMC2, tapez:[5]
$ . ~/emc2/scripts/emc-environment
Jusqu'à ce que vous fermiez la console, il sera mis en place afin que les programmes et les pages de manuel soient disponibles sans avoir à se référer au chemin à chaque fois. Ensuite vous pouvez lancer EMC2 en faisant:
$ emc
Pour installer EMC2 sur un système sans noyau temps réel, ajoutez
--enable-simulator
à la ligne de commande configure
. Dans ce mode,
seule la partie purement programme d’EMC2 démarrera.
Aucun matériel n’aura à être contrôlé, les timmings ne sont pas
garantis, mais les autres fonctionnalités de HAL, EMC2 et ses diverses
interfaces sont disponibles. Pour utiliser ce mode ajoutez
--enable-run-in-place
à la commande configure, l'étape du sudo make
setuid
n’est pas nécessaire.
Vous pouvez avoir besoin de recompiler le code d’EMC2 pour diverses raisons. Vous pouvez avoir à modifier le code source, ou vous pouvez avoir seulement téléchargé quelques nouveaux fichiers. Pour recompiler, tapez les commandes suivantes:
$ cd ~/emc2/src
Le processus de compilation est suffisamment performant pour ne recompiler que ce qui est affecté par vos changements.
Ce test est le premier test à effectuer sur un PC pour savoir si celui-ci est capable de piloter une machine CNC.
Le temps de latence est le temps nécessaire au PC pour arrêter ce qu’il est en train de faire pour répondre à une requête externe. Dans notre cas, la requête est l’horloge qui sert de référence pour les impulsions de pas. Plus la latence est basse, plus l’horloge pourra être rapide et donc, plus rapides et plus douces seront les impulsions de pas.
Le temps de latence est beaucoup plus important que la vitesse du P. Un vieux Pentium III qui répond aux interruptions avec 10 microsecondes entre chacune peut donner de meilleurs résultats qu’un rapide P4 en Hyperthreading.
Le CPU n’est pas le seul facteur déterminant le temps de latence. Les cartes mères, les cartes vidéo, les ports USB et de nombreuses autres choses peuvent détériorer le temps de latence.
Faire générer les impulsions de pas au logiciel présente un grand avantage, c’est gratuit. Quasiment chaque PC dispose d’un port parallèle capable de sortir sur ses broches les signaux de pas générés par le logiciel. Cependant, les générateurs d’impulsions logiciels ont aussi quelques inconvénients:
La seule façon de savoir ce qu’il en est sur votre PC est de lancer un test de latence de HAL. Pour exécuter ce test, il suffit devriez voir quelque chose comme ceci:
.
Pendant que le test est en cours d’exécution, il faut øg abuser de l’ordinateur. Déplacez les fenêtres sur l'écran. Connectez vous à l’Internet. Copiez quelques gros fichiers sur le disque dur. Jouer de la musique. Lancez une démo OpenGL telle que que le temps de latence soit mesuré dans le pire des cas. {textbf{Ne pas exécuter EMC2 ou Stepconf pendant que latency-test est en cours d’exécution.}}Le chiffre {textbf{max jitter}}dans cet exemple est de 17894 nanosecondes, soit 17.9 microsecondes. Enregistrer ce chiffre et entrez le dans Stepconf quand il le demande.
Dans cet exemple de test de latence il n’a fallu que quelques secondes pour afficher cette valeur. Vous devrez peut être lancer le test pendant plusieurs minutes. Parfois même, dans le pire des cas, rien ne provoque de latence ou seulement des actions particulières. Par exemple, une carte mère Intel marchait très bien la plupart du temps, mais toutes les 64 secondes elle avait une très mauvaise latence de 300s. Heureusement, il existe un correctif (voir Fixing Dapper SMI Issues http://wiki.linuxcnc.org/cgi-bin/emcinfo.pl?FixingDapperSMIIssues)
Alors, que signifient les résultats ? Si le résultat de votre Max Jitter est en dessous d’environ 15-20 microsecondes (15000-20000 nanosecondes), l’ordinateur pourra donner d’excellents résultats avec la génération logicielle des pas. Si le temps de latence est à plus de 30-50 microsecondes, vous aurez de bons résultats, mais la vitesse maximum sera un peu décevante, spécialement si vous utilisez des micropas ou si le pas de votre vis est fin. Si les résultats sont de 100uS ou plus (100,000 nanosecondes), alors le PC n’est pas un bon candidat à la génération des pas. Les résultats supérieurs à 1 milliseconde (1,000,000 nanosecondes) éliminent, dans tous les cas, ce PC pour faire tourner EMC, en utilisant des micropas ou pas.
Notez que si vous obtenez une latence élevée, il peut être possible de l’améliorer. Un PC avait une très mauvaise latence (plusieurs millisecondes) en utilisant la carte graphique interne. Un carte graphique Matrox d’occasion à $5US a résolu le problème. EMC n’exige pas de matériel de pointe.
Pour ceux qui construisent leur matériel, il est facile et économique d’augmenter le nombre d’entrées sorties d’un PC en lui ajoutant une carte PCI fournissant un ou deux ports parallèles supplémentaires. Faire suivre ces ports d’une couche d’opto-isolation est utile pour éviter les courts circuits pouvant détruire la carte, voir même toute la carte mère. EMC2 supporte un maximum de 8 ports parallèles.
Certaines parmis les bonnes cartes parallèles sont à base de chipset Netmos. Elles fournissent un signal +5V bien propre, elles sont fournies avec un ou deux ports parallèles.
Pour trouver les adresses d’entrées/sorties de ces cartes, ouvrir une console et utiliser la commande en ligne:
lspci -v
Rechercher ensuite dans la liste de matériel fournie, le nom du chipset de la nouvelle carte, dans cette exemple c’est l’entrée NetMos Technologypour une carte à deux ports:
0000:01:0a.0 Communication controller: Netmos Technology PCI 9815 Multi-I/O Controller (rev 01)
Subsystem: LSI Losgic / Symbios Logic 2POS (2 port parallel adapter)
Flags: medium devsel, IRQ 5 I/O ports at b800 {[}size=8{]} I/O ports at bc00 {[}size=8{]} I/O ports at c000 {[}size=8{]} I/O ports at c400 {[}size=8{]} I/O ports at c800 {[}size=8{]} I/O ports at cc00 {[}size=16{]}
Après expérimentation, il se trouve que le premier port (incorporé à la carte) utilise la troisième adresse de la liste (c000) et le deuxième port (racccordé par un ruban) utilise la première adresse (b800).
Il est alors possible d’ouvrir dans l'éditeur le fichier .hal de la machine et d’insérer l’adresse trouvée à l’endroit approprié.
loadrt hal\_parport cfg=0x378 0xc000
Noter la présence des guillemets () encadrant les deux adresses, ils sont obligatoires dès qu’il y a plus d’une carte.
Il est nécessaire également d’ajouter les fonctions de lecture (read) et d'écriture (write) pour la nouvelle carte. Par exemple,
addf parport.1.read base-thread 1
addf parport.1.write base-thread -1
Noter que les valeurs peuvent être différentes de celles de cet exemple. Les cartes Netmos sont Plug-N-Play, elles peuvent donc changer leur adressage selon le connecteur PCI dans lequel elles sont placées. Si vous modifiez l’installation des cartes PCI de votre machine, n’oubliez pas de vérifier leurs adresses avant de lancer EMC.
EMC est entièrement configuré avec des fichiers textes classiques. Tous ces fichiers peuvent être lus et modifiés dans n’importe quel éditeur de texte disponible dans toute distribution Linux[6] . Soyez prudent lorsque vous modifierez ces fichiers, certaines erreurs pourraient empêcher le démarrage d’EMC. Ces fichiers sont lus à chaque fois que le logiciel démarre. Certains d’entre eux sont lus de nombreuses fois pendant l’exécution d’CNC.
Les fichiers de configuration inclus:
emcrc::
(((.emcrc))) Ce fichier enregistre des informations spécifiques à l'utilisateur, il a été créé pour enregistrer le nom du répertoire lorsque l'utilisateur choisit sa première configuration d'EMC.footnote:[Habituellement, ce fichier est dans le répertoire home de l'utilisateur (ex: /home/user/ ) ]
Les éléments avec le repère (hal) sont utilisés seulement pour les fichiers de HAL en exemples. C’est une bonne convention. D’autres éléments sont utilisés directement par EMC et doivent toujours avoir la section et le nom donné à l’item.
Un fichier INI typique suit une organisation simple;
Chacun de ces éléments est séparé, sur une seule ligne. Chaque fin de ligne ou retour chariot crée un nouvel élément.
Une ligne de commentaires débute avec un ; ou un #. Si le logiciel qui analyse le fichier ini rencontre l’un ou l’autre de ces caractères, le reste de la ligne est ignorée. Les commentaires peuvent être utilisés pour décrire ce que font les éléments du fichier INI.
; Ceci est le fichier de configuration de ma petite fraiseuse.
Des commentaires peuvent également être utilisés pour choisir entre plusieurs valeurs d’une seule variable.
# DISPLAY = tkemc
Dans cette liste, la variable DISPLAY est positionnée sur axis puisque toutes les autres sont commentées. Si quelqu’un édite une liste comme celle-ci et par erreur, décommente deux lignes, c’est la première rencontrée qui sera utilisée.
Notez que dans une ligne de variables, les caractères `
#” et `
`;`” n’indiquent pas un commentaire.
INCORRECT = value # and a comment
Les différentes parties d’un fichier .ini sont regroupées dans des sections. Une section commence par son nom en majuscules entre crochets [UNE_SECTION]. L’ordre des sections est sans importance. Les sections suivantes sont utilisées par emc:
Une ligne de variables est composée d’un nom de variable, du signe égal (=) et d’une valeur. Tout, du premier caractère non blanc qui suit le signe = jusqu'à la fin de la ligne, est passé comme valeur à la variable. Vous pouvez donc intercaler des espaces entre les symboles si besoin. Un nom de variable est souvent appelé un mot clé.
Les paragraphes suivants détaillent chaque section du fichier de configuration, en utilisant des exemples de variables dans les lignes de configuration.
Certaines de ces variables sont utilisées par EMC. Elles doivent toujours utiliser le nom de section et le nom de variable dans leur appellation. D’autres variables ne sont utilisées que par HAL. Les noms des sections et les noms des variables indiquées sont celles qui sont utilisées dans les exemples de fichiers de configuration.
Les différentes interfaces du programme utilisent différentes options. Toutes les options ne sont pas supportées par toutes les interfaces.
DISPLAY = tkemc Le nom de l’interface utilisateur à utiliser. Les options disponibles sont les suivantes:
xemc
core_stepper.hal
) et un qui spécifie le brochage des sorties
(xxx_pinout.hal
)
La section [TRAJ] contient les paramètres généraux du module planificateur de trajectoires d' EMCMOT. Vous n’aurez pas à modifier ces valeurs si vous utilisez EMC avec une machine à trois axes en provenance des USA. Si vous êtes dans une zone métrique, utilisant des éléments matériels métriques, vous pourrez utiliser le fichier stepper_mm.ini dans lequel les valeurs sont déjà configurées dans cette unité.
Attention : NO_FORCE_HOMING mise à 1 permettra à la machine de franchir les limites logicielles pendant les mouvements ce qui n’est pas souhaîtable pour un fonctionnement normal!
Les sections [AXIS_0], [AXIS_1], etc. contiennent les paramètres généraux des composants individuels du module de contrôle. La numérotation des sections axis commencent à 0 et vont jusqu’au nombre d’axes spécifié dans la variable [TRAJ] AXES, moins 1.
Fichier dans lequel est enregistrée une structure de compensation spécifique à cet axe. Les valeurs internes sont des triplets représentant les positions suivantes:
La position nominale est celle où devrait être le mobile. La position en marche positive signifie, où se trouve le mobile pendant le déplacement dans le sens positif. La position en marche négative signifie, où se trouve le mobile pendant le déplacement dans le sens négatif. Un triplet par ligne. Actuellement la limite d’EMC2 est de 256 triplets par axe. Si COMP_FILE est spécifié, BACKLASH est ignoré. Les valeurs sont en unités machine.
Exemple de triplet avec COMP_FILE_TYPE = 0: 1.00 1.01 0.99.
Le même exemple de triplet avec COMP_FILE_TYPE = 1: 1.00 -0.01 0.01
Les paramètres suivants sont relatifs aux prises d’origine, pour plus d’informations, lire le chapitre sur la POM. [sec:Prises-d-origine]
Les entrées suivantes concernent les systèmes à servomoteurs, comme la carte du système univstep de Pico Systems.[7] Cette description suppose que les unités en sortie du composant PID sont des Volts.
(hal) Ces deux valeurs sont, l'échelle et le facteur d’offset de l’ampli moteur de cet axe. La seconde valeur (offset) est soustraite de la valeur de sortie calculée (en Volts) puis divisée par la première valeur (facteur d'échelle), avant d'être écrite dans le convertisseur D/A. Les unités du facteur d'échelle sont des Volts réels par Volts en sortie de DAC. Les unités de la valeur d’offset sont en Volts. Ces valeurs peuvent être utilisées pour linéariser un DAC. Plus précisément, quand les sorties sont écrites, EMC converti d’abord les unités quasi-SI des sorties concernées en valeurs brutes, exemple: Volts pour un amplificateur DAC. Cette mise à l'échelle ressemble à cela: La valeur d'échelle peut être obtenue par analyse des unités, exemple: les unités sont [unités SI en sortie]/[unités de l’actuateur]. Par exemple, sur une machine sur laquelle une tension de consigne de l’ampli de 1 Volt donne une vitesse de 250 mm/sec : volt}]] Notez que les unités d’offset sont en unités machine, exemple: mm/sec et qu’elles sont déjà soustraites depuis la sonde de lecture. La valeur de cet offset est obtenue en prenant la valeur de votre sortie qui donne 0,0 sur la sortie de l’actuateur. Si le DAC est linéarisé, cet offset est normallement de 0.0. L'échelle et l’offset peuvent être utilisés pour linéariser les DAC, d’où des valeurs qui reflètent les effets combinés du gain de l’ampli, de la non linéarité du DAC, des unités du DAC, etc. Pour ce faire, suivez cette procédure:
Raw (brutes) | Mesurées |
---|---|
-10 | -9.93 |
-9 | -8.83 |
0 | -0.03 |
1 | 0.96 |
9 | 9.87 |
10 | 10.87 |
[6] Ne confondez pas un éditeur de texte et un traitement de texte. Un éditeur de texte comme gedit ou kwrite produisent des fichiers uniquement en texte. Les lignes de textes sont séparées les unes des autres. Un traitement de texte comme Open Office produit des fichiers avec des paragraphes, des mises en formes des mots. Ils ajoutent des codes de contrôles, des polices de formes et de tailles variées etc. Un éditeur de texte n’a rien de tout cela.
[7] Référez vous au “Manuel de l’intégrateur d’EMC2” pour des informations complémentaires sur les systèmes à servomoteurs et leur contrôle en PID.
La prise d’origine semble assez simple, il suffit de déplacer chaque axe à un emplacement connu et de positionner l’ensemble des variables internes d’EMC en conséquence. Toutefois, les machines sont différentes les unes des autres et la prise d’origine est maintenant devenue assez complexe.
La figure [fig: Sequences de prise d-origine] montre les quatre séquences de prise d’origine possibles, avec les variables de configuration associées [cap:Variables sequences de POM]. Une description détaillée de ces paramètres sera faite au chapitre suivant.
Il y a six combinaisons possibles des variables qui définissent le déroulement de la séquence de prise d’origine. EIles sont définies dans la section [AXIS] du fichier ini.
SEARCH_VEL | LATCH_VEL | USE_INDEX | Type de séquence |
---|---|---|---|
nonzero | nonzero | NO | Switch-seulement |
nonzero | nonzero | YES | Switch + Index |
0 | nonzero | YES | Index-seulement |
0 | 0 | NO | Aucun |
Autres combinaisons | Erreur |
Combinaisons des variables de la POM. Vitesse de la phase initiale de prise d’origine, c’est la recherche du contact d’origine machine. Une valeur différente de zéro indique à EMC la présence d’un contact d’origine machine. EMC va alors commencer par vérifier si ce contact est déjà pressé. Si oui, il le dégagera à la vitesse établie par “HOME_SEARCH_VEL”, la direction du dégagement sera de signe opposé à celui de “HOME_SEARCH_VEL”. Puis, il va revenir vers le contact en se déplaçant dans la direction spécifiée par le signe de “HOME_SEARCH_VEL” et à la vitesse déterminée par sa valeur absolue. Quand le contact d’origine machine est détecté, le mobile s’arrête aussi vite que possible, il y aura cependant toujours un certain dépassement dépendant de la vitesse. Si celle-ci est trop élevée, le mobile peut dépasser suffisamment le contact pour aller attaquer un fin de course de limite d’axe, voir même aller se crasher dans une butée mécanique. À l’opposé, si “HOME_SEARCH_VEL” est trop basse, la prise d’origine peut durer très longtemps.
Une valeur égale à zéro indique qu’il n’y a pas de contact d’origine machine, dans ce cas, les phases de recherche de ce contact seront occultées. La valeur par défaut est zéro.
Spécifie la vitesse et la direction utilisée par le mobile pendant la dernière phase de la prise d’origine, c’est la recherche précise du contact d’origine machine, si il existe et de l’emplacement de l’impulsion d’index, si elle est présente. Cette vitesse est plus lente que celle de la phase initiale, afin d’améliorer la précision. Si “HOME_SEARCH_VEL” et “HOME_LATCH_VEL” sont de mêmes signes, la phase de recherche précise s’effectuera dans le même sens que la phase de recherche initiale. Dans ce cas, le mobile dégagera d’abord le contact en sens inverse avant de revenir vers lui à la vitesse définie ici. L’acquisition de la position d’origine se fera sur la première impulsion de changement d'état du contact. Si “HOME_SEARCH_VEL” et “HOME_LATCH_VEL” sont de signes opposés, la phase de recherche précise s’effectuera dans le sens opposé à celui de la recherche initiale. Dans ce cas, EMC dégagera le contact à la vitesse définie ici. L’acquisition de la position d’origine se fera sur la première impulsion de changement d'état du contact lors de son dégagement. Si “HOME_SEARCH_VEL” est à zéro, signifiant qu’il n’y a pas de contact et que “HOME_LATCH_VEL” et différente de zéro, le mobile continuera jusqu'à la prochaine impulsion d’index. Si “HOME_SEARCH_VEL” est différent de zéro et que “HOME_LATCH_VEL” est égal à zéro, c’est une cause d’erreur, l’opération de prise d’origine échouera. La valeur par défaut est zéro.
Peut contenir les valeurs YES ou NO. Cette variable détermine si EMC doit ignorer les fins de course de limites d’axe. Certaines machines n’utilisent pas un contact d’origine séparé, à la place, elles utilisent un des interrupteurs de fin de course comme contact d’origine. Dans ce cas, EMC doit ignorer l’activation de cette limite de course pendant la séquence de prise d’origine. La valeur par défaut de ce paramètre est NO.
Spécifie si une impulsion d’index doit être prise en compte (cas de règles de mesure ou de codeurs de positions). Si cette variable est vraie (HOME_USE_INDEX = YES), EMC fera l’acquisition de l’origine machine sur le premier front de l’impulsion d’index. Si elle est fausse (=NO), EMC fera l’acquisition de l’origine sur le premier front produit par le contact d’origine (dépendra des signes de “HOME_SEARCH_VEL” et “HOME_LATCH_VEL”). La valeur par défaut est NO.
Contient l’emplacement du point d’origine ou de l’impulsion d’index, en coordonnées relatives. Il peut aussi être traité comme le décalage entre le point d’origine machine et le zéro de l’axe. A la détection de l’impulsion d’origine, EMC ajuste les coordonnées de l’axe à la valeur de “HOME_OFFSET”. La valeur par défaut est zéro.
C’est la position sur laquelle ira le mobile à la fin de la séquence de prise d’origine. Après avoir détecté le contact d’origine, avoir ajusté les coordonnées de ce point à la valeur de “HOME_OFFSET”, le mobile va se déplacer sur la valeur de “HOME, c’est le point final de la séquence de prise d’origine. La valeur par défaut est zéro. Notez que même si ce paramètre est égal à la valeur de “HOME_OFFSET”, le mobile dépassera très légérement la position du point d’aquisition de l’origine machine avant de s’arrêter. Donc il y aura toujours un petit mouvement à ce moment là (sauf bien sûr si “HOME_SEARCH_VEL” est à zéro, et que toute la séquence de POM a été sautée). Ce mouvement final s’effectue en vitesse de déplacement rapide. Puisque l’axe est maintenant référencé, il n’y a plus de risque pour la machine, un mouvement rapide est donc la façon la plus rapide de finir la séquence de prise d’origine.[8]
Si cet axe n’a pas un contact d’origine séparé des autres, mais plusieurs contacts câblés sur la même broche, mettez cette valeur à 1 pour éviter de commencer la prise d’origine si un de ces contacts partagés est déjà activé. Mettez cette valeur à 0 pour permettre la prise d’origine même si un contact est déjà attaqué.
Utilisé pour définir l’ordre des séquences “HOME ALL” de prise d’origine des différents axes (exemple: la POM de l’axe X ne pourra se faire qu’après celle de Z). La POM d’un axe ne pourra se faire qu’après tous les autres en ayant la valeur la plus petite de “HOME_SEQUENCE” et après qu’ils soient déjà tous à “HOME_OFFSET”. Si deux axes ont la même valeur de “HOME_SEQUENCE”, leur POM s’effectueront simultanément. Si “HOME_SEQUENCE” est égale à -1 ou non spécifiée, l’axe ne sera pas compris dans la séquence “HOME ALL”. Les valeurs de “HOME_SEQUENCE” débutent à 0, il ne peut pas y avoir de valeur inutilisée.
Quand l’interpréteur d’EMC à été créé, il à été écrit pour les fraiseuses. C’est pourquoi le plan par défaut est le plan XY (G17). Sur un tour standard utilise seulement les axes du plan XZ (G18). Pour changer le plan par défaut d’un tour, mettez la ligne suivante dans la section RS274NGC du fichier ini.
RS274NGC_STARTUP_CODE = G18
[8] La distinction entre l’origine machine et le décalage d’origine n’est pas aussi claire que je le voudrais. J’envisage de faire un petit dessin et un exemple pour la clarifier.
Voir également les man pages motion(9) et iocontrol(1)
Ces pins, paramètres et fonctions sont créés par le module temps réel `“motmod`”.
M52 P1
la vitesse commandée est multipliée par cette valeur. Cet
effet est
multiplicatif avec motion.feed-hold et la valeur du correcteur de
vitesse du niveau NML.
M62
à M65
.
M53 P1
et que ce bit est TRUE, la vitesse est fixée à 0.
Beaucoup de ces paramètres servent d’aide au déboguage et sont sujets aux changements ou au retrait à tout moment.
motion-command-handler.time (s32, RO)
motion-command-handler.tmax (s32, RW)
motion-controller.time (s32, RO)
motion-controller.tmax (s32, RW)
Ces pins et paramètres sont créés par le module temps réel “motmod”
. Ce sont en fait des valeurs d’articulations, mais les pins et les
paramètres sont toujours appelés “axis.N”.footnote:[Dans une machine à
“cinématique triviale”, il y a correspondance une
pour une, entre les articulations et les axes.
NDT: nous utilisons dans cette traduction le terme “axe”, dans le cas d’une cinématique non triviale il devra être remplacé par le terme “articulation” (joint). ] Ils sont lus et mis à jour par la fonction motion-controller.
Beaucoup de ces paramètres servent d’aide au déboguage et sont sujets aux changements ou au retrait à tout moment.
Ces pins sont créées par le contrôleur d’entrées/sorties de l’espace utilisateur, habituellement appelé `“io`”.
Des informations plus détaillées peuvent être trouvées dans la man page en tapant "man halcmd" dans une console. Pour voir la configuration de HAL ainsi que le status de ses pins et paramétres utiliser la fenêtre HAL Configuration dans le menu «Machine» d’AXIS. Pour visualiser le status des pins, ouvrir l’onglet «Watch» puis cliquer dans l’arborescence sur les pins qui doivent être visualisées dans la fenêtre watch.
La commande "loadrt" charge un composant temps réel de HAL. Les composants temps réel doivent être ajoutés au thread temps réel pour être fonctionnels. Il n’est pas possible de charger un composant de l’espace utilisateur dans l’espace temps réel.
Syntaxe et exemple:
*loadrt <composant> <options>*
*loadrt mux4 count=1*
La commande "addf" ajoute une fonction à un thread temps réel. Si l’assistant StepConf a été utilisé pour créer la configuration, deux threads ont été créés.
Syntaxe et exemple:
*addf <composant> <thread>*
*addf mux4 servo-thread*
La commande "loadusr" charge un composant de HAL de l’espace utilisateur. Les programmes de l’espace utilisateur ont leur propre process séparé qui optionellement communique avec les autres composants de HAL via leurs pins et paramètres. Il n’est pas possible de charger un composant temps réel dans l’espace utilisateur.
Les drapeaux peuvent être un ou plusieurs parmis les suivants:
Syntaxe et exemple:
*loadusr <composant> <options>*
*loadusr halui*
*loadusr -Wn spindle gs2_vfd -n spindle*
En anglais ça donne "loadusr wait for name spindle component gs2_vfd name spindle." + Le -n spindle est une partie du composant gs2_vfd et non de la commande loadusr.
La commande "net" crée une "connection" entre un signal et une ou plusieurs pins. Les indicateurs de direction "⇐ et ⇒" sont seulement des aides à la lecture, ils n’ont pas d’autre utilité.
Syntaxe et exemple:
*net <signal-name> <pin-name> <opt-direction> <opt-pin-name>*
*net both-home-y <= parport.0.pin-11-in*
Chaque signal ne peut avoir qu’une seule source (une seule pin de HAL "out”) et autant de «lecteurs» (des pins de HAL "in") que souhaité. Dans la colonne Dir de la fenêtre de configuration de HAL il est possible de voir quelles pins sont "in" et quelles pins sont "out".
Pour faire celà en une ligne:
*net xStep stepgen.0.out => parport.0.pin-02-out parport.0.pin-08-out*
Ou pour le faire en plusieurs lignes, utiliser simplement le signal avec les lecteurs des lignes suivantes:
*net xStep stepgen.0.out => parport.0.pin-02-out + net xStep => parport.0.pin-02-out*
Les pins appelées I/O pins comme «index-enable», ne suivent pas cette règle.
La commande "setp" ajuste la valeur d’une pin ou d’un paramètre. Les valeurs valides dépendront du type de la pin ou du paramètre.
Pour des informations sur les flottants voir ici (en anglais):
http://en.wikipedia.org/wiki/Floating_point
Les paramètres peuvent être positionnés avant utilisation ou pendant l’utilisation, toutefois certains composants ont des paramètres qui doivent être positionnés avant utilisation. Il n’est pas possible d’utiliser «setp» sur une pin connectée à un signal.
Syntaxe et exemple:
*setp <pin/parameter-name> <value>*
*setp paraport.0.pin-08-out TRUE*
The command "linksp" creates a "connection" between a signal and one pin.
Syntaxe et exemple:
*linksp <signal-name> <pin-name>*
*linksp X-step parport.0.pin-02-out*
La commande "linksp" a été incluse dans la commande "net".
The command "linkps" creates a "connection" between one pin and one signal. It is the same as linksp but the arguments are reversed.
Syntaxe et exemple:
*linkps <pin-name> <signal-name>*
*linkps parport.0.pin-02-out X-Step*
La commande "linkps" a été incluse dans la commande "net".
The command "unlinkp" unlinks a pin from the connected signal. If no signal was connected to the pin prior running the command, nothing happens.
Syntaxe et exemple:
*unlinkp <pin-name>*
*unlinkp parport.0.pin-02-out*
the command "newsig" creates a new HAL signal by the name <signame> and the data type of <type>. Type must be "bit", "s32", "u32" or "float". Error if <signame> all ready exists.
Syntaxe et exemple:
*newsig <signame> <type>*
*newsig Xstep bit*
D’autres informations peuvent être trouvées dans le manuel de HAL ou la man page de «halrun».
Si l’assistant StepConf a été utilisé pour générer la configuration trois fichiers HAL ont dû être créés dans le répertoire de la configuration.
Hal contient plusieurs composants logiques temps réel. Les composants logiques suivent une tables de vérité montrant les états logiques des sorties en fonction de l'état des entrées. Typiquement, la manipulation des bits d’entrée détermine l'état électrique des sorties selon la table de vérité des portes.
Le composant "and2" est une porte "and" à deux entrées. Sa table de vérité montre la sortie pour chaque combinaison des entrées.
Syntaxe
*and2 [count=N|names=name1[,name2...]]*
Fonctions
and2.n
Pins
and2.N.in0 (bit, in) + and2.N.in1 (bit, in) + and2.N.out (bit, out)
Table de vérité
in0 | in1 | out |
---|---|---|
False | False | False |
True | False | False |
False | True | False |
True | True | True |
Le composant "not" est un simple inverseur d'état.
Syntaxe
*not [count=n|names=name1[,name2...]]*
Fonctions
not.all + not.n
Pins
not.n.in (bit, in) + not.n.out (bit, out)
Table de vérité
in | out |
---|---|
True | False |
False | True |
Le composant "or2" est une porte OR à deux entrées.
Syntaxe
*or2[count=,|names=name1[,name2...]]*
Fonctions
or2.n
Pins
or2.n.in0 (bit, in) + or2.n.in1 (bit, in) + or2.n.out (bit, out)
Table de vérité
in0 | in1 | out |
---|---|---|
True | False | True |
True | True | True |
False | True | True |
False | False | False |
Le composant "xor2" est une porte XOR à deux entrées (OU exclusif).
Syntaxe
*xor2[count=,|names=name1[,name2...]]*
Fonctions
xor2.n
Pins
xor2.n.in0 (bit, in) + xor2.n.in1 (bit, in) + xor2.n.out (bit, out)
Table de vérité
in0 | in1 | out |
---|---|---|
True | False | True |
True | True | False |
False | True | True |
False | False | False |
Un exemple de connection avec un "and2", deux entrées vers une sortie.
*loadrt and2 count=1 + addf and2.0 servo-thread + net my-sigin1 and2.0.in0 <= parport.0.pin-11-in + net my-sigin2 and2.0.in.1 <= parport.0.pin-12-in + net both-on parport.0.pin-14-out <= and2.0.out*
Dans cet exemple un and2 est chargé dans l’espace temps réel, puis ajouté à servo thread. Ensuite la broche d’entrée 11 du port parallèle est connectée à l’entrée in0 de la porte. Puis la broche d’entrée 12 du port est connectée à l’entrée in1 de la porte. Enfin la sortie and2.0.out de la porte est connectée à la broche de sortie 14 du port parallèle. Ainsi en suivant la table de vérité du and2, si les broches 11 et 12 du port sont à 1, alors sa sortie 14 est à 1 aussi.
Le script halshow peut vous aider à retrouver votre chemin dans un HAL en fonctionnement. Il s’agit d’un système très spécialisé qui doit se connecter à un HAL en marche. Il ne peut pas fonctionner seul car il repose sur la capacité de HAL de rapporter ce qu’il connaît de lui même par la librairie d’interface de halcmd. Chaque fois que halshow fonctionne avec une configuration d’EMC différente, il sera différent.
Comme nous le verrons bientôt, cette capacité de HAL de se documenter lui même est un des facteurs clés pour arriver à un système CNC optimum.
On peut accéder à Halshow depuis Axis, pour cela, aller dans le menu “Machine” puis choisir “Afficher la configuration de HAL”.
La gauche de l'écran que montre la figure [cap:-Fentre-Halshow] est une arborescence, un peu comme vous pouvez le voir avec certains navigateurs de fichiers. Sur la droite, une zone avec deux onglets: MONTRER et WATCH.
L’arborescence montre toutes les parties principales de HAL. En face de chacune d’entre elles, se trouve un petit signe + ou - dans une case. Cliquer sur le signe plus pour déployer cette partie de l’arborescence et affichera son contenu. Si cette case affiche un signe moins, cliquer dessus repliera cette section de l’arborescence.
Il est également possible de déployer et de replier l’arborescence complète depuis le menu “Arborescence”.
En cliquant sur un nom dans l’arborescence plutôt que sur son signe plus ou moins, par exemple le mot “Components”, HAL affichera tout ce qu’il connait du contenu de celui-ci. La figure [cap:-Fentre-Halshow] montre une liste comme celle que vous verrez si vous cliquez sur “Components” avec une carte servo standard m5i20 en fonctionnement. L’affichage des informations est exactement le même que celui des traditionnels outils d’analyse de HAL en mode texte. L’avantage ici, c’est que nous y avons accès d’un clic de souris. Accès qui peut être aussi large ou aussi focalisé que vous le voulez.
Si nous examinons de plus près l’affichage de l’arborescence, nous pouvons voir que les six éléments principaux peuvent tous être déployés d’au moins un niveau. Quand ces niveaux sont à leur tour déployés vous obtenez une information de plus en plus focalisée en cliquant sur le nom des éléments dans l’arborescence. Vous trouverez que certaines hal pins et certains paramètres affichent plusieurs réponses. C’est dû à la nature des routines de recherche dans halcmd lui même. Si vous cherchez une pin, vous pouvez en trouver deux comme cela:
Component Pins:
Le deuxième nom de pin contient le nom complémenté du premier.
Dans le bas de l’onglet Montrer, un champ de saisie permet de jouer sur le fonctionnement de HAL. Les commandes que vous entrez ici et leur effet sur HAL, ne sont pas enregistrés. Elles persisteront tant qu’EMC tournera, mais disparaîtront dès son arrêt.
Le champ de saisie marqué “Tester une commande HAL:” acceptera n’importe quelle commande valide pour halcmd. Elles incluent:
Ce petit éditeur entrera une commande à chaque fois que vous presserez <Entrée> ou que vous cliquerez sur le bouton “Exécuter”. Si une commande y est mal formée, un dialogue d’erreur s’affichera. Si vous n'êtes pas sûr de savoir comment formuler une commande, vous trouverez la réponse dans la documentation de halcmd et des modules spécifiques avec lesquels vous travaillez.
Nous allons utiliser cet éditeur pour ajouter un module différentiel à HAL et le connecter à la position d’un axe pour voir le ratio de changement de position, par exemple, l’accélération. Il faut d’abord charger un module de HAL nommé blocks, l’ajouter au thread servo et le connectet à la pin position d’un axe. Une fois cela fait, nous pourrons retrouver la sortie du différentiateur dans halscope. Alors allons-y. (oui j’ai vérifié).
Ndt: le message qui s’affiche au chargement de blocks ne l’empêche pas de fonctionner.
loadrt blocks ddt=1
Maintenant, regardez dans components, vous devriez y voir blocks.
Loaded HAL Components:
Effectivement, il est là. Dans notre cas l’id est 08. Ensuite nous devons savoir quelles fonctions sont disponibles avec lui, nous regardons dans Functions.
Exported Functions:
Ici, nous cherchons owner #08 et voyons que blocks a exporté une fonction nommée ddt.0. Nous devrions être en mesure d’ajouter ddt.0 au thread servo et il fera ses calculs chaque fois que le thread sera mis à jour. Encore une fois recherchons la commande addf et on voit qu’elle utilise trois arguments comme cela:
addf <functname> <threadname> [<position>]
Nous connaissons déjà functname=ddt.0, pour trouver le nom du thread, déployons l’arborescence des Threads. Nous y trouvons deux threads, servo-thread et base-thread. La position de ddt.0 dans le thread n’est pas critique. Passons la commande:
addf ddt.0 servo-thread
Comme c’est juste pour visualiser, nous laissons la position en blanc pour obtenir la dernière position dans le thread. La figure [cap:-Commande-addf] montre l'état de halshow après que cette commande a été exécutée.
Ensuite, nous devons connecter ce block à quelque chose. Mais comment savoir quelles pins sont disponibles? La réponse se trouve dans l’arbre, en regardant sous Pins. On y trouve ddt et on voit:
Component Pins:
Cela semble assez facile à comprendre, mais à quel signal ou pin voulons-nous nous connecter, ça pourrait être une pin d’axe, une pin de stepgen, ou un signal. On vois cela en regardant dans axis.0.
Component Pins:
Donc, il semble que Xpos-cmd devrait être un bon signal à utiliser. Retour à l'éditeur et entrons la commande suivante:
linksp Xpos-cmd ddt.0.in
Maintenant si on regarde le signal Xpos-cmd dans l’arbre, on voit ce qu’on a fait.
Signals:
Nous voyons que ce signal provient de axis.0.motor-pos-cmd et va, à la fois, sur ddt.0.in et sur stepgen.0.position-cmd. En connectant notre block au signal nous avons évité les complications avec le flux normal de cette commande de mouvement.
La zone de l’onglet “Montrer” utilise halcmd pour découvrir ce qui se passe à l’intérieur de HAL pendant son fonctionnement. Il vous donne une information complète de ce qu’il découvre. Il met aussi à jour dès qu’une commande est envoyée depuis le petit éditeur pour modifier ce HAL. Il arrive un temps ou vous voulez autre chose d’affiché, sans la totalité des informations disponibles dans cette zone. C’est la grande valeur de l’onglet WATCH d’offrir cela.
En cliquant sur l’onglet WATCH une zone vide s’affichera. Vous pouvez ajouter des signaux et des pins dans cette zone et visualiser leurs valeurs.[9] Vous pouvez ajouter des pins ou des signaux quand l’onglet Watch est ouvert, en cliquant sur leurs noms. La figure [cap:-L-onglet-Watch] Montre cette zone avec plusieurs signaux de type “bit”. Parmis ces signaux, les enable-out pour les trois premiers axes et deux de la branche iocontrol, les signaux “estop”. Notez que les axes ne sont pas activés même si les signaux estop disent qu’EMC n’est pas en estop. Un bref regard sur themc en arrière plan, montre que l'état d’EMC est ESTOP RESET. L’activation des amplis ne deviendra pas vraie tant que la machine ne sera pas mise en marche.
Les cercles de deux couleurs, simili leds, sont toujours bruns foncé quand un signal est faux. Elle sont jaunes quand le signal est vrai. Quand une pin ou un signal est sélectionné mais n’est pas de type bit, sa valeur numérique s’affiche.
Watch permet de visualiser rapidement le résultat de tests sur des contacts ou de voir l’effet d’un changement que vous faites dans EMC en utilisant l’interface graphique. Le taux de rafraîchissement de Watch est un peu trop lent pour visualiser les impulsions de pas d’un moteur mais vous pouvez l’utiliser si vous déplacez un axe très lentement ou par très petits incréments de distance. Si vous avez déjà utilisé IO_Show dans EMC, la page de Watch de halshow peut être réglée pour afficher ce que fait le port parallèle.
[9] Le taux de rafraîchissement de la zone Watch est plus lent que celui de Halmeter ou de Halscope. Si vous avez besoin d’une bonne résolution dans le timming des signaux, ces outils sont plus efficaces.
Ce chapitre décrit quelques uns des réglages les plus fréquents, sur lesquels l’utilisateur aura à agir lors de la mise au point d’EMC2. En raison de l’adaptabilité d’EMC2, il serait très difficile de les documenter tous en gardant ce document relativement concis.
Le système rencontré le plus fréquemment chez les utilisateurs d’EMC2 est un système à moteurs pas à pas. Les interfaces de pilotage de ces moteurs recoivent d’EMC2 des signaux de pas et de direction.
C’est le système le plus simple à mettre en oeuvre parce que les moteurs fonctionnent en boucle ouverte (pas d’information de retour des moteurs), le système nécessite donc d'être configuré correctement pour que les moteurs ne perdent pas de pas et ne calent pas.
Ce chapitre s’appuie sur la configuration fournie d’origine avec EMC2
appelée «stepper» et qui se trouve habituellement dans
/etc/emc2/sample-configs/stepper
.
Avec la génération logicielle des pas la fréquence maximale en sortie, pour les impulsions de pas et de direction, est de une impulsion pour deux BASE_PERIOD. La fréquence de pas maximale accessible pour un axe est le produit de MAX_VELOCITY et de INPUT_SCALE. Si la fréquence demandée est excessive, une erreur de suivi se produira (following error), particulièrement pendant les jog rapides et les mouvements en G0.
Si votre interface de pilotage des moteurs accepte des signaux d’entrée en quadrature, utilisez ce mode. Avec un signal en quadrature, un pas est possible pour chaque BASE_PERIOD, ce qui double la fréquence maximum admissible.
Les autres remèdes consistent à diminuer une ou plusieurs variables: BASE_PERIOD (une valeur trop faible peux causer un bloquage du PC), INPUT_SCALE (s’il est possible sur l’interface de pilotage de sélectionner une taille de pas différente, de changer le rapport des poulies ou le pas de la vis mère), ou enfin MAX_VELOCITY et STEPGEN_MAXVEL.
Si aucune combinaison entre BASE_PERIOD, INPUT_SCALE et MAX_VELOCITY n’est fonctionnelle, il faut alors envisager un générateur de pas externe (parmis les contrôleurs de moteurs pas à pas universels supportés par EMC2)
EMC2 est très flexible et grâce à la couche d’abstraction de HAL (Hardware Abstraction Layer) il est facile de spécifier que tel signal ira sur telle broche. (voir la section ??? pour des informations complètes à propos de HAL.
Comme décrit dans l’introduction et la manuel de HAL, il comporte des composants dont il fourni les signaux, les pins et les paramètres.
Les premiers signaux et pin relatifs au brochage sont[10]:
signaux: Xstep, Xdir et Xen
Pour configurer le fichier ini, il est possible de choisir entre les deux brochages les plus fréquents, devenus des standards de fait, le brochage standard_pinout.hal ou le brochage xylotex_pinout.hal. Ces deux fichiers indiquent à HAL comment raccorder les différents signaux aux différentes pins. Dans la suite, nous nous concentrerons sur le brochage «standard_pinout.hal».
Ce fichier contient certaines commandes de HAL et habituellement ressemble à celà:
# standard pinout config file for 3-axis steppers # using a parport for I/O # # first load the parport driver loadrt hal_parport cfg="0x0378" # # next connect the parport functions to threads # read inputs first addf parport.0.read base-thread 1 # write outputs last addf parport.0.write base-thread -1 # # finally connect physical pins to the signals net Xstep => parport.0.pin-03-out net Xdir => parport.0.pin-02-out net Ystep => parport.0.pin-05-out net Ydir => parport.0.pin-04-out net Zstep => parport.0.pin-07-out net Zdir => parport.0.pin-06-out # create a signal for the estop loopback net estop-loop iocontrol.0.user-enable-out iocontrol.0.emc-enable-in # create signals for tool loading loopback net tool-prep-loop iocontrol.0.tool-prepare iocontrol.0.tool-prepared net tool-change-loop iocontrol.0.tool-change iocontrol.0.tool-changed # connect "spindle on" motion controller pin to a physical pin net spindle-on motion.spindle-on => parport.0.pin-09-out ### ### You might use something like this to enable chopper drives when machine ON ### the Xen signal is defined in core_stepper.hal ### # net Xen => parport.0.pin-01-out ### ### If you want active low for this pin, invert it like this: ### # setp parport.0.pin-01-out-invert 1 ### ### A sample home switch on the X axis (axis 0). make a signal, ### link the incoming parport pin to the signal, then link the signal ### to EMC's axis 0 home switch input pin ### # net Xhome parport.0.pin-10-in => axis.0.home-sw-in ### ### Shared home switches all on one parallel port pin? ### that's ok, hook the same signal to all the axes, but be sure to ### set HOME_IS_SHARED and HOME_SEQUENCE in the ini file. See the ### user manual! ### # net homeswitches <= parport.0.pin-10-in # net homeswitches => axis.0.home-sw-in # net homeswitches => axis.1.home-sw-in # net homeswitches => axis.2.home-sw-in ### ### Sample separate limit switches on the X axis (axis 0) ### # net X-neg-limit parport.0.pin-11-in => axis.0.neg-lim-sw-in # net X-pos-limit parport.0.pin-12-in => axis.0.pos-lim-sw-in ### ### Just like the shared home switches example, you can wire together ### limit switches. Beware if you hit one, EMC will stop but can't tell ### you which switch/axis has faulted. Use caution when recovering from this. ### # net Xlimits parport.0.pin-13-in => axis.0.neg-lim-sw-in axis.0.pos-lim-sw-in
Les lignes commençant par # sont des commentaires, aidant à la lecture du fichier.
Voici les opérations qui sont exécutées quand le fichier standard_pinout.hal est lu par l’interpréteur:
Pour modifier le fichier standard_pinout.hal, il suffit de l’ouvrir dans un éditeur de texte puis d’y localiser les parties à modifier.
Si vous voulez par exemple, modifier les broches de pas et de direction de l’axe X, il vous suffit de modifier le numéro de la variable nommée parport.0.pin-XX-out:
linksp Xstep parport.0.pin-03-out
peut être modifiée pour devenir:
linksp Xstep parport.0.pin-02-out
ou de manière générale n’importe quel numéro que vous souaîteriez.
Attention: il faut être certain de n’avoir qu’un seul signal connecté à une broche.
Si une interface attends un signal “actif bas”, ajouter une ligne avec
le paramètre d’inversion de la sortie, -invert
. Par exemple, pour
inverser le signal de rotation de la broche:
setp parport.0.pin-09-invert TRUE
Si votre vitesse de broche peut être contrôlée par un signal de PWM,
utilisez le composant «pwmgen»
pour créer ce signal:
loadrt pwmgen output_type=0
Ce qui donnera le fonctionnement suivant, pour un signal PWM à: 0%
donnera une vitesse de 0tr/mn, 10% une vitesse de 180tr/mn, etc. Si un
signal PWM supérieur à 0% est requis pour que la broche commence à
tourner, suivez l’exemple du fichier de configuration nist-lathe qui
utilise un composant d'échelle (scale
).
Certains pilotes de moteurs requiert un signal de validation «enable» avant d’autoriser tout mouvement du moteur. Pour celà des signaux sont déjà définis et appelés Xen, Yen, Zen.
Pour les connecter vous pouvez utilisez l’exemple suivant:
linksp Xen parport.0.pin-08-out
Il est possible d’avoir une seule pin de validation pour l’ensemble des pilotes, ou plusieurs selon la configuration que vous voulez. Notez toutefois qu’habituellement quand un axe est en défaut, tous les autres sont invalidés aussi de sorte que, n’avoir qu’un seul signal/pin de validation pour l’ensemble est parfaitement sécurisé.
Comme vous pouvez le voir à la section [sub:standard_pinout.hal], par défaut la configuration standard n’utilise pas de bouton d’Arrêt d’Urgence externe. [12]
Pour ajouter un simple bouton externe (ou plusieurs en série) vous devez compléter les lignes suivantes:
# create a signal for the estop loopback net estop-loop iocontrol.0.user-enable-out iocontrol.0.emc-enable-in
avec
net estop-out <= iocontrol.0.user-enable-out net estop-ext <= parport.0.pin-01-in net estop-ext => iocontrol.0.emc-enable-in
Ce qui implique qu’un bouton d’Arrêt d’Urgence soit connecté sur la broche 01 du port parallèle. Tant que le bouton est enfoncé (le contact ouvert)[13], EMC2 restera dans l'état «Arrêt d’Urgence» (ESTOP). Quand le bouton externe sera relâché, EMC2 passera immédiatement dans l'état «Arrêt d’Urgence Relâché» (ESTOP-RESET) vous pourrez ensuite mettre la machine en marche en pressant le bouton «Marche machine» et vous êtes alors prêt à continuer votre travail avec EMC2.
[10] Note: pour rester concis, nous ne présenterons qu’un seul axe, tous les autres sont similaires.
[11] Le thread le plus rapide parmis les réglages d’EMC2, habituellement il n’y a que quelques microsecondes entre les exécutions de ce code.
[12] Une explication complète sur la manière de gérer les circuiteries d’Arrêt d’Urgence se trouve sur le wiki.linuxcnc.org (en) et dans le Manuel de l’intégrateur
[13] Utiliser exclusivement des contacts normalement fermés pour les A/U.
Certaines de ces descriptions sont plus approfondies dans leurs pages man. Certaines auront juste une description limitée. Chaque composant a sa page man. A partir de cette liste vous connaîtrez quels composants existent avec le nom et le N° de leur page man permettant d’avoir plus de détails. Par exemple dans une fenêtre de terminal tapez `man 1 axis `pour accéder aux informations de cette page man.
Certaines de ces descriptions sont plus approfondies dans leur man page. Certaines auront juste une description limitée. Chaque composant a sa man page. A partir de cette liste vous connaîtrez quels composants existent avec le nom et le N° de leur man page permettant d’avoir plus de détails.
En cours de construction.
Tous ces exemples impliquent la disponibilité de deux “threads base” et de “servo-thread”.
La plupart des composants ont leurs pages de manuel, style *nix. Pour afficher ces “man pages” pour les composants temps réel, taper dans un terminal “man 9 'nomducomposant'”.
Le présent document se concentre sur les composants les plus complexes qui demandent des figures difficiles à reproduire dans une man page.
Ce composant fournit un générateur logiciel d’impulsions de pas répondant aux commandes de position ou de vitesse. En mode position, il contient une boucle de position pré-réglée, de sorte que les réglages de PID ne sont pas nécessaires. En mode vitesse, il pilote un moteur à la vitesse commandée, tout en obéissant aux limites de vitesse et d’accélération. C’est un composant uniquement temps réel, dépendant de plusieurs facteurs comme la vitesse du CPU, etc, il est capable de fournir des fréquences de pas maximum comprisent entre 10kHz et 50kHz. La figure [fig:Diagramme-bloc-stepgen] montre trois schémas fonctionnels, chacun est un simple générateur d’impulsions de pas. Le premier diagramme est pour le type 0, (pas et direction). Le second est pour le type 1 (up/down, ou pseudo-PWM) et le troisième est pour les types 2 jusqu'à 14 (les différentes séquences de pas). Les deux premiers diagrammes montrent le mode de commande position et le troisième montre le mode vitesse. Le mode de commande et le type de pas, se réglent indépendamment et n’importe quelle combinaison peut être choisie.
emc2$
<type-array>
est une série d’entiers décimaux séparés par des
virgules. Chaque
chiffre provoquera le chargement d’un simple générateur d’impulsions de
pas, la valeur de ce chiffre déterminera le type de pas.
<ctrl_array>
est une série de lettres “p`” ou “`v
” séparées par
des virgules, qui spécifient le mode pas ou le mode
vitesse. ctrl_type
est optionnel, si il est omis, tous les
générateurs de pas seront en
mode position. Par exemple, la commande:
emc2#
va installer trois générateurs de pas. Les deux premiers utilisent le
type de pas 0 (pas et direction) et fonctionnent en mode position. Le
dernier utilise le type de pas 2 (quadrature) et fonctionne en mode
vitesse. La valeur par défaut de <config-array>
est “0,0,0”
qui va
installer trois générateurs de type 0 (step/dir). Le nombre
maximum de générateurs de pas est de 8 (comme définit par MAX_CHAN dans
stepgen.c). Chaque générateur est indépendant, mais tous sont
actualisés par la même fonction(s), au même instant. Dans les
descriptions qui suivent, <chan>
est le nombre de générateurs
spécifiques. La numérotation des
générateurs commence à 0.
Chaque générateur d’impulsions de pas n’aura que certaines de ces pins, selon le type de pas et le mode de contrôle sélectionné.
(float)
` stepgen.<chan>.position-cmd` — Position désirée du
moteur, en unités de longueur (mode position
seulement).
(float)
` stepgen.<chan>.velocity-cmd` — Vitesse désirée du moteur,
en unités de longueur par seconde (mode
vitesse seulement).
(s32) ``stepgen.<chan>.counts
— Rétroaction de la position en
unités de comptage, actualisée par
la fonction capture_position()
.
(float) ``stepgen.<chan>.position-fb
— Rétroaction de la position
en unités de longueur, actualisée par
la fonction capture_position()
.
(bit)
` stepgen.<chan>.step` — Sortie des impulsions de pas (type de
pas 0 seulement).
(bit)
` stepgen.<chan>.dir` — Sortie direction (type de pas 0
seulement).
(bit) ``stepgen.<chan>.up
— Sortie UP en pseudo-PWM (type de pas 1
seulement).
(bit) ``stepgen.<chan>.down
— Sortie DOWN en pseudo-PWM (type de
pas 1 seulement).
(bit) ``stepgen.<chan>.phase-A
— Sortie phase A (séquences de pas 2
à 14 seulement).
(bit) ``stepgen.<chan>.phase-B
— Sortie phase B (séquences de pas 2
à 14 seulement).
(bit) ``stepgen.<chan>.phase-C
— Sortie phase C (séquences de pas 3
à 14 seulement).
(bit) ``stepgen.<chan>.phase-D
— Sortie phase D (séquences de pas 5
à 14 seulement).
(bit) ``stepgen.<chan>.phase-E
— Sortie phase E (séquences de pas
11 à 14 seulement).
(float)
` stepgen.<chan>.position-scale` — Pas par unité de
longueur. Ce paramètre est utilisé pour les
sorties et les rétroactions.
(float)
` stepgen.<chan>.maxvel` — Vitesse maximale, en unités de
longueur par seconde. Si égal à
0.0, n’a aucun effet.
(float)
` stepgen.<chan>.maxaccel` — Valeur maximale
d’accélération, en unités de longueur par seconde
au carré. Si égal à 0.0, n’a aucun effet.
(float)
` stepgen.<chan>.frequency` — Fréquence des pas, en pas par
seconde.
(float)
` stepgen.<chan>.steplen` — Durée de l’impulsion de pas
(types de pas 0 et 1) ou durée minimum
dans un état donné (séquences de pas 2 à 14), en nanosecondes.
(float)
` stepgen.<chan>.stepspace` — Espace minimum entre deux
impulsions de pas (types de pas 0 et 1
seulement), en nanosecondes.
(float)
` stepgen.<chan>.dirsetup` — Durée minimale entre un
changement de direction et le début de la
prochaine impulsion de pas (type de pas 0 seulement), en nanosecondes.
(float)
` stepgen.<chan>.dirhold` — Durée minimale entre la fin
d’une impulsion de pas et un
changement de direction (type de pas 0 seulement), en nanosecondes.
(float)
` stepgen.<chan>.dirdelay` — Durée minimale entre un pas
dans une direction et un pas dans la
direction opposée (séquences de pas 1 à 14 seulement), en nanosecondes.
(s32)
` stepgen.<chan>.rawcounts` — Valeur de comptage brute
(count) de la rétroaction, réactualisée
par la fonction make_pulses()
.
En mode position, les valeurs de maxvel et de maxaccel sont utilisées par la boucle de position interne pour éviter de générer des trains d’impulsions de pas que le moteur ne peut pas suivre. Lorsqu’elles sont réglées sur des valeurs appropriées pour le moteur, même un grand changement instantané dans la position commandée produira un mouvement trapézoïdal en douceur vers la nouvelle position. L’algorithme fonctionne en mesurant à la fois, l’erreur de position et l’erreur de vitesse, puis en calculant une accélération qui tende à réduire vers zéro, les deux en même temps. Pour plus de détails, y compris les contenus de la boîte “d'équation de contrôle”, consulter le code source.
En mode vitesse, maxvel est une simple limite qui est appliquée à la vitesse commandée, maxaccel est utilisé pour créer une rampe avec la fréquence actuelle, si la vitesse commandée change brutalement. Comme dans le mode position, des valeurs appropriées de ces paramètres assurent que le moteur pourra suivre le train d’impulsions généré.
Le générateur de pas supporte 15 différentes “séquences de pas”. Le
type de pas 0 est le plus familier, c’est le standard pas et direction
(step/dir). Quand stepgen est configuré pour le type 0, il y a quatre
paramètres supplémentaires qui déterminent le timing exact des signaux
de pas et de direction. Voir la figure [fig:StepDir-timing] pour la
signification de ces paramètres. Les paramètres sont en nanosecondes,
mais ils doivent être arrondis à un entier, multiple de la période du
thread qui appelle make_pulses()
. Par exemple, si make_pulses()
est appelée toutes les 16µs et que “steplen” est à 20000, alors
l’impulsion de pas aura une durée de 2 x 16 = 32µs. La valeur par
défaut de ces quatre paramètres est de 1ns, mais l’arrondi automatique
prendra effet au premier lancement du code. Puisqu’un pas exige d'être
haut pendant “steplen”`ns et bas pendant `“stepspace”`ns, la
fréquence maximale est 1.000.000.000 divisé par `(steplen+stepspace)
.
Si “maxfreq”
est réglé plus haut que cette limite, il sera abaissé
automatiquement. Si “maxfreq” est à zéro, il restera à zéro, mais la
fréquence de sortie sera toujours limitée.
Timing pas et direction. Le type de pas 1 a deux sorties, up et down. Les impulsions
apparaissent sur l’une ou l’autre, selon la direction du déplacement.
Chaque impulsion a une durée de “steplen”`ns et les impulsions sont
séparées de `“stepspace”`ns. La fréquence maximale est la même que pour
le type 0. Si `“maxfreq”
est réglé plus haut que cette limite il sera
abaissé automatiquement.
Si “maxfreq” est à zéro, il restera à zéro, mais la fréquence de sortie
sera toujours limitée.
Les séquences 2 jusqu'à 14 sont basées sur les états et ont entre deux
et cinq sorties. Pour chaque pas, un compteur d''état est incrémenté ou
décrémenté. Les figures [fig:Trois-phases-quadrature],
[fig:Quatre-phases] et [fig:Cinq-phases] montrent les différentes
séquences des sorties en fonction de l'état du compteur. La fréquence
maximale est 1.000.000.000 divisé par “steplen`” et comme dans les
autres séquences, `“maxfreq”
sera abaissé si il est au dessus de cette
limite.
Séquence de pas à cinq phases. Le composant exporte trois fonctions. Chaque fonction agit sur tous les générateurs d’impulsions de pas. Lancer différents générateurs dans différents threads n’est pas supporté.
(funct)
` stepgen.make-pulses` — Fonction haute vitesse de
génération et de comptage des impulsions
(non flottant).
(funct)
` stepgen.update-freq` — Fonction basse vitesse de
conversion de position en vitesse, mise
à l'échelle et traitement des limitations.
(funct)
` stepgen.capture-position` — Fonction basse vitesse pour
la rétroaction, met à jour les latches
et les mesures de position.
La fonction à grande vitesse “stepgen.make-pulses”
devrait être
lancée dans un thread très rapide, entre 10 et 50us
selon les capacités de l’ordinateur. C’est la période de ce thread qui
détermine la fréquence maximale des pas, de steplen
, stepspace
,
dirsetup
, dirhold
et dirdelay, tous sont arrondis
au multiple
entier de la période du thread en nanosecondes. Les deux
autres fonctions peuvent être appelées beaucoup plus lentement.
Ce composant fournit un générateur logiciel de PWM (modulation de largeur d’impulsions) et PDM (modulation de densité d’impulsions). C’est un composant temps réel uniquement, dépendant de plusieurs facteurs comme la vitesse du CPU, etc, Il est capable de générer des fréquences PWM de quelques centaines de Hertz en assez bonne résolution, à peut-être 10kHz avec une résolution limitée.
emc2$
<config-array>
est une série d’entiers décimaux séparés par des
virgules. Chaque
chiffre provoquera le chargement d’un simple générateur de PWM, la
valeur de ce chiffre determinera le type de sortie. Par exemple:
emc2$
va installer trois générateurs de PWM. Le premier utilisera une sortie
de type 0 (PWM seule), le suivant utilisera une sortie de type 1 (PWM
et direction) et le troisième utilisera une sortie de type 2 (UP et
DOWN). Il n’y a pas de valeur par défaut, si <config-array>
n’est
pas spécifié, aucun générateur de PWM ne sera installé. Le
nombre maximum de générateurs de fréquences est de 8 (comme définit par
MAX_CHAN dans pwmgen.c). Chaque générateur est indépendant, mais tous
sont mis à jour par la même fonction(s), au même instant. Dans les
descriptions qui suivent, <chan>
est le nombre de générateurs
spécifiques. La numérotation des
générateurs de PWM commence à 0.
Chaque générateur de PWM aura les pins suivantes:
(float)
` pwmgen.<chan>.value` — Valeur commandée, en unités
arbitraires. Sera mise à l'échelle par
le paramètre d'échelle (voir ci-dessous).
(bit)
` pwmgen.<chan>.enable` — Active ou désactive les sorties du
générateur de PWM.
Chaque générateur de PWM aura également certaines de ces pins, selon le type de sortie choisi:
(bit)
` pwmgen.<chan>.pwm` — Sortie PWM (ou PDM), (types de sortie 0
et 1 seulement).
(bit)
` pwmgen.<chan>.dir` — Sortie direction (type de sortie 1
seulement).
(bit) ``pwmgen.<chan>.up
— Sortie PWM/PDM pour une valeur positive
en entrée ( type de sortie
2 seulement).
(bit) ``pwmgen.<chan>.down
— Sortie PWM/PDM pour une valeur
négative en entrée (type de sortie
2 seulement).
(float)
` pwmgen.<chan>.scale` — Facteur d'échelle pour convertir
les valeurs en unités
arbitraires, en coefficients de facteur cyclique.
(float)
` pwmgen.<chan>.pwm-freq` — Fréquence de PWM désirée, en
Hz. Si égale à 0.0, la modulation
sera PDM au lieu de PWM. Si elle est réglée plus haute que les limites
internes, au prochain appel de la fonction update_freq()
elle sera
ramenée aux limites internes. Si elle est différente de
zéro et si le lissage
est faux, au prochain appel de la fonction
update_freq()
elle sera réglée au plus proche entier multiple de la
période de la
fonction make_pulses()
.
(bit)
` pwmgen.<chan>.dither-pwm` — Si vrai, active le lissage pour
affiner la fréquence PWM ou le
rapport cyclique qui ne pourraient pas être obtenus avec une pure PWM.
Si faux, la fréquence PWM et le rapport cyclique seront tous les deux
arrondis aux valeurs pouvant être atteintes exactement.
(float)
` pwmgen.<chan>.min-dc` — Rapport cyclique minimum compris
entre 0.0 et 1.0 (Le rapport
cyclique sera à zéro quand il est désactivé, indépendamment de ce
paramètre).
(float)
` pwmgen.<chan>.max-dc` — Rapport cyclique maximum compris
entre 0.0 et 1.0.
(float)
` pwmgen.<chan>.curr-dc` — Rapport cyclique courant, après
toutes les limitations et les
arrondis (lecture seule).
Le générateur de PWM supporte trois “types de sortie”. Le type 0 a une seule pin de sortie. Seules, les commandes positives sont acceptées, les valeurs négatives sont traitées comme zéro (elle seront affectées par` min-dc` si il est différent de zéro). Le type 1 a deux pins de sortie, une pour le signal PWM/PDM et une pour indiquer la direction. Le rapport cyclique d’une pin PWM est basé sur la valeur absolue de la commande, de sorte que les valeurs négatives sont acceptables. La pin de direction est fausse pour les commandes positives et vraie pour les commandes négatives. Finalement, le type 2 a également deux sorties, appelées “up” et “down”. Pour les commandes positives, le signal PWM apparaît sur la sortie up et la sortie down reste fausse. Pour les commandes négatives, le signal PWM apparaît sur la sortie down et la sortie up reste fausse. Les sorties de type 2 sont appropriées pour piloter la plupart des ponts en H.
Le composant exporte deux fonctions. Chaque fonction agit sur tous les générateurs de PWM, lancer différents générateurs dans différents threads n’est pas supporté.
(funct)
` pwmgen.make-pulses` — Fonction haute vitesse de
génération de fréquences PWM (non
flottant).
(funct)
` pwmgen.update` — Fonction basse vitesse de mise à
l'échelle, limitation des valeurs
et traitement d’autres paramètres.
La fonction haute vitesse “pwmgen.make-pulses”
devrait être lancée
dans un thread très rapide, entre 10 et 50µs
selon les capacités de l’ordinateur. C’est la période de ce thread qui
détermine la fréquence maximale de la porteuse PWM, ainsi que la
résolution des signaux PWM ou PDM. L’autre fonction peut être appelée
beaucoup plus lentement.
Ce composant fournit, en logiciel, le comptage des signaux provenant d’encodeurs en quadrature. Il s’agit d’un composant temps réel uniquement, il est dépendant de divers facteurs comme la vitesse du CPU, etc, il est capable de compter des signaux de fréquences comprises entre 10kHz à peut être 50kHz. La figure [fig:Diagramme-bloc-du-codeur] est le diagramme bloc d’un canal de comptage de codeur.
Diagramme bloc du compteur de codeur.
emc2$
<counters>
est le nombre de compteurs de codeur à installer. Si
numchan
n’est pas spécifié, trois compteurs seront installés. Le
nombre
maximum de compteurs est de 8 (comme définit par MAX_CHAN dans
encoder.c). Chaque compteur est indépendant, mais tous sont mis à jour
par la même fonction(s) au même instant. Dans les descriptions qui
suivent, <chan>
est le nombre de compteurs spécifiques. La
numérotation des compteurs
commence à 0.
(bit)
` encoder.<chan>.phase-A` — Signal de la phase A du codeur en
quadrature.
(bit)
` encoder.<chan>.phase-B` — Signal de la phase B du codeur en
quadrature.
(bit)
` encoder.<chan>.phase-Z` — Signal de la phase Z (impulsion
d’ndex) du codeur en quadrature.
(bit) ``encoder.<chan>.reset
— Voir l’interface canonique des
codeurs à la section
???.
(bit) ``encoder.<chan>.velocity
— Vitesse estimée du signal de
quadrature.
(bit) ``encoder.<chan>.index-enable
— Voir l’interface canonique
des codeurs.
(s32) ``encoder.<chan>.count
— Voir l’interface canonique des
codeurs.
(float) ``encoder.<chan>.position
— Voir l’interface canonique des
codeurs.
(s32)
` encoder.<chan>.raw-count` — Valeur de comptage brute,
actualisée par la fonction update-counters()
.
(
bit
) encoder.<chan>.x4-mode
— Ajuste le comptage en mode 4x
ou 1x. Le mode 1x est intéressant
pour les manivelles de jog.
(float)
` encoder.<chan>.position-scale` — Voir l’interface
canonique des codeurs à la section
???.
Le composant exporte deux fonctions. Chaque fonction agit sur tous les compteurs de codeur, lancer différents compteurs de codeur dans différents threads n’est pas supporté.
(funct)
` encoder.update-counters` — Fonction haute vitesse de
comptage d’impulsions (non flottant).
(funct)
` encoder.capture-position` — Fonction basse vitesse
d’actualisation des latches et mise à
l'échelle de la position.
Ce composant fournit une boucle de contrôle Proportionnel/Intégrale/Dérivée. C’est un composant temps réel uniquement. Par souci de simplicité, cette discussion suppose que nous parlons de boucles de position, mais ce composant peut aussi être utilisé pour implémenter d’autres boucles de rétroaction telles que vitesse, hauteur de torche, température, etc. La figure [fig:Diagramme-bloc-PID] est le schéma fonctionnel d’une simple boucle PID.
Diagramme bloc d’une boucle PID.
emc2$
<loops>
est le nombre de boucles PID à installer. Si numchan
n’est pas spécifié, une seule boucle sera installée. Le nombre
maximum de boucles est de 16 (comme définit par MAX_CHAN dans pid.c).
Chaque boucle est complétement indépendante. Dans les descriptions qui
suivent, <loopnum>
est le nombre de boucles spécifiques. La
numérotation des boucle PID
commence à 0.
Si debug=1
est spécifié, le composant exporte quelques paramètres
destinés au
déboguage et aux réglages. Par défaut, ces paramètres ne sont pas
exportés, pour économiser la mémoire partagée et éviter d’encombrer la
liste des paramètres.
Les trois principales pins sont:
(float) ``pid.<loopnum>.command
— La position désirée (consigne),
telle que commandée par un autre
composant système.
(float) ``pid.<loopnum>.feedback
— La position actuelle (mesure),
telle que mesurée par un organe de
rétroaction comme un codeur de position.
(float) ``pid.<loopnum>.output
— Une commande de vitesse qui tend
à aller de la position actuelle à
la position désirée.
Pour une boucle de position, command et feedback sont en unités de longueur. Pour un axe linéaire, cela pourrait être des pouces, mm, mètres, ou tout autre unité pertinente. De même pour un axe angulaire, ils pourraient être des degrés, radians, etc. Les unités sur la pin output représentent l'écart nécessaire pour que la rétroaction coïncide avec la commande. Pour une boucle de position, output est une vitesse exprimée en pouces/seconde, mm/seconde, degrés/seconde, etc. Les unités de temps sont toujours des secondes et les unités de vitesses restent cohérentes avec les unités de longueur. Si la commande et la rétroaction sont en mètres, la sortie sera en mètres par seconde.
Chaque boucle PID a deux autres pins qui sont utilisées pour surveiller ou contrôler le fonctionnement général du composant.
(float) ``pid.<loopnum>.error
— Egal à .command
moins
.feedback
. (consigne - mesure)
(bit) ``pid.<loopnum>.enable
— Un bit qui active la boucle. Si
.enable
est faux, tous les intégrateurs sont remis à zéro et les
sorties sont
forcées à zéro. Si .enable
est vrai, la boucle opère normalement.
Le gain PID, les limites et autres caractèristiques accordables de la boucle sont implémentés comme des paramètres.
(float)
` pid.<loopnum>.Pgain` — Gain de la composante
proportionnelle
(float)
` pid.<loopnum>.Igain` — Gain de la composante intégrale
(float)
` pid.<loopnum>.Dgain` — Gain de la composante dérivée
(float)
` pid.<loopnum>.bias` — Constante du décalage de sortie
(float)
` pid.<loopnum>.FF0` — Correcteur prédictif d’ordre zéro
(feedforward) - sortie
proportionnelle à la commande (position).
(float)
` pid.<loopnum>.FF1` — Correcteur prédictif de premier
ordre (feedforward) - sortie
proportionnelle à la dérivée de la commande (vitesse).
(float)
` pid.<loopnum>.FF2` — Correcteur prédictif de second ordre
(feedforward) - sortie
proportionnelle à la dérivée seconde de la commande
(accélération)[14].
(float)
` pid.<loopnum>.deadband` — Définit la bande morte
(tolérance)
(float)
` pid.<loopnum>.maxerror` — Limite d’erreur
(float)
` pid.<loopnum>.maxerrorI` — Limite d’erreur intégrale
(float)
` pid.<loopnum>.maxerrorD` — Limite d’erreur dérivée
(float)
` pid.<loopnum>.maxcmdD` — Limite de la commande dérivée
(float)
` pid.<loopnum>.maxcmdDD` — Limite de la commande dérivée
seconde
(float)
` pid.<loopnum>.maxoutput` — Limite de la valeur de sortie
Toutes les limites max???,
sont implémentées de sorte que si la
valeur de ce paramètre est à
zéro, il n’y a pas de limite.
Si debug=1
est spécifié quand le composant est installé, quatre
paramètres
supplémentaires seront exportés:
(float)
` pid.<loopnum>.errorI` — Intégrale de l’erreur.
(float)
` pid.<loopnum>.errorD` — Dérivée de l’erreur.
(float)
` pid.<loopnum>.commandD` — Dérivée de la commande.
(float)
` pid.<loopnum>.commandDD` — Dérivée seconde de la commande.
Le composant exporte une fonction pour chaque boucle PID. Cette fonction exécute tous les calculs nécessaires à la boucle. Puisque chaque boucle a sa propre fonction, les différentes boucles peuvent être incluses dans les différents threads et exécutées à différents rythmes.
(funct)
` pid.<loopnum>.do_pid_calcs` — Exécute tous les calculs
d’une seule boucle PID.
Si vous voulez comprendre exactement l’algorithme utilisé pour calculer la sortie d’une boucle PID, référez vous à la figure [fig:Diagramme-bloc-PID], les commentaires au début du source` emc2/src/hal/components/pid.c` et bien sûr, au code lui même. Les calculs de boucle sont dans la fonction C` calc_pid()`.
Le codeur simulé est exactement la même chose qu’un codeur. Il produit des impulsions en quadrature avec une impulsion d’index, à une vitesse contrôlée par une pin de HAL. Surtout utile pour les essais.
emc2$
<number>
est le nombre de codeurs à simuler. Si aucun n’est
spécifié, un seul
codeur sera installé. Le nombre maximum de codeurs est de 8 (comme
définit par MAX_CHAN dans sim_encoder.c).
(float) ``sim-encoder.<chan-num>.speed
— La vitesse commandée pour
l’arbre simulé.
(bit) ``sim-encoder.<chan-num>.phase-A
— Sortie en quadrature.
(bit) ``sim-encoder.<chan-num>.phase-B
— Sortie en quadrature.
(bit) ``sim-encoder.<chan-num>.phase-Z
— Sortie de l’impulsion
d’index.
Quand .speed
est positive, .phase-A
mène .phase-B
.
speed
. Par défaut est de 1.0, ce qui signifie que speed
est en
tours par seconde. Passer l'échelle à 60 pour des tours par
minute, la passer à 360 pour des degrés par seconde, à 6.283185 pour
des radians par seconde, etc.
Noter que les impulsions par tour ne sont pas identiques aux valeurs de comptage par tour (counts). Une impulsion est un cycle complet de quadrature. La plupart des codeurs comptent quatre fois pendant un cycle complet.
Le composant exporte deux fonctions. Chaque fonction affecte tous les codeurs simulés.
(funct)
` sim-encoder.make-pulses` — Fonction haute vitesse de
génération d’impulsions en quadrature
(non flottant).
(funct)
` sim-encoder.update-speed` — Fonction basse vitesse de
lecture de speed
, de mise à l'échelle et d’activation de
make-pulses
.
L’anti-rebond est un composant temps réel capable de filtrer les rebonds créés par les contacts mécaniques. Il est également très utile dans d’autres applications, où des impulsions très courtes doivent être supprimées.
emc2$
<config-string>
est une série d’entiers décimaux séparés par des
espaces. Chaque
chiffre installe un groupe de filtres anti-rebond identiques, le
chiffre détermine le nombre de filtres dans le groupe. Par exemple:
emc2$
va installer trois groupes de filtres. Le groupe 0 contient un filtre,
le groupe 1 en contient quatre et le groupe 2 en contient deux. La
valeur par défaut de <config-string>
est “1”
qui installe un seul
groupe contenant un seul filtre. Le nombre
maximum de groupes est de 8 (comme définit par MAX_GROUPS dans
debounce.c). Le nombre maximum de filtres dans un groupe est limité
seulement par l’espace de la mémoire partagée. Chaque groupe est
complétement indépendant. Tous les filtres dans un même groupe sont
identiques et ils sont tous mis à jour par la même fonction, au même
instant. Dans les descriptions qui suivent, <G>
est le numéro du
groupe et <F>
est le numéro du filtre dans le groupe. Le premier
filtre est le
filtre 0 dans le groupe 0.
Chaque filtre individuel a deux pins.
(bit) ``debounce.<G>.<F>.in
— Entrée du filtre <F>
du groupe <G>
.
(bit) ``debounce.<G>.<F>.out
— Sortie du filtre <F>
du groupe
<G>
.
Chaque groupe de filtre a un paramètre[15].
(s32) ``debounce.<G>.delay
— Délai de filtrage pour tous les
filtres du groupe <G>
.
Le délai du filtre est dans l’unité de la période du thread. Le délai minimum est de zéro. La sortie d’un filtre avec un délai de zéro, suit exactement son entrée, il ne filtre rien. Plus le délai augmente, plus larges seront les impulsions rejetées. Si le délai est de 4, toutes les impulsions égales ou inférieures à quatre périodes du thread, seront rejetées.
Siggen est un composant temps réel qui génère des signaux carrés, triangulaires et sinusoïdaux. Il est principalement utilisé pour les essais.
emc2$
<chans>
est le nombre de générateurs de signaux à installer. Si
numchan
n’est pas spécifié, un seul générateur de signaux sera
installé. Le
nombre maximum de générateurs est de 16 (comme définit par MAX_CHAN
dans siggen.c). Chaque générateur est complétement indépendant. Dans
les descriptions qui suivent, <chan>
est le numéro d’un générateur
spécifique. Les numéros de générateur
commencent à 0.
Chaque générateur a cinq pins de sortie.
(float) ``siggen.<chan>.sine
— Sortie de l’onde sinusoïdale.
(float) ``siggen.<chan>.cosine
— Sortie de l’onde cosinusoïdale.
(float) ``siggen.<chan>.sawtooth
— Sortie de l’onde en dents de scie.
(float) ``siggen.<chan>.triangle
— Sortie de l’onde triangulaire.
(float) ``siggen.<chan>.square
— Sortie de l’onde carrée.
Les cinq sorties ont les mêmes fréquence, amplitude et offset.
Trois pins de contrôle s’ajoutent aux pins de sortie:
(float) ``siggen.<chan>.frequency
— Réglage de la fréquence en
Hertz, par défaut la valeur est de 1 Hz.
(float) ``siggen.<chan>.amplitude
— Réglage de l’amplitude de pic
des signaux de sortie, par défaut,
est à 1.
(float) ``siggen.<chan>.offset
— Réglage de la composante continue
des signaux de sortie, par
défaut, est à 0.
Par exemple, si siggen.0.amplitude
est à 1.0 et siggen.0.offset
est à 0.0, les sorties oscilleront entre -1.0 et +1.0. Si
siggen.0.amplitude
est à 2.5 et siggen.0.offset
est à 10.0, les
sorties oscilleront entre 7.5 et 12.5.
Aucun. [16]
[14] FF2 n’est actuellement pas implémenté, mais il pourrait l'être. Considérez cette note “FIXME” dans le code.
[15] Chaque filtre individuel a également une variable d'état interne. C’est un switch du compilateur qui peut exporter cette variable comme un paramètre. Ceci est prévu pour des essais et devrait juste être un gaspillage de mémoire partagée dans des circonstances normales.
[16] Dans les versions antérieures à la 2.1, fréquence, amplitude et offset étaient des paramètres. Ils ont été modifiés en pins pour permettre le contrôle par d’autres composants.
Parport est un pilote pour le port parallèle traditionnel des PC. Le port dispose d’un total de 17 broches physiques. Le port parallèle originel a divisé ces broches en trois groupes: données, contrôles et états. Le groupe “données” consiste en 8 broches de sortie, le groupe “contrôles” consiste en 4 broches et le groupe “états” consiste en 5 broches d’entrée.
Au début des années 1990, le port parallèle bidirectionnel est arrivé, ce qui a permis à l’utilisateur d’ajuster le groupe des données comme étant des sorties ou comme étant des entrées. Le pilote de HAL supporte le port bidirectionnel et permet à l’utilisateur de configurer le groupe des données en entrées ou en sorties. Si il est configuré en sorties, un port fournit un total de 12 sorties et 5 entrées. Si il est configuré en entrées, il fournit 4 sorties et 13 entrées.
Dans certains ports parallèles, les broches du groupe contrôle sont des collecteurs ouverts, ils peuvent aussi être mis à l'état bas par une porte extérieure. Sur une carte avec les broches de contrôle en collecteurs ouverts, le mode “x” de HAL permet un usage plus flexible avec 8 sorties dédiées, 5 entrées dédiées et 4 broches en collecteurs ouverts. Dans d’autres ports parallèles, les broches du groupe contrôles sont en push-pull et ne peuvent pas être utilisées comme des entrées.footnote:[HAL ne peut pas déterminer automatiquement si les broches en mode bidirectionnel “x” sont effectivement en collecteurs ouverts (OC). Si elles n’y sont pas, elles ne peuvent pas être utilisées comme des entrées. Essayer de les passer à l'état BAS par une source extérieure peut détériorer le matériel.
Pour déterminer si votre port a des broches de contrôle en “collecteur ouvert”, charger hal_parport en mode “x”, positionner les broches de contrôle à une valeur HAUTE. HAL doit lire des pins à l'état VRAI. Ensuite, insérer une résistance de 470 entre une des broches de contrôle et GND du port parallèle. Si la tension de cette broche de contrôle est maintenant proche de 0V et que HAL la lit comme une pin FAUSSE, alors vous avez un port OC. Si la tension résultante est loin de 0V ou que HAL ne la lit pas comme étant FAUSSE, votre port ne ne peut pas être utilisé en mode “x”.
Le matériel extérieur qui pilote les broches de contrôle devrait également utiliser des portes en collecteur ouvert (ex: 74LS05…). Généralement, une pin de HAL -out devrait être VRAIE quand la pin physique est utilisée comme une entrée.
Sur certaines machines, les paramètres du BIOS peuvent affecter la possibilité d’utiliser le mode “x”. Le mode “SPP” est le mode qui fonctionne le plus fréquemment. ]
Aucune autre combinaison n’est supportée. Un port ne peut plus être modifié pour passer d’entrées en sorties dès que le pilote est installé. La figure [fig:Parport-block-diag] montre deux diagrammes, un montre le pilote quand le groupe de données est configuré en sorties et le second le montre configuré en entrées.
Le pilote parport peut contrôler au maximum 8 ports (définis par MAX_PORTS dans le fichier hal_parport.c). Les ports sont numérotés à partir de zéro.
loadrt hal_parport cfg="<config-string>"
La chaine config-string représente l’adresse hexadécimale du port, suivie optionnellement par une direction, le tout répété pour chaque port. Les directions sont “in”, “out”, ou “x”, elles déterminent la direction des broches physiques 2 à 9 et s’il y a lieu de créer des pins d’entrée de HAL pour les broches de contrôle physiques. Si la direction n’est pas précisée, le groupe données sera par défault en sortie. Par exemple:
loadrt hal_parport cfg="0x278 0x378 in 0x20A0 out"
Cet exemple installe les pilotes pour un port 0x0278, avec les broches
2 à 9 en sorties (par défaut, puisque ni “ in ”, ni “out” n’est
spécifié), un port 0x0378, avec les broches 2 à 9 en entrées et un port
0x20A0, avec les broches 2 à 9 explicitement spécifiées en sorties.
Notez que vous devez connaître l’adresse de base des ports parallèles
pour configurer correctement les pilotes. Pour les ports sur bus ISA,
ce n’est généralement pas un problème, étant donné que les ports sont
presque toujours à une adresse “bien connue”, comme 0x278 ou 0x378 qui
sont typiquement configurées dans le BIOS. Les adresses des cartes sur
bus PCI sont habituellement trouvées avec “lspci -v” dans une ligne
“I/O ports”, ou dans un message du kernel après l’exécution de “sudo
modprobe -a parport_pc`”. Il n'y a pas d'adresse par défaut, si
`<config-string>
ne contient pas au moins une adresse, un message
d’erreur s’affichera.
(bit) ``parport.<portnum>.pin-<pinnum>-out
— Pilote une pin de
sortie physique.
(bit) ``parport.<portnum>.pin-<pinnum>-in
— Suit une pin d’entrée
physique.
(bit) ``parport.<portnum>.pin-<pinnum>-in-not
— Suit une pin
d’entrée physique, mais inversée.
Pour chaque pin, <portnum>
est le numéro du port et <pinnum>
est
le numéro de la broche physique du connecteur DB-25.
Pour chaque broche de sortie physique, le pilote crée une simple pin
de HAL, par exemple parport.0.pin-14-out
. Les pins 2 jusqu'à 9 font
partie du groupe données, elles sont des
pins de sortie si le port est défini comme un port de sorties (par
défaut en sortie). Les broches 1, 14, 16 et 17 sont des sorties dans
tous les modes. Ces pins de HAL contrôlent l'état des pins physiques
correspondantes.
Pour chaque pin d’entrée physique, le pilote crée deux pins de HAL,
par exemple parport.0.pin-12-in
et parport.0.pin-12-in-not
. Les
pins 10, 11, 12, 13 et 15 sont toujours des sorties. Les pins 2
jusqu'à 9 sont des pins d’entrée seulement si le port est défini comme
un port d’entrées. Une pin de HAL -in
est VRAIE si la pin physique
est haute et FAUSSE si la pin physique
est basse. Une pin de HAL -in-not
est inversée, elle est FAUSSE si
la pin physique est haute. En
connectant un signal à l’une ou à l’autre, l’utilisateur peut décider
de la logique de l’entrée. En mode “x”, les pins 1, 14, 16 et 17 sont
également des pins d’entrée.
(bit) ``parport.<portnum>.pin-<pinnum>-out-invert
— Inverse une pin
de sortie.
(U32) parport.<portnum>.reset-time
— Le temps (en nanosecondes)
entre le moment ou la broche est écrite
et le moment ou elle est réititialisée par les fonctions de
réinitialisation de HAL.
Le paramètre -invert
détermine si une pin de sortie est active haute
ou active basse. Si -invert
est FAUX, mettre la pin HAL -out
VRAIE
placera la pin physique à l'état haut et mettre la pin HAL
FAUSSE placera la pin physique à l'état bas. Si -invert
est VRAI,
mettre la pin HAL -out
VRAIE va mettre la pin physique à l'état bas.
Si -reset
est VRAI, la fonction de réinitialisation va passer la
pin à la
valeur de -out-invert
. Ceci peut être utilisé en conjonction avec
“stepgen doublefreq”
pour produire un pas par période.
(funct) ``parport.<portnum>.read
— Lit les pins physiques du port
<portnum>
et met à jour les pins de HAL` -in` et` -in-not`.
(funct) ``parport.read-all
— Lit les pins physiques de tous les
ports et met à jour les pins de
HAL -in
et -in-not
.
(funct) ``parport.<portnum>.write
— Lit les pins de HAL -out
du
port <portnum>
et met à jour les pins de sortie physiques
correspondantes.
(funct) ``parport.write-all
— Lit les pins de HAL -out
de tous
les ports et met à jour toutes les pins de sortie physiques.
(funct) ``parport.<portnum>.reset
— Attends que le délai de mise à
jour soit écoulé depuis le dernière
écriture, remet à jour les pins aux valeurs indiquées par
-out-invert
et les paramètres de -out-invert
. La réinitialisation
doit être plus tard dans le même thread que l'écriture.
Les différentes fonctions sont prévues pour les situations où un port
doit être mis à jour dans un thread très rapide, mais d’autres ports
peuvent être mis à jour dans un thread plus lent pour gagner du temps
CPU. Ce n’est probablement pas une bonne idée d’utiliser en même temps,
les fonctions -all
et une fonction individuelle.
Si le chargement du module le message suivant:
insmod: error inserting '/home/jepler/emc2/rtlib/hal_parport.ko':
s’assurer que le noyau du kernel standard, parport_pc,
n’est pas
chargé[17] et qu’aucun périphérique dans le système ne revendique les ports
concernés.
SI le module est chargé mais ne semble pas fonctionner, l’adresse du
port est incorrecte ou le module probe_parport
est requis.
Dans les PC récents, le port parallèle peut exiger une configuration
plug and play (PNP) avant d'être utilisable. Le module probe_parport
effectue la configuration de tous les ports PNP présents et devrait
être chargé avant hal_parport
. Sur les machines sans ports PNP, il
peut être chargé mais n’a aucun
effet.
loadrt probe_parport
Si le kernel Linux affiche un message similaire à:
parport: PnPBIOS parport detected.
Quand le module parport_pc est chargé, avec la commande: sudo
modprobe -a parport_pc; sudo rmmod parport_pc,
l’utilisation de ce
module sera probablement nécessaire.
.
Les modules commerciaux ci-dessous pouront êtres traduits en français sur demande.
The commercial modules below could be translated into French on request.
.
The Axiom Measurement & Control AX5214H is a 48 channel digital I/O board. It plugs into an ISA bus, and resembles a pair of 8255 chips.[18]
loadrt hal_ax5214h cfg="<config-string>"
The config string consists of a hex port address, followed by an 8
character string of “I” and “O” which sets groups of pins as inputs and
outputs. The first two character set the direction of the first two 8
bit blocks of pins (0-7 and 8-15). The next two set blocks of 4 pins
(16-19 and 20-23). The pattern then repeats, two more blocks of 8 bits
(24-31 and 32-39) and two blocks of 4 bits (40-43 and 44-47). If more
than one board is installed, the data for the second board follows the
first. As an example, the string "0x220 IIIOIIOO 0x300 OIOOIOIO"
installs drivers for two boards. The first board is at address 0x220,
and has 36 inputs (0-19 and 24-39) and 12 outputs (20-23 and 40-47).
The second board is at address 0x300, and has 20 inputs (8-15, 24-31,
and 40-43) and 28 outputs (0-7. 16-23, 32-39, and 44-47). Up to 8
boards may be used in one system.
(bit
`) ax5214.<boardnum>.out-<pinnum> `-- Drives a physical output
pin.
(
bit
) ax5214.<boardnum>.in-<pinnum>
— Tracks a physical input
pin.
(
bit
) ax5214.<boardnum>.in-<pinnum>-not
— Tracks a physical
input pin, inverted.
For each pin, <boardnum>
is the board number (starts at zero), and
<pinnum>
is the I/O channel number (0 to 47).
Note that the driver assumes active LOW signals. This is so that
modules such as OPTO-22 will work correctly (TRUE means output ON, or
input energized). If the signals are being used directly without
buffering or isolation the inversion needs to be accounted for. The
in-
HAL pin is TRUE if the physical pin is low (OPTO-22 module
energized), and FALSE if the physical pin is high (OPTO-22 module off).
The in-<pinnum>-not
HAL pin is inverted — it is FALSE if the
physical pin is low
(OPTO-22 module energized). By connecting a signal to one or the other,
the user can determine the state of the input.
(
bit
) ax5214.<boardnum>.out-<pinnum>-invert
— Inverts an output
pin.
The -invert
parameter determines whether an output pin is active
high or active
low. If -invert
is FALSE, setting the HAL out-
pin TRUE drives
the physical pin low, turning ON an attached OPTO-22
module, and FALSE drives it high, turning OFF the OPTO-22 module. If
-invert
is TRUE, then setting the HAL out-
pin TRUE will drive the
physical pin high and turn the module OFF.
The Servo-To-Go is one of the first PC motion control cards[19] supported by EMC. It is an ISA card and it exists in different flavours (all supported by this driver). The board includes up to 8 channels of quadrature encoder input, 8 channels of analog input and output, 32 bits digital I/O, an interval timer with interrupt and a watchdog.
loadrt hal_stg [base=<address>] [num_chan=<nr>] [dio="<dio-string>"] [model=<model>]
The base address field is optional; if it’s not provided the driver attempts to autodetect the board. The num_chan field is used to specify the number of channels available on the card, if not used the 8 axis version is assumed. The digital inputs/outputs configuration is determined by a config string passed to insmod when loading the module. The format consists of a four character string that sets the direction of each group of pins. Each character of the direction string is either "I" or "O". The first character sets the direction of port A (Port A - DIO.0-7), the next sets port B (Port B - DIO.8-15), the next sets port C (Port C - DIO.16-23), and the fourth sets port D (Port D - DIO.24-31). The model field can be used in case the driver doesn’t autodetect the right card version[20]. For example:
loadrt hal_stg base=0x300 num_chan=4 dio="IOIO"
This example installs the stg driver for a card found at the base address of 0x300, 4 channels of encoder feedback, DAC’s and ADC’s, along with 32 bits of I/O configured like this: the first 8 (Port A) configured as Input, the next 8 (Port B) configured as Output, the next 8 (Port C) configured as Input, and the last 8 (Port D) configured as Output
loadrt hal_stg
This example installs the driver and attempts to autodetect the board address and board model, it installs 8 axes by default along with a standard I/O setup: Port A & B configured as Input, Port C & D configured as Output.
(s32
`) stg.<channel>.counts `-- Tracks the counted encoder ticks.
(
float
) stg.<channel>.position
— Outputs a converted position.
(
float
`) stg.<channel>.dac-value `-- Drives the voltage for the
corresponding DAC.
(
float
) stg.<channel>.adc-value
— Tracks the measured voltage
from the corresponding ADC.
(bit) ``stg.in-<pinnum>
— Tracks a physical input pin.
(bit) ``stg.in-<pinnum>-not
— Tracks a physical input pin, but
inverted.
(bit) ``stg.out-<pinnum>
— Drives a physical output pin
For each pin, <channel>
is the axis number, and <pinnum>
is the
logic pin number of the STG[21].
The in-
HAL pin is TRUE if the physical pin is high, and FALSE if the
physical pin is low. The in-<pinnum>-not
HAL pin is inverted — it
is FALSE if the physical pin is high. By
connecting a signal to one or the other, the user can determine the
state of the input.
(float) ``stg.<channel>.position-scale
— The number of counts /
user unit (to convert from counts to units).
(
float
`) stg.<channel>.dac-offset `-- Sets the offset for the
corresponding DAC.
(
float
) stg.<channel>.dac-gain
— Sets the gain of the
corresponding DAC.
(
float
) stg.<channel>.adc-offset
— Sets the offset of the
corresponding ADC.
(
float
) stg.<channel>.adc-gain
— Sets the gain of the
corresponding ADC.
(
bit
) stg.out-<pinnum>-invert
— Inverts an output pin.
The -invert
parameter determines whether an output pin is active
high or active
low. If -invert
is FALSE, setting the HAL out-
pin TRUE drives the
physical pin high, and FALSE drives it low. If -invert
is TRUE, then
setting the HAL out-
pin TRUE will drive the physical pin low.
(funct) ``stg.capture-position
— Reads the encoder counters from
the axis <channel>
.
(funct) ``stg.read-adcs
— Reads the voltages from the ADCs.
(funct) ``stg.di-read
— Reads physical in-
pins of all ports and
updates all HAL in-
and in-<pinnum>-not
pins.
(funct) ``stg.do-write
— Reads all HAL out-
pins and updates all
physical output pins.
The Mesa Electronics m5i20 card consists of an FPGA that can be loaded with a wide variety of configurations, and has 72 pins that leave the PC. The assignment of the pins depends on the FPGA configuration. Currently there is a HAL driver for the “4 axis host based motion control” configuration, and this FPGA configurations is also provided with EMC2. It provides 8 encoder counters, 4 PWM outputs (normally used as DACs) and up to 48 digital I/O channels, 32 inputs and 16 outputs.[22]
Installing:
loadrt hal_m5i20 [loadFpga=1|0] [dacRate=<rate>]
If loadFpga
is 1 (the default) the driver will load the FPGA
configuration on
startup. If it is 0, the driver assumes the configuration is already
loaded. dacRate
sets the carrier frequency for the PWM outputs, in
Hz. The default is
32000, for 32KHz PWM. Valid values are from 1 to 32226. The driver
prints some useful debugging message to the kernel log, which can be
viewed with dmesg
.
Up to 4 boards may be used in one system.
In the following pins, parameters, and functions, <board> is the board ID. According to the naming conventions the first board should always have an ID of zero, however this driver uses the PCI board ID, so it may be non-zero even if there is only one board.
(s32
`) m5i20.<board>.enc-<channel>-count `-- Encoder position, in
counts.
(
float
`) m5i20.<board>.enc-<channel>-position `-- Encoder
position, in user units.
(bit) ``m5i20.<board>.enc-<channel>-index
— Current status of index
pulse input?
(bit)
` m5i20.<board>.enc-<channel>-index-enable -- when true , and
an index pulse appears on the encoder input, reset counter to
zero and clear `index-enable
.
(bit) ``m5i20.<board>.enc-<channel>-reset
— When true, counter is
forced to zero.
(bit) ``m5i20.<board>.dac-<channel>-enable
— Enables DAC if true.
DAC outputs zero volts if false?
(float) ``m5i20.<board>.dac-<channel>-value
— Analog output value
for PWM “DAC” (in user units, see -scale
and -offset
)
(bit) ``m5i20.<board>.in-<channel>
— State of digital input pin,
see canonical digital input.
(bit) ``m5i20.<board>.in-<channel>-not
— Inverted state of digital
input pin, see canonical digital input.
(bit) ``m5i20.<board>.out-<channel>
— Value to be written to
digital output, see canonical digital output.
(bit) ``m5i20.<board>.estop-in
— Dedicated estop input, more
details needed.
(bit) ``m5i20.<board>.estop-in-not
— Inverted state of dedicated
estop input.
(bit) ``m5i20.<board>.watchdog-reset
— Bidirectional, - Set TRUE
to reset watchdog once, is automatically
cleared. If bit value 16 is set in watchdog-control
then this value
is not used, and the hardware watchdog is cleared
every time the dac-write
function is executed.
(float) ``m5i20.<board>.enc-<channel>-scale
— The number of counts
/ user unit (to convert from counts to units).
(
float
`) m5i20.<board>.dac-<channel>-offset `-- Sets the DAC offset.
(
float
`) m5i20.<board>.dac-<channel>-gain `-- Sets the DAC gain
(scaling).
(
bit
`) m5i20.<board>.dac-<channel>-interlaced ` — Sets the DAC to
interlaced mode. Use this mode if you are filtering
the PWM to generate an anaolg voltage.[23]
(
bit
`) m5i20.<board>.out-<channel>-invert `-- Inverts a digital
output, see canonical digital output.
(
u32
) m5i20.<board>.watchdog-control
— Configures the
watchdog. The value may be a bitwise OR of the
following values:
[width="90%", options="header"] |======================================== |Bit # | Value | Meaning |0 | 1 | Watchdog is enabled |1 | 2 | Watchdog is automatically reset by DAC writes (the HAL `dac-write` function) |======================================== Typically, the useful values are 0 (watchdog disabled) or 3 (watchdog enabled, cleared by `dac-write`). - `(``u32``) m5i20.<board>.led-view` -- Maps some of the I/O to onboard LEDs. See table below.
(funct) ``m5i20.<board>.encoder-read
— Reads all encoder counters.
(funct)
` m5i20.<board>.digital-in-read `-- Reads digital inputs.
(funct)
` m5i20.<board>.digital-out-write `-- Writes digital outputs.
(funct) ``m5i20.<board>.misc-update
— Writes watchdog timer
configuration to hardware. Resets watchdog
timer. Updates E-stop pin (more info needed). Updates onboard LEDs.
The Hostmot-4 FPGA configuration has the following pinout. There are three 50-pin ribbon cable connectors on the card: P2, P3, and P4. There are also 8 status LEDs.
m5i20 card connector P2 | Function/HAL-pin |
---|---|
1 | enc-01 A input |
3 | enc-01 B input |
5 | enc-00 A input |
7 | enc-00 B input |
9 | enc-01 index input |
11 | enc-00 index input |
13 | dac-01 output |
15 | dac-00 output |
17 | DIR output for dac-01 |
19 | DIR output for dac-00 |
21 | dac-01-enable output |
23 | dac-00-enable output |
25 | enc-03 B input |
27 | enc-03 A input |
29 | enc-02 B input |
31 | enc-02 A input |
33 | enc-03 index input |
35 | enc-02 index input |
37 | dac-03 output |
39 | dac-02 output |
41 | DIR output for dac-03 |
43 | DIR output for dac-02 |
45 | dac-03-enable output |
47 | dac-02-enable output |
49 | Power +5 V (or +3.3V ?) |
all even pins | Ground |
Encoder counters 4 - 7 work simultaneously with in-00 to in-11.
If you are using in-00 to in-11 as general purpose IO then reading enc-<4-7> will produce some random junk number.
m5i20 card connector P3 | Function/HAL-pin | Secondary Function/HAL-pin |
---|---|---|
1 | in-00 | enc-04 A input |
3 | in-01 | enc-04 B input |
5 | in-02 | enc-04 index input |
7 | in-03 | enc-05 A input |
9 | in-04 | enc-05 B input |
11 | in-05 | enc-05 index input |
13 | in-06 | enc-06 A input |
15 | in-07 | enc-06 B input |
17 | in-08 | enc-06 index input |
19 | in-09 | enc-07 A input |
21 | in-10 | enc-07 B input |
23 | in-11 | enc-07 index input |
25 | in-12 | |
27 | in-13 | |
29 | in-14 | |
31 | in-15 | |
33 | out-00 | |
35 | out-01 | |
37 | out-02 | |
39 | out-03 | |
41 | out-04 | |
43 | out-05 | |
45 | out-06 | |
47 | out-07 | |
49 | Power +5 V (or +3.3V ?) | |
all even pins | Ground |
The index mask masks the index input of the encoder so that the encoder index can be combined with a mechanical switch or opto detector to clear or latch the encoder counter only when the mask input bit is in proper state (selected by mask polarity bit) and encoder index occurs. This is useful for homing. The behaviour of these pins is controlled by the Counter Control Register (CCR), however there is currently no function in the driver to change the CCR. See REGMAP4[24] for a description of the CCR.
m5i20 card connector P4 | Function/HAL-pin | Secondary Function/HAL-pin |
---|---|---|
1 | in-16 | enc-00 index mask |
3 | in-17 | enc-01 index mask |
5 | in-18 | enc-02 index mask |
7 | in-19 | enc-03 index mask |
9 | in-20 | |
11 | in-21 | |
13 | in-22 | |
15 | in-23 | |
17 | in-24 | enc-04 index mask |
19 | in-25 | enc-05 index mask |
21 | in-26 | enc-06 index mask |
23 | in-27 | enc-07 index mask |
25 | in-28 | |
27 | in-29 | |
29 | in-30 | |
31 | in-31 | |
33 | out-08 | |
35 | out-09 | |
37 | out-10 | |
39 | out-11 | |
41 | out-12 | |
43 | out-13 | |
45 | out-14 | |
47 | out-15 | |
49 | Power +5 V (or +3.3V ?) | |
all even pins | Ground |
The status LEDs will monitor one motion channel set by the`
m5i20.<board>.led-view parameter. A call to
`m5i20.<board>.misc-update
is required to update the viewed channel.
LED name | Output |
---|---|
LED0 | IRQLatch ? |
LED1 | enc-<channel> A |
LED2 | enc-<channel> B |
LED3 | enc-<channel> index |
LED4 | dac-<channel> DIR |
LED5 | dac-<channel> |
LED6 | dac-<channel>-enable |
LED7 | watchdog timeout ? |
The Vital Systems Motenc-100 and Motenc-LITE are 8- and 4-channel servo control boards. The Motenc-100 provides 8 quadrature encoder counters, 8 analog inputs, 8 analog outputs, 64 (68?) digital inputs, and 32 digital outputs. The Motenc-LITE has only 4 encoder counters, 32 digital inputs and 16 digital outputs, but it still has 8 analog inputs and 8 analog outputs. The driver automatically identifies the installed board and exports the appropriate HAL objects.[25]
Installing:
loadrt hal_motenc
During loading (or attempted loading) the driver prints some usefull
debugging message to the kernel log, which can be viewed with dmesg
.
Up to 4 boards may be used in one system.
In the following pins, parameters, and functions, <board> is the board ID. According to the naming conventions the first board should always have an ID of zero. However this driver sets the ID based on a pair of jumpers on the baord, so it may be non-zero even if there is only one board.
(s32
`) motenc.<board>.enc-<channel>-count `-- Encoder position, in
counts.
(
float
`) motenc.<board>.enc-<channel>-position `-- Encoder
position, in user units.
(bit) ``motenc.<board>.enc-<channel>-index
— Current status of
index pulse input.
(bit) ``motenc.<board>.enc-<channel>-idx-latch
— Driver sets this
pin true when it latches an index pulse (enabled
by latch-index
). Cleared by clearing` latch-index`.
(bit) ``motenc.<board>.enc-<channel>-latch-index
— If this pin is
true, the driver will reset the counter on the next
index pulse.
(bit) ``motenc.<board>.enc-<channel>-reset-count
— If this pin is
true, the counter will immediately be reset to
zero, and the pin will be cleared.
(float) ``motenc.<board>.dac-<channel>-value
— Analog output value
for DAC (in user units, see -gain
and -offset
)
(float) ``motenc.<board>.adc-<channel>-value
— Analog input value
read by ADC (in user units, see -gain
and -offset
)
(bit) ``motenc.<board>.in-<channel>
— State of digital input pin,
see canonical digital input.
(bit) ``motenc.<board>.in-<channel>-not
— Inverted state of digital
input pin, see canonical digital input.
(bit) ``motenc.<board>.out-<channel>
— Value to be written to
digital output, seen canonical digital
output.
(bit) ``motenc.<board>.estop-in
— Dedicated estop input, more
details needed.
(bit) ``motenc.<board>.estop-in-not
— Inverted state of dedicated
estop input.
(bit) ``motenc.<board>.watchdog-reset
— Bidirectional, - Set TRUE
to reset watchdog once, is automatically
cleared.
(float) ``motenc.<board>.enc-<channel>-scale
— The number of counts
/ user unit (to convert from counts to units).
(
float
`) motenc.<board>.dac-<channel>-offset `-- Sets the DAC
offset.
(
float
`) motenc.<board>.dac-<channel>-gain `-- Sets the DAC gain
(scaling).
(
float
`) motenc.<board>.adc-<channel>-offset `-- Sets the ADC
offset.
(
float
`) motenc.<board>.adc-<channel>-gain `-- Sets the ADC gain
(scaling).
(
bit
`) motenc.<board>.out-<channel>-invert `-- Inverts a digital
output, see canonical digital output.
(
u32
) motenc.<board>.watchdog-control
— Configures the
watchdog. The value may be a bitwise OR of the
following values:
[width="90%", options="header"] |======================================== |Bit # | Value | Meaning |0 | 1 | Timeout is 16ms if set, 8ms if unset |2 | 4 | Watchdog is enabled |4 | 16 | Watchdog is automatically reset by DAC writes (the HAL `dac-write` function) |======================================== Typically, the useful values are 0 (watchdog disabled) or 20 (8ms watchdog enabled, cleared by `dac-write`). - `(``u32``) motenc.<board>.led-view` -- Maps some of the I/O to onboard LEDs?
(funct) ``motenc.<board>.encoder-read
— Reads all encoder counters.
(funct)
` motenc.<board>.digital-in-read `-- Reads digital inputs.
(funct)
` motenc.<board>.digital-out-write `-- Writes digital outputs.
(funct) ``motenc.<board>.misc-update
— Updates misc stuff.
Pico Systems has a family of boards for doing servo, stepper, and pwm control. The boards connect to the PC through a parallel port working in EPP mode. Although most users connect one board to a parallel port, in theory any mix of up to 8 or 16 boards can be used on a single parport. One driver serves all types of boards. The final mix of I/O depends on the connected board(s). The driver doesn’t distinguish between boards, it simply numbers I/O channels (encoders, etc) starting from 0 on the first card.
Installing:
loadrt hal_ppmc port_addr=<addr1>[,<addr2>[,<addr3>...]]
The port_addr
parameter tells the driver what parallel port(s) to
check. By default, <addr1>
is 0x0378, and <addr2>
and following
are not used. The driver searches the entire address
space of the enhanced parallel port(s) at port_addr
, looking for
any board(s) in the PPMC family. It then exports HAL
pins for whatever it finds. During loading (or attempted loading) the
driver prints some usefull debugging message to the kernel log, which
can be viewed with dmesg
.
Up to 3 parport busses may be used, and each bus may have up to 8 devices on it.
In the following pins, parameters, and functions, <board> is the board ID. According to the naming conventions the first board should always have an ID of zero. However this driver sets the ID based on a pair of jumpers on the baord, so it may be non-zero even if there is only one board.
(s32
`) ppmc.<port>.encoder.<channel>.count `-- Encoder position, in
counts.
(s32
`) ppmc.<port>.encoder.<channel>.delta `-- Change in counts
since last read.
(
float
`) ppmc.<port>.encoder.<channel>.position `-- Encoder
position, in user units.
(bit) ``ppmc.<port>.encoder.<channel>.index
— Something to do with
index pulse.[26]
(bit) ``ppmc.<port>.pwm.<channel>.enable
— Enables a PWM generator.
(float) ``ppmc.<port>.pwm.<channel>.value
— Value which determines
the duty cycle of the PWM waveforms. The
value is divided by pwm.<channel>.scale
, and if the result is 0.6
the duty cycle will be 60%, and so on.
Negative values result in the duty cycle being based on the absolute
value, and the direction pin is set to indicate negative.
(bit) ``ppmc.<port>.stepgen.<channel>.enable
— Enables a step pulse
generator.
(float) ``ppmc.<port>.stepgen.<channel>.velocity
— Value which
determines the step frequency. The value is multiplied
by stepgen.<channel>.scale
, and the result is the frequency in
steps per second. Negative values
result in the frequency being based on the absolute value, and the
direction pin is set to indicate negative.
(bit) ``ppmc.<port>.in-<channel>
— State of digital input pin, see
canonical digital input.
(bit) ``ppmc.<port>.in.<channel>.not
— Inverted state of digital
input pin, see canonical digital input.
(bit) ``ppmc.<port>.out-<channel>
— Value to be written to digital
output, seen canonical digital
output.
(float) ``ppmc.<port>.enc.<channel>.scale
— The number of counts /
user unit (to convert from counts to units).
(float) ``ppmc.<port>.pwm.<channel-range>.freq
— The PWM carrier
frequency, in Hz. Applies to a group of four
consecutive PWM generators, as indicated by <channel-range>
. Minimum
is 153Hz, maximum is 500KHz.
(
float
) ppmc.<port>.pwm.<channel>.scale `-- Scaling for PWM
generator. If `scale
is X, then the duty cycle will be 100% when the
value
pin is X (or -X).
(
float
`) ppmc.<port>.pwm.<channel>.max-dc `-- Maximum duty cycle,
from 0.0 to 1.0.
(
float
`) ppmc.<port>.pwm.<channel>.min-dc `-- Minimum duty cycle,
from 0.0 to 1.0.
(
float
`) ppmc.<port>.pwm.<channel>.duty-cycle `-- Actual duty
cycle (used mostly for troubleshooting.)
(
bit
`) ppmc.<port>.pwm.<channel>.bootstrap ` — If true, the PWM
generator will generate a short sequence of pulses
of both polarities when it is enabled, to charge the bootstrap
capacators used on some MOSFET gate drivers.
(
u32
) ppmc.<port>.stepgen.<channel-range>.setup-time ` -- Sets
minimum time between direction change and step pulse, in units
of 100nS. Applies to a group fof four consecutive PWM generators, as
indicated by `<channel-range>
.
(
u32
) ppmc.<port>.stepgen.<channel-range>.pulse-width ` -- Sets
width of step pulses, in units of 100nS. Applies to a group
fof four consecutive PWM generators, as indicated by `<channel-range>
.
(
u32
) ppmc.<port>.stepgen.<channel-range>.pulse-space-min ` --
Sets minimum time between pulses, in units of 100nS. The maximum
step rate is 1/( 100nS * (
pulse-width` +` pulse-space-min` )).
Applies to a group fof four consecutive PWM generators, as
indicated by <channel-range>
.
(
float
) ppmc.<port>.stepgen.<channel>.scale ` -- Scaling for step
pulse generator. The step frequency in Hz is the
absolute value of `velocity
* scale
.
(
float
) ppmc.<port>.stepgen.<channel>.max-vel `-- The maximum
value for `velocity
. Commands greater than max-vel
will be clamped.
Also applies to negative values. (The absolute value
is clamped.)
(
float
`) ppmc.<port>.stepgen.<channel>.frequency `-- Actual step
pulse frequency in Hz (used mostly for troubleshooting.)
(
bit
`) ppmc.<port>.out.<channel>.invert `-- Inverts a digital
output, see canonical digital output.
The Pluto-P is an inexpensive ($60) FPGA board featuring the ACEX1K chip from Altera.
The src/hal/drivers/pluto_servo_firmware/
and
src/hal/drivers/pluto_step_firmware/
` ` subdirectories contain the
Verilog source code plus additional files
used by Quartus for the FPGA firmwares. Altera’s Quartus II software is
required to rebuild the FPGA firmware. To rebuild the firmware from the
.hdl and other source files, open the .qpf
file and press CTRL-L.
Then, recompile emc2.
Like the HAL hardware driver, the FPGA firmware is licensed under the terms of the GNU General Public License.
The gratis version of Quartus II runs only on Microsoft Windows, although there is apparently a paid version that runs on Linux.
The Pluto-P board may be ordered from http://www.knjn.com/ShopBoards_Parallel.html (US based, international shipping is available). Some additional information about it is available from http://www.fpga4fun.com/board_pluto-P.html and from the developer’s blog.
The pluto_servo system is suitable for control of a 4-axis CNC mill with servo motors, a 3-axis mill with PWM spindle control, a lathe with spindle encoder, etc. The large number of inputs allows a full set of limit switches.
This driver features:
Primary function | Alternate Function | Behavior if both functions used |
---|---|---|
UP0 | PWM0 | When pwm-0-pwmdir is TRUE, this pin is the PWM output |
OUT10 | XOR’d with UP0 or PWM0 | |
UP1 | PWM1 | When pwm-1-pwmdir is TRUE, this pin is the PWM output |
OUT12 | XOR’d with UP1 or PWM1 | |
UP2 | PWM2 | When pwm-2-pwmdir is TRUE, this pin is the PWM output |
OUT14 | XOR’d with UP2 or PWM2 | |
UP3 | PWM3 | When pwm-3-pwmdir is TRUE, this pin is the PWM output |
OUT16 | XOR’d with UP3 or PWM3 | |
DN0 | DIR0 | When pwm-0-pwmdir is TRUE, this pin is the DIR output |
OUT11 | XOR’d with DN0 or DIR0 | |
DN1 | DIR1 | When pwm-1-pwmdir is TRUE, this pin is the DIR output |
OUT13 | XOR’d with DN1 or DIR1 | |
DN2 | DIR2 | When pwm-2-pwmdir is TRUE, this pin is the DIR output |
OUT15 | XOR’d with DN2 or DIR2 | |
DN3 | DIR3 | When pwm-3-pwmdir is TRUE, this pin is the DIR output |
OUT17 | XOR’d with DN3 or DIR3 | |
QZ0 | IN8 | Read same value |
QZ1 | IN9 | Read same value |
QZ2 | IN10 | Read same value |
QZ3 | IN11 | Read same value |
QA0 | IN12 | Read same value |
QA1 | IN13 | Read same value |
QA2 | IN14 | Read same value |
QA3 | IN15 | Read same value |
QB0 | IN16 | Read same value |
QB1 | IN17 | Read same value |
QB2 | IN18 | Read same value |
QB3 | IN19 | Read same value |
A list of all loadrt arguments, HAL function names, pin names and parameter names is in the manual page, pluto_servo.9.
A schematic for a 2A, 2-axis PWM servo amplifier board is available (http://emergent.unpy.net/projects/01148303608). The L298 H-Bridge (L298 H-bridge) is inexpensive and can easily be used for motors up to 4A (one motor per L298) or up to 2A (two motors per L298) with the supply voltage up to 46V. However, the L298 does not have built-in current limiting, a problem for motors with high stall currents. For higher currents and voltages, some users have reported success with International Rectifier’s integrated high-side/low-side drivers. (http://www.cnczone.com/forums/showthread.php?t=25929)
Pluto-step is suitable for control of a 3- or 4-axis CNC mill with stepper motors. The large number of inputs allows for a full set of limit switches.
The board features:
While the “extended main connector” has a superset of signals usually found on a Step & Direction DB25 connector—4 step generators, 9 inputs, and 6 general-purpose outputs—the layout on this header is different than the layout of a standard 26-pin ribbon cable to DB25 connector.
The firmware and driver enforce step length, space, and direction change times. Timings are rounded up to the next multiple of , with a maximum of . The timings are the same as for the software stepgen component, except that “dirhold” and “dirsetup” have been merged into a single parameter “dirtime” which should be the maximum of the two, and that the same step timings are always applied to all channels.
[17] In the emc packages for Ubuntu, the file
/etc/modprobe.d/emc2
generally prevents parport_pc
from being automatically loaded.
[18] In fact it may be a pair of 8255 chips, but I’m not sure. If/when someone starts a driver for an 8255 they should look at the ax5214 code, much of the work is already done.
[19] a motion control card usually is a board containing devices to control one or more axes (the control devices are usually DAC’s to set an analog voltage, encoder counting chips for feedback, etc.)
[20] hint: after starting up the driver, dmesg can be consulted for messages relevant to the driver (e.g. autodetected version number and base address)
[21] if IIOO is defined, there are 16 input pins (in-00 .. in-15) and 16 output pins (out-00 .. out-15), and they correspond to PORTs ABCD (in-00 is PORTA.0, out-15 is PORTD.7)
[22] Ideally the encoders, “DACs”, and digital I/O would comply with the canonical interfaces defined earlier, but they don’t. Fixing that is on the things-to-do list.
[23] With normal 10 bit PWM, 50% duty cycle would be 512 cycles on and 512 cycles off = ca 30 kHz with 33 MHz reference counter. With fully interleaved PWM this would be 1 cycle on, 1 cycle off for 1024 cycles (16.66 MHz if the PWM reference counter runs at 33 MHz) = much easier to filter. The 5I20 configuration interlace is somewhat between non and fully interlaced (to make it easy to filter but not have as many transistions as fully interleaved).
[24] emc2/src/hal/drivers/m5i20/REGMAP4E
[25] Ideally the encoders, DACs, ADCs, and digital I/O would comply with the canonical interfaces defined earlier, but they don’t. Fixing that is on the things-to-do list.
[26] Index handling does not comply with the canonical encoder interface, and should be changed.
Halui est une interface utilisateur pour EMC s’appuyant sur HAL, elle connecte les pins de HAL à des commandes NML. La plupart des fonctionnalités (boutons, indicateurs etc.) utilisées par les interfaces graphiques traditionnelles (mini, Axis, etc.), sont fournies par des pins de HAL dans Halui.
La façon la plus facile pour utiliser halui est de modifier votre dossier d’ini pour inclure
HALUI = halui
dans la section [HAL].
Une solution alternative pour l’invoquer (surtout si vous générez la config avec stepconf) est d’inclure
loadusr halui -ini /path/to/inifile.ini
dans votre fichier custom.hal.
bit
) halui.estop.activate - pin de requête d’arrêt d’urgence (E-Stop)
bit
) halui.estop.reset - pin de requête de relâchement de l’arrêt
d’urgence (E-Stop reset)
bit
) halui.estop.is-activated - indique si l’arrêt d’urgence est
actif
bit
) halui.mist.on - pin de requête du brouillard
bit
) halui.mist.is-on - indique si le brouillard est actif
bit
) halui.mist.off - pin de requête d’arrêt du brouillard
bit
) halui.flood.on - pin de requête d’arrosage
bit
) halui.flood.is-on - indique si l’arrosage est actif
bit
) halui.flood.off - pin de requête d’arrêt d’arrosage
bit
) halui.lube.on - pin de requête de graissage
bit
) halui.lube.is-on - indique si le graissage est actif
bit
) halui.lube.off - pin de requête d’arrêt du graissage
<n> est un nombre compris entre 0 et 7, ou <selected>.
bit
) halui.jog.<n>.minus - jog en direction négative
bit
) halui.jog.<n>.plus - jog en direction positive
<n> est un nombre compris entre 0 et 7, ou selected.
bit
) halui.joint.<n>.home (out) - pin pour la prise d’origine d’un
joint
spécifique
bit
) halui.joint.<n>.on-soft-min-limit - pin de status indiquant
que le
joint est sur sa limite logicielle négative
bit
) halui.joint.<n>.on-soft-max-limit - pin de status indiquant
que le
joint est sur sa limite logicielle positive
bit
) halui.joint.<n>.on-hard-min-limit - pin de status indiquant
que le
joint est sur son fin de course de limite négative
bit
) halui.joint.<n>.on-hard-max-limit - pin de status indiquant
que le
joint est sur son fin de course de limite positive
bit
) halui.joint.<n>.has-fault (out) - pin de status indiquant que
le
joint est en défaut
bit
) halui.joint.<n>.is-homed (out) - pin de status indiquant que le
joint est référencé
bit
) halui.joint.<n>.is-selected bit (out) - pin indiquant que le
joint
est «selected» - interne à halui
bit
) halui.joint.<n>.select (in) - select joint (0..7) - interne à
halui
u32
) halui.joint.selected (out) - selected joint (0..7) - interne à
halui
bit
) halui.joint.selected.has-fault (out) - pin de status
indiquant que
le joint <n> est en défaut
bit
) halui.joint.selected.home (in) - pin pour la prise d’origine du
joint «selected»
bit
) halui.joint.selected.is-homed (out) - pin de status indiquant
que le
joint «selected» est référencé
bit
) halui.joint.selected.on-hard-max-limit (out) - status pin
telling
that the selected joint is on the positive hardware limit
bit
) halui.joint.selected.on-hard-min-limit (out) - pin de status
indiquant que le joint «selected» est sur son fin de course de limite
négative
bit
) halui.joint.selected.on-soft-max-limit (out) - pin de status
indiquant que le joint «selected» est sur sa limite logicielle positive
bit
) halui.joint.selected.on-soft-min-limit (out) - pin de status
indiquant que le joint «selected» est sur sa limite logicielle négative
bit
) halui.machine.on - pin de requête de marche machine
bit
) halui.machine.off - pin de requête d’arrêt machine
bit
) halui.machine.is-on - indique que la machine est en marche
La vitesse linéaire maximum peut être ajustée entre 0 et la valeur de la variable MAX_VELOCITY dans la section [TRAJ] du fichier ini.
bit
) halui.max-velocity.count-enable (in) - Si TRUE, la vitesse
max est
modifiée quand le comptage change
bit
) halui.max-velocity.decrease (in) - pin pour diminuer la
vitesse max
bit
) halui.max-velocity.increase (in) - pin pour augmenter la
vitesse max
Il arrive que l’utilisateur veuille ajouter des tâches plus complexes devant être effectuées par l’activation d’une pin de HAL. C’est possible en utilisant le schéma de commande en données manuelles (MDI) suivant:
bit
)
halui.mdi-command-<nr>, <nr> est un nombre compris entre 00 et le
nombre de MDI_COMMAND trouvées dans le fichier ini, avec un maximum de
64 commandes.
bit
) halui.mode.manual (in) - pin de requête du mode manuel
bit
) halui.mode.is_manual (out) - indique si le mode manuel est actif
bit
) halui.mode.auto (in) - pin de requête du mode auto
bit
) halui.mode.is_auto (out)- indique si le mode auto est actif
bit
) halui.mode.mdi (in) - pin de requête du mode données manuelles
bit
) halui.mode.is_mdi (out) - indique si le mode données
manuelles est
actif
bit
) halui.mode.joint (in) - pin de requête du mode jog joint par
joint
bit
) halui.mode.is-joint (out) - pin indiquant si le mode joint
par joint
est actif
bit
) halui.mode.is-teleop (out) - pin indiquant que le mode jog
coordonné
est actif
bit
) halui.spindle.start (in) - Marche de la broche
bit
) halui.spindle.is-on (out) -
bit
) halui.spindle.stop (in) - Arrêt de la broche
bit
) halui.spindle.forward (in) - Marche broche en sens horaire
bit
) halui.spindle.runs-forward (out) -
bit
) halui.spindle.reverse (in) - Marche broche en sens anti-horaire
bit
) halui.spindle.runs-backward (out) -
bit
) halui.spindle.increase (in) - Augmente la vitesse de broche
bit
) halui.spindle.decrease (in) - Diminue la vitesse de broche
bit
) halui.spindle.brake-on (in) - pin d’activation du frein de
broche
bit
) halui.spindle.brake-is-on (out) - indique si le frein est actif
bit
) halui.spindle.brake-off (in) - pin de désactivation du frein
de broche
bit
) halui.program.is-idle (out) - pin de status indiquant qu’aucun
programme n’est lancé
bit
) halui.program.is-running (out) - pin de status indiquant qu’un
programme est lancé
bit
) halui.program.is-paused (out) - pin de status indiquant qu’un
programme est en pause
bit
) halui.program.run (in) - pin de lancement d’un programme
bit
) halui.program.pause (in) - pin pour passer un programme en pause
bit
) halui.program.resume (in) - pin pour lancer la reprise d’un
programme
bit
) halui.program.step (in) - pin pour avancer d’une ligne de
programme
bit
) halui.program.block-delete.is-on (out) -
bit
) halui.program.block-delete.off (in) -
bit
) halui.program.block-delete.on (in) -
bit
) halui.program.optional-stop.is-on (out) -
bit
) halui.program.optional-stop.off (in) -
bit
) halui.program.optional-stop.on (in) -
bit
) halui.program.stop (in) - pin pour stopper un programme
Panneau virtuel de contrôle en python (*Py*thon *V*irtual *C*ontrol *P*anel)
Le panneau de contrôle virtuel pyVCP (python Virtual Control Panel) a été créé pour donner à l’intégrateur la possibilité de personnaliser l’interface graphique AXIS avec des boutons et des indicateurs destinés aux tâches spéciales.
Le coût d’un panneau de contrôle physique est très élevé et il peut utiliser un grand nombre de broches d’entrées/sorties. C’est là que le panneau virtuel prends l’avantage car il ne coûte rien d’utiliser pyVCP.
Les panneaux virtuels de contrôle peuvent être utilisés pour tester ou monitorer le matériel, les entrées/sorties et remplacer temporairement d’autres matériels d’entrées/sorties pendant le déboguage d’une logique ladder, ou pour simuler un panneau physique avant de le construire et de le câbler vers les cartes électroniques.
L’image suivante montre plusieurs widgets pyVCP.
La disposition d’un panneau pyVCP est spécifiée avec un fichier XML qui contient les balises des widgets entre <pyvcp> et </pyvcp>. Par exemple:
<pyvcp>
Si vous placez ce texte dans un fichier nommé tiny.xml et que vous le lancez avec:
pyvcp -c panneau tiny.xml
pyVCP va créer le panneau pour vous, il y inclut deux widgets, un Label avec le texte “Ceci est un indicateur à LED” et une LED rouge, utilisée pour afficher l'état d’un signal HAL de type BIT. Il va aussi créer un composant HAL nommé “panneau” (tous les widgets dans ce panneau sont connectés aux pins qui démarrent avec “panneau”). Comme aucune balise <halpin> n'était présente à l’intérieur de la balise <led>, pyVCP nomme automatiquement la pin HAL pour le widget LED panneau.led.0
Pour obtenir la liste des widgets, leurs balises et options, consultez la documentation des widgets: [sec:Documentation-des-widgets]
Un fois que vous avez créé votre panneau, connecter les signaux HAL de la forme à la pin pyVCP se fait avec la commande halcmd linksp habituelle. Si vous débutez avec HAL, le tutoriel de HAL ??? est vivement recommendé.
Certaines parties de pyVCP sont évaluées comme du code Python, elles peuvent donc exécuter n’importe quelle action disponible dans les programmes Python. N’utilisez que des fichiers pyVCP en .xml à partir d’une source de confiance.
Puisque AXIS utilise le même environnement graphique et les même outils (Tkinter) que pyVCP, il est possible d’inclure un panneau pyVCP sur le côté droit de l’interface utilisateur normale d’AXIS. Un exemple typique est présenté ci-dessous.
Placer le fichier pyVCP XML décrivant le panneau dans le même répertoire que le fichier .ini. Nous voulons afficher la vitesse courante de la broche sur un widget barre de progression. Copier le code XML suivant dans un fichier appelé broche.xml:
<pyvcp>
Ici nous avons fait un panneau avec un label “Vitesse broche:” et un widget barre de progression. Nous avons spécifié que la pin HAL connectée à la barre de progression devait s’appeler “spindle-speed” et réglé la valeur maximum de la barre à 5000 (se reporter à la documentation des widgets, plus loin, pour toutes les options disponibles). Pour faire connaître ce fichier à AXIS et qu’il l’appelle au démarrage, nous devons préciser ce qui suit dans la section [DISPLAY] du fichier .ini:
PYVCP = broche.xml
Pour que notre widget affiche réellement la vitesse de la broche “spindle-speed”, il doit être raccordé au signal approprié de HAL. Le fichier .hal qui sera exécuté quand AXIS et pyVCP démarreront doit être spécifié, de la manière suivante, dans la section [HAL] du fichier .ini:
POSTGUI_HALFILE = broche_vers_pyvcp.hal
Ce changement lancera la commande HAL spécifiée dans “broche_vers_pyvcp.hal”. Dans notre exemple, ce fichier contiendra juste la commande suivante:
net spindle-rpm-filtered => pyvcp.spindle-speed
ce qui suppose que le signal appelé “spindle-rpm-filtered” existe aussi. Noter que lors de l’exécution avec AXIS, toutes les pins des widgets de pyVCP ont des noms commençant par “pyvcp.”.
Voila à quoi ressemble le panneau pyVCP que nous venons de créer,
incorporé à AXIS. La configuration sim/lathe
fournie en exemple, est
configurée de cette manière.
Les signaux de HAL existent en deux variantes, BIT et FLOAT. pyVCP peut afficher la valeur d’un signal avec un widget indicateur, ou modifier la valeur d’un signal avec un widget de contrôle. Ainsi, il y a quatre classes de widgets pyVCP connectables aux signaux de HAL. Une cinquième classe de widgets d’aide permet d’organiser et d’appliquer des labels aux panneaux.
Chaque widget est décrit brièvement, suivi par la forme d'écriture utilisée et d’une capture d'écran. Toutes les balises contenues dans la balise du widget principal, sont optionnelles.
à l’heure actuelle, les deux syntaxes, basée sur les balises et basée sur les attributs, sont supportées. Par exemple, les deux fragments de code XML suivants sont traités de manière identique:
<led halpin="ma-led"/>
et
<led><halpin>"ma-led"</halpin></led>
Quand la syntaxe basée sur les attributs est utilisée, les règles suivantes sont utilisées pour convertir les valeurs des attributs en valeurs Python:
{(["'
,
Il est évalué comme une expression Python.
Quand la syntaxe basée sur les balises est utilisée, le texte entre les balises est toujours évalué comme un expression Python.
Les exemples ci-dessous montrent un mélange des deux formats.
Editer le fichier XML avec un éditeur de texte. La plupart du temps un double click sur le nom de fichier permet de choisir "ouvrir avec l’editeur de texte" ou similaire.
Les couleurs peuvent être spécifiées en utilisant les couleurs RGB de X11 soit par le nom, par exemple: "gray75" ou soit en hexa décimal, par exemple: "#0000ff”. Une liste complète est consultable ici: http://sedition.com/perl/rgb.html.
Couleurs les plus courantes (les numéros suivant la couleur indiquent la nuance de la couleur)
Une LED est utilisée pour indiquer l'état d’un signal BIT. La couleur de la LED sera on_color quand le signal BIT est vrai et off_color autrement.
<led>
<halpin> définit le nom de la pin, par défaut: “led.n”, où n est un entier <size> définit la taille de la led, par défaut: 20 <on_color> définit la couleur de la led LED quand la pin est vraie, par défaut: “green” <off_color> définit la couleur de la LED quand la pin est fausse, par défaut: “ref”
C’est une variante du widget "led".
<vbox> + <relief>RIDGE</relief> + <bd>6</bd> + <rectled> + <halpin>"ma-led-rect"</halpin> + <height>"50"</height> + <width>"100"</width> + <on_color>"green"</on_color> + <off_color>"red"</off_color> + </rectled> + </vbox>
Le code ci-dessus produit cet exemple. Il affiche également un relief autour de la boîte.
Un bouton permet de contrôler une pin BIT. La pin sera mise vraie quand le bouton sera pressé et maintenu enfoncé, elle sera mise fausse quand le bouton sera relâché.
Les boutons peuvent suivre le format suivant:
Une case à cocher contrôle une pin BIT. La pin sera mise vraie quand la case sera cochée et fausse si la case est décochée.
<checkbutton>
Une case non cochée: et une case cochée:
Un bouton radio placera une seule des pins BIT vraie. Les autres seront mises fausses.
<radiobutton>
Noter que dans cet exemple, les pins de HAL seront nommées mon-bouton-radio.un, mon-bouton-radio.deux et mon-bouton-radio.trois. Dans la capture d'écran, la valeur “trois” est sélectionnée.
L’affichage d’un nombre peux suivre le format suivant:
Le widget number affiche la valeur d’un signal de type float.
<number> + <halpin>"number"</halpin> + <font>("Helvetica",24)</font> + <format>"+4.4f"</format> + </number>
Le widget nombre affiche la valeur d’un signal FLOAT.
<number>
<font> est une police de caractères de type Tkinter avec la spécification de sa taille. Noter que sous Ubuntu 6.06 Helvetica n’est pas disponible en taille supérieure à 40 ou 50. Une police qui peut être agrandie jusqu'à la taille 200 est la police courier 10 pitch, que vous pouvez spécifier de la manière suivante, pour afficher des chiffres réellement grands:
<font>('courier 10 pitch',100)</font>
<format> est un format style C, spécifié pour définir le format d’affichage du nombre.
Le widget s32 affiche la valeur d’un nombre s32. La syntaxe est la même que celle de "number" excepté le nom qui est <s32>. Il faut prévoir une largeur suffisante pour afficher le nombre dans sa totalité.
<s32> + <halpin>"simple-number"</halpin> + <font>("Helvetica",24)</font> + <format>"6d"</format> + <width>6</width> + </s32>
Seul l’affichage d’images au format gif est possible. Toutes les images doivent avoir la même taille. Les images doivent être toutes dans le même répertoire que le fichier ini (ou dans le répertoire courant pour un fonctionnement en ligne de commande avec halrun/halcmd).
La bascule "image_bit" bascule entre deux images selon la position vraie ou fausse de halpin.
<pyvcp> + <image name='fwd' file='fwd.gif'/> + <image name='rev' file='rev.gif'/> + <vbox> + <image_bit halpin='selectimage' images='fwd rev'/> + </vbox> + </pyvcp>
En utilisant les deux images fwd.gif et rev.gif. FWD est affiché quand "selectimage" est fausse et REV est affiché quand "selectimage" est vraie.
La bascule "image_u32" est la même que "image_bit" excepté que le nombre d’images n’est pratiquement plus limité, il suffit de "selectionner" l’image en ajustant halpin à une valeur entière commençant à 0 pour la première image de la liste, à 1 pour la seconde image etc.
<pyvcp> + <image name='stb' file='stb.gif'/> + <image name='fwd' file='fwd.gif'/> + <image name='rev' file='rev.gif'/> + <vbox> + <image_u32 halpin='selectimage' images='stb fwd rev'/> + </vbox> + </pyvcp>
Même résultat mais en ajoutant l’image stb.gif.
Le widget barre de progression affiche la valeur d’un signal FLOAT, graphiquement dans une barre de progression et simultanément, en numérique.
<bar>
Le galvanomètre affiche la valeur d’un signal FLOAT dans un affichage à aiguille “à l’ancienne”.
<meter>
La roue codeuse contrôle une pin FLOAT. La valeur de la pin est augmentée ou diminuée de la valeur de resolution, à chaque pression sur une flèche, ou en positionnant la souris sur le nombre puis en tournant la molette de la souris.
<spinbox>
Le curseur contrôle une pin FLOAT. La valeur de la pin est augmentée ou diminuée en déplaçant le curseur, ou en positionnant la souris sur le curseur puis en tournant la molette de la souris.
<scale>
Noter que par défaut c’est min qui est affiché même si il est supérieur à max, à moins que min ne soit négatif.
Le bouton tournant imite le fonctionnement d’un vrai bouton tournant, en sortant sur un FLOAT HAL la valeur sur laquelle est positionné le curseur, que ce soit en le faisant tourner avec un mouvement circulaire, ou en tournant la molette de la souris. Un double click gauche augmente la résolution et un double click droit la diminue d’un digit. La sortie est limitée par les valeurs min et max. La variable cpr fixe le nombre de graduations sur le pourtour du cadran (prudence avec les grands nombres).
<dial> + <size>200</size> + <cpr>100</cpr> + <min_>-15</min_> + <max_>15</max_> + <text>"Dial"</text> + <init>0</init> + <resolution>0.001</resolution> + <halpin>"anaout"</halpin> + <dialcolor>"yellow"</dialcolor> + <edgecolor>"green"</edgecolor> + <dotcolor>"black"</dotcolor> + </dial>
Les containers sont des widgets qui contiennent d’autres widgets.
Le container bordure est spécifié avec deux tags utilisés ensembles. Le tag <relief> spécifie le type de bordure et le tag <bd> spécifie la largeur de la bordure.
La valeur de "n" fixe la largeur de la bordure.
<hbox> + <button> + <relief>FLAT</relief> + <text>"FLAT"</text> + <bd>3</bd> + </button>
<button> + <relief>SUNKEN</relief> + <text>"SUNKEN"</text> + <bd>3</bd> + </button>
<button> + <relief>RAISED</relief> + <text>"RAISED"</text> + <bd>3</bd> + </button>
<button> + <relief>GROOVE</relief> + <text>"GROOVE"</text> + <bd>3</bd> + </button>
<button> + <relief>RIDGE</relief> + <text>"RIDGE"</text> + <bd>3</bd> + </button> + </hbox>
Utilisez une Hbox lorsque vous voulez aligner les widgets, horizontalement, les uns à côtés des autres.
<hbox>
à l’intérieur d’une Hbox, vous pouvez utiliser les balises <boxfill
fill=""/>
, <boxanchor anchor=""/>
et <boxexpand expand=""/>
pour
choisir le comportement des éléments contenus dans la boîte,
lors d’un redimensionnement de la fenêtre. Pour des détails sur le
comportement de fill, anchor, et expand, référez vous au manuel du pack
Tk, pack(3tk)
. Par défaut, fill='y'
, anchor='center'
,
expand='yes'
.
Utilisez une Vbox lorsque vous voulez aligner les widgets verticalement, les uns au dessus des autres.
<vbox>
à l’intérieur d’une Hbox, vous pouvez utiliser les balises <boxfill
fill=""/>
, <boxanchor anchor=""/>
et <boxexpand expand=""/>
pour
choisir le comportement des éléments contenus dans la boîte,
lors d’un redimensionnement de la fenêtre. Pour des détails sur le
comportement de fill, anchor, et expand, référez vous au manuel du pack
Tk, pack(3tk)
. Par défaut, fill='y'
, anchor='center'
,
expand='yes'
.
Un labelframe est un cadre entouré d’un sillon et un label en haut à gauche.
<labelframe text="Label: Leds groupées">
Une table est un container qui permet d'écrire dans une grille de
lignes et de colonnes. Chaque ligne débute avec la balise <tablerow/>
. Un widget container peut être en lignes ou en colonnes par
l’utilisation de la balise <tablespan rows= cols=/>
. Les bordures
des cellules contenant les widgets “sticky” peuvent
être réglées grâce à l’utilisation de la balise <tablesticky
sticky=/>
. Une table peut s'étirer sur ses lignes et colonnes
flexibles (sticky).
Exemple:
<table flexible_rows="[2]" flexible_columns="[1,4]">
image:images/pyvcp_table.png[]
Une interface à onglets peut économiser énormément d’espace.
<tabs> + <names> ["spindle","green eggs"]</names> + </tabs> + <tabs> + <names>["Spindle", "Green Eggs", "Ham"]</names> + <vbox> + <label> + <text>"Spindle speed:"</text> + </label> + <bar> + <halpin>"spindle-speed"</halpin> + <max_>5000</max_> + </bar> + </vbox> + <vbox> + <label> + <text>"(this is the green eggs tab)"</text> + </label> + </vbox> + <vbox> + <label> + <text>"(this tab has nothing on it)"</text> + </label> + </vbox> + </tabs>
Habituellement quand nous parlons de machines CNC, nous pensons à des machines programmées pour effectuer certains mouvements et effectuer diverses tâches. Pour avoir une représentation unifiée dans l’espace de ces machines, nous la faisons correspondre à la vision humaine de l’espace en 3D, la plupart des machines (sinon toutes) utilisent un système de coordonnées courant, le système Cartésien.
Le système de coordonnées Cartésiennes est composé de 3 axes (X, Y, Z) chacun perpendiculaire aux 2 autres. [27]
Quand nous parlons d’un programme G-code (RS274NGC) nous parlons d’un certain nombre de commandes (G0, G1, etc.) qui ont comme paramètres (X- Y- Z-). Ces positions se référent exactement à des positions Cartésiennes. Une partie du contrôleur de mouvements d’EMC2 est responsable de la translation entre ces positions et les positions correspondantes de la cinématique de la machine[28].
Une jointure, pour une machine CNC est un des degrés physiques de liberté de la machine. Elle peut être linéaire (vis à billes) ou rotative (table tournante, jointures d’un bras robotisé). Il peut y avoir n’importe quel nombre de jointures sur une machine. Par exemple, un robot classique dispose de 6 jointures et une fraiseuse classique n’en a que 3.
Sur certaines machines, les jointures sont placées de manière à correspondre aux axes cinématiques (jointure 0 le long de l’axe X, jointure 1 le long de l’axe Y et jointure 2 le long de l’axe Z), ces machines sont appelées machines Cartésiennes (ou encore machines à cinématiques triviales . Ce sont les machines les plus courantes parmi les machines-outils mais elles ne sont pas courantes dans d’autres domaines comme les machines de soudage (ex: robots de soudage de type puma).
Comme nous l’avons vu, il y a un groupe de machines sur lesquelles chacun des axes est placé le long d’un des axes Cartésiens. Sur ces machines le passage, du plan de l’espace Cartésien (le programme G-code) au plan de l’espace jointure (l’actuateur actuel de la machine), est trivial. C’est un simple plan 1:1:
pos->tran.x = joints[0];
Dans l’extrait de code ci-dessus, nous pouvons voir comment le plan est fait: la position X est identique avec la jointure 0, Y avec la jointure 1 etc. Nous nous référons dans ce cas à une cinématique directe (une transformation avant), tandis que dans l’extrait de code suivant il est fait référence à une cinématique inverse (ou une transformation inverse):
joints[0] = pos->tran.x;
Comme on peut le voir, c’est assez simple de faire la transformation d’une machine à cinématique banale (ou Cartésienne). Cela devient un peu plus compliqué si il manque un axe à la machine.[29][30]
Il peut y avoir un certain nombre de types de configurations de machine (robots: puma, scara; hexapodes etc.) Chacun d’eux est mis en place en utilisant des jointures linéaires et rotatives. Ces jointures ne correspondent pas habituellement avec les coordonnées Cartésiennes, cela nécessite une fonction cinématique qui fasse la conversion (en fait 2 fonctions: fonction en avant et inverse de la cinématique).
Pour illustrer ce qui précède, nous analyserons une simple cinématique appelée bipode (une version simplifiée du tripode, qui est déjà une version simplifiée de l’hexapode).
Le bipode dont nous parlons est un appareil, composé de deux moteurs placés sur un mur, à cet appareil un mobile est suspendu par des fils. Les jointures dans ce cas sont les distances entre le mobile et les moteurs de l’appareil (nommées AD et BD sur la figure [cap:Bipod-setup]).
La position des moteurs est fixée par convention. Le moteur A est en (0,0), qui signifie que sa coordonnée X est 0 et sa coordonnée Y également 0. Le moteur B est placé en (Bx, 0), se qui veut dire que sa coordonnée X est Bx.
Notre pointe mobile se trouvera au point D défini par les distances AD et BD, et par les coordonnées Cartésiennes Dx, Dy.
La tâche de la cinématique consistera à transformer les longueurs des jointures en (AD, BD) en coordonnées Cartésiennes (Dx, Dy) et vice-versa.
Pour effectuer la transformation de l’espace jointure en espace Cartésien nous allons utiliser quelques règles de trigonomètrie (le triangle rectangle déterminé par les points (0,0), (Dx,0), (Dx,Dy) et le triangle rectangle (Dx,0), (Bx,0) et (Dx,Dy).
Nous pouvons voir aisément que , de même que .
Si nous soustrayons l’un de l’autre nous aurons:
et par conséquent:
De là nous calculons:
Noter que le calcul inclus la racine carrée de la différence, mais qu’il n’en résulte pas un nombre réel. Si il n’y a aucune coordonnées Cartésienne pour la position de cette jointure, alors la position est dite singulière. Dans ce cas, la cinématique inverse retourne -1.
Traduction en code:
double AD2 = joints[0] * joints[0]; return 0;
Un module cinématique est implémenté comme un composant de HAL, et il est permis d’exporter ses pins et ses paramètres. Il consiste en quelques fonctions “C” (par opposition au fonctions de HAL):
KINEMATICS_TYPE kinematicsType(void)
Retourne l’identificateur de type de la cinématique, typiquement
KINEMATICS_BOTH
.
int rtapi_app_main(void)
void rtapi_app_exit(void)
Il s’agit des fonctions standards d’installation et de la
désinstallation des modules RTAPI.
Quand ils sont contenus dans un seul fichier source, les modules de la
cinématique peuvent être compilés et installé par «comp`». Voir la
manpage `«comp(1)»
pour d’autres informations.
[27] Le mot “axes” est aussi communément (et incorrectement) utilisé à propos des machines CNC, il fait référence aux directions des mouvements de la machine.
[28] Cinématique: une fonction à deux voies pour transformer un espace Cartésien en espace à jointures
[29] Si la machine (par exemple un tour) est montée avec seulement les axes X, Z et A et que le fichier d’init d’EMC2 contient uniquement la définition de ces 3 jointures, alors l’assertion précédente est fausse. Parce-que nous avons actuellement (joint0=x, joint1=Z, joint2=A) ce qui suppose que joint1=Y. Pour faire en sorte que cela fonctionne dans EMC2 il suffit de définir tous les axes (XYZA), EMC2 utilisera alors une simple boucle dans HAL pour l’axe Y inutilisé.
[30] Une autre façon de le faire fonctionner, est de changer le code correspondant et recompiler le logiciel.
Faire générer les impulsions de pas au logiciel présente un gros avantage, c’est gratuit. Comme chaque PC est équipé d’un port parallèle, il est capable de sortir sur celui-ci, les impulsions générées par le logiciel. Toutefois, cette génération d’impulsions logicielle présente aussi certains désaventages:
Ce chapitre présente certaines mesures qui vous aideront à obtenir les meilleurs résultats du logiciel.
La latence correspond au temps pris par le PC pour stopper ce qui est en cours et répondre à une requête externe. Dans notre cas, la requête est l’horloge qui sert au cadencement des impulsions de pas. Plus basse est la latence, plus rapide pourra être l’horloge, plus rapides et plus douces seront les impulsions de pas.
La latence est de loin plus importante que la vitesse du CPU. Un Pentium II répondant à chaque interruption et toutes les 10 microsecondes pourra donner de meilleurs résultats qu’un rapide P4 HT.
Le CPU n’est pas le seul facteur déterminant la latence. Les cartes mères, cartes graphiques, ports USB et nombre d’autres choses peuvent la dégrader. La meilleure façon de savoir ce que vous pouvez attendre d’un PC consiste à exécuter le test de latence RTAI.
NE PAS ESSAYER DE LANCER EMC2 PENDANT QUE LE TEST EST EN COURS
Sous Ubuntu Dapper, vous pouvez lancer le test en ouvrant une console et en faisant:
sudo mkdir /dev/rtf; sudo mknod /dev/rtf/3 c 150 3; sudo mknod /dev/rtf3 c 150 3; cd /usr/realtime*/testsuite/kern/latency; ./run
et vous devriez voir quelques choses comme:
ubuntu:/usr/realtime-2.6.12-magma/testsuite/kern/latency$ ./run * * * Type ^C to stop this application. (Tapez CTRL-C pour arrêter cette application) * *
## RTAI latency calibration tool ## # period = 100000 (ns) # avrgtime = 1 (s) # do not use the FPU # start the timer # timer_mode is oneshot
RTAI Testsuite - KERNEL latency (all data in nanoseconds) RTH| lat min| ovl min| lat avg| lat max| ovl max| overruns RTD| -1571| -1571| 1622| 8446| 8446| 0 RTD| -1558| -1571| 1607| 7704| 8446| 0 RTD| -1568| -1571| 1640| 7359| 8446| 0 RTD| -1568| -1571| 1653| 7594| 8446| 0 RTD| -1568| -1571| 1640| 10636| 10636| 0 RTD| -1568| -1571| 1640| 10636| 10636| 0
Pendant la durée du test, vous devez "abuser" de l’ordinateur. Déplacez les fenêtres tout autour de l'écran. Surfez sur le web. Déplacez quelques longs fichiers sur le disque. Jouez de la musique. Lancez un programme OpenGL comme glxgears. L’idée étant de pousser le PC au bout de ses limites pendant que le test de latence observe pour trouver les cas les moins bons.
L’avant dernière colonne marquée «ovl max» est la plus importante. Notez sa valeur, vous en aurez besoin par la suite. Elle contient les mesures de latence les plus mauvaises durant tout le test. Dans l’exemple ci-dessus, la valeur est de 10636 nanosecondes, soit 10.6 microsecondes, ce qui est excellent. Toutefois, le test de l’exemple n’a duré que quelques secondes (une ligne s’affiche à chaque seconde). Vous devez lancer le test pendant plusieurs minutes, parfois le plus mauvais temps n’apparaît pas vraiment, ou il apparaît quand vous faites une action particulière. J’ai une carte mère Intel qui marche très bien la plupart du temps, mais chaque 64 secondes arrive une valeur très mauvaise de 300uS. Par chance, ce cas a trouvé une solution, voyez ici: Le Wiky de Linuxcnc.
Que signifient les résultats du tableau, à quels résultats s’attendre? Si la valeur de votre «ovl max» est inférieure à 15-20 microsecondes (15000-20000 nanosecondes), l’ordinateur donnera d’excellents résultats. Si la latence maximale est près de 30-50 microsecondes, vous aurez de bons résultats, mais la fréquence maximale des pas risque d'être décevante, spécialement si vous utilisez des micropas ou si vous avec une vis avec un pas fin. Si la latence est de 100uS ou plus (100,000 nanosecondes), alors le PC n’est pas utilisable pour générer des trains d’impulsions par logiciel. Des chiffres suppérieurs à 1 milliseconde (1,000,000 nanosecondes) signifie que ce PC ne convient pas du tout pour EMC2, que vous pensiez générer les pas par logiciel ou non.
Notez que si vous obtenez de mauvais résultats, c’est peut être améliorable. Par exemple, un PC qui avait une latence très mauvaise (plusieurs millisecondes) en utilisant la carte graphique intégrée a vu le problème résolu par une carte graphique Matrox à 5$. EMC ne nécessite pas du matériel de pointe.
Les différente marques de cartes de pilotage de moteurs pas à pas demandent toutes des timing différents pour les impulsions de commande de pas et de direction. Aussi vous avez besoin d’accéder (ou Google) à la fiche des spécifications techniques de votre carte.
Par exemple, le manuel du Gecko G202 indique:
Step Frequency: 0 to 200 kHz
Step Pulse “0” Time: 0.5 uS min (Step on falling edge)
Step Pulse “1” Time: 4.5 uS min
Direction Setup: 1 uS min (20 uS min hold time after Step edge)
Les spécifications du Gecko G203V indiquent:
Step Frequency: 0 to 333 kHz
Step Pulse “0” Time: 2.0 uS min (Step on rising edge)
Step Pulse “1” Time: 1.0 uS min
Direction Setup:
200 nS (0.2uS) before step pulse rising edge
+
+ 200 nS (0.2uS) hold after step pulse rising edge
+
Un carte Xylotex donne dans ses données techniques un superbe graphe du timing nécessaire, il indique:
Minimum DIR setup time before rising edge of STEP Pulse 200nS Minimum
DIR hold time after rising edge of STEP pulse 200nS
Minimum STEP pulse high time 2.0uS
Minimum STEP pulse low time 1.0uS
Step happens on rising edge
Notez les valeurs que vous trouvez, vous en aurez besoin pour la prochaine étape.
BASE_PERIOD est l’horloge de votre EMC2. A chaque période, le générateur d’impulsions de pas décide si il est temps pour une autre impulsion. Une période plus courte vous permettra de générer plus d’impulsions par seconde, dans les limites. Mais si vous la réglez trop bas, votre ordinateur va passer autant de temps à générer des impulsions de pas que pour exécuter tous le reste de ses tâches, il finira peut-être même par se bloquer. La latence et la génération de pas exigent d’affecter la plus courte période utilisable, comme nous le verrons un peu plus loin.
Regardons l’exemple du Gecko en premier. Le G202 peut gérer des impulsions restant à l'état bas pendant 0.5uS et à l'état haut pendant 4.5uS, il a besoin que la broche de direction soit stable 1uS avant le front descendant et qu’elle reste stable pendant 20uS après le front descendant. La plus longue durée est de 20uS, c’est le temps de maintien. Une approche simple consisterait à fixer la période à 20uS. Ce qui signifierait que tous les changements d'état des lignes STEP et DIR serait espacés de 20uS. C’est tout bon, non?
Faux! Si la latence était de zéro, et que tous les fronts soient espacés de 20uS, tout irait bien. Mais tous les ordinateurs ont une latence. Si l’ordinateur a 11uS de latence, celà signifie que, ce que l’ordinateur exécute aura parfois un retard de 11uS et la fois suivante pourra être juste à l’heure, le délai entre le premier et le second sera seulement de 9uS. Si le premier génére l’impulsion de pas et le second change la broche de direction, le timing de 20uS requis par le G202 sera tout simplement violé. Cela signifie que votre moteur aura peut être fait un pas dans la mauvaise direction et que votre pièce ne sera pas à la cote.
Le côté vraiment mauvais de ce problème est qu’il peut être très très rare. Les pires latences sont celles qui ne se produisent que quelques fois par minute. Les chances qu’une mauvaise latence de ce genre arrive juste quand le moteur est en train de changer de direction sont faibles. Ainsi, vous avez de très rares erreurs qui vous ruinent une pièce de temps en temps et qui sont impossibles à résoudre.
La façon la plus simple pour éviter ce problème est de choisir une BASE_PERIOD qui soit la somme de la plus longue période requise par votre carte plus la durée de la pire latence de votre ordinateur. Si vous utilisez un Gecko avec un temps de maintien exigé de 20uS et que votre test de latence vous avait donné une latence maximum de 11uS, alors si vous définissez BASE_PERIOD à 20+11 = 31uS (31000 nanosecondes dans le fichier ini), vous aurez la garantie de répondre aux exigences de votre carte de pilotage.
Mais c’est un compromis. Faire une impulsion de pas demande au moins deux périodes. Une pour débuter l’impulsion, et une pour y mettre fin. Etant donné que la période est de 31uS, il faut 2x31 = 62uS pour créer une impulsion de pas. Ce qui signifie que la fréquence de pas maximum sera seulement de 16129 pas par seconde. Pas très bon. (Mais n’abandonnez pas, nous avons encore quelques réglages à faire dans la section suivante.)
Pour la Xylotex, la configuration demande des temps de maintien très courts de 200nS chacun (0.2uS). Le temps le plus long est de 2uS. Si vous avez 11uS de latence, alors vous pouvez définir BASE_PERIOD aussi bas que 11+2 = 13uS. Se débarrasser du long temps de maintien de 20uS aide vraiment. Avec une période de 13uS, un pas complet ne dure que 26uS = 2x13 et la fréquence maximum est de 38461 pas par seconde!
Mais ne commencez pas à célébrer celà. Notez que 13uS est une période très courte. Si vous essayez d’exécuter le générateur de pas toutes les 13uS, il ne restera peut-être pas assez de temps pour faire autre chose et votre ordinateur se bloquera. Si vous visez des périodes de moins de 25uS, vous devez commencer à 25uS ou plus, lancer EMC et voir comment les choses réagissent. Si tout va bien, vous pouvez réduire progressivement la période. Si le pointeur de la souris commence à être sacadé et que le reste du PC ralentit, votre période est un peu trop court. Retournez alors à la valeur précédente qui permettent le meilleur fonctionnement.
Dans ce cas, supposons que vous ayez commencé à 25uS, en essayant descendre à 13uS, vous trouvez que c’est autour de 16uS que se situe la limite la plus basse et qu’en dessous l’ordinateur ne répond plus très bien. Alors, vous utilisez 16uS. Avec une période à 16uS et une latence à 11uS, le temps de sortie le plus court sera de 16-11 = 5uS. La carte demande seulement 2uS, ainsi vous aurez une certaine marge. Il est bon d’avoir une marge si vous ne voulez pas perdre de pas parce que vous auriez réglé un timing trop court.
Quel est la fréquence de pas maximum? Rappelez-vous, deux périodes pour faire un pas. Vous avez réglé la période à 16uS alors qu’un pas prend 32uS. Il fonctionnera à 31250 pas par seconde, ce qui n’est pas mal.
Dans la section précédente, nous avons utilisé la carte de puissance Xylotex pour piloter nos moteurs avec une période de 16uS ce qui nous a donné une fréquence de pas de 31250 pas par seconde maximum. Alors que la Gecko a été bloquée à 31uS avec une assez mauvaise fréquence de pas de 16129 pas par seconde. L’exemple de la Xylotex est au mieux de ce que nous puissions faire. Mais la Gecko peut être ameliorées.
Le problème avec le G202 est le temps de maintien demandé de 20uS. Ca plus la latence de 11uS nous oblige à utiliser une période longue de 31uS. Mais le générateur de pas logiciel d’EMC2 a un certain nombre de paramètres qui permettent d’augmenter les différentes durées d’une période à plusieurs autres. Par exemple, si «steplen» passe de 1 à 2, alors il y aura deux périodes entre le début et la fin de l’impulsion. De même, si «dirhold» passe de 1 à 3, il y aura au moins trois périodes entre l’impulsion de pas et un changement d'état de la broche de direction.
Si nous pouvons utiliser «dirhold» pour le temps de maintien de 20uS demandé, alors le temps le plus long suivant sera de 4.5uS. Ajoutez les 11uS de latence à ces 4.5uS, et vous obtenez une période minimale de 15.5uS. Lorsque vous essayez 15.5uS, vous trouvez que l’ordinateur est très lent, donc vous régler sur 16uS. Si nous laissons «dirhold» à 1 (par défaut), alors le temps minimum entre le pas et la direction est de 16uS moins la période de latence de 11uS = 5uS, ce qui n’est pas suffisant. Nous avons besoin de 15 autres uS, puisque la période est de 16uS, nous avons besoin d’une période de plus. Nous allons donc passer «dirhold» de 1 à 2. Maintenant, le temps minimum entre la fin de l’impulsion et l’impulsion de changement de direction est de 5+16 = 21uS et nous n’avons pas à craindre que la Gecko parte dans la mauvaise direction en raison de la latence.
Si l’ordinateur a une latence de 11uS, alors la combinaison d’une période de base de 16uS et d’une valeur de «dirhold» de 2 garanti que nous serons toujours dans le respect des délais exigés par la Gecko. Pour les pas normaux (sans changement de direction), l’augmentation de la valeur de «dirhold» n’aura aucun effet. Il faudra deux périodes d’un total de 32uS pour faire un seul pas et nous avons la même fréquence de 31250 pas par seconde que nous avions eu avec la Xylotex.
Le temps de latence de 11uS utilisé dans cet exemple est très bon. Si vous travaillez par le biais de ces exemples avec des latences plus grandes, comme 20 ou 25uS, la fréquence de pas la plus grande à la fois pour la Xylotex et la Gecko sera plus faible. Mais les mêmes formules sont applicables pour calculer un BASE_PERIOD optimal et pour régler «dirhold» ou d’autres paramètres du générateur de pas.
Pour un système à moteurs pas à pas avec générateur de pas logiciel rapide et fiable, vous ne pouvez pas deviner la période et les autres paramètres de configuration. Vous devez faire des mesures sur votre ordinateur et faire les calculs qui garantirons les meilleurs signaux dont les moteurs ont besoin.
Pour rendre le calcul plus facile, j’ai créé une feuille de calcul Open Office (StepTimingCalculator). Vous entrez les résultats du test de latence et les timing de votre carte de pilotage et la feuille calcule la meilleure BASE_PERIOD. Ensuite, vous testez la période pour vous assurer que votre PC ne sera pas ralenti ou bloqué. Enfin, vous entrez dans la période actuelle et la feuille de calcul vous indiquera le réglage de stepgen nécessaire pour répondre aux exigences de votre carte de pilotage. Elle calcule aussi la fréquence de pas maximum que vous serez en mesure de générer.
J’ai ajouté quelques petites choses à la feuille de calcul pour calculer la fréquence maximum et quelques autres calculs.
Un régulateur Proportionnel Intégral Dérivé (PID) est un organe de contrôle qui permet d’effectuer une régulation en boucle fermée d’un procédé industriel.
Le régulateur compare une valeur mesurée sur le procédé avec une valeur de consigne. La différence entre ces deux valeurs (le signal d'«erreur») est alors utilisée pour calculer une nouvelle valeur d’entrée du process tandant à réduire au maximum l'écart entre la mesure et la consigne (signal d’erreur le plus faible possible).
Contrairement aux algorithmes de régulation simples, le contrôle par PID peut ajuster les sorties du procédé, en fonction de l’amplitude du signal d’erreur, et en focntion du temps. Il donne des résultats plus précis et un contrôle plus stable. (Il est montré mathématiquement qu’une boucle PID donne un contrôle plus stable qu’un contrôle proportionnel seul et qu’il est plus précis que ce dernier qui laissera le procédé osciller).
Intuitivement, une boucle PID essaye d’automatiser ce que fait un opérateur muni d’un multimètre et d’un potentiomètre de contrôle. L’opérateur lit la mesure de sortie du procédé affichée sur le multimètre et utilise le bouton du potentiomètre pour ajuster l’entrée du procédé (l'«action») jusqu'à stabiliser la mesure de la sortie souhaîtée, affichée sur le multimètre.
Un boucle de régulation est composée de trois parties:
Quand le régulateur lit le capteur, il soustrait la valeur lue à la valeur de la consigne et ainsi, obtient l'«erreur de mesure». Il peut alors utiliser cette erreur pour calculer une correction à appliquer sur la variable d’entrée du procédé (l'«action») de sorte que cette correction tende à supprimer l’erreur mesurée en sortie de procédé.
Dans une boucle PID, la correction à partir de l’erreur est calculée de trois façons: P) l’erreur de mesure courante est soustraite directement (effet proportionnel), I) l’erreur est intégrée pendant un laps de temps (effet intégral), D) l’erreur est dérivée pendant un laps de temps (effet dérivé).
Une régulation à PID peut être utilisée dans n’importe quel procédé pour contrôler une variable mesurable, en manipulant d’autres variables de ce procédé. Par exemple, elle peut être utilisée pour contrôler: température, pression, débit, compostion chimique, vitesse et autres variables.
Dans certains systèmes de régulation, les régulateurs sont placés en série ou en parallèle. Dans ces cas, le régulateur «maître» produit les signaux utilisés par les régulateurs «esclaves». Une situation courante dans le contrôle des moteurs, la régulation de vitesse, qui peut demander que la vitesse du moteur soit contrôlée par un régulateur «esclave» (souvent intégré dans le variateur de fréquence du moteur) recevant en entrée une valeur proportionnelle à la vitesse. Cette entrée de l'«esclave» est alors fournie par la sortie du régulateur «maître», lequel reçoit la variable de consigne.
Le "PID" représente les abréviations des trois actions qu’il utilise pour effectuer ses corrections, ce sont des ajouts d’un signal à un autre. Tous agissent sur la quantité régulée. Les actions aboutissent finalement à des «soustractions» de l’erreur de mesure, parce que le signal proportionnel est habituellement négatif.
Pour cette action, l’erreur est multipliée par la constante P (pour Proportionnel) qui est négative, puis ajoutée (soustraction de l’erreur de mesure) à la quantitée régulée. P est valide uniquement sur la bande dans laquelle le signal de sortie du régulateur est proportionnel à l’erreur du système. Noter que si l’erreur de mesure est égale à zéro, la partie proportionnelle de la sortie du régulateur est également à zéro.
L’action intégrale fait intervenir la notion de temps. Elle tire profit du signal d’erreur passé qui est intégré (additionné) pendant un laps de temps, puis multiplié par la constante I (négative) ce qui en fait une moyenne, elle est enfin additionnée (soustraction de l’erreur de mesure) à la quantité régulée. La moyenne de l’erreur de mesure permet de trouver l’erreur moyenne entre la sortie du régulateur et la valeur de la consigne. Un système seulement proportionnel oscille en plus et en moins autour de la consigne du fait qu’en arrivant vers la consigne, l’erreur est à zéro, il n’enléve alors plus rien est dépasse la consigne, ou oscille et/ou se stabilise à une valeur trop basse ou trop élevée. L’addition sur l’entrée d’une proportion négative (soustraction) de l’erreur de mesure moyennée, permet toujours de réduire l'écart moyen entre la mesure en sortie et la consigne. Donc finalement, une boucle PI bien réglée verra sa sortie redescendre lentement à la valeur de la consigne.
L’action dérivée utilise aussi la notion de temps. Elle cherche à anticiper l’erreur future. La dérivée première (la pente de l’erreur) est calculée pour un laps de temps et multipliée par la constante (négative) D, puis elle est additionnée (soustraction de l’erreur de mesure) à la quantité régulée. L’action dérivée de la régulation fourni une réponse aux perturbations agissant sur le système. Plus important est le terme dérivé, plus rapide sera la réponse en sortie à une perturbation sur l’entrée.
Plus techniquement, une boucle PID peut être caractérisée comme un filtre appliqué sur un système complexe d’un domaine fréquentiel. C’est utilisé pour calculer si le système atteindra une valeur stable. Si les valeurs sont choisies incorrectement, le procédé entrera en oscillation et sa sortie n’atteindra jamais la consigne.
Régler une boucle de régulation consiste à agir sur les paramètres des différentes actions (gain du proportionnel, gain de l’intégral, gain de la dérivée) sur des valeurs optimales pour obtenir la réponse désirée sur la sortie du procédé. Le comportement des procédés varient selon les applications lors d’un changement de consigne. Certains procédés ne permettent aucun dépassement de la consigne. D’autres doivent minimiser l'énergie nécessaire pour atteindre un nouveau point de consigne. Généralement la stabilité de la réponse est requise, le procédé ne doit pas osciller quels que soient les conditions du procédé et le point de consigne.
Régler une boucle est rendu plus compliqué si le temps de réponse du procédé est long; il peut prendre plusieurs minutes, voir plusieurs heures pour qu’une modification de consigne produise un effet stable. Certains procédés ne sont pas linéaires et les paramètres qui fonctionnent bien à pleine charge ne marchent plus lors du démarrage hors charge du procédé. Cette section décrit quelques méthodes manuelles traditionnelles pour régler ces boucles.
Il existe plusieurs méthodes pour régler une boucle PID. Le choix de la méthode dépendra en grande partie de la possibilité ou non de mettre la boucle «hors production» pour la mise au point ainsi que de la vitesse de réponse du système. Si le système peut être mis hors production, la meilleure méthode de réglage consiste souvent à soumettre le système à un changement de consigne, à mesurer la réponse en fonction du temps et à l’aide de cette réponse à déterminer les paramètres de la régulation.
Si le système doit rester en production, une méthode de réglage consiste à mettre les valeurs I et D à zéro. Augmenter ensuite le gain P jusqu'à ce que la sortie de la boucle oscille. Puis, augmenter le gain I jusqu'à ce que cesse l’oscillation. Enfin, augmenter le gain D jusqu'à ce que la boucle soit suffisamment rapide pour atteindre rapidement sa consigne. Le réglage d’une boucle PID rapide provoque habituellement un léger dépassement de consigne pour avoir une montée plus rapide, mais certains systèmes ne le permettent pas.
Paramètre | Temps de montée | Dépassement | Temps de réglage | S.S. Error |
---|---|---|---|---|
P | Augmente | Augmente | Chang. faible | Diminue |
I | Diminue | Augmente | Augmente | Eliminate |
D | Chang. faible | Diminue | Diminue | Chang. faible |
Effets de l’augmentation des paramètres
Une autre méthode de réglage est la méthode dite de "Ziegler-Nichols", introduite par John G. Ziegler et Nathaniel B. Nichols. Elle commence comme la méthode précédente: réglage des gains I et D à zéro et acroîssement du gain P jusqu'à ce que la sortie du procédé commence à osciller. Noter alors le gain critique () et la période d’oscillation de la sortie (). Ajuster alors les termes P, I et D de la boucle comme sur la table ci-dessous:
Type de régulation | P | I | D |
---|---|---|---|
P | |||
PI | |||
PID |
La logique Ladder ou langage de programmation Ladder est une méthode pour tracer les schémas en logique électrique. Il s’agit maintenant d’un langage graphique vraiment populaire pour la programmation des automates programmables industriels (API). Il a été à l’origine inventé pour décrire la logique à relais. Son nom est fondé sur la constatation que les programmes dans cette langue ressemblent à une échelle (ladder), avec deux "rails" verticaux et, entre eux, une série "d'échelons". En Allemagne et ailleurs en Europe, le style consiste à placer les rails horizontaux, un en haut de la page et l’autre en bas avec les échelons verticaux dessinés séquentiellement de la gauche vers la droite.
Un programme en logique Ladder, également appelé schéma Ladder, est ressemblant au schéma d’un ensemble de circuits électriques à relais. C’est l’intérêt majeur du schéma Ladder de permettre à une large variété de personnels techniques, ingénieurs, techniciens électriciens, etc de le comprendre et de l’utiliser sans formation complémentaire grâce à cette ressemblance.
La logique Ladder est largement utilisée pour programmer les API, avec lesquels le contrôle séquentiel des processus de fabrication est requis. Le Ladder est utile pour les systèmes de contrôle simples mais critiques, ou pour reprendre d’anciens circuits à relais câblés. Comme les contrôleurs à logique programmable sont devenus plus sophistiqués, ils ont aussi été utilisés avec succès dans des systèmes d’automatisation très complexes.
Le langage Ladder peut être considéré comme un langage basé sur les règles, plutôt que comme un langage procédural. Un "échelon" en Ladder représente une règle. Quand elles sont mises en application avec des éléments électromécaniques, les diverses règles "s’exécutent" toutes simultanément et immédiatement. Quand elle sont mises en application dans la logique d’un automate programmable, les règles sont exécutées séquentiellement par le logiciel, dans une boucle. En exécutant la boucle assez rapidement, typiquement plusieurs fois par seconde, l’effet d’une exécution simultanée et immédiate est obtenu.
Les composants les plus communs du Ladder sont les contacts (entrées), ceux-ci sont habituellement NC (normalement clos) ou NO (normalement ouvert) et les bobines (sorties).
Bien sûr, il y a beaucoup plus de composants dans le langage Ladder complet, mais la compréhension de ceux-ci aidera à appréhender le concept global du langage.
L'échelle se compose d’un ou plusieurs échelons. Ces échelons sont tracés horizontalement, avec les composants placés sur eux (entrées, sorties et autres), les composants sont évalués de la gauche vers la droite.
Cet exemple est un simple échelon:
L’entrée B0 sur la gauche et un contact normalement ouvert, il est connecté sur la sortie Q0 sur la droite. Imaginez maintenant qu’une tension soit appliquée à l’extrême gauche, dès que B0 devient vraie (par exemple: l’entrée est activée, ou l’utilisateur a pressé le contact NO), la tension atteint l’extrême droite en traversant la bobine Q0. Avec comme conséquence que la sortie Q0 passe de 0 à 1.
Lors de l’ajout d’un deuxième port parallèle placé dans un slot PCI il est indispensable de connaître son adresse avant de pouvoir l’utiliser avec EMC2. Pour trouver l’adresse de ce port, ouvrez un terminal et tapez:
lspci -v
Vous devriez voir quelques choses comme ci-dessous parmi la liste du matériel installé en PCI:
Dans notre cas l’adresse était la première, nous avons donc modifié le fichier .hal pour passer de
loadrt hal_parport cfg=0x378
à
loadrt hal_parport cfg="0x378 0xa800 in"
Notez les guillemets obligatoires encadrant les adresses.
Nous avons également ajouté:
addf parport.1.read base-thread +
addf parport.1.write base-thread
pour que le second port parallèle soit lu et écrit.
Par défaut les 8 premières broches des ports parallèles sont des sorties. Le drapeau in situé derrière l’adresse d’un port permet de les positionner comme étant 8 entrées sur ce port.
Si la vitesse de votre broche est contrôlée par un variateur de fréquence avec une consigne vitesse en 0 à 10V et que vous utilisez une carte de conversion (DAC) comme la m5i20 pour sortir le signal.
Premièrement vous devez calculer le facteur d'échelle entre la vitesse broche et la tension de commande. Dans cet exemple, la vitesse maximale de la broche sera de 5000 tr/mn pour une tension de commande de 10V. notre facteur d'échelle sera donc de 0.002
Si votre carte DAC ne dispose pas d’une fonction échelle, nous devrons ajouter un composant «scale» (echelle) au fichier hal pour calibrer «motion.spindle-speed-out» entre 0 et 10 comme demandé par le variateur de fréquence.
*loadrt scale count=1*
*addf scale.0 servo-thread*
*setp scale.0.gain 0.002*
*net spindle-speed-scale motion.spindle-speed-out => scale.0.in*
*net spindle-speed-DAC scale.0.out => <le nom de la sortie de votre DAC>*
Si la vitesse de votre broche peut être contrôlée par un signal de PWM, utilisez le composant «pwmgen» pour créer le signal:
*loadrt pwmgen output_type=0 *
*addf pwmgen.update servo-thread*
*addf pwmgen.make-pulses base-thread*
*net spindle-speed-cmd motion.spindle-speed-out => pwmgen.0.value*
*net spindle-on motion.spindle-on => pwmgen.0.enable*
*net spindle-pwm pwmgen.0.pwm => parport.0.pin-09-out*
La réponse du contrôleur de PWM est simple: 0% donne 0tr/mn, 10% donnent 180 tr/mn… 100% donnent 1800 tr/mn. Si un minimum est nécessaire pour faire tourner la broche, suivez l’exemple «nist-lathe» fourni dans les exemples de configuration pour ajouter un composant d'échelle.
Si vous voulez un signal de marche broche reliant «motion.spindle-on» à une broche de sortie physique. Pour relier ces pins à une broche du port parallèle, ajouter une ligne comme la suivante dans votre fichier .hal, il faut bien sûr qu’elle soit câblée à votre interface de contrôle.
*net spindle-enable motion.spindle-on => parport.0.pin-14-out*
Si vous voulez contrôler le sens de rotation de votre broche, les pins de HAL «motion.spindle-forward» et «motion.spindle-reverse» étant contrôlées par M3 et M4, peuvent être mise à une valeur positive différente de zéro pour que M3/4 inverse le sens de la broche.
Pour relier ces pins à des broches du port parallèle utilisez, par exemple, les lignes suivantes dans votre fichier .hal, bien sûr ces broches doivent être câblées à votre interface de contrôle.
*net spindle-fwd motion.spindle-forward -> parport.0.pin-16-out*
*net spindle-rev motion.spindle-reverse => parport.0.pin-17-out*
Une information de retour est nécessaire pour qu’EMC puisse réaliser les mouvements synchronisés avec la broche comme le filetage ou la vitesse de coupe constante. L’assistant de configuration StepConf peut réaliser les connections lui même si les signaux «Canal A codeur broche» et «Index codeur broche» sont choisis parmi les entrées.
Matériel supposé présent:
Configuration de base pour ajouter ces composants:
*loadrt encoder num_chan=1 + addf encoder.update-counters base-thread + addf encoder.capture-position servo-thread + setp encoder.0.position-scale 100 + setp encoder.0.counter-mode 1 + net spindle-position encoder.0.position => motion.spindle-revs + net spindle-velocity encoder.0.velocity => motion.spindle-speed-in + net spindle-index-enable encoder.0.index-enable <=> motion.spindle-index-enable + net spindle-phase-a encoder.0.phase-A + net spindle-phase-b encoder.0.phase-B + net spindle-index encoder.0.phase-Z + net spindle-phase-a <= parport.0.pin-10-in + net spindle-index <= parport.0.pin-11-in*
Cet exemple explique comment relier une manivelle facile à trouver aujourd’hui sur le marché. Cet exemple utilisera la manivelle MPG3 avec une carte d’interface C22 de chez CNC4PC et un second port parallèle placé sur un slot PCI. Cet exemple fournira trois axes avec chacun trois incréments de pas: 0.1, 0.01, 0.001.
Dans votre fichier «custom.hal» ou dans un autre fichier .hal, ajoutez ce qui suit en vérifiant bien que les composants mux4 ou encoder ne soient pas déjà utilisés. Si c'était le cas vous auriez juste à augmenter le nombre de ces composants.
# Manivelle de jog
loadrt encoder num_chan=1 +
loadrt mux4 count=1 +
addf encoder.capture-position servo-thread +
addf encoder.update-counters base-thread +
addf mux4.0 servo-thread
# Mode position # Chaque cran de manivelle provoque un pas calibré, # la durée du mouvement total peut dépasser la durée de rotation de la manivelle. # C’est le mode par défaut. setp axis.N.jog-vel-mode 0
# Mode vitesse # L’axe s’arrête quand la manivelle s’arrête, même si la pas de jog est incomplet. # Décommenter la ligne suivante pour obtenir ce mode de fonctionnement, # et commenter le mode position. #setp axis.N.jog-vel-mode 1
# Chaque axe est ajusté indépendemment des autres.
# Tailles des pas de jog
setp mux4.0.in0 0.1 +
setp mux4.0.in1 0.01 +
setp mux4.0.in2 0.001
# Sélecteur de taille des pas du jog +
net scale1 mux4.0.sel0 <= parport.1.pin-09-in +
net scale2 mux4.0.sel1 <= parport.1.pin-10-in
net pend-scale axis.0.jog-scale <= mux4.0.out +
net pend-scale axis.1.jog-scale +
net pend-scale axis.2.jog-scale
# Signaux du codeur +
net mpg-a encoder.0.phase-A <= parport.1.pin-02-in +
net mpg-b encoder.0.phase-B <= parport.1.pin-03-in
# Sélecteur d'axe +
net mpg-x axis.0.jog-enable <= parport.1.pin-04-in +
net mpg-y axis.1.jog-enable <= parport.1.pin-05-in +
net mpg-z axis.2.jog-enable <= parport.1.pin-06-in
net pend-counts axis.0.jog-counts <= encoder.0.counts +
net pend-counts axis.1.jog-counts +
net pend-counts axis.2.jog-counts
Si ce que vous obtenez ne correspond pas à ce que vous espériez, la plupart du temps c’est juste un petit manque d’expérience. Accroître son expérience permet souvent une meilleure compréhension globale. Porter un diagnostic sur plusieurs problèmes est toujours plus facile en les prenant séparément, de même qu’une équation dont on a réduit le nombre de variables est toujours plus rapide à résoudre. Dans le monde réel ce n’est pas toujours le cas mais c’est une bonne voie à suivre.
La raison la plus fréquente dans une nouvelle installation pour que le moteur ne bouge pas est l’interversion entre le signal de pas et le signal de direction. Si, quand vous pressez le bouton de jog dans un sens puis dans l’autre, le moteur n’avance que d’un pas à chaque fois et toujours dans la même direction, vous êtes dans ce cas.
Certaine interfaces de pilotage de moteurs ont une broche d’activation (enable) ou demandent un signal de pompe de charge pour activer leurs sorties.
Le concept d’erreur de suivi est étrange quand il s’agit de moteurs pas à pas. Etant un système en boucle ouverte, aucune contre réaction ne permet de savoir si le suivi est correct ou non. EMC calcule si il peut maintenir le suivi demandé par une commande, si ce n’est pas possible il stoppe le mouvement et affiche une erreur de suivi. Les erreurs de suivi sur les systèmes pas à pas sont habituellement les suivantes:
Toutes ces erreurs se produisent lorsque l’horloge temps réel n’est pas capable de fournir le nombre de pas nécessaire pour maintenir la vitesse requise par le réglage de la variable BASE_PERIOD. Ce qui peut se produire, par exemple après un test de latence trop bref pour obtenir un valeur fiable, dans ce cas, revenir à une valeur plus proche de ce qu’elle était et réessayez. C’est également le cas quand les valeurs de vitesse maximum et d’accélération maximum sont trop élevées.
Si un backlash a été ajouté, il est nécessaire d’augmenter STEPGEN_MAXACCEL aux environs du double de MAX_ACCELERATION dans la section [AXIS] du fichier INI et ce, pour chacun des axes sur lesquels un backlash a été ajouté. EMC2 utilise une "extra accélération" au moment de l’inversion de sens pour reprendre le jeu. Sans correction du backlash, l’accélération pour le générateur de pas peut être juste un peu plus basse que celle du planificateur de mouvements.
Quand vous rencontrez cette erreur:
RTAPI: ERROR: Unexpected realtime delay on task n
C’est généralement que la variable BASE_PERIOD dans la section [EMCMOT] du fichier ini a une valeur trop petite. Vous devez lancer un «Latency Test» pendant une durée plus longue pour voir si vous n’avez pas un délai excessif quelque part, responsable de ce problème. Si c’est le cas réajuster alors BASE_PERIOD avec la nouvelle valeur obtenue.
EMC2 vérifie le nombre de cycles du CPU entre les invocations du thread temps réel. Si certains éléments de votre matériel provoquent un délai excessif ou que les threads sont ajustés à des valeurs trop rapides, vous rencontrerez cette erreur.
Cette erreur n’est affichée qu’une seule fois par session. En effet, si votre BASE_PERIOD était trop basse vous pourriez avoir des centaines de milliers de messages d’erreur par seconde si plus d’un était affiché.
lien vers latency-test
Si un de vos axes vibre, grogne ou fait des petits mouvements dans toutes les directions, c’est révélateur d’un mauvais timing d’impulsions de pas de ce moteur. Les paramètres du pilote matériel sont a vérifier et a ajuster. Il peut aussi y avoir des pertes de pas aux changements de direction. Si le moteur cale complétement, il est aussi possible que les paramètres MAX_ACCELERATION ou MAX_VELOCITY aient des valeurs trop élevées.
Le programme suivant vérifie que la configuration de l’axe Z est correcte. Copiez le programme dans le répertoire de votre emc2/nc_files nommez le «TestZ.ngc» ou similaire. Initialisez votre machine avec Z = 0.000 sur le dessus de la table. Chargez et lancez le programme. Il va effectuer 200 mouvements d’aller et retour entre 10.00 et 30.00mm. Si vous avez un problème de configuration, la position de l’axe Z affichée à la fin du programme, soit 10.00mm, ne correspondra pas à la position mesurée. Pour tester un autre axe remplacez simplement le Z des G0 par le nouvel axe.
( Faite Z=0 au dessus de la table avant de démarrer! ) ( Ce programme teste les pertes de position en Z ) ( msg, test 1 de la configuration de l'axe Z ) G21 #1000=100 ( boucle 100 fois ) ( cette boucle comporte un delai après chaque mouvement ) ( test des réglages d'accélération et de vitesse ) o100 while [#1000] G0 Z30.000 G4 P0.250 G0 Z10.000 G4 P0.250 #1000 = [#1000 - 1] o100 endwhile ( msg, test 2 de la configuration de l'axe Z, pressez S pour continuer) M1 (un arrêt ici) #1000=100 ( boucle 100 fois ) ( Les boucles suivantes n'ont plus de délai en fin de mouvements ) ( test des o101 while [#1000] G0 Z30.000 . G0 Z10.000 #1000 = [#1000 - 1] o101 endwhile ( msg, Fin Z doit être à 10mm au dessus de la table ) M2
Voici quelques commandes et techniques de base pour l’utilisateur débutant sous Linux. Beaucoup d’autres informations peuvent être trouvées sur le site web ou dans les man pages.
Quand vous installez EMC2 avec le CD-Live Ubuntu, par défaut vous devez passer par la fenêtre de connexion à chaque démarrage du PC. Pour activer le login automatique ouvrez le menu «Système» →«Administration»→«Fenêtre de connexion». Si l’installation est récente la fenêtre de connexion peut prendre quelques secondes pour s’ouvrir. Vous devez entrer le mot de passe utilisé pour l’installation pour accéder à la fenêtre des préférences. Ouvrez alors l’onglet «Sécurité», cochez la case «Activer les connexions automatiques» et saisissez votre nom d’utilisateur ou choisissez en un dans la liste déroulante. Vous êtes maintenant dispensé de la fenêtre de connexion.
Les Man pages sont des pages de manuel générées automatiquement le plus souvent. Les Man pages existent pour quasiment tous les programmes et les commandes de Linux.
Pour visualiser une man page ouvrez un terminal depuis Applications > Accessoires > Terminal. Par exemple si vous voulez trouver quelques choses concernant la commande «find», tapez alors dans le terminal:
man find
Utilisez les touches «Vers le haut» et «Vers le bas» pour faire défiler le texte et la touche «Q» pour quitter.
En cas de problème il est parfois utile de connaître la liste des modules du noyau qui sont chargés. Ouvrez une console et tapez:
lsmod
Si vous voulez, pour le consulter tranquillement, envoyer le résultat de la commande dans un fichier, tapez la sous cette forme:
lsmod > mes_modules.txt
Le fichier mes_modules.txt résultant se trouvera alors dans votre répertoire home si c’est de là que vous avez ouvert la console.
Editer certains fichiers du système en root peut donner des résultats inattendus! Soyez trés vigilant quand vous éditez en root. Vous pouvez ouvrir et lire de nombreux fichiers systèmes appartenant au root qui sont en mode lecture seule.
Ouvrir un terminal depuis Applications > Accessoires > Terminal.
Dans ce terminal, tapez:
sudo gedit
Ouvrez un fichier depuis Fichiers, Ouvrir puis éditez le.
Pour afficher le chemin du répertoire courant dans le terminal tapez:
pwd
Pour remonter dans le répertoire précédent, tapez dans le terminal:
` cd ..`
Pour remonter de deux niveaux de répertoire, tapez dans le terminal:
` cd ../..`
Pour aller directement dans le sous-répertoire emc2/configs tapez:
cd emc2/configs
Pour voir le contenu du répertoire courant tapez:
dir
ou
ls
La commande «find» peut être un peu déroutante pour le nouvel utilisateur de Linux. La syntaxe de base est:
find répertoire_de_départ paramètres actions
Par exemple, pour trouver tous les fichiers .ini dans votre répertoire emc2 utilisez d’abord la commande «pwd» pour trouver le répertoire courant. Ouvrez un nouveau terminal et tapez:
pwd
il vous est retourné par exemple le résultat suivant:
/home/robert
Avec cette information vous pouvez taper, par exemple, la commande:
find /home/robert/emc2 -name *.ini -print
Le -name est le nom de fichier que vous recherchez et le -print indique à find d’afficher le résultat dans le terminal. Le *.ini indique à find de retourner tous les fichiers contenant l’extension .ini
Tapez dans un terminal:
grep -i -r 'texte à rechercher' *
Pour trouver tous les fichiers contenant le texte 'texte à rechercher' dans le répertoire courant et tous ses sous-répertoires et en ignorant la casse. Le paramètre -i demande d’ignorer la casse et le -r demande une recherche récursive (qui inclus tous les sous-répertoires dans la recherche). Le caractère * est un jocker indiquant «tous les fichiers».
Pour visualiser les messages du boot utilisez la commande «dmesg» depuis un terminal. Pour enregistrer ces messages dans un fichier redirigez les avec:
`dmesg > dmesg.txt`
Le contenu de ce fichier pourra alors être copié et collé à destination des personnes en ligne qui vous aideront à diagnostiquer votre problème.
Pour voir la liste du matériel utilisé par votre carte mère, tapez la commande suivante dans un terminal:
Lors de l’installation d’Ubuntu les réglages du moniteur sont détectés. Il peut arriver que ça fonctionne mal et que la résolution ne soit que celle d’un moniteur générique en 800x600.
Pour résoudre ce cas, suivez les instructions données ici: