LOCODUINO

Aide
Forum de discussion
Dépôt GIT Locoduino
Flux RSS

jeudi 23 mars 2023

69 visiteurs en ce moment

Les interrupteurs

Ou comment basculer d’un avis à l’autre…

. Par : Thierry

DIFFICULTÉ :

Un interrupteur (’switch’ dans la langue du brexit) est un dispositif matériel destiné à changer un état permanent parmi deux choix possibles.

Des interrupteurs, vous en utilisez tous les jours : allumer la lumière, mettre son clignotant (enfin ceux qui les utilisent…), allumer son aspirateur (si, si, le truc bruyant qui vous réveille le samedi matin !). C’est un élément extrêmement courant de notre vie quotidienne.
Il ne faut pas confondre ces bascules matérielles avec des dispositifs logiciels qui remplissent la même fonction mais basés sur de simples poussoirs, comme les touches de votre télévision, de votre téléphone, de votre clim… Vous allez me dire, ’Oui, mais quand j’appuie sur le bouton On/Off de la télé, ça s’allume et ça s’éteint comme la lumière de la salle à manger !’. C’est vrai, mais c’est juste que le poussoir en question se sert d’une impulsion temporaire pour changer l’état courant et passer à l’autre état. Si la télé était éteinte, on va l’allumer, et inversement. Contrairement au bouton de la salle à manger qui va maintenir une connexion électrique dans une position, et la couper dans l’autre.
Les interrupteurs sont incroyablement variés dans leurs formes, leurs modes de fonctionnement, leurs prix !

PNG - 38.3 ko
En haut, des boutons ’bruts’ pour des montages électroniques. En bas, plutôt du joli pour un montage définitif.

La forme et le prix, c’est vous qui voyez, mais le fonctionnement doit être conforme à ce que le programme, et donc vous, en attendez. Les grandes caractéristiques à prendre en compte sont : la puissance électrique transmissible, la capacité à rester sur l’une de ses positions, le nombre de connexions commutées… Une terminologie a été adoptée comme un standard de fait pour le monde l’électronique et décrit les différents modèles :

Nom En clair Description Symbole
SPST Single pole, Single throw Dans une position le contact est établi entre une entrée et une sortie, dans l’autre position, le contact est rompu.
SPDT Single pole, Double throw Le contact est établi alternativement entre une entrée et deux sorties.
DPST Double pole, Single throw On a là deux entrées, connectées à deux sorties ou non connectées.
DPDT Double pole, Double throw Deux entrées sont connectées alternativement à deux sorties chacune. Chaque entrée et ses sorties sont électriquement indépendantes de l’autre entrée et ses sorties.
nPmT Multi pole, Multi throw ’n’ Entrées sont connectées à ’m’ sorties. Ici un 2P6T

D’autres configurations existent avec par exemple un point central stable qui permet de ne rien connecter dit ’Center Off’, ou plus de deux positions stables comme le gros bouton d’une machine à laver le linge ou de la sélection de source d’un vieil ampli HI-FI.

PNG - 30.6 ko
En haut, un ’Central Off’. En bas deux sélecteurs à multiples positions

Réagir à ces interrupteurs consiste à identifier le moment où un contact est activé ou relâché. Noter que tout comme un bouton poussoir, et comme tout dispositif mécanique de commutation, des rebonds sont présents au moment du changement d’état. Et il convient de les gérer dans le croquis Arduino.

Prenons un interrupteur SPST connecté à la broche 3 :

  1. #define INTER 3
  2.  
  3. void setup()
  4. {
  5. pinMode(INTER, INPUT);
  6. }
  7.  
  8. void loop()
  9. {
  10. if (digitalRead(INTER) == LOW) // Si la broche est LOW, faire :
  11. {instructions off}
  12. else // sinon, faire :
  13. {instructions on}
  14. }

