/ docs / src / hal / tutorial_fr.txt
tutorial_fr.txt
   1  :lang: fr
   2  :toc:
   3  
   4  = Le tutoriel de HAL
   5  
   6  [[cha:Tutoriel-HAL]] (((Tutoriel de HAL)))
   7  
   8  [[sec:Intro-tutoriel]]
   9  == Introduction
  10  (((Introduction)))
  11  
  12  Halrun peut être utilisé pour créer un système complet et fonctionnel.
  13  Il s'agit d'un outil de configuration et de mise au point très puissant, en
  14  ligne de commande ou en fichier texte. Les exemples suivants illustrent son
  15  installation et son fonctionnement.
  16  
  17  [[sec:Tutoriel-Halcmd]]
  18  == Halcmd
  19  (((Tutoriel Halcmd)))
  20  
  21  Halcmd est un outil en ligne de commande pour manipuler HAL. Il existe
  22  une man page plus complète pour halcmd, elle sera installée en même
  23  temps qu' LinuxCNC depuis ses sources ou depuis un paquet. Si LinuxCNC a été
  24  compilé en _run-in-place_, la man page n'est pas installée, mais elle
  25  est accessible, dans le répertoire principal de LinuxCNC, taper:
  26  ----
  27  $ man -M docs/man halcmd 
  28  ----
  29  
  30  === Tab-complétion
  31  
  32  Votre version de halcmd peut inclure la complétion avec la touche tab.
  33  Au lieu de compléter les noms de fichiers comme le fait un shell, il
  34  complète les commandes avec les identifiants HAL. Essayez de presser la
  35  touche tab après le début d'une commande HAL:
  36  ----
  37  halcmd: loa<TAB> 
  38  
  39  halcmd: load 
  40  
  41  halcmd: loadrt 
  42  
  43  halcmd: loadrt deb<TAB> 
  44  
  45  halcmd: loadrt debounce
  46  ---- 
  47  
  48  === L'environnement RTAPI
  49  
  50  RTAPI est le sigle de Real Time Application Programming Interface. De
  51  nombreux composants HAL travaillent en temps réel et tous les
  52  composants de HAL stockent leurs données dans la mémoire partagée, de
  53  sorte que les composants temps réel puissent y accéder. Normalement,
  54  Linux ne prend pas en charge les programmes temps réel ni le type de
  55  mémoire partagée dont HAL a besoin. Heureusement, il existe des
  56  systèmes d'exploitation temps réel RTOS qui fournissent les extensions
  57  nécessaires à Linux. Malheureusement, chaque RTOS fait les choses
  58  différemment des autres.
  59  
  60  Pour remédier à ces différences, l'équipe de LinuxCNC a proposé RTAPI, qui
  61  fournit une manière cohérente aux programmes de parler au RTOS. Si vous
  62  êtes un programmeur qui veut travailler à l'intérieur de LinuxCNC, vous
  63  pouvez étudier _linuxcnc/src/rtapi/rtapi.h_ pour comprendre l'API. Mais si
  64  vous êtes une personne normale, tout
  65  ce que vous avez besoin de savoir à propos de RTAPI est qu'il doit être
  66  (avec le RTOS) chargé dans la mémoire de votre ordinateur avant de
  67  pouvoir faire n'importe quoi avec HAL.
  68  
  69  [[sec:Tutoriel-Exemple-Simple]]
  70  == Tutoriel simple
  71  (((Tutoriel simple)))
  72  
  73  === Charger un composant temps réel
  74  
  75  Pour ce tutoriel, nous allons supposer que vous avez installé avec
  76  succès le CD-Live ou que vous avez compilé correctement l'arborescence
  77  linuxcnc/src. Si nécessaire, invoquez le script _rip-environment_ pour
  78  préparer votre shell. Dans ce cas, tout ce que vous avez à faire
  79  est de charger le RTOS requis et les modules RTAPI dans la mémoire.
  80  Tapez juste les commandes suivantes dans une console:
  81  ----
  82  $cd linuxcnc
  83   
  84  $linuxcnc halrun 
  85  
  86  $halcmd: 
  87  ----
  88  
  89  Avec l'OS temps réel et RTAPI chargés, vous pouvez passer au premier
  90  exemple. Notez que le prompt a changé, il est passé de _+$+_ à _halcmd:_.
  91  La raison en est que les commandes ultérieures seront interprétées
  92  comme des commandes HAL et non plus comme des commandes shell.
  93  
  94  Pour le premier exemple, nous allons utiliser un composant HAL appelé
  95  _siggen_, qui est un simple générateur de signaux. Une description
  96  complète de ce composant est disponible à la <<sec:Siggen, section siggen>> 
  97  de ce document. 
  98  Il s'agit d'un composant temps réel, mis en œuvre comme un module du 
  99  noyau Linux. Pour charger siggen utiliser la commande de HAL, _loadrt_:
 100  ----
 101  halcmd: loadrt siggen
 102  ----
 103  
 104  === Examiner HAL
 105  
 106  Maintenant que le module est chargé, il faut introduire _halcmd_,
 107  l'outil en ligne de commande utilisé pour configurer HAL. Pour une description 
 108  plus complète essayez: _man halcmd_, ou consultez la
 109  section <<sec:Tutoriel-Halcmd, halcmd au début de ce document>>. La 
 110  première commande de halcmd et _show_, qui affichera les informations 
 111  concernant l'état actuel de HAL. Pour afficher tout ce qui est 
 112  installé tapez:
 113  ----
 114  halcmd: show comp
 115  
 116      Loaded HAL Components:  
 117      ID     Type  Name          PID   State  
 118      3      RT    siggen              ready  
 119      2      User  halcmd2177    2177  ready  
 120  ----
 121  
 122  Puisque halcmd lui même est un composant HAL, il sera toujours
 123  présent dans la liste. 
 124  Le nombre après halcmd dans la liste des composants est le
 125  Process ID. Il est toujours possible de lancer plus d'une instance de
 126  halcmd en même temps (dans différentes fenêtres par exemple), le numéro
 127  PID est ajouté à la fin du nom pour rendre celui-ci unique. La liste
 128   montre aussi le composant _siggen_  que nous avions installé à l'étape
 129  précédente. Le _RT_ sous _Type_ indique que siggen est un composant temps réel.
 130  
 131  Ensuite, voyons quelles pins siggen rend disponibles:
 132  ----
 133  halcmd: show pin 
 134  
 135      Component Pins: 
 136      Owner   Type  Dir         Value  Name 
 137          3  float   IN             1  siggen.0.amplitude 
 138          3  float  OUT             0  siggen.0.cosine 
 139          3  float   IN             1  siggen.0.frequency 
 140          3  float   IN             0  siggen.0.offset 
 141          3  float  OUT             0  siggen.0.sawtooth 
 142          3  float  OUT             0  siggen.0.sine 
 143          3  float  OUT             0  siggen.0.square 
 144          3  float  OUT             0  siggen.0.triangle 
 145  ----
 146  
 147  Cette commande affiche toutes les pins présentes dans HAL. Un
 148  système complexe peut avoir plusieurs dizaines ou centaines de pins.
 149  Mais pour le moment il y a seulement huit pins. Toutes ces huit pins
 150  sont des flottants, elles transportent toutes des données en provenance
 151  du composant siggen. Puisque nous n'avons pas encore exécuté le code
 152  contenu dans le composant, certaines pins ont une valeur de zéro.
 153  
 154  L'étape suivante consiste à examiner les paramètres:
 155  ----
 156  halcmd: show param
 157  
 158      Parameters: 
 159      Owner   Type  Dir        Value   Name 
 160          3    s32   RO            0   siggen.0.update.time 
 161          3    s32   RW            0   siggen.0.update.tmax 
 162  ----
 163  
 164  La commande _show param_ affiche tous les paramètres de HAL. Pour le
 165  moment chaque paramètre à la valeur par défaut attribuée quand le
 166  composant a été chargé. Notez dans la colonne _Dir_, les paramètres
 167  marqués _-W_ sont en écriture possible, pour ceux qui ne sont jamais
 168  modifiés par
 169  le composant lui-même, mais qui sont modifiables par l'utilisateur pour
 170  contrôler le composant. Nous verrons comment plus tard. Les paramètres
 171   marqués _R-_ sont en lecture seule. Il ne peuvent être modifiés que
 172  par le composant. Finalement, les paramètres marqués _RW_ sont en
 173  lecture/écriture. Ils peuvent être modifiés par le composant
 174   et aussi par l'utilisateur. Nota: les paramètres
 175  _siggen.0.update.time_ et _siggen.0.update.tmax_ existent dans un but
 176  de débogage, ils ne sont pas couverts par cette documentation. 
 177  Les paramètres thread.time et thread.tmax sont associés avec le thread
 178  créé quand le composant a été chargé. Quand la réécriture de HAL sera
 179  terminée, le thread ne sera plus créé à ce stade, de sorte que ces
 180  paramètres ne seront plus visibles.
 181  
 182  Il n'y a pas de thread créé ici, mais il y a quand même les paramètres
 183  _siggen.0.update.time_ et _siggen.0.update.tmax_.
 184  
 185  Les paramètres de thread sont ceux du composant 02, le module siggen.
 186  C'est incorrect, ils devraient être ceux du module hal_lib, parce que
 187  le thread lui même n'est plus la propriété de siggen, et si
 188  siggen est retiré, les paramètres devraient rester.
 189  
 190  Et bien finalement, _fixer_ les paramètres de thread aura pris plus de
 191  temps que je ne pensais. Donc, je les ai éliminés pour l'instant. Quand
 192  la réécriture de HAL sera terminée, je les remettrai.
 193  
 194  La plupart des composants temps réel exportent une ou plusieurs
 195  fonctions pour que le code qu'elles contiennent soit exécuté en temps
 196  réel. Voyons ce que la fonction siggen exporte:
 197  ----
 198  halcmd: show funct
 199  
 200      Exported Functions: 
 201      Owner  CodeAddr  Arg       FP   Users  Name 
 202      00003  f801b000  fae820b8  YES      0   siggen.0.update 
 203  ----
 204  
 205  Le composant siggen exporte une seule fonction. Il nécessite un
 206  flottant (Floating Point). Il n'est lié à aucun thread, puisque _users_ 
 207  est à zéro. footnote:[Les champs CodeAddr et Arg ont été utilisés
 208  pendant le développement et devraient probablement disparaître.]
 209  
 210  === Exécuter le code temps réel
 211  
 212  Pour faire tourner le code actuellement contenu dans la fonction
 213  _siggen.0.update_, nous avons besoin d'un thread temps réel. C'est le
 214  composant appelé _threads_ qui est utilisé pour créer le nouveau
 215  thread. Créons un thread appelé _test-thread_ avec une période de 1 ms
 216  (1000 µs ou 1000000 ns):
 217  ----
 218  halcmd: loadrt threads name1=test-thread period1=1000000 
 219  ----
 220  
 221  Voyons si il fonctionne:
 222  ----
 223  halcmd: show thread
 224  
 225      Realtime Threads: 
 226           Period  FP     Name               (     Time, Max-Time ) 
 227           999855  YES           test-thread (        0,        0 ) 
 228  ----
 229  
 230  Il fonctionne. La période n'est pas exactement de 1000000 ns à cause
 231  des limitations dues au matériel, mais nous avons bien un thread qui
 232  tourne à une période approximativement correcte et qui peut manipuler
 233  des fonctions en virgule flottante. La prochaine étape sera de
 234  connecter la fonction au thread:
 235  ----
 236  halcmd: addf siggen.0.update test-thread 
 237  ----
 238  
 239  Pour le moment nous avions utilisé halcmd seulement pour regarder
 240  HAL. Mais cette fois-ci, nous avons
 241   utilisé la commande _addf_ (add function) pour changer quelque chose
 242  dans HAL. Nous avons dit
 243   à halcmd d'ajouter la fonction _siggen.0.update_ au thread
 244  _test-thread_ et la commande suivante indique qu'il a réussi:
 245  ----
 246  halcmd: show thread 
 247  
 248      Realtime Threads: 
 249           Period  FP     Name          (     Time, Max-Time ) 
 250           999855  YES    test-thread   (        0,        0 ) 
 251                      1 siggen.0.update 
 252  ----
 253  
 254  Il y a une étape de plus avant que le composant siggen ne commence
 255  à générer des signaux. Quand HAL est démarré pour la
 256  première fois, les threads ne sont pas en marche. C'est pour vous
 257  permettre de compléter la configuration du système avant que le code
 258  temps réel ne démarre. Une fois que vous êtes satisfait de la
 259  configuration, vous pouvez lancer le code temps réel comme ceci:
 260  ----
 261  halcmd: start
 262  ----
 263  
 264  Maintenant le générateur de signal est en marche. Regardons ses pins
 265  de sortie:
 266  ----
 267  halcmd: show pin
 268  
 269      Component Pins: 
 270      Owner   Type  Dir         Value  Name 
 271           3  float IN              1  siggen.0.amplitude 
 272           3  float OUT    -0.1640929  siggen.0.cosine 
 273           3  float IN              1  siggen.0.frequency 
 274           3  float IN              0  siggen.0.offset 
 275           3  float OUT    -0.4475303  siggen.0.sawtooth 
 276           3  float OUT     0.9864449  siggen.0.sine 
 277           3  float OUT            -1  siggen.0.square 
 278           3  float OUT    -0.1049393  siggen.0.triangle 
 279  ----
 280  
 281  Regardons encore une fois: 
 282  ----
 283  halcmd: show pin 
 284  
 285      Component Pins: 
 286      Owner   Type  Dir         Value  Name 
 287           3  float IN              1  siggen.0.amplitude 
 288           3  float OUT     0.0507619  siggen.0.cosine 
 289           3  float IN              1  siggen.0.frequency 
 290           3  float IN              0  siggen.0.offset 
 291           3  float OUT     -0.516165  siggen.0.sawtooth 
 292           3  float OUT     0.9987108  siggen.0.sine 
 293           3  float OUT            -1  siggen.0.square  
 294           3  float OUT    0.03232994  siggen.0.triangle 
 295  ----
 296  
 297  Nous avons fait, très rapidement, deux commandes _show pin_ et vous
 298  pouvez voir que les sorties ne sont plus à zéro. Les sorties
 299  sinus, cosinus, dents de scie et triangle changent constamment. La
 300  sortie carrée fonctionne également, mais elle passe simplement de +1.0
 301  à -1.0 à chaque cycle.
 302  
 303  === Modifier des paramètres
 304  
 305  La réelle puissance de HAL est de permettre de modifier les choses.
 306  Par exemple, on peut utiliser la commande _setp_ pour ajuster la
 307  valeur d'un paramètre. Modifions l'amplitude du
 308  signal de sortie du générateur de 1.0 à 5.0:
 309  ----
 310  halcmd: setp siggen.0.amplitude 5 
 311  ----
 312  
 313  Voyons encore une fois les paramètres et les pins:
 314  ----
 315  halcmd: show param 
 316  
 317      Parameters: 
 318      Owner   Type  Dir         Value  Name 
 319           3  s32   RO           1754  siggen.0.update.time 
 320           3  s32   RW          16997  siggen.0.update.tmax 
 321  
 322  halcmd: show pin 
 323  
 324      Component Pins: 
 325      Owner   Type  Dir         Value  Name 
 326           3  float IN              5  siggen.0.amplitude 
 327           3  float OUT     0.8515425  siggen.0.cosine 
 328           3  float IN              1  siggen.0.frequency 
 329           3  float IN              0  siggen.0.offset 
 330           3  float OUT      2.772382  siggen.0.sawtooth 
 331           3  float OUT     -4.926954  siggen.0.sine 
 332           3  float OUT             5  siggen.0.square 
 333           3  float OUT      0.544764  siggen.0.triangle 
 334  
 335  ----
 336  
 337  Notez que la valeur du paramètre _siggen.0.amplitude_ est bien passée
 338  à 5.000 et que les pins ont maintenant des valeurs
 339  plus grandes.
 340  
 341  === Enregistrer la configuration de HAL 
 342  
 343  La plupart de ce que nous avons fait jusqu'ici avec halcmd a été de
 344  simplement regarder les choses avec la commande show . Toutefois,
 345  deux commandes ont réellement modifié des valeurs. Au fur
 346  et à mesure que nous concevons des systèmes plus complexes avec HAL,
 347  nous allons utiliser de nombreuses commandes pour le configurer comme
 348  nous le souhaitons. HAL a une mémoire d'éléphant et peut retenir sa
 349  configuration jusqu'à ce qu'il s'arrête. Mais qu'en est-il de la
 350  prochaine fois ? Nous ne voulons pas entrer une série de commande à
 351  chaque fois que l'on veut utiliser le système. Nous pouvons enregistrer
 352  la configuration de l'ensemble de HAL en une seule commande:
 353  ----
 354  halcmd: save 
 355  
 356      # components 
 357      loadrt threads name1=test-thread period1=1000000 
 358      loadrt siggen 
 359      # pin aliases 
 360      # signals 
 361      # nets 
 362      # parameter values 
 363      setp siggen.0.update.tmax 14687 
 364      # realtime thread/function links 
 365      addf siggen.0.update test-thread 
 366  ----
 367  
 368  La sortie de la commande _save_ est une séquence de commandes HAL. Si
 369  vous commencez par un HAL _vide_ et que vous tapez toute la séquence de 
 370  commandes HAL, vous aurez la configuration qui existait lors de l'exécution de 
 371  la commande save. Pour sauver ces commandes pour une utilisation ultérieure,
 372  nous allons simplement rediriger la sortie vers un fichier:
 373  ----
 374  halcmd: save all saved.hal 
 375  ----
 376  
 377  === Quitter halrun
 378  
 379  Pour quitter halrun, ne pas fermez simplement la fenêtre de terminal sans avoir 
 380  arrêté la session de HAL, pour l'arrêter correctement tapez:
 381  ----
 382  halcmd: exit 
 383  
 384  ~/linuxcnc$
 385  ----
 386  
 387  === Restaurer la configuration de HAL 
 388  
 389  Pour restaurer la configuration de HAL enregistrée dans _saved.hal_, nous
 390  avons besoin d'exécuter toutes les commandes enregistrées. Pour ce
 391  faire, nous utiliserons la commande _-f <filename>_ qui lit les
 392  commandes à partir d'un fichier, le _-I_ affichera le prompt halcmd
 393  après l'exécution des commandes:
 394  ----
 395  ~/linuxcnc$ halrun -I -f saved.hal 
 396  ----
 397  
 398  Noter qu'il n'y a pas de commande _start_ dans le fichier saved.hal.
 399  Il est nécessaire de la retaper (ou d'éditer saved.hal pour l'ajouter):
 400  ----
 401  halcmd: start 
 402  
 403  halcmd: exit 
 404  
 405  ~/linuxcnc$ 
 406  ----
 407  
 408  === Suppression de la mémoire de HAL
 409  
 410  Si un arrêt inattendu d'une session de HAL survient, il sera peut être 
 411  nécessaire de décharger HAL de la mémoire avant de pouvoir lancer une autre 
 412  session. Pour cela, taper la commande suivante dans une fenêtre de terminal:
 413  ----
 414  ~/linuxcnc$ halrun -U
 415  ---- 
 416  
 417  [[sec:Tutoriel-halmeter]]
 418  == Visualiser HAL avec halmeter
 419  (((Tutoriel halmeter)))
 420  
 421  Il est possible de construire des systèmes HAL vraiment complexes sans
 422  utiliser d'interface graphique. Mais il y a quelque chose de rassurant
 423  à visualiser le résultat du travail. Le premier et le plus simple des
 424  outils graphiques pour HAL, est _halmeter_. C'est un programme très
 425  simple qui s'utilise comme un multimètre. Il permet d'observer les pins,
 426  signaux ou paramètres en affichant la valeur courante de ces items. Il
 427  est très simple à utiliser. Dans une console taper _halmeter_. 
 428  halmeter est une application pour environnement graphique. Deux
 429  fenêtres vont apparaître, la fenêtre de sélection est la plus grande.
 430  Elle comprend trois onglets. Un onglet liste toutes les pins
 431  actuellement définies dans HAL. Le suivant, liste tous les signaux et
 432  le dernier onglet, liste tous les paramètres. Cliquer sur un onglet,
 433  puis cliquer sur un des items pour le sélectionner. La petite fenêtre affichera 
 434  le nom et la valeur de l'item sélectionné.
 435  L'affichage est mis à jour environ 10 fois par seconde. Pour libérer de
 436  la place sur l'écran, la fenêtre de sélection peut être fermée avec le
 437  bouton _Fermer_. Sur la petite fenêtre, cachée sous la grande à
 438  l'ouverture, le bouton _Sélectionner_, ré-ouvre la fenêtre de sélection et le
 439  bouton _Quitter_ arrête le programme et ferme les fenêtres.
 440  
 441  Il est possible d'ouvrir et de faire fonctionner simultanément
 442  plusieurs halmeter, ce qui permet de visualiser plusieurs items en
 443  même temps. Pour ouvrir un halmeter en libérant la console, taper
 444  _halmeter &_ pour le lancer en tâche de fond. Il est possible de
 445  lancer halmeter en lui faisant afficher immédiatement un item, pour cela, 
 446  ajouter les arguments sur la ligne de commande _pin|sig|par[am] nom_. Il 
 447  affichera le signal, la pin, ou le paramètre _nom_ dès qu'il
 448  démarrera. Si l'item indiqué n'existe pas, il démarrera normalement.
 449  Finalement, si un item est spécifié pour l'affichage, il est possible
 450  d'ajouter _-s_ devant pin|sig|param pour indiquer à halmeter d'utiliser
 451  une fenêtre encore plus réduite. Le nom de l'item sera affiché dans la
 452  barre de titre au lieu de sous la valeur et il n'y aura pas de bouton.
 453  Utile pour afficher beaucoup de halmeter dans un petit espace de
 454  l'écran.
 455  
 456  Nous allons utiliser de nouveaux éléments du composant siggen pour
 457  vérifier halmeter. Si vous avez fini l'exemple précédent, alors siggen
 458  est déjà chargé. Sinon, on peut charger tout comme nous l'avons fait
 459  précédemment:
 460  ----
 461  ~/linuxcnc$ halrun 
 462  
 463  halcmd: loadrt siggen 
 464  
 465  halcmd: loadrt threads name1=test-thread period1=1000000 
 466  
 467  halcmd: addf siggen.0.update test-thread 
 468  
 469  halcmd: start 
 470  
 471  halcmd: setp siggen.0.amplitude 5 
 472  ----
 473  
 474  === Lancement de halmeter
 475  
 476  À ce stade, nous avons chargé le composant siggen, il est en cours
 477  d'exécution. Nous pouvons lancer halmeter. Puisque halmeter est une
 478  application graphique, X doit être actif.
 479  ----
 480  halcmd: loadusr halmeter 
 481  ----
 482  
 483  Dans le même temps, une fenêtre s'ouvre sur votre écran, demandant de
 484  sélectionner l'item à observer.
 485  
 486  [[cap:halmeter-Fenetre-selection]]
 487  .Fenêtre de sélection de halmeter
 488  (((Fenêtre de sélection)))
 489  
 490  image::images/halmeter-select_fr.png[alt="Fenêtre de sélection de halmeter"]
 491  
 492  Ce dialogue contient trois onglets. Le premier onglet affiche toutes
 493  les HAL pins du système. La seconde affiche tous les signaux et le
 494  troisième affiche tous les paramètres. Si nous voulons analyser la pin
 495  _siggen.0.cosine_ en premier, il suffit de cliquer sur elle puis sur
 496  le bouton _Fermer_. Le dialogue de sélection se ferme et la mesure s'affiche
 497  dans une fenêtre semblable à la figure ci-dessous.
 498  
 499  [[sec:halmeter-valeur]]
 500  .Affichage de la valeur
 501  (((Affichage de la valeur)))
 502  
 503  image::images/halmeter-1_fr.png[alt="Affichage de la valeur"]
 504  
 505  Pour modifier ce qui est affiché sur halmeter pressez le bouton
 506  _Sélectionner_ qui vous ramènera à la fenêtre de sélection précédente.
 507  
 508  Vous devriez voir la valeur évoluer puisque siggen génère une onde
 509  cosinusoïdale. halmeter rafraîchi son affichage environ 5 fois par
 510  seconde.
 511  
 512  Pour éteindre halmeter, cliquer sur le bouton _Quitter_.
 513  
 514  Pour visualiser plusieurs pins, signaux ou paramètres en même temps,
 515  il est possible d'ouvrir plusieurs halmeter. La fenêtre de halmeter
 516  est intentionnellement petite justement pour permettre d'en ouvrir un
 517  grand nombre sur le même écran.[[sec:Tutoriel-Plus-Complexe]]
 518  
 519  == Tutoriel plus complexe avec stepgen
 520  
 521  Jusqu'à maintenant, nous avons chargé un composant HAL. Mais l'idée
 522  générale de HAL est de vous permettre de charger et de relier un grand
 523  nombre de composants pour en faire un système complexe. L'exemple suivant
 524  va utiliser deux composants.
 525  
 526  Avant de mettre en place ce nouvel exemple, nous allons commencer par
 527  un petit nettoyage. Si vous avez fini l'un des exemples précédents, il
 528  faut supprimer tous les composants et ensuite recharger la RTAPI et les
 529  librairies de HAL en faisant:
 530  ----
 531  halcmd: exit 
 532  
 533  ~/linuxcnc$ halrun 
 534  ----
 535  
 536  === Installation des composants
 537  
 538  Maintenant, nous allons charger le composant générateur d'impulsions.
 539  Pour l'instant, nous pouvons nous passer des détails et exécuter les
 540  commandes suivantes:footnote:[Le signe _\_ à la fin d'une longue ligne
 541  indique que la ligne est tronquée (c'est nécessaire pour formater ce document). 
 542  Quand vous entrez la commande en ligne dans la console, sautez simplement le _\_ 
 543  (ne pressez pas Entrée) et continuez à taper la ligne suivante.]
 544  
 545  Dans cet exemple nous utiliserons le type de contrôle _velocity_ du
 546  composant stepgen.
 547  ----
 548  halrun: loadrt stepgen step_type=0,0 ctrl_type=v,v 
 549  
 550  halcmd: loadrt siggen 
 551  
 552  halcmd: loadrt threads name1=fast fp1=0 period1=50000 name2=slow period2=1000000
 553  ----
 554  
 555  La première commande charge deux générateurs d'impulsions, configurés
 556  pour générer des impulsions de type 0. La seconde commande charge notre
 557  vieil ami siggen et la troisième crée deux threads, un rapide (fast)
 558  avec une période de 50 µs et un lent avec une période de 1ms. Le thread
 559  rapide ne prend pas en charge les fonctions à virgule flottante
 560  (fp1=0).
 561  
 562  Comme précédemment, on peut utiliser _halcmd show_ pour jeter un coup
 563  d'oeil à HAL. Cette fois, nous aurons beaucoup
 564  plus de pins et de paramètres que précédemment:
 565  ----
 566  halcmd: show pin 
 567  
 568      Component Pins: 
 569      Owner   Type  Dir         Value  Name 
 570           4  float IN              1  siggen.0.amplitude 
 571           4  float OUT             0  siggen.0.cosine 
 572           4  float IN              1  siggen.0.frequency 
 573           4  float IN              0  siggen.0.offset 
 574           4  float OUT             0  siggen.0.sawtooth 
 575           4  float OUT             0  siggen.0.sine 
 576           4  float OUT             0  siggen.0.square 
 577           4  float OUT             0  siggen.0.triangle 
 578           3  s32   OUT             0  stepgen.0.counts 
 579           3  bit   OUT         FALSE  stepgen.0.dir 
 580           3  bit   IN          FALSE  stepgen.0.enable 
 581           3  float OUT             0  stepgen.0.position-fb 
 582           3  bit   OUT         FALSE  stepgen.0.step 
 583           3  float IN              0  stepgen.0.velocity-cmd 
 584           3  s32   OUT             0  stepgen.1.counts 
 585           3  bit   OUT         FALSE  stepgen.1.dir 
 586           3  bit   IN          FALSE  stepgen.1.enable 
 587           3  float OUT             0  stepgen.1.position-fb 
 588           3  bit   OUT         FALSE  stepgen.1.step 
 589           3  float IN              0  stepgen.1.velocity-cmd 
 590  
 591  
 592  halcmd: show param 
 593  
 594      Parameters: 
 595      Owner   Type  Dir         Value  Name 
 596           4  s32   RO              0  siggen.0.update.time 
 597           4  s32   RW              0  siggen.0.update.tmax 
 598           3  u32   RW     0x00000001  stepgen.0.dirhold 
 599           3  u32   RW     0x00000001  stepgen.0.dirsetup 
 600           3  float RO              0  stepgen.0.frequency 
 601           3  float RW              0  stepgen.0.maxaccel 
 602           3  float RW              0  stepgen.0.maxvel 
 603           3  float RW              1  stepgen.0.position-scale 
 604           3  s32   RO              0  stepgen.0.rawcounts 
 605           3  u32   RW     0x00000001  stepgen.0.steplen 
 606           3  u32   RW     0x00000001  stepgen.0.stepspace 
 607           3  u32   RW     0x00000001  stepgen.1.dirhold 
 608           3  u32   RW     0x00000001  stepgen.1.dirsetup 
 609           3  float RO              0  stepgen.1.frequency 
 610           3  float RW              0  stepgen.1.maxaccel 
 611           3  float RW              0  stepgen.1.maxvel 
 612           3  float RW              1  stepgen.1.position-scale 
 613           3  s32   RO              0  stepgen.1.rawcounts 
 614           3  u32   RW     0x00000001  stepgen.1.steplen 
 615           3  u32   RW     0x00000001  stepgen.1.stepspace 
 616           3  s32   RO              0  stepgen.capture-position.time 
 617           3  s32   RW              0  stepgen.capture-position.tmax 
 618           3  s32   RO              0  stepgen.make-pulses.time 
 619           3  s32   RW              0  stepgen.make-pulses.tmax 
 620           3  s32   RO              0  stepgen.update-freq.time 
 621           3  s32   RW              0  stepgen.update-freq.tmax 
 622  ----
 623  
 624  === Connexion des pins avec les signaux
 625  
 626  Nous avons donc deux générateurs d'impulsions de pas et un générateur
 627  de signaux. Maintenant, nous allons créer des signaux HAL pour
 628  connecter ces trois composants. Nous allons faire comme si nous
 629  pilotions les axes X et Y d'une machine avec nos générateurs
 630  d'impulsions de pas. Nous voulons déplacer la table en ronds. Pour ce
 631  faire, nous allons envoyer un signal cosinusoïdal à l'axe des X et un
 632  signal sinusoïdal à l'axe des Y. Le module siggen créera le sinus et le
 633  cosinus, mais nous aurons besoin de _fils_ pour connecter les modules
 634  ensemble. Dans HAL, les _fils_ sont appelés signaux. Nous devons en
 635  créer deux. Nous pouvons les appeler comme on veut, dans cet exemple il
 636  y aura _X-vel_ et _Y-vel_. Le signal _X-vel_ partira de la sortie
 637  cosinus du générateur de signaux et arrivera sur
 638  l'entrée _velocity_ du premier générateur d'impulsions de pas. La
 639  première étape consiste à connecter le signal à la sortie du générateur
 640  de signaux. Pour connecter un signal à une pin, nous utilisons la
 641  commande _net_:
 642  ----
 643  halcmd: net X-vel <= siggen.0.cosine
 644  ---- 
 645  
 646  Pour voir l'effet de la commande _net_, regardons les signaux:
 647  ----
 648  halcmd: show sig 
 649  
 650      Signals: 
 651      Type          Value  Name     (linked to) 
 652      float             0  X-vel <== siggen.0.cosine 
 653  ----
 654  
 655  Quand un signal est connecté à une ou plusieurs pins, la commande
 656  _show_ liste les pins immédiatement suivies par le nom du signal.
 657  Les flèches donnent la direction du flux de données, dans ce cas, le flux
 658   va de la pin _siggen.0.cosine_ vers le signal _X-vel_. Maintenant,
 659  connectons _X-vel_ à l'entrée _velocity_ du générateur d'impulsions de
 660  pas:
 661  ----
 662  halcmd: net X-vel => stepgen.0.velocity-cmd 
 663  ----
 664  
 665  Nous pouvons aussi connecter l'axe Y au signal _Y-vel_. Il doit partir de 
 666  la sortie sinus du générateur de signaux pour arriver sur l'entrée du second 
 667  générateur d'impulsions de pas. La commande suivante fait, en une ligne, la 
 668  même chose que les deux commandes _net_ précédentes ont fait pour _X-vel_:
 669  ----
 670  halcmd: net Y-vel siggen.0.sine => stepgen.1.velocity-cmd
 671  ---- 
 672  
 673  Pour voir l'effet de la commande net, regardons encore les signaux et
 674  les pins:
 675  ----
 676  halcmd: show sig 
 677  
 678      Signals: 
 679      Type          Value  Name     (linked to) 
 680      float             0  X-vel <== siggen.0.cosine 
 681                                 ==> stepgen.0.velocity-cmd 
 682      float             0  Y-vel <== siggen.0.sine 
 683                                 ==> stepgen.1.velocity-cmd 
 684  ----
 685  
 686  La commande _show sig_ montre clairement comment les flux de
 687  données circulent dans HAL. Par exemple, le signal _X-vel_ 
 688  provient de la pin _siggen.0.cosine_ et va vers la pin 
 689  _stepgen.0.velocity-cmd_. 
 690  
 691  === Exécuter les réglages du temps réel - threads et functions
 692  
 693  Penser à ce qui circule dans les _fils_ rend les pins et les signaux
 694  assez faciles à comprendre. Les threads et les fonctions sont un peu
 695  plus délicates à appréhender. Les fonctions contiennent des instructions pour
 696  l'ordinateur. Les threads sont les méthodes utilisées pour faire
 697  exécuter ces instructions quand c'est nécessaire. Premièrement,
 698  regardons les fonctions dont nous disposons:
 699  ----
 700  halcmd: show funct 
 701  
 702      Exported Functions: 
 703      Owner   CodeAddr  Arg       FP   Users  Name 
 704       00004  f9992000  fc731278  YES      0   siggen.0.update 
 705       00003  f998b20f  fc7310b8  YES      0   stepgen.capture-position 
 706       00003  f998b000  fc7310b8  NO       0   stepgen.make-pulses 
 707       00003  f998b307  fc7310b8  YES      0   stepgen.update-freq 
 708  ----
 709  
 710  En règle générale, vous devez vous référer à la documentation de
 711  chaque composant pour voir ce que font ses fonctions. Dans notre
 712  exemple, la fonction _siggen.0.update_ est utilisée pour mettre à jour
 713  les sorties du générateur de signaux. 
 714  Chaque fois qu'elle est exécutée, le générateur recalcule les valeurs
 715  de ses sorties sinus, cosinus, dent de scie, triangle, carrée. Pour générer 
 716  un signal régulier, il doit fonctionner à des intervalles très précis.
 717  
 718  Les trois autres fonctions sont relatives au générateur d'impulsions de pas: 
 719  
 720  La première, _stepgen.capture-position_, est utilisée pour un retour 
 721  de position. Elle capture la valeur d'un 
 722  compteur interne comptant les impulsions qui sont générées. S'il n'y 
 723  a pas de perte de pas, ce compteur indique la position du moteur. 
 724  
 725  La fonction principale du générateur d'impulsions est
 726  _stepgen.make-pulses_. Chaque fois que _make-pulses_ démarre, elle
 727  décide qu'il est temps de faire un pas, si oui elle fixe
 728  les sorties en conséquence. Pour des pas plus doux, elle doit fonctionner
 729  le plus souvent possible. Parce qu'elle a besoin de fonctionner de
 730   manière rapide, _make-pulses_ est hautement optimisée et n'effectue
 731  que quelques calculs.
 732  Contrairement aux autres, elle n'a pas besoin de virgule flottante pour
 733  ses calculs.
 734  
 735  La dernière fonction, _stepgen.update-freq_, est responsable de 
 736  l'échelle et de quelques autres calculs qui ne doivent être effectués 
 737  que lors d'une commande de changement de fréquence.
 738  
 739  Pour notre exemple nous allons faire tourner _siggen.0.update_ à une
 740  vitesse modérée pour le calcul des valeurs sinus et cosinus.
 741   Immédiatement après avoir lancé siggen.0.update, nous lançons 
 742  _stepgen.0.update_freq_ pour charger les nouvelles valeurs dans le générateur 
 743  d'impulsions. Finalement nous lancerons _stepgen.make_pulses_ aussi vite que 
 744  possible pour des pas plus doux. 
 745  Comme nous n'utilisons pas de retour de position, nous n'avons pas besoin de
 746  lancer _stepgen.capture_position_.
 747  
 748  Nous lançons les fonctions en les ajoutant aux threads. Chaque thread
 749  va à une vitesse précise. Regardons de quels threads nous disposons:
 750  ----
 751  halcmd: show thread 
 752  
 753      Realtime Threads: 
 754           Period  FP     Name               (     Time, Max-Time ) 
 755           996980  YES                  slow (        0,        0 ) 
 756            49849  NO                   fast (        0,        0 ) 
 757  ----
 758  
 759  Les deux _threads_ ont été créés lorsque nous les avons chargés. Le
 760  premier, _slow_ , tourne toutes les millisecondes, il est capable
 761  d'exécuter des fonctions en virgule flottante (FP). Nous l'utilisons pour
 762  _siggen.0.update_ et _stepgen.update_freq_. Le deuxième thread est
 763  _fast_, il tourne toutes les 50 microsecondes, il ne prend pas en
 764  charge les calculs en virgule flottante. Nous l'utilisons pour
 765  _stepgen.make_pulses_. Pour connecter des fonctions au bon thread,
 766  nous utilisons la commande _addf_. Nous spécifions la fonction en 
 767  premier, suivie par le thread:
 768  ----
 769  halcmd: addf siggen.0.update slow 
 770  
 771  halcmd: addf stepgen.update-freq slow 
 772  
 773  halcmd: addf stepgen.make-pulses fast 
 774  ----
 775  
 776  Après avoir lancé ces commandes, nous pouvons exécuter la commande _show
 777  thread_ une nouvelle fois pour voir ce qui ce passe:
 778  ----
 779  halcmd: show thread 
 780  
 781      Realtime Threads: 
 782           Period  FP     Name               (     Time, Max-Time ) 
 783           996980  YES                  slow (        0,        0 ) 
 784                        1 siggen.0.update 
 785                        2 stepgen.update-freq 
 786            49849  NO                   fast (        0,        0 ) 
 787                        1 stepgen.make-pulses 
 788  ----
 789  
 790  Maintenant, chaque thread est suivi par les noms des fonctions, dans
 791  l'ordre dans lequel les fonctions seront exécutées.
 792  
 793  === Réglage des paramètres
 794  
 795  Nous sommes presque prêts à démarrer notre système HAL. Mais il faut
 796  auparavant régler quelques paramètres. Par défaut le composant siggen
 797  génère des signaux qui varient entre +1 et -1. Pour notre exemple,
 798  c'est très bien, nous voulons que la vitesse de la table varie de +1 à
 799  -1 pouce par seconde. Toutefois, l'échelle du générateur d'impulsions
 800  de pas n'est pas bonne. Par défaut, il génère une fréquence de sortie
 801  de 1 pas par seconde avec une capacité de 1000. Il est fort improbable
 802  qu'un pas par seconde nous donne une vitesse de déplacement de la table
 803  d'un pouce par seconde. Supposons que notre vis fasse 5 tours par
 804  pouce, couplée à un moteur pas à pas de 200 pas par tour et une
 805  interface qui fournit 10 micropas par pas. Il faut donc 2000 pas pour
 806  faire un tour de vis et 5 tours pour faire un pouce. Ce qui signifie
 807  que notre montage utilisera 10000 pas par pouce. Nous avons besoin de
 808  multiplier la vitesse d'entrée à l'étape générateur d'impulsions par
 809  10000 pour obtenir la bonne valeur. C'est exactement pour cela
 810  qu'existe le paramètre _stepgen.n.velocity-scale_ . Dans notre cas, les
 811  axes X et Y ont la même échelle et nous pouvons
 812  passer les deux paramètres à 10000:
 813  ----
 814  halcmd: setp stepgen.0.position-scale 10000 
 815  
 816  halcmd: setp stepgen.1.position-scale 10000 
 817  
 818  halcmd: setp stepgen.0.enable 1 
 819  
 820  halcmd: setp stepgen.1.enable 1 
 821  ----
 822  
 823  Cela signifie que, avec la pin _stepgen.0.velocity-cmd_ à 1.000 et le
 824  générateur réglé pour 10000 impulsions par seconde
 825  (10kHz), avec le moteur et la vis décrits précédemment, nos axes auront
 826  une vitesse de déplacement de exactement 1.000 pouce par seconde. Cela
 827  illustre une notion clé du concept de HAL, des éléments comme les
 828  échelles étant au plus bas niveau possible, dans notre exemple le
 829   générateur d'impulsions de pas, le signal interne _X-vel_ est celui
 830  de la vitesse de déplacement de la table en pouces par
 831   seconde. Les autres composants comme _siggen_ ne savent rien du tout
 832  à propos de l'échelle des autres. Si on change
 833  de vis, ou de moteur, il n'y a qu'un seul paramètre à changer,
 834  l'échelle du générateur d'impulsions de pas.
 835  
 836  === Lançons le!
 837  
 838  Nous avons maintenant tout configuré et sommes prêts à démarrer. Tout
 839  comme dans le premier exemple, nous utilisons la commande _start_:
 840  ----
 841  halcmd: start 
 842  ----
 843  
 844  Bien que rien ne semble se produire, à l'intérieur de l'ordinateur les
 845  impulsions de pas sont présentes sur la sortie du générateur, variant
 846  entre 10kHz dans un sens et 10kHz dans l'autre à chaque seconde. Dans
 847  la suite de ce tutoriel, nous allons voir comment convertir ces signaux
 848  internes des moteurs dans le monde réel, mais nous allons d'abord les
 849  examiner pour voir ce qui se passe.
 850  
 851  [[sec:Tutoriel-halscope]]
 852  == Voyons-y de plus près avec halscope
 853  (((Tutoriel halscope)))
 854  
 855  L'exemple précédent génère certains signaux très intéressants. Mais
 856  beaucoup de ce qui se passe est beaucoup trop rapide pour être vu avec
 857  halmeter. Pour examiner de plus près ce qui se passe à l'intérieur de
 858  HAL, il faudrait un oscilloscope. Heureusement HAL en offre un, appelé
 859  _halscope_. Il permet de capturer la valeur des pins, des signaux et des
 860  paramètres en fonction du temps. 
 861  
 862  === Démarrer halscope
 863  
 864  halscope comporte deux parties, une partie en temps réel qui est
 865  chargée comme un module de noyau et une partie utilisateur qui fournit
 866  l'interface graphique et l'affichage. Cependant, vous n'avez pas à vous
 867  inquiéter à ce sujet car l'interface demandera automatiquement que la
 868  partie temps réel soit chargée:
 869  ----
 870  halcmd: loadusr halscope 
 871  ----
 872  
 873  La fenêtre graphique du scope s'ouvre, immédiatement suivie par un
 874  dialogue _Fonction temps réel non liée_ visible sur la figure ci-dessous:
 875  
 876  [[fig:fonction-non-liee]]
 877  .Dialogue _Fonction temps réel non liée_
 878  (((Fonction non liée)))
 879  
 880  image::images/halscope-01_fr.png[alt="Dialogue Fonction temps réel non liée"]
 881  
 882  C'est dans ce dialogue que vous définissez le taux d'échantillonnage
 883  de l'oscilloscope. Pour le moment nous voulons un échantillon par
 884  milliseconde, alors cliquez sur le thread _slow_ et laissez le
 885  multiplicateur à 1. Nous allons aussi passer la longueur
 886  d'enregistrement à 4000 échantillons, de sorte que nous
 887  puissions utiliser jusqu'à 4 canaux simultanément. Quand vous
 888  sélectionnez un thread puis que vous cliquez sur le bouton _OK_, le
 889  dialogue disparaît et la fenêtre initiale du scope s'ouvre, comme ci-dessous.
 890  
 891  [[fig:Fenetre-initiale-halscope]]
 892  .Fenêtre initiale du scope
 893  (((Fenêtre initiale)))
 894  
 895  image::images/halscope-02_fr.png[alt="Fenêtre initiale du scope"]
 896  
 897  === Branchement des sondes du scope
 898  
 899  À ce stade, halscope est prêt à l'emploi. Nous avons déjà choisi le
 900  taux d'échantillonnage et la longueur d'enregistrement, de sorte que la
 901  prochaine étape consiste à décider de ce qu'il faut mesurer. C'est
 902  équivalent à brancher les _sondes virtuelles du scope_ à HAL. halscope
 903  dispose de 16 canaux, mais le nombre de canaux utilisables à un moment
 904  donné dépend de la longueur d'enregistrement, plus il y a de canaux,
 905  plus les enregistrements seront courts, car la mémoire disponible
 906  pour l'enregistrement est fixée à environ 16000 échantillons.
 907  
 908  Les boutons des canaux se situent en dessous de l'écran du scope.
 909  Cliquez le bouton _1_ et vous verrez apparaître le dialogue de
 910  sélection des sources dans lequel vous devrez choisir _la source qui 
 911  devra s'afficher sur le canal 1, comme sur la figure ci-dessous. 
 912  Ce dialogue est très similaire à celui utilisé par halmeter.
 913  
 914  [[fig:Selection-sources-halscope]]
 915  .Dialogue de sélection des sources
 916  (((Sélection de la source)))
 917  
 918  image::images/halscope-03_fr.png[alt="Dialogue de sélection des sources"]
 919  
 920  Nous aimerions bien regarder les signaux que nous avons défini
 921  précédemment, pour cela, cliquons sur l'onglet _Signaux_ et le dialogue
 922  affichera tous les signaux existants dans HAL, dans notre exemple nous
 923  avons seulement les deux signaux X-vel et Y-vel, comme ci-dessous.
 924  
 925  Pour choisir un signal, il suffit de cliquer dessus. Dans notre cas,
 926  nous voulons utiliser le canal 1 pour afficher le signal _X-vel_.
 927  Lorsque l'on clique sur _X-vel_, la fenêtre se ferme et le canal a
 928  été sélectionné.
 929  
 930  [[cap:Select-Signal]]
 931  .Sélection du signal
 932  (((Sélection du signal)))
 933  
 934  image::images/halscope-04_fr.png[alt="Sélection du signal"]
 935  
 936  Le bouton du canal _1_ est pressé, le numéro du canal 1 et le nom 
 937  _X-vel_ apparaissent sous la rangée de boutons. L'affichage indique
 938  toujours le canal sélectionné, vous pouvez avoir beaucoup de canaux sur
 939  l'écran, mais celui qui est actif sera en surbrillance.
 940  
 941  [[cap:halscope]]
 942  .halscope
 943  (((halscope)))
 944  
 945  image::images/halscope-05_fr.png[alt="halscope"]
 946  
 947  Les différents contrôles comme la position verticale et l'amplitude
 948  sont toujours relatifs au canal 1. Pour ajouter un signal sur le canal
 949  2, cliquer sur le bouton _2_. Dans la fenêtre de dialogue, cliquer sur
 950  l'onglet _Signaux_, puis cliquer sur _Y-vel_.
 951  
 952  Nous voulons aussi voir les signaux carrés et triangles produits. Il
 953  n'existe pas de signaux connectés à ces pins, nous utilisons donc
 954  l'onglet _Pins_. Pour le canal _3_, sélectionnez _siggen.0.triangle_ 
 955  et pour le canal _4_, choisissez _siggen.0.square_.
 956  
 957  === Capturer notre première forme d'onde
 958  
 959  Maintenant que nous avons plusieurs sondes branchées sur HAL, nous 
 960  pouvons capturer quelques formes d'ondes. Pour démarrer le scope,
 961  cochez la case _Normal_ du groupe _Mode "Run"_ (en haut à droite).
 962  Puisque nous avons une longueur d'enregistrement de 4000 échantillons
 963  et une acquisition de 1000 échantillons par seconde, il faudra à
 964  halscope environ 2 secondes pour remplir la moitié de son tampon.
 965  Pendant ce temps, une barre de progression juste au-dessus de l'écran
 966  principal affichera le remplissage du tampon. Une fois que le tampon
 967  est à moitié plein, scope attend un déclencheur (Trigger). Puisque nous n'en
 968  avons pas encore configuré, il attendra toujours. Pour déclencher
 969  manuellement, cliquez sur le bouton _Forcer_ du groupe _Trigger_ en
 970  haut à droite. Vous devriez voir le reste de la zone tampon se remplir,
 971  puis l'écran afficher les ondes capturées. Le résultat ressemble à la
 972  figure ci-dessous.
 973  
 974  [[fig:Capture-onde-halscope]]
 975  .Capture d'ondes
 976  (((Capture d'onde)))
 977  
 978  image::images/halscope-06_fr.png[alt="Capture d'ondes"]
 979  
 980  === Ajustement vertical
 981  
 982  Les traces sont assez difficiles à distinguer car toutes les quatre
 983  sont les unes sur les autres. Pour résoudre ce problème, nous utilisons
 984  les curseurs du groupe _Vertical_ situé à droite de l'écran. 
 985  Ces deux curseurs agissent sur le canal actuellement sélectionné. En ajustant 
 986  le _Gain_, notez qu'il couvre une large échelle (contrairement aux 
 987  oscilloscopes réels), celle-ci permet d'afficher des signaux très petits 
 988  (pico unités) à très grands (Tera - unités). Le curseur _Pos_ déplace la 
 989  trace affichée de haut en bas sur toute la hauteur de l'écran. Pour de plus 
 990  grands ajustements le bouton _Offset_ peut être utilisé.
 991  
 992  [[cap:Ajustement-vertical-halscope]]
 993  .Ajustement vertical
 994  (((Ajustement vertical)))
 995  
 996  image::images/halscope-07_fr.png[alt="Ajustement vertical"]
 997  
 998  Le grand bouton _Canal sélectionné_ en bas, indique que le canal 1 est
 999  actuellement le canal sélectionné et qu'il correspond au signal
1000  _X-vel_. Essayez de cliquer sur les autres canaux pour mettre
1001  leurs traces en évidence et pouvoir les déplacer avec le curseur _Pos_.
1002  
1003  === Déclenchement (Triggering)
1004  
1005  L'utilisation du bouton _Forcer_ n'est parfois pas satisfaisante pour
1006  déclencher le scope. Pour régler un déclenchement réel,
1007  cliquer sur le bouton _Source_ situé en bas à droite. Il ouvre alors le
1008  dialogue _Trigger Source_, qui est simplement la liste de toutes les
1009  sondes actuellement branchées, voir la figure ci-dessous.
1010  Sélectionner la sonde à utiliser pour déclencher en cliquant dessus.
1011  Pour notre exemple nous utilisons 3 canaux, essayons l'onde triangle.
1012  Quand le dialogue ce referme, après le choix, le bouton affiche _Source Canal n_
1013  où n est le numéro du canal venant d'être choisi comme déclencheur.
1014  
1015  [[fig:halscope-demo-5]]
1016  .Dialogue des sources de déclenchement
1017  (((Dialogue des sources de déclenchement)))
1018  
1019  image::images/halscope-08_fr.png[alt="Dialogue des sources de déclenchement"]
1020  
1021  Après avoir défini la source de déclenchement, il est possible
1022  d'ajuster le niveau de déclenchement avec les curseurs du groupe 
1023  _Trigger_ le long du bord droit. Le niveau peut être modifié à partir
1024  du haut vers le bas de l'écran, il est affiché sous les curseurs. La
1025  position est l'emplacement du point de déclenchement dans
1026  l'enregistrement complet. Avec le curseur tout en bas, le point de
1027  déclenchement est à la fin de l'enregistrement et halscope affiche ce
1028  qui s'est passé avant le déclenchement. Lorsque le curseur est
1029  tout en haut, le point de déclenchement est au début de
1030  l'enregistrement, l'affichage représente ce qui s'est passé après le
1031  déclenchement. Le point de déclenchement est visible comme une petite
1032  ligne verticale dans la barre de progression située juste au dessus de
1033  l'écran. La polarité du signal de déclenchement peut être inversée en
1034  cliquant sur le bouton _Montant_ situé juste sous l'affichage du niveau de
1035  déclenchement, il deviendra alors _descendant_. Notez que la modification 
1036  de la position de déclenchement arrête le scope une fois la position ajustée, 
1037  vous relancez le scope en cliquant sur le bouton _Normal_ du groupe 
1038  _Mode "Run"_. 
1039  
1040  Maintenant que nous avons réglé la position verticale et le
1041  déclenchement, l'écran doit ressembler à la figure ci-dessous.
1042  
1043  [[fig:halscope-demo-6]]
1044  .Formes d'ondes avec déclenchement
1045  (((Formes d'onde)))
1046  
1047  image::images/halscope-09_fr.png[alt="Formes d'ondes avec déclenchement"]
1048  
1049  === Ajustement horizontal
1050  
1051  Pour examiner de près une partie d'une forme d'onde, vous pouvez
1052  utiliser le _zoom_ au dessus de l'écran pour étendre la trace
1053  horizontalement et le curseur de position horizontale, _Pos_ du 
1054  groupe _Horizontal_, pour déterminer quelle partie de l'onde zoomée est visible. 
1055  Parfois simplement élargir l'onde n'est pas suffisant et il faut augmenter 
1056  la fréquence d'échantillonnage. Par exemple, nous aimerions voir les impulsions 
1057  de pas qui sont générés dans notre exemple. Mais les impulsions de pas font 
1058  seulement 50 us de long, l'échantillonnage à 1kHz n'est pas assez rapide. 
1059  Pour changer le taux d'échantillonnage, cliquer sur le bouton qui affiche le 
1060  nombre d'échantillons pour avoir le dialogue _Sélectionner un taux 
1061  d'échantillonnage_, figure ci-dessous. 
1062  Pour notre exemple, nous cliquerons sur le thread _fast_, qui fournira un 
1063  échantillonnage à environ 20kHz. Maintenant au lieu d'afficher environ 4 
1064  secondes de données, un enregistrement sera de 4000 échantillons à 20kHz, soit
1065  environ 0.20 seconde.
1066  
1067  [[fig:halscope-demo-7]]
1068  .Dialogue de choix d'échantillonnage
1069  (((Choix d'échantillonnage)))
1070  
1071  image::images/halscope-10_fr.png[alt="Dialogue de choix d'échantillonnage"]
1072  
1073  === Plus de canaux
1074  
1075  Maintenant regardons les impulsions de pas. halscope dispose de 16
1076  canaux, mais pour cet exemple, nous en utilisons seulement 4 à la fois.
1077  Avant de sélectionner tout autre canal, nous avons besoin d'en éteindre
1078  certains. Cliquer sur le canal _2_, puis sur le bouton _Canal Off_ sous le
1079  groupe _vertical_. Ensuite, cliquez sur le canal 3, le mettre Off et
1080  faire de même pour le canal 4. Même si les circuits sont éteints, ils
1081  sont encore en mémoire et restent connectés, en fait, nous
1082  continuerons a utiliser le canal 3 comme source de déclenchement. Pour
1083  ajouter de nouveaux canaux, sélectionner le canal _5_, choisir la pin 
1084  _stepgen.0.dir_, puis le canal _6_ et sélectionner _stepgen.0.step_. 
1085  Ensuite, cliquer sur _mode Normal_ pour lancer le scope, ajustez le
1086  zoom horizontal à 10 ms par division. Vous devriez voir les impulsions de
1087  pas ralentir à la vitesse commandée approcher de zéro, puis la
1088  pin de direction changer d'état et les impulsions de pas se resserrer de 
1089  nouveau en même temps que la vitesse augmente. Vous aurez peut être besoin 
1090  d'ajuster le gain sur le canal 1 afin de mieux voir l'action de la vitesse sur 
1091  l'évolution des impulsions de pas. Le résultat devrait être proche de celui de 
1092  la figure ci-dessous. Ce type de mesure est délicate car il y a un énorme écart 
1093  d'échelle entre la fréquence des pas et l'action sur la vitesse, d'ou la courbe 
1094  X-vel assez plate et les impulsions de pas très resserrées.
1095  
1096  [[fig:halscope-demo-8]]
1097  .Observer les impulsions de pas
1098  (((Observer les impulsions)))
1099  
1100  image::images/halscope-11_fr.png[alt="Observer les impulsions de pas"]
1101  
1102  === Plus d'échantillons
1103  
1104  Si vous souhaitez enregistrer plus d'échantillons à la fois,
1105  redémarrez le temps réel et chargez halscope avec un argument numérique
1106  qui indique le nombre d'échantillons que vous voulez capturer, comme:
1107  ----
1108  halcmd: loadusr halscope 80000 
1109  ----
1110  
1111  Si le composant _scope_rt_ n'est pas déjà chargé, halscope va le
1112  charger et lui demander un total de 80000 échantillons, de sorte 
1113  que lorsque l'échantillonnage se fera sur 4 canaux à la fois, 
1114  il y aura 20000 échantillons par canal. (Si _scope_rt_ est déjà 
1115  chargé, l'argument numérique passé à halscope sera sans effet)
1116  
1117