#LyX 1.5.1 created this file. For more info see http://www.lyx.org/ \lyxformat 221 \textclass book \begin_preamble \usepackage[plainpages=false,pdfpagelabels,colorlinks=true,linkcolor=blue]{hyperref} \end_preamble \language french \inputencoding auto \fontscheme bookman \graphics default \float_placement !tbph \paperfontsize default \spacing single \papersize letterpaper \use_geometry 1 \use_amsmath 0 \use_natbib 0 \use_numerical_citations 0 \paperorientation portrait \leftmargin 1in \topmargin 1in \rightmargin 0.8in \bottommargin 0.8in \secnumdepth 1 \tocdepth 5 \paragraph_separation skip \defskip smallskip \quotes_language english \papercolumns 1 \papersides 1 \paperpagestyle default \author "" \layout Chapter \begin_inset LatexCommand \label{cha:Introduction} \end_inset Introduction \layout Section \begin_inset LatexCommand \label{sec:Qu'est-ce que HAL} \end_inset Qu'est-ce que HAL ? \layout Standard HAL \begin_inset LatexCommand \index{HAL} \end_inset est le sigle de Hardware Abstraction Layer, le terme Anglais pour Couche d'Abstraction Matériel \begin_inset Foot collapsed true \layout Standard Note du traducteur: nous garderons le sigle HAL dans toute la documentation. \end_inset . Au plus haut niveau, il s'agit simplement d'une méthode pour permettre à un grand nombre de \begin_inset Quotes eld \end_inset modules \begin_inset Quotes erd \end_inset d'être chargés et interconnectés pour assembler un système complexe. La partie \begin_inset Quotes eld \end_inset matériel \begin_inset Quotes erd \end_inset devient abstraite parce que HAL a été conçu à l'origine pour faciliter la configuration d'EMC pour une large gamme de matériels. Bon nombre de ces modules sont des pilotes de périphériques. Cependant, HAL peut faire beaucoup plus que configurer les pilotes du matériel. \layout Subsection HAL est basé sur le système traditionnel d'étude des projets techniques \layout Standard HAL est basé sur le même principe que celui utilisé pour l'étude des circuits et des systèmes techniques, il va donc être utile d'examiner d'abord ces principes. \layout Standard N'importe quel système, y compris les machines CNC \begin_inset LatexCommand \index{CNC} \end_inset , est fait de composants interconnectés. Pour les machines CNC, ces composants pourraient être le contrôleur principal, les amplis de servomoteurs, les amplis ou les commandes de puissance des moteurs pas à pas, les moteurs, les codeurs, les interrupteurs de fin de course, les panneaux de boutons de commande, les manivelles, peut être aussi un variateur de fréquence pour le moteur de broche, un automate programma ble pour gérer le changeur d'outils, etc. Le constructeur de machine doit choisir les éléments, les monter et les câbler entre eux pour obtenir un système complet et fonctionnel. \layout Subsubsection Choix des organes \layout Standard Il ne sera pas nécessaire au constructeur de machine de se soucier du fonctionne ment de chacun des organes, il les traitera comme des boîtes noires. Durant la phase de conception, il décide des éléments qu'il va utiliser, par exemple, moteurs pas à pas ou servomoteurs, quelle marque pour les amplis de puissance, quels types d'interrupteurs de fin de course et combien il en faudra, etc. La décision d'intégrer tel ou tel élément spécifique plutôt qu'un autre, repose sur ce que doit faire cet élément et sur ses caractéristiques fournies par le fabricant. La taille des moteurs et la charge qu'ils doivent supporter affectera le choix des interfaces de puissance nécessaires pour les piloter. Le choix de l'ampli affectera le type des signaux de retour demandés ainsi que le type des signaux de vitesse et de position qui doivent lui être transmis. \layout Standard Dans le monde de HAL, l'intégrateur doit décider quels composants de HAL sont nécessaires. Habituellement, chaque carte d'interface nécessite un pilote. Des composants supplémentaires peuvent être demandés, par exemple, pour la génération logicielle des impulsions d'avance, les fonctionnalités des automates programmables, ainsi qu'une grande variété d'autres tâches. \layout Subsubsection Étude des interconnections \layout Standard Le créateur d'un système matériel, ne sélectionnera pas seulement les éléments, il devra aussi étudier comment ils doivent être interconnectés. Chaque boîte noire dispose de bornes, deux seulement pour un simple contact, ou plusieurs douzaines pour un pilote de servomoteur ou un automate. Elles doivent être câblées entre elles. Les moteurs câblés à leurs interfaces de puissance, les fins de course câblés au contrôleur et ainsi de suite. Quand le constructeur de machine commence à travailler sur le câblage, il crée un grand plan de câblage représentant tous les éléments de la machine ainsi que les connections qui les relient entre eux. \layout Standard En utilisant HAL, les \emph on composants \emph default sont interconnectés par des \emph on signaux \emph default . Le concepteur peut décider quels signaux sont nécessaires et à quoi ils doivent être connectés. \layout Subsubsection Implémentation \layout Standard Une fois que le plan de câblage est complet, il est possible de construire la machine. Les pièces sont achetées et montées, elles peuvent alors être câblées et interconnectées selon le plan de câblage. Dans un système physique, chaque interconnection est un morceau de fil qui doit être coupé et raccordé aux bornes appropriées. \layout Standard HAL fournit un bon nombre d'outils d'aide à la \begin_inset Quotes eld \end_inset construction \begin_inset Quotes erd \end_inset d'un système HAL. Certains de ces outils permettent de \begin_inset Quotes eld \end_inset connecter \begin_inset Quotes erd \end_inset (ou déconnecter) un simple \begin_inset Quotes eld \end_inset fil \begin_inset Quotes erd \end_inset . D'autres permettent d'enregistrer une liste complète des organes, du câblage et d'autres informations à propos du système, de sorte qu'il puisse être \begin_inset Quotes eld \end_inset reconstruit \begin_inset Quotes erd \end_inset d'une simple commande. \layout Subsubsection Mise au point \layout Standard Très peu de machines marchent bien dès la première fois. Lors des tests, le technicien peut utiliser un appareil de mesure pour voir si un fin de course fonctionne correctement ou pour mesurer la tension fournie aux servomoteurs. Il peut aussi brancher un oscilloscope pour examiner le réglage d'une interface ou pour rechercher des interférences électriques et déterminer leurs sources. En cas de problème, il peut s'avérer indispensable de modifier le plan de câblage, peut être que certaines pièces devront être recâblées différemment, voir même remplacées par quelque chose de totalement différent. \layout Standard HAL fournit les équivalents logiciels du voltmètre, de l'oscilloscope, du générateur de signaux et les autres outils nécessaires à la mise au point et aux réglages d'un système. Les même commandes utilisées pour construire le système, seront utilisées pour faire les changements indispensables. \layout Subsection En résumé \layout Standard Ce document est destiné aux personnes déjà capables de concevoir ce type de réalisation matérielle, mais qui ne savent pas comment connecter le matériel à EMC. \layout Standard La conception de matériel, telle que décrite précédemment, s'arrête à l'interfac e de contrôle. Au delà, il y a un tas de boîtes noires, relativement simples, reliées entre elles pour faire ce qui est demandé. À l'intérieur, un grand mystère, c'est juste une grande boîte noire qui fonctionne, nous osons l'espérer. \layout Standard HAL étend cette méthode traditionnelle de conception de matériel à l'intérieur de la grande boîte noire. Il transforme les pilotes de matériels et même certaines parties internes du matériel, en petites boîtes noires pouvant être interconnectées, elles peuvent alors remplacer le matériel externe. Il permet au \begin_inset Quotes eld \end_inset plan de câblage \begin_inset Quotes erd \end_inset de faire voir une partie du contrôleur interne et non plus, juste une grosse boîte noire. Plus important encore, il permet à l'intégrateur de tester et de modifier le contrôleur en utilisant les mêmes méthodes que celles utilisées pour le reste du matériel. \layout Standard Les termes tels que moteurs, amplis et codeurs sont familiers aux intégrateurs de machines. Quand nous parlons d'utiliser un câble extra souple à huit conducteurs blindés pour raccorder un codeur de position à sa carte d'entrées placée dans l'ordinateur. Le lecteur comprend immédiatement de quoi il s'agit et se pose la question, \begin_inset Quotes eld \end_inset quel type de connecteurs vais-je devoir monter de chaque côté de ce câble ? \begin_inset Quotes erd \end_inset Le même genre de réflexion est indipensable pour HAL mais le cheminement de la pensée est différent. Au début les mots utilisés par HAL pourront sembler un peu étranges, mais ils sont identiques au concept de travail évoluant d'une connection à la suivante. \layout Standard HAL repose sur une seule idée, l'idée d'étendre le plan de câblage à l'intérieur du contrôleur. Si vous êtes à l'aise avec l'idée d'interconnecter des boîtes noires matérielle s, vous n'aurez sans doute aucune difficulté à utiliser HAL pour interconnecter des boites noires logicielles. \layout Section \begin_inset LatexCommand \label{sec:Concept de HALL} \end_inset Concept de HAL \layout Standard Cette section est un glossaire qui définit les termes clés de HAL mais il est différent d'un glossaire traditionnel en ce sens que les termes ne sont pas classés par ordre alphabétique. Ils sont classés par leur relation ou par le sens du flux à l'intérieur de HAL. \layout Description Component \begin_inset LatexCommand \index{HAL Composant} \end_inset : (Composant) Lorsque nous avons parlé de la conception du matériel, nous avons évoqué les différents éléments individuels comme "pièces", "modules", "boîtes noires", etc. L'équivalent HAL est un "component" ou "HAL component". (ce document utilisera: "HAL component" quand la confusion avec un autre type de composant est possible, mais normalement, utilisez juste: "component".) Un HAL component est une pièce logicielle avec, bien définis, des entrées, des sorties, un comportement, qui peuvent éventuellement être interconnectés. \layout Description Parameter \begin_inset LatexCommand \index{HAL Paramétre} \end_inset : (Paramètre) De nombreux composants matériels ont des réglages qui ne sont raccordés à aucun autre composant mais qui sont accessibles. Par exemple, un ampli de servomoteur a souvent des potentiomètres de réglage et des points tests sur lesquels on peut poser une pointe de touche de voltmètre ou une sonde d'oscilloscope pour visualiser le résultat des réglages. Les HAL components aussi peuvent avoir de tels éléments, ils sont appelés "parameters". Il y a deux types de paramètres: \begin_inset Quotes eld \end_inset Input parameters \begin_inset Quotes erd \end_inset qui sont des équivalents des potentiomètres. Ce sont des valeurs qui peuvent être réglées par l'utilisateur, elles gardent leur valeur jusqu'à un nouveau réglage. \begin_inset Quotes eld \end_inset Output parameters \begin_inset Quotes erd \end_inset qui ne sont pas ajustables. Ils sont équivalents aux points tests qui permettent de mesurer la valeur d'un signal interne. \layout Description Pin \begin_inset LatexCommand \index{HAL Broche} \end_inset : (Broche) Les composants matériels ont des broches qui peuvent être interconnec tées entre elles. L'équivalent HAL est une "pin" ou "HAL pin". ("HAL pin" est utilisé quand c'est nécessaire pour éviter la confusion.) Toutes les HAL pins sont nommées et les noms des pins sont utilisés lors des interconnexions entre elles. Les HAL pins sont des entités logicielles qui n'existent qu'à l'intérieur de l'ordinateur. \layout Description Physical_Pin \begin_inset LatexCommand \index{HAL: Broche physique} \end_inset : (Broche physique) La plupart des interfaces d'entrées/sorties ont des broches physiques réelles pour leur connection avec l'extérieur, par exemple, les broches du port parallèle. Pour éviter la confusion, elles sont appelées "physical pins". Ce sont des repères pour faire penser au monde physique réel. \begin_inset Note collapsed true \layout Standard Vous vous demandez peut être quelle relation il y a entre les HAL_pins, les Physical pin et les éléments extérieurs comme les codeurs ou une carte stg. Nous avons ici, affaire à des interfaces de type translation/conversion de données. \end_inset \layout Description Signal \begin_inset LatexCommand \index{HAL Signal} \end_inset : Dans une machine physique réelle, les terminaisons des différents organes sont reliées par des fils. L'équivalent HAL d'un fil est un "signal" ou "HAL signal". Ces signaux connectent les \begin_inset Quotes eld \end_inset HAL pins \begin_inset Quotes erd \end_inset entre elles comme le requiert le concepteur de la machine. Les \begin_inset Quotes eld \end_inset HAL signals \begin_inset Quotes erd \end_inset peuvent être connectés et déconnectés à volonté (même avec la machine en marche). \layout Description Type \begin_inset LatexCommand \index{HAL Type} \end_inset : Quand on utilise un matériel réel, il ne viendrait pas à l'idée de connecter la sortie 24V d'un relais à l'entrée analogique +/-10V de l'ampli d'un servomoteur. Les \begin_inset Quotes eld \end_inset HAL pins \begin_inset Quotes erd \end_inset ont les même restrictions, qui sont fondées sur leur type. Les \begin_inset Quotes eld \end_inset pins \begin_inset Quotes erd \end_inset et les \begin_inset Quotes eld \end_inset signals \begin_inset Quotes erd \end_inset ont tous un type, un \begin_inset Quotes eld \end_inset signals \begin_inset Quotes erd \end_inset ne peux être connecté qu'à une \begin_inset Quotes eld \end_inset pins \begin_inset Quotes erd \end_inset de même type. Il y a actuellement les 4 types suivants: \layout Itemize \noun on bit \noun default - une simple valeur vraie ou fausse TRUE/FALSE ou ON/OFF \layout Itemize \noun on float \noun default - un flottant de 32 bits, avec approximativement 24 bits de résolution et plus de 200 bits d'échelle dynamique. \layout Itemize \noun on u32 \noun default - un entier non signé de 32 bits, les valeurs légales vont de 0 à +4294967295 \layout Itemize \noun on s32 \noun default - un entier signé de 32 bits, les valeurs légales vont de -2147483648 à +2147483647 \layout Description \begin_inset LatexCommand \label{des:Function} \end_inset Function \begin_inset LatexCommand \index{HAL Fonction} \end_inset : (Fonction) Les composants matériels réels ont tendance à réagir immédiatement à leurs signaux d'entrée. Par exemple, si la tension d'entrée d'un ampli de servo varie, la sortie varie aussi automatiquement. Les composants logiciels ne peuvent pas réagir immédiatement. Chaque composant a du code spécifique qui doit être exécuté pour faire ce que le composant est sensé faire. Dans certains cas, ce code tourne simplement comme une partie du composant. Cependant dans la plupart des cas, notamment dans les composants temps réel, le code doit être exécuté selon un ordre bien précis et à des intervalles trés précis. Par exemple, les données en entrée doivent d'abord être lues avant qu'un calcul ne puisse être effectué sur elles et les données en sortie ne peuvent pas être écrites tant que le calcul sur les données d'entrée n'est pas terminé. Dans ces cas, le code est confié au système sous forme de "functions". Chaque \begin_inset Quotes eld \end_inset function \begin_inset Quotes erd \end_inset est un bloc de code qui effectue une action spécifique. L'intégrateur peut utiliser des "threads" pour combiner des séries de \begin_inset Quotes eld \end_inset functions \begin_inset Quotes erd \end_inset qui seront exécutées dans un ordre particulier et selon des intervalles de temps spécifiques. \layout Description \begin_inset LatexCommand \label{des:Thread} \end_inset Thread \begin_inset LatexCommand \index{HAL Fil} \end_inset : (Fil) Un "thread" est une liste de \begin_inset Quotes eld \end_inset functions \begin_inset Quotes erd \end_inset qui sont lancées à intervalles spécifiques par une tâche temps réel. Quand un \begin_inset Quotes eld \end_inset thread \begin_inset Quotes erd \end_inset est créé pour la première fois, il a son cadencement spécifique (période), mais pas de \begin_inset Quotes eld \end_inset functions \begin_inset Quotes erd \end_inset . Les \begin_inset Quotes eld \end_inset functions \begin_inset Quotes erd \end_inset seront ajoutées au \begin_inset Quotes eld \end_inset thread \begin_inset Quotes erd \end_inset et elle seront exécutées dans le même ordre, chaque fois que le \begin_inset Quotes eld \end_inset tread \begin_inset Quotes erd \end_inset tournera. \layout Standard Prenons un exemple, supposons que nous avons un composant de port parallèle nommé \begin_inset Quotes eld \end_inset hal_parport \begin_inset Quotes erd \end_inset . Ce composant défini une ou plusieurs \begin_inset Quotes eld \end_inset HAL pins \begin_inset Quotes erd \end_inset pour chaque \begin_inset Quotes eld \end_inset physical pin \begin_inset Quotes erd \end_inset . Les \begin_inset Quotes eld \end_inset pins \begin_inset Quotes erd \end_inset sont décrites dans ce composant, comme expliqué dans la section \begin_inset Quotes eld \end_inset component \begin_inset Quotes eld \end_inset de cette doc, par: leurs noms, comment chaque \begin_inset Quotes eld \end_inset pin \begin_inset Quotes erd \end_inset est en relation avec la \begin_inset Quotes eld \end_inset physical pin \begin_inset Quotes erd \end_inset , est-elle inversée, peut-on changer sa polarité, etc. Mais ça ne permet pas d'obtenir les données des \begin_inset Quotes eld \end_inset HAL pins \begin_inset Quotes erd \end_inset aux \begin_inset Quotes eld \end_inset physical pins \begin_inset Quotes erd \end_inset . Le code est utilisé pour faire ça, et c'est la où les \begin_inset Quotes eld \end_inset functions \begin_inset Quotes erd \end_inset entrent en oeuvre. Le composant parport nécessite deux \begin_inset Quotes eld \end_inset functions \begin_inset Quotes erd \end_inset : une pour lire les broches d'entrée et mettre à jour les \begin_inset Quotes eld \end_inset HAL pins \begin_inset Quotes erd \end_inset , l'autre pour prendre les données des \begin_inset Quotes eld \end_inset HAL pins \begin_inset Quotes erd \end_inset et les écrire sur les broches de sortie \begin_inset Quotes eld \end_inset physical pins \begin_inset Quotes erd \end_inset . Ce deux fonctions font partie du pilote \begin_inset Quotes eld \end_inset hal_parport \begin_inset Quotes erd \end_inset . \layout Section \begin_inset LatexCommand \label{sec:Intro-Composants-HAL} \end_inset Composants HAL \layout Standard Chaque composant HAL est un morceau de logiciel avec, bien définis, des entrées, des sorties et un comportement. Ils peuvent être installés et interconnectés selon les besoins. Cette section liste certains des composants actuellement disponibles et décrit brièvement ce que chacun fait. Les détails complets sur chacun seront donnés plus loin dans ce document. \layout Subsection \begin_inset LatexCommand \label{sub:Programmes-externes} \end_inset Programmes externes attachés à HAL \layout Description motion \begin_inset LatexCommand \index{motion} \end_inset Un module temps réel qui accepte les commandes de mouvement en NML et inter-agi t avec HAL \layout Description iocontrol \begin_inset LatexCommand \index{iocontrol} \end_inset Un module d'espace utilisateur qui accepte les commandes d'entrée/sortie (I/O) en NML et inter-agit avec HAL \layout Description classicladder \begin_inset LatexCommand \index{ClassicLadder} \end_inset Un automate programmable en langage à contacts utilisant HAL pour les entrées/s orties (I/O) \layout Description halui \begin_inset LatexCommand \index{halui} \end_inset Un espace de utilisateur de programmation qui inter-agit avec HAL et envoie des commandes NML, Il est destiné à fonctionner comme une interface utilisateur en utilisant les boutons et interrupteurs externes. \layout Subsection \begin_inset LatexCommand \label{sub:Composants-internes} \end_inset Composants internes \layout Description stepgen \begin_inset LatexCommand \index{stepgen} \end_inset Générateur d'impulsions de pas avec boucle de position. Voir la section \begin_inset LatexCommand \ref{sec:Stepgen} \end_inset \layout Description encoder \begin_inset LatexCommand \index{encoder} \end_inset Codeur/compteur logiciel. Voir la section \begin_inset LatexCommand \ref{sec:Encoder} \end_inset \layout Description pid \begin_inset LatexCommand \index{pid} \end_inset Boucle de contrôle Proportionnelle/Intégrale/Dérivée. Voir la section \begin_inset LatexCommand \ref{sec:PID} \end_inset \layout Description siggen \begin_inset LatexCommand \index{siggen} \end_inset Générateur d'ondes: sinusoïdale/cosinusoïdale/triangle/carrée, pour la mise au point. Voir la section \begin_inset LatexCommand \ref{sec:Siggen} \end_inset \layout Description supply \begin_inset LatexCommand \index{supply} \end_inset Une simple alimentation, pour la mise au point \layout Description blocks \begin_inset LatexCommand \index{blocks} \end_inset Un assortiment de composants (mux, demux, or, and, integ, ddt, limit, wcomp, etc.) \layout Subsection \begin_inset LatexCommand \label{sub:Pilotes de matériels} \end_inset Pilotes de matériels \layout Description hal_ax5214h \begin_inset LatexCommand \index{hal-ax5214h} \end_inset Un pilote pour la carte d'entrées/sorties Axiom Measurement & Control AX5241H \layout Description hal_m5i20 \begin_inset LatexCommand \index{hal-m5i20} \end_inset Un pilote pour la carte Mesa Electronics 5i20 \layout Description hal_motenc \begin_inset LatexCommand \index{hal-motenc} \end_inset Un pilote pour la carte Vital Systems MOTENC-100 \layout Description hal_parport \begin_inset LatexCommand \index{hal-parport} \end_inset Pilote pour le(ou les) port(s) parallèle(s). Voir la section \begin_inset LatexCommand \ref{sec:Parport} \end_inset \layout Description hal_ppmc \begin_inset LatexCommand \index{hal-ppmc} \end_inset Un pilote pour la famille de contrôleurs Pico Systems (PPMC, USC et UPC) \layout Description hal_stg \begin_inset LatexCommand \index{hal-stg} \end_inset Un pilote pour la carte Servo To Go (versions 1 & 2) \layout Description hal_vti \begin_inset LatexCommand \index{hal-vti} \end_inset Un pilote pour le contrôleur Vigilant Technologies PCI ENCDAC-4 \layout Subsection \begin_inset LatexCommand \label{sub:Outils-Utilitaires} \end_inset Outils-Utilitaires \layout Description halcmd \begin_inset LatexCommand \index{halcmd} \end_inset Ligne de commande pour la configuration et les réglages. Voir la section \begin_inset LatexCommand \ref{sec:Halcmd} \end_inset \layout Description halgui Outil graphique pour la configuration et les réglages. (pas encore implémenté). \layout Description halmeter \begin_inset LatexCommand \index{halmeter} \end_inset Un multimètre pour les signaux HAL. Voir la section \begin_inset LatexCommand \ref{sec:Halmeter} \end_inset \layout Description halscope \begin_inset LatexCommand \index{halscope} \end_inset Un oscilloscope digital à mémoire, complétement fonctionnel pour les signaux HAL. Voir la section \begin_inset LatexCommand \ref{sec:Halscope} \end_inset \layout Standard Chacun de ces modules est décrit en détail dans les chapitres suivants. \layout Section \begin_inset LatexCommand \label{sec:Legos} \end_inset Tinkertoys, Erector Sets, Legos et le HAL \layout Standard Cette première introduction au concept de HAL peut être un peu déconcertante pour l'esprit. Construire quelque chose avec des blocs peut être un défi, pourtant certains jeux de construction avec lesquels nous avons joué étant enfants peuvent nous aider à construire un système HAL. \layout Subsection Une tour \layout Quote Je regardais mon fils et sa petite fille de six ans construire une tour à partir d'une boîte pleine de blocs de différentes tailles, de barres et de pièces rondes, des sortes de couvercles. L'objectif était de voir jusqu'où la tour pouvait monter. Plus la base était étroite plus il restait de pièces pour monter. Mais plus la base était étroite, moins la tour était stable. Je les voyais étudier combien de blocs ils pouvaient poser et où ils devaient les poser pour conserver l'équilibre avec le reste de la tour. \layout Standard La notion d'empilage de cartes pour voir jusqu'où on peut monter est une très vieille et honorable manière de passer le temps. En première lecture, l'intégrateur pourra avoir l'impression que construire un HAL est un peu comme ça. C'est possible avec une bonne planification, mais l'intégrateur peut avoir à construire un système stable aussi complexe qu'une machine actuelle l'exige. \layout Subsection Erector Sets \begin_inset Foot collapsed true \layout Standard Le jeu Erector Set est une invention de AC Gilbert \end_inset (Meccano en France) \layout Standard C'était une grande série de boites de construction en métal, des tôles perforées , plates ou en cornières, toutes avaient des trous régulierements espacés. Vous pouviez concevoir des tas de choses et les monter avec ces éléments maintenus entre eux par des petits boulons. \layout Quote J'ai eu ma première boîte Erector pour mon quatrième anniversaire. Je sais que la boîte était prévue pour des enfants beaucoup plus agés que moi. Peut être que mon père se faisait vraiment un cadeau à lui même. J'ai eu une période difficile avec les petites vis et les petits écrous. J'ai vraiment eu envie d'avoir quatre bras, un pour visser avec le tournevis, un pour tenir la vis, les pièces et l'écrou. En persévérant, de même qu'en agaçant mon père, j'ai fini par avoir fait tous les montages du livret. Bientôt, je lorgnais vers les plus grandes boîtes qui étaient imprimées sur ce livret. Travailler avec ces pièces de taille standard m'a ouvert le monde de la construction et j'ai bientôt été au delà des projets illustrés. \layout Standard Les composants Hal ne sont pas tous de même taille ni de même forme mais ils permettent d'être regroupés en larges unités qui feront bien du travail. C'est dans ce sens qu'ils sont comme les pièces d'un jeu Erector. Certains composants sont longs et minces. Ils connectent essentiellement les commandes de niveau supérieur aux \begin_inset Quotes eld \end_inset physical pins \begin_inset Quotes erd \end_inset . D'autres composants sont plus comme les plateformes rectangulaires sur lesquelles des machines entières pourraient être construites. Un intégrateur parviendra rapidement au delà des brefs exemples et commencera à assembler des composants entre eux d'une manière qui lui sera propre. \layout Subsection Tinkertoys \begin_inset Foot collapsed false \layout Standard Tinkertoy est maintenant registered trademark of the Hasbro company. \end_inset \layout Quote Le jouet en bois Tinkertoys est plus humain que l'acier froid de l'Erector. Le coeur de la construction avec TinkerToys est un connecteur rond avec huit trous équidistants sur la circonférence. Il a aussi un trou au centre, perpendiculaire aux autres trous répartis autour du moyeu. \layout Quote Les moyeux pouvaient être connectés avec des tiges rondes de différentes longueurs. Le constructeur pouvait faire une grosse roue à l'aide de rayons qui partaient du centre. \layout Quote Mon projet favori était une station spaciale rotative. De courtes tiges rayonnaient depuis les trous du moyeu central et étaient connectées avec d'autres moyeux aux extrémités des rayons. Ces moyeux extérieurs étaient raccordés entre eux avec d'autres rayons. Je passais des heures à rêver de vivre dans un tel dispositif, marchant de moyeu en moyeu et sur la passerelle extérieure qui tournait lentement à cause de la gravité dans l'espace en état d'apesanteur. Les provisions circulaient par les rayons et les ascenceurs qui les transféraie nt dans la fusée arrimée sur le rayon central pendant qu'on déchargeait sa précieuse cargaison. \layout Standard L'idée qu'une \begin_inset Quotes eld \end_inset pin \begin_inset Quotes erd \end_inset ou qu'un \begin_inset Quotes eld \end_inset component \begin_inset Quotes erd \end_inset est la plaque centrale pour de nombreuses connections est aussi une notion facile avec le HAL. Les exemples deux à quatre (voir section \begin_inset LatexCommand \ref{cha:Tutoriel-HAL} \end_inset ) connectent le multimètre et l'oscilloscope aux signaux qui sont prévus pour aller ailleurs. Moins facile, la notion d'un moyeu pour plusieurs signaux entrants. Mais, c'est également possible avec l'utilisation appropriée des fonctions dans ce composant de moyeu qui manipulent les signaux quand ils arrivent, venant d'autres composants. \layout Standard Une autre réflexion qui vient à partir de ce jouet mécanique est une représentat ion de \begin_inset Quotes eld \end_inset HAL threads \begin_inset Quotes erd \end_inset . Un \begin_inset Quotes eld \end_inset thread \begin_inset Quotes erd \end_inset pourrait ressembler un peu à un chilopode, une chenille, ou un perce-oreille. Une épine dorsale, des \begin_inset Quotes eld \end_inset HAL components \begin_inset Quotes erd \end_inset , raccordés entre eux par des tiges, les \begin_inset Quotes eld \end_inset HAL signals \begin_inset Quotes erd \end_inset . Chaque composant prend dans ses propres paramètres et selon l'état de ses broches d'entrée, les passe sur ses broches de sortie à l'intention du composant suivant. Les signaux voyagent ainsi de bout en bout, le long de l'épine dorsale où ils sont ajoutés ou modifiés par chaque composant son tour venu. \layout Standard Les \begin_inset Quotes eld \end_inset Threads \begin_inset Quotes erd \end_inset sont tous synchronisés et exécutent une série de tâches de bout en bout. Une représentation mécanique est possible avec Thinkertoys si on pense à la longueur du jouet comme étant la mesure du temps mis pour aller d'un bout à l'autre. Un thread, ou épine dorsale, très différent est créé en connectant le même ensemble de modules avec des tiges de longueur différente. La longueur totale de l'épine dorsale peut aussi être changée en jouant sur la longueur des tiges pour connecter les modules. L'ordre des opérations est le même mais le temps mis pour aller d'un bout à l'autre est très différent. \layout Subsection \begin_inset LatexCommand \label{sub:Un-Exemple-en-Lego} \end_inset Un exemple en Lego \begin_inset Foot collapsed true \layout Standard The Lego name is a trademark of the Lego company. \end_inset \layout Standard Lorsque les blocs de Lego sont arrivés dans nos magasins, ils étaient à peu près tous de la même taille et de la même forme. Bien sûr il y avait les demi taille et quelques uns en quart de taille mais tous rectangulaires. Les blocs de Lego se relient ensembles en enfonçant les broches mâles d'une pièce dans les trous femelles de l'autre. En superposant les couches, les jonctions peuvent être rendues très solides, même aux coins et aux tés. \layout Quote J'ai vu mes enfants et mes petits-enfants construire avec des pièces Lego (les mêmes Lego). Il y en a encore quelques milliers dans une vieille et lourde boîte en carton qui dort dans un coin de la salle de jeux. Ils sont stockés dans cette boîte car c'était trop long de les ranger et de les ressortir à chacune de leur visite et ils étaient utilisés à chaque fois. Il doit bien y avoir les pièces de deux douzaines de boîtes différentes de Lego. Les petits livrets qui les accompagnaient ont été perdus depuis longtemps, mais la magie de la construction avec l'imbrication de ces pièces toutes de la même taille est quelque chose à observer. \layout Standard Remarquez la similitude qu'il y a entre la description suivante, de la construct ion d'un jeu de composants de mouvements dans le HAL et la construction d'un mur en Lego. \layout Quote Le module de mouvement exporte une \begin_inset Quotes eld \end_inset pin \begin_inset Quotes erd \end_inset pour chaque axe dans un espace Cartésien, une autre \begin_inset Quotes eld \end_inset pin \begin_inset Quotes erd \end_inset pour chaque axe dans un espace articulé. Quand il est chargé, il crée automatiquement un signal de "jonction" pour chaque axe et connecte automatiquement ces signaux de la \begin_inset Quotes eld \end_inset joint pin \begin_inset Quotes erd \end_inset à la \begin_inset Quotes eld \end_inset cartesean pin \begin_inset Quotes erd \end_inset . Donc vous avez automatiquement un "trivkins" dès que vous chargez le module de mouvement. (trivkins: trivial kinematics; cinématique triviale, dans le cas ou chaque moteur déplace un seul axe à 90 degrés des autres) \layout Standard Le module de mouvement est comme des Lego en ligne de bout en bout. Trivkins est juste comme un simple bloc en chevauchant un autre. Les mouvements que font les broches lors du montage/démontage des pièces sont similaires à ce qu'on vient de voir. Mais le parallèle ne s'arrête pas là. \layout Quote Si vous avez besoin d'une autre cinématique, vous chargez un \begin_inset Quotes eld \end_inset kins component \begin_inset Quotes erd \end_inset . Ce composant "connait" le nom des pins que le module de mouvement utilise pour chaque axe, pour les deux: joint et Cartésien. Quand il est chargé, il crée automatiquement les signaux, et connecte ses propres pins à celles du module de mouvement (qui va deconnecter les "jonctions "). Il peut aussi connaître le nom des \begin_inset Quotes eld \end_inset threads \begin_inset Quotes erd \end_inset utilisés par le module de mouvement et peut ajouter automatiquement ses propres fonctions à ces \begin_inset Quotes eld \end_inset threads \begin_inset Quotes erd \end_inset . \layout Standard Trivkins est enlevé afin que les modules de mouvement puissent être répartis vers l'extérieur en utilisant d'autres modules, un pont différent est construit entre les pins d'entrée et celle de sortie. En terme de Lego, trivkins pourrait être un bloc gris et xxkins un bloc jaune. \layout Quote Ainsi, le résultat est que 24 \begin_inset Quotes eld \end_inset HAL signals \begin_inset Quotes erd \end_inset et 2 \begin_inset Quotes eld \end_inset HAL functions \begin_inset Quotes erd \end_inset sont configurés, sans qu'aucune action ne soit demandée à l'intégrateur autre que celle de charger le module. (24 signaux parce-que 6 axes * 2 parce-que en joint et en Cartésien * 2 parce-que nous avons la cinématique inverse et l'inversion des signaux. Parce que les \begin_inset Quotes eld \end_inset HAL signals \begin_inset Quotes erd \end_inset existent, ils peuvent être mesurés ou visualisés lors des tests. Mais puisque tous les modules connaissent leurs noms et savent comment se connecter automatiquement, l'intégrateur n'a pas besoin de le savoir ni de s'en inquiéter. \layout Standard Ce genre de configuration automatique de HAL est possible parce que tous les modules de cinématique se "branchent" la même manière. \layout Section \begin_inset LatexCommand \label{sec:Problèmes-de-Timing-dans-HALL} \end_inset Problèmes de timming dans HAL \layout Standard Contrairement aux modèles physiques du câblage entre les boîtes noires sur lequel, nous l'avons dit, HAL est basé, il suffit de relier deux broches avec un signal hal, on est loin de l'action physique. \layout Standard La vraie logique à relais consiste en relais connectés ensembles, quand un relais s'ouvre ou se ferme, le courant passe (ou s'arrête) immédiatement. D'autres bobines peuvent changer d'état etc. Dans le style langage à contacts d'automate comme le Ladder ça ne marche pas de cette façon. Habituellement dans un Ladder simple passe, chaque barreau de l'échelle est évalué dans l'ordre où il se présente et seulement une fois par passe. Un exemple parfait est un simple Ladder avec un contact en série avec une bobine. Le contact et la bobine actionnent le même relais. \layout Standard Si c'était un relais conventionnel, dès que la bobine est sous tension, le contact s'ouvre et coupe la bobine, le relais retombe etc. Le relais devient un buzzer. \layout Standard Avec un automate programmable, si la bobine est OFF et que le contact est fermé quand l'automate commence à évaluer le programme, alors à la fin de la passe, la bobine sera ON. Le fait que la bobine ouvre le contact qui la prive de courant est ignoré jusqu'à la prochaine passe. À la passe suivante, l'automate voit que le contact est ouvert et désactive la bobine. Donc, le relais va battre rapidement entre on et off à la vitesse à laquelle l'automate évalue le programme. \layout Standard Dans HAL, c'est le code qui évalue. En fait, la version Ladder HAL temps réel de ClassicLadder exporte une fonction pour faire exactement cela. Pendant ce temps, un thread exécute les fonctions spécifiques à intervalle régulier. Juste comme on peut choisir de régler la durée de la boucle de programme d'un automate programmable à 10ms, ou à 1 seconde, on peut définir des \begin_inset Quotes eld \end_inset HAL threads \begin_inset Quotes erd \end_inset avec des périodes différentes. \layout Standard Ce qui distingue un thread d'un autre n'est pas ce qu'il fait mais quelles fonctions lui sont attachées. La vraie distinction est simplement combien de fois un thread tourne. \layout Standard Dans EMC on peut avoir un thread à 50 \begin_inset Formula $\mu$ \end_inset s et un thread à 1ms. En se basant sur les valeurs de BASE_PERIOD et de SERVO_PERIOD. Valeurs fixées dans le fichier ini. \layout Standard La prochaine étape consiste à décider de ce que chaque thread doit faire. Certaines de ces décisions sont les mêmes dans (presque) tous les systèmes emc. Par exemple, le gestionnaire de mouvement est toujours ajouté au servo-thread. \layout Standard D'autres connections seront faites par l'intégrateur. Il pourrait s'agir de brancher la lecture d'un codeur par une carte STG à un DAC pour écrire les valeurs dans le servo thread, ou de brancher une fonction stepgen au base-thread avec la fonction parport pour écrire les valeurs sur le port. \the_end