C’est le codage minimal. Il va nous exposer à plusieurs problèmes : les rebonds ne sont pas gérés, et la mémorisation de l’état courant n’est pas globale, ce qui fait qu’à chaque loop on va refaire les instructions on ou off… Ce qui peut être sans importance sur l’allumage d’une DEL par exemple, ou au contraire problématique dans un autre contexte. Voyons la version correcte, utilisant la bibliothèque Bounce2 recommandée par… LOCODUINO (et Arduino.cc, mais c’est accessoire…) !

  1. #include <Bounce2.h>
  2.  
  3. #define INTER 3
  4.  
  5. // Créer (instancier) un objet Bounce
  6. Bounce inter;
  7.  
  8. void setup()
  9. {
  10. // Configure la broche avec la résistance de tirage
  11. pinMode(INTER, INPUT_PULLUP);
  12. // Attache l'objet 'inter' à la même broche
  13. inter.attach(INTER);
  14. inter.interval(5); // temps de latence entre deux mesures d'état
  15. }
  16.  
  17. // Variable qui va contenir l'état courant du bouton
  18. // On commence avec -1 qui est un état inconnu...
  19. int courant = -1;
  20.  
  21. void loop()
  22. {
  23. // Mise à jour de l'état de inter : bouton pressé ou non ?
  24. inter.update();
  25.  
  26. // Récupération de l'état du bouton
  27. int valeur = inter.read();
  28.  
  29. // Si la valeur n'a pas changé depuis la dernière fois, ne rien faire.
  30. if (valeur == courant)
  31. return;
  32.  
  33. // Agir en fonction de l'état du bouton
  34. if ( valeur == LOW)
  35. { Instructions On }
  36. else
  37. { Instructions Off }
  38.  
  39. courant = valeur;
  40. }

Dans cette version, grâce à Bounce on va bien éliminer les rebonds, et grâce à une petite gestion de valeur courante, on ne fera les choses qu’une seule fois… La connexion d’une broche de sortie d’un interrupteur répond exactement aux mêmes exigences que pour un bouton poussoir, en terme de présence ou non de résistance et de OUTPUT_PULLUP (plus d’explications ici).
Pour finir voyons le code pour un interrupteur à une entrée et deux sorties (SPDT) :

  1. #include <Bounce2.h>
  2.  
  3. // Une broche par position
  4. #define INTER_A 3
  5. #define INTER_B 4
  6.  
  7. // Liste des états possibles de l'interrupteur. Les valeurs utilisées doivent juste être différentes entre elles.
  8. // J'aurais d'ailleurs pu ré-utiliser INTER_A et INTER_B...
  9. #define INTER_ETAT_INDEFINI -1
  10. #define INTER_ETAT_A 10
  11. #define INTER_ETAT_B 20
  12.  
  13. // Créer (instancier) un objet Bounce pour chaque broche
  14. Bounce interA;
  15. Bounce interB;
  16.  
  17. void setup()
  18. {
  19. // Configure les broches avec la résistance de tirage
  20. pinMode(INTER_A, INPUT_PULLUP);
  21. pinMode(INTER_B, INPUT_PULLUP);
  22.  
  23. // Attache l'objet 'interA' à sa broche
  24. interA.attach(INTER_A);
  25. interA.interval(5); // temps de latence entre deux mesures d'état
  26.  
  27. // Attache l'objet 'interB' à sa broche
  28. interB.attach(INTER_B);
  29. interB.interval(5); // temps de latence entre deux mesures d'état
  30. }
  31.  
  32. // Variable qui va contenir l'état courant du bouton
  33. // On commence avec -1 qui est un état inconnu...
  34. int courant = INTER_ETAT_INDEFINI;
  35.  
  36. void loop()
  37. {
  38. // Mise à jour de l'état des interA et B : bouton pressé ou non ?
  39. interA.update();
  40. interB.update();
  41.  
  42. // Récupération de l'état des broches
  43. int valeurA = interA.read();
  44. int valeurB = interB.read();
  45.  
  46. // Si la valeur n'a pas changé depuis la dernière fois, ne rien faire.
  47. if (valeurA == true && courant == INTER_ETAT_A)
  48. return;
  49. if (valeurB == true && courant == INTER_ETAT_B)
  50. return;
  51.  
  52. if (valeurA == true)
  53. courant = INTER_ETAT_A;
  54. if (valeurB == true)
  55. courant = INTER_ETAT_B;
  56.  
  57. // Agir en fonction de l'état du bouton
  58. if ( courant == INTER_ETAT_A)
  59. { Instructions etat A }
  60. else
  61. { Instructions etat B }
  62. }

