ModelleisenbahN

Accueil > La technologie > Arduino > Manœuvre des aiguilles avec des servo-moteurs > Sélection d’un servomoteur pour le réglage des butées

Manœuvre des aiguilles en analogique avec des servo-moteurs

Sélection d’un servomoteur pour le réglage des butées

publié par Jean-Luc, le samedi 23 novembre 2013

Tags aiguille - arduino - servo

Le réglage des butées est un point important. En effet, chaque servo moteur va avoir un neutre un peu différent de ses congénères. Il en va de même pour les positions extrêmes. De plus, chaque installation d’aiguille est un peu différente des autres.

Il est donc essentiel de pouvoir, servomoteur par servomoteur, régler les deux positions extrêmes.

Le matériel

Afin de sélectionner l’un des servomoteurs pour régler, au moyen de deux poussoirs, sa position extrême actuelle nous avons besoin d’un dispositif permettant de donner un numéro de servomoteur. Le dispositif le plus adapté est un codeur rotatif à 10 positions comme celui-ci.

JPEG - 101.7 ko
http://akizukidenshi.com/img/goods/...

Ces codeurs rotatifs ont 6 broches. 2 d’entre-elles sont reliées entre elles et communes, les 4 autres codent en binaire la position du bouton (4 bits).

Comme 5 entrées analogiques sont disponibles et qu’il est aussi possible de les utiliser comme entrée numérique, on ne va pas finasser et simplement utiliser une entrée par bit [1]. 1 entrée analogique, A1, restera disponible pour les poussoirs de réglage.

Je n’ai pas de codeur rotatif en stock, à la place je vais utiliser un DIP-switch à 4 interrupteurs sur lequel le numéro du servo sera codé en binaire et qui sera raccordé exactement de la même façon que le codeur. Par convention, on décide que la valeur 0 (position 0 du codeur) est le mode d’exploitation. Aucun servo n’est sélectionné par le codeur. Les valeurs de 1 à 8 permettent de sélectionner le servo à régler. La valeur 9 correspond aussi au mode exploitation où aucun servo n’est sélectionné.

Le codeur est donc raccordé de la manière suivante aux entrées A2 à A5.

PNG - 46.5 ko
Câblage du codeur
Les interrupteurs c3, c2, c1 et c0 représentent chacun un chiffre binaire. Par convention, un 0 correspond à l’interrupteur ouvert et un 1 à l’interrupteur fermé. Si tous les interrupteurs sont ouverts, la valeur 0 est codée, si c0 est fermé et les autres ouverts la valeur 1 est codée. Si c2 et c1 sont fermés, les autres ouverts la valeur 6 est codée.

Les entrées dispose de résistances de tirage à 5V (on dit pull-up) interne que l’on peut activer par programme. Quand les interrupteurs sont ouverts, c’est à dire à 0 par convention, la valeur présente sur les entrées est 5V et non 0V ; Il faut en tenir compte pour construire le logiciel.

Le logiciel

Pour lire la valeur numérique codée et la stocker dans une variable entière servoARegler, il faut donc lire les entrées A2, A3, A4 et A5 en numérique, en déduire une valeur de bit et positionner le bit correspondant dans servoARegler. C’est l’occasion de voir une nouvelle spécificité du langage C, la manipulation des bits dans une variable.

Le langage C permet de faire des opérations logiques bit à bit. Les opérateurs permettant de telles opérations sont : le et bit à bit, noté &, le ou bit à bit, noté |, le ou exclusif bit à bit, noté ^ et le non (inversion de bit) bit à bit noté ~. Il existe aussi deux opérateurs de décalage : décalage logique vers la gauche d’un certain nombre de bits, noté << et le décalage vers la droite d’un certain nombre de bits, noté >>. Dans les deux cas, les bits laissés libres par le décalage sont à 0 [2], les bits qui sont expulsés sont perdus.

Ainsi, si l’on veut construire un byte dont tous les bits sont à 0 sauf les bits 0, 2 et 4 qui sont à 1 :

PNG - 3.3 ko

On peut écrire : 1 << 4 | 1 << 2 | 1

C’est à dire :

PNG - 19 ko

Ce qui est bien le résultat escompté.

On peut se poser la question de savoir que renvoit la lecture d’une entrée en numérique par un digitalRead(...). Eh bien elle vaut soit HIGH, soit LOW. Ces deux constantes sont en fait des entiers qui valent 1 pour HIGH et 0 pour LOW. On peut donc utiliser la valeur renvoyée par un digitalRead(...) dans un calcul. C’est ce que nous allons faire pour calculer la valeur du codeur.

En examinant le schéma de connexion, on voit que la condition permettant de construire le bit correspondant à une des entrées est l’inverse de la valeur renvoyée par digitalRead(...) parce que la position ouverte de l’interrupteur correspond à +5V. Il faut donc inverser cette valeur en utilisant le non logique : !. Cet opérateur retourne un 1 si son opérande est un 0 et un 0 si son opérande est différent de 0.

Donc la valeur du codeur peut être construite par l’expression suivante :

  1. servoARegler =
  2. (! digitalRead(A2)) << 3 |
  3. (! digitalRead(A3)) << 2 |
  4. (! digitalRead(A4)) << 1 |
  5. (! digitalRead(A5));

Télécharger

Pour programmer proprement, on va loger ceci dans une fonction, lireReglage() et en profiter pour recadrer la valeur brute. Si la valeur brute est plus grande que 8, elle est remise à 0 et la valeur brute - 1 est retournée. De cette manière -1 signifie « rien à régler » et une valeur positive désigne le numéro du servo à régler.

  1. /*
  2.  * Lecture du codeur de réglage.
  3.  * Retourne -1 si aucun servo n'est sélectionné et
  4.  * le numéro du servo de 0 à 7 si un servo est sélectionné
  5.  */
  6. int lireReglage()
  7. {
  8. int servoARegler =
  9. (! digitalRead(A2)) << 3 |
  10. (! digitalRead(A3)) << 2 |
  11. (! digitalRead(A4)) << 1 |
  12. (! digitalRead(A5));
  13.  
  14. if (servoARegler > 8) servoARegler = 0;
  15.  
  16. return servoARegler - 1;
  17. }

Télécharger

Comme c’est l’état du codeur qui nous intéresse et non les événements de changement d’état, il n’est pas nécessaire de se préoccuper des transitoires et autres rebonds.

Il va aussi falloir activer les résistances interne de pull-up. Faisons ceci dans une fonction qui sera appelée à partir de setup().

  1. void initialiseCodeur()
  2. {
  3. /* Active le pullup des entrées A2, A3, A4 et A5 */
  4. digitalWrite(A2,HIGH);
  5. digitalWrite(A3,HIGH);
  6. digitalWrite(A4,HIGH);
  7. digitalWrite(A5,HIGH);
  8. }

Télécharger

Notes

[1On rappelle que les entrées/sorties logiques, en haut de l’Arduino, encore disponibles sont réservées pour les LED témoin.

[2Seulement si la variable est non signée. Si la variable est signée, le décalage à droite remplit les bits laissés libres avec le bit de signe.

Répondre à cet article

Les thèmes

Archives

Informations

ModelleisenbahN | publié sous licence Creative Commons by-nc-nd 2.0 fr | généré dynamiquement par SPIP & Blog'n Glop