Bonjour, après les moteurs continus, on va parler des moteurs pas-à-pas et des encodeurs. Il n'y a pas beaucoup de choses à dire mais ça nous permettra de réviser notre expérience en programmation. On va parler des types de moteurs pas-à-pas, insister surtout sur les moteurs de type Lavet et parler un petit peu des encodeurs. Les moteurs pas-à-pas que vous connaissez sont, en général, de type 4 phases et les deux bobines à l'intérieur du moteur vont déplacer un aimant ou attirer les pôles métalliques de façon à ce que quand vous générez les phases sur le moteur, vous avez une rotation dans un sens direct ou inverse. Une astuce qui permet d'affiner un petit peu la position, c'est de faire des demi-pas, de bouger non-simultanément, dans le fond, les deux signaux. Alors si vous avez besoin de moteurs pas-à-pas de ce type-là, il faut les interfaces de puissance, il faut très souvent des tensions supplémentaires donc je ne vais pas m'en occuper, je ne suis pas un vendeur de schiltz et vous trouverez des librairies associées à cette commande de moteur. Je m'intéresse plutôt à ces moteurs pas-à-pas miniatures que l'on trouve aussi dans les montres, qui sont les moteurs Lavet, qui ont une construction simplifiée et dans cet exemple-là, ben vous voyez que vous avez un petit aimant ici au centre qui va être positionné par deux bobines pour, dans ce cas-là, prendre la position verticale mais si maintenant vous coupez le courant ici, vous aurez uniquement cette bobine qui va attirer le moteur à 60 degrés et en 6 phases, vous aurez un tour complet. Alors la construction est assez jolie, vous les trouvez dans les voitures, dans le tableau de bord des voitures, ils existent depuis plus de 10 ans donc ça devrait être assez facile à en récupérer. Alors c'est l'aspect programmation qui nous intéresse. Il nous faut quatre fils que l'on va brancher sur le port C en activant ces quatres bits ici en sortie, les bits 0, 3 out. Et maintenant, il nous faut définir une table, la table d'avance, qui va définir dans le fond les euh, six combinaisons de quatre bits qui permettent de faire avancer le moteur. Alors, il suffit de passer un tout petit peu de temps à lire la documentation et convertir dans des mots de 4 bits, codés en hexadécimal, pour avoir la succession des pas pour que ça avance. Si vous intervertissez ces valeurs, et bien ça va reculer. Donc si vous voulez avancer et reculer, vous avez le choix entre passer entre deux tables mais attention à la synchronisation. Vous préférerez vous déplacer dans un sens ou dans l'autre avec le pointeur de temps. Alors le programme est trivial, si je veux tester, je fais une boucle for, j'avance toutes les 2000 microsecondes euh, les moteurs pas-à-pas, c'est intéressant à étudier, ils ont parfois des vitesses où l'impulsion qui le fait tourner le fait osciller et il a de la peine, en fait, à se positionner exactement sur la position, sur la bonne position avant qu'il y ait l'impulsion suivante. L'autre point d'aujourd'hui, c'est les encodeurs. Les encodeurs de souris vont générer un signal déphasé, ici ces deux diodes ne sont pas diamétralement opposées, il y a un petit décallage qui fait que la séquence reçue est décallée, on dit de 90 degrés, puisque ceci correspond, pas nécessairement à un tour complet mais à une avance d'une dent sur le capteur, sur le disque optique. Dans tous les appareils maintenant, le potentiomètre a été remplacé par un encodeur qui est en fait une suite de balais qui vont générer des signaux déphasés mais attention puisque c'est des contacts mécaniques, vous allez avoir des rebonds de contact. Voilà ce que j'ai pu observer sur un oscilloscope. Euh, là c'est un petit peu bizarre, j'ai de la peine à l'interpréter mais c'est bien ce que verra le processeur et il faut le filtrer soit par des instructions qui vont décider que cette impulsion est trop courte, soit par un condensateur qui ne filtre pas trop. Là, apparemment, il y a quelque chose de, de bizarre qui a été mal filtré. Donc euh, la programmation, même si elle est facile, l'implémentation complète n'est pas toujours évidente, il faut avoir les moyens d'observation de ce qu'il se passe exactement au niveau électrique. Alors du point de vue programmation, ben typiquement on a une machine d'état. On est dans l'état 0 avec les deux entrées qui valent 0. On passe dans l'état 1 avec 0 qui est à 1, donc l'entrée in0 est à 1 a fait passer dans cet état où on va rester jusqu'à ce qu'on ait le in1 qui s'active et cetera. Et si maintenant, on change de sens ici, et bien, dans la position 3, on va voir que c'est in1 qui s'est activé. Et dans cette position 3, on devrait passer à l'état 1, il y a peut-être une incohérence entre ces deux dessins mais vous voyez l'esprit. Si je tourne dans l'autre sens maintenant, je vais parcourir une fois dans un sens, une fois dans l'autre. Alors ceci, par programmation, peut se faire assez facilement, il faut naturellement définir sur quel bit sont cablés les deux bits 0 et 1. Il faut naturellement donner les directions de ces bits au niveau des registres de directions. Et maintenant, je continue dans un instant, l'algorithme principal qui gère cette machine d'état se fait avec un switch next et vous avez un certain nombre de cas et là, on s'est arrangé de donner des noms à ces cas qui correspondent justement aux états qui ont été définis ici. Il y a le cas 0, et 0 il faut mettre une lettre devant. Si on est en in0, on va passer dans l'état 1. Donc, on doit incrémenter le compteur puisqu'on tourne dans ce sens, on va incrémenter de 1. On incrémente la position et puis on dit next, l'état prochain, ça ça fait partie hein, de la structure du switch variable next, si cette variable next est égale à e1, on verra comment ça a été déclaré, et bien, on a fait tout ce qu'il fallait faire, on quitte et puis quand on reviendra dans ce switch next, et bien on va voir que ce n'est plus le cas 0, 1, on est dans le cas 1 et dans ce cas 1, et bien si on voit que le signal est en fait en quelque sorte, on est revenu en arrière dans la rotation, on va se trouver dans in0, enfin on va se retrouver dans e0 et on va décrémenter le compteur de nouveau. Donc on va parcourir ces différents cas et la vitesse d'accès est relativement rapide donc on peut trouver des algorithmes plus rapides naturellement. Alors les cas e0, e1, e2, e3 ont été déclarés par cette fonction qui s'appelle enum. Enum, dans le fond, dit simplement : moi, je sais que c'est 0, 1, 2, 3 mais l'utilisateur préfère dire e0, e1, e2, e3. C'est un peu comme le define, une correspondance. Et puis on va, ici, et il y a une variable next qui se déclare en même temps et dont la valeur initiale est e0. Donc ça, ça fait partie du switch. Maintenant, il nous faut dire que notre compteur est à 0 et nous pouvons partir dans la boucle. On va afficher le compteur, ici j'ai décidé sur le port C. Est-ce que je peux l'envoyer sur un serial print? Le serial print va prendre un certain temps donc je risque de perdre des pas et de croire que mon programme est faux. Donc il faudra tourner très, très lentement si je veux afficher les pas, ici, au niveau du serial print. Ici, j'ai décidé qu'en une milliseconde j'avais avantage à échantillonner ces entrées. Je peux les échantillonner plus souvent mais ça va utiliser de la puissance du processeur. Bien, alors voilà, on a vu un petit peu qu'il y avait des moteurs 4 phases, qu'il y a des moteurs Lavet avec 6 phases, que leur programmation est triviale et qu'il y a des encodeurs aussi qui s'utilisent de plus en plus fréquemment et qui sont faciles à programmer avec une machine d'état, l'instruction switch case.