Il y a moyen de faire plus concis avec des tableaux, surtout si on veut augmenter le nombre de positions, mais au moins on comprend le principe. En fait chaque broche est gérée comme un bouton simple indépendant, alors que la variable ’courant’, elle, contient l’état général du switch.

Faites bien attention lorsque vous achetez ces interrupteurs, leurs caractéristiques électriques doivent être respectées (pas de 220V sur un switch pour montage électronique !), et il est très facile de se tromper en passant une commande sur le mode de fonctionnement : point milieu ou pas, nombre de positions stables, nombre de connexions commutées sur chaque position…

8 Messages

Réagissez à « Les interrupteurs »

Qui êtes-vous ?
Votre message

Pour créer des paragraphes, laissez simplement des lignes vides.

Lien hypertexte

(Si votre message se réfère à un article publié sur le Web, ou à une page fournissant plus d’informations, vous pouvez indiquer ci-après le titre de la page et son adresse.)

Rubrique « Matériel »

Fonctionnement et pilotage d’une DEL

Qu’est ce qu’une carte Arduino ?

Amplifier le signal de sortie d’un ARDUINO avec un ULN 2803

Résistances, kézako ?

Les cartes Teensy

Relais électromagnétique

Les diodes classiques

Détecteurs à ultrasons

La carte Arduino Uno

Bouton poussoir

Les différents types de mouvements d’un servomoteur

Les encodeurs en quadrature

Les écrans LCD alphanumériques

Des bus de communication pour l’Arduino

Les interrupteurs

Le microcontrôleur ATtiny45 (1)

Le microcontrôleur ATtiny45 (2)

Le microcontrôleur ATtiny45 (3)

Le microcontrôleur ATtiny45 (4)

Le microcontrôleur ATtiny45 (5)

Le microcontrôleur ATtiny45 (6)

Le microcontrôleur ATtiny45 (7)

Le microcontrôleur ATtiny45 (8)

Le microcontrôleur ATtiny45 (9)

Le microcontrôleur ATtiny45 (10)

Signaux lumineux et Arduino

Les shields de prototypage et de connexion

Commande de moteur à courant continu

Choisir sa carte Arduino

Salade de broches

Une station DCC complète, polyvalente et économique avec JMRI.

Écran couleur tactile Kuman

Capteurs à effet Hall

Programmation des ATtiny Digispark

Ma première centrale DCC

Ma première manette DCC (1)

Une station DCC minimale avec boutons de commande et écran Oled

Ma première manette DCC (2)

Le Raspberry Pi Pico

Signalisation et sonorisation du va-et-vient pour deux trains

Configurateur de CV sur base de la station DCC minimale

Les derniers articles

Configurateur de CV sur base de la station DCC minimale


msport

Signalisation et sonorisation du va-et-vient pour deux trains


msport

Une station DCC minimale avec boutons de commande et écran Oled


Dominique, msport

Le Raspberry Pi Pico


Jean-Luc

Ma première manette DCC (2)


msport

Ma première manette DCC (1)


msport

Ma première centrale DCC


msport

Programmation des ATtiny Digispark


Dominique, msport

Salade de broches


Thierry

Capteurs à effet Hall


Christian

Les articles les plus lus

Commande de moteur à courant continu

Une station DCC complète, polyvalente et économique avec JMRI.

Les diodes classiques

Programmation des ATtiny Digispark

Les différents types de mouvements d’un servomoteur

Capteurs à effet Hall

Ma première centrale DCC

Le microcontrôleur ATtiny45 (8)

Les cartes Teensy

La carte Arduino Uno