halmodule_fr.txt
1 :lang: fr 2 :toc: 3 4 = Créer des composants de l'espace utilisateur 5 6 == Utilisation de base en Python 7 8 Un composant de l'espace utilisateur commence par créer ses pins et 9 ses paramètres, puis il entre dans une boucle dans laquelle il va 10 positionner périodiquement toutes ses sorties en fonction de ses 11 entrées. Le composant suivant, un passe-tout, copie la valeur vue sur 12 ses pins d'entrée (_passe_tout.in_) vers ses pins de sortie 13 (_passe_tout.out_) approximativement une fois par seconde. 14 ---- 15 #!/usr/bin/env python 16 import hal, time 17 h = hal.component("passe_tout") 18 h.newpin("in", hal.HAL_FLOAT, hal.HAL_IN) 19 h.newpin("out", hal.HAL_FLOAT, hal.HAL_OUT) 20 h.ready() 21 try: 22 while 1: 23 time.sleep(1) 24 h['out'] = h['in'] 25 except KeyboardInterrupt: 26 raise SystemExit 27 ---- 28 29 Copier le listing précédent dans un fichier nommé _passe_tout_, le 30 rendre exécutable par un _chmod +x_ et le placer dans son _$PATH_. 31 On peut alors l'essayer en faisant: 32 33 34 +*halrun*+ 35 36 +halcmd: *loadusr passe_tout*+ 37 38 +halcmd: *show pin*+ 39 40 Component Pins: 41 Owner Type Dir Value Name 42 03 float IN 0 passe_tout.in 43 03 float OUT 0 passe_tout.out 44 45 +halcmd: *setp passe_tout.in 3.14*+ 46 47 +halcmd: *show pin*+ 48 49 Component Pins: 50 Owner Type Dir Value Name 51 03 float IN 3.14 passe_tout.in 52 03 float OUT 3.14 passe_tout.out 53 54 55 == Composants de l'espace utilisateur et délais 56 57 Si vous tapez rapidement _show pin_, vous pourrez voir que 58 _passe_tout.out_ conserve un moment son ancienne valeur de 0. Ceci 59 est dû à l'appel de la fonction _time.sleep(1)_, qui fait que les pins 60 de sortie changent d'état, au plus, une fois par seconde. 61 Parce-que ce composant appartient à l'espace utilisateur, 62 ce délai peut apparaître plus long, par exemple si la mémoire utilisée 63 par le composant pass_tout est échangée avec le disque dur, 64 le délai peut être allongé jusqu'au rafraîchissement de la mémoire. 65 66 Ces composants de l'espace utilisateur conviennent parfaitement pour 67 des éléments tels que des panneaux de contrôle pour lesquels des délais 68 de l'ordre de quelques millisecondes sont imperceptibles. Ils ne 69 conviennent pas, en revanche, pour envoyer des impulsions de pas vers 70 une carte de pilotage de périphériques pour lesquelles les délais 71 doivent rester de l'ordre de quelques microsecondes, dans tous les 72 cas. 73 74 == Créer les pins et les paramètres 75 76 +h = hal.component("passe_tout")+ 77 78 Le composant lui-même est créé par l'appel du constructeur 79 _hal.component_. Les arguments sont le nom du composant HAL et 80 optionnellement, le préfixe utilisé pour les noms de pin et de paramètre. 81 Si le préfixe n'est pas spécifié, le nom du composant est utilisé. 82 83 +h.newpin("in", hal.HAL_FLOAT, hal.HAL_IN)+ 84 85 Puis les pins sont créées par appels des méthodes sur l'objet 86 composant. Les arguments sont: pin nom suffixe, type de pin et 87 direction de la pin. Pour les paramètres, les arguments sont: paramètre 88 nom suffixe, type de paramètre et direction du paramètre. 89 90 .Noms des options de HAL 91 92 [width="95%", options="header"] 93 |======================================== 94 |*Types de Pin et Paramètre:* | HAL_BIT | HAL_FLOAT | HAL_S32 | HAL_U32 95 |*Directions des pins:* | HAL_IN | HAL_OUT | HAL_IO | 96 |*Directions des paramètres:* | HAL_RO | HAL_RW | | 97 |======================================== 98 99 Le nom complet d'une pin ou d'un paramètre est formé en joignant le 100 préfixe avec le suffixe par un *.*, comme dans l'exemple où la pin 101 créée est appelée _passe_tout.in_. 102 103 +h.ready()+ 104 105 Une fois toutes les pins et les paramètres créés, la méthode _.ready()_ 106 est appelée. 107 108 === Changer le préfixe 109 110 Le préfixe peut être changé en appelant la méthode _.setprefix()_. Le 111 préfixe courant peut être retrouvé en appelant la méthode 112 _.getprefix()_. 113 114 == Lire et écrire les pins et les paramètres 115 116 Pour les pins et les paramètres qui sont aussi des identifiants 117 Python, la valeur est accessible ou ajustable en utilisant la syntaxe 118 des attributs suivante: 119 120 +h.out = h.in+ 121 122 Pour les pins et les paramètres qui sont aussi des identifiants 123 Python, la valeur est accessible ou ajustable en utilisant la syntaxe 124 de sous-script suivante: 125 126 +h['out'] = h['in']+ 127 128 === Pilotage des pins de sortie (HAL_OUT) 129 130 Périodiquement, habituellement dans le temps de réponse de l'horloge, 131 toutes les pins HAL_OUT doivent être _pilotées_ en leur assignant une 132 nouvelle valeur. Ceci doit être fait que la valeur soit différente ou 133 non de la valeur précédemment assignée. Quand la pin est connectée au 134 signal, l'ancienne valeur de sortie n'est pas copiée vers le signal, la 135 valeur correcte n'apparaîtra donc sur le signal qu'une fois que le 136 composant lui aura assigné une nouvelle valeur. 137 138 === Pilotage des pins bidirectionnelles (HAL_IO) 139 140 La règle mentionnée ci-dessus ne s'applique pas aux pins 141 bidirectionnelles. Au lieux de cela, une pin bidirectionnelle doit 142 seulement être pilotée par le composant et quand le composant souhaite 143 changer sa valeur. Par exemple, dans l'interface codeur, le composant 144 codeur positionne seulement la pin _index-enable_ à _FALSE_ quand une 145 impulsion d'index est vue et que l'ancienne valeur est _TRUE_, mais ne 146 la positionne jamais à _TRUE_. Positionner de manière répétitive la 147 pin à _FALSE_ pourrait faire qu'un autre composant connecté agisse 148 comme si une nouvelle impulsion d'index avait été vue. 149 150 == Quitter 151 152 Une requête _halcmd unload_ pour le composant est délivrée comme une 153 exception _KeyboardInterrupt_ . Quand une requête de déchargement 154 arrive, le processus doit quitter 155 dans un court laps de temps ou appeler la méthode _.exit()_ sur le 156 composant si un travail substantiel, comme la lecture ou 157 l'écriture de fichiers, doit être fourni pour terminer le processus 158 d'arrêt. 159 160 == Idées de projets 161 162 - Créer un panneau de contrôle extérieur avec boutons poussoirs, 163 interrupteurs et voyants. Connecter le tout à un microcontrôleur et 164 raccorder le microcontrôleur à un PC en utilisant une liaison série. 165 Python est vraiment capable d'interfacer une liaison série grâce à son 166 module http://pyserial.sourceforge.net/[pyserial] (Paquet 167 _python-serial_, dans les dépôts universe d'Ubuntu) 168 - Relier un module d'affichage à LCD 169 http://lcdproc.omnipotent.net/[LCDProc] et l'utiliser pour afficher les 170 informations de votre choix (Paquet _lcdproc_, dans les dépôts universe 171 d'Ubuntu) 172 - Créer un panneau de contrôle virtuel utilisant n'importe quelle 173 librairie d'interface graphique supportée par Python (gtk, qt, 174 wxwindows, etc) 175 176