Les ports GPIO en entrée
publication: 29 décembre 2023 / mis à jour 30 décembre 2023
Dans le précédent article nous avons abordé la gestion des ports GPIO en sortie pour commander une LED. Ces mêmes ports GPIO peuvent aussi être gérés en entrée pour tester des signaux. Ici, nous allons simplement tester l'état d'un interrupteur.
L'interrupteur
J'ai choisi ce type de contacteur, qui est un contacteur de fin de course, à deux états:

- au repos, le contact est fermé entre Com et NC
- en action, le contact est fermé entre Com et NO

Ce contacteur peut être facilement utilisé sur une plaque d'essai. Il dispose de deux trous permettant un montage facile. Le contacteur est très sensible. Il se déclenche sur une faible pression. Le relâchement de la pression ramène le contacteur à son état initial.
Gestion par GPIO
Le câblage du contacteur est réalisé de cette manière:
- pin 36 3V3 (OUT) <--> entrée Com contacteur
- pin 10 GP7 <--> sortie NO contacteur
Pour commencer, on définit le mot gpio_get
:
\ Get state of a single specified GPIO : gpio_get ( gpio -- state ) PIN_MASK GPIO_IN @ and ;
Le mot gpio_get
récupère l'état du contacteur:
- si state = 0, le contacteur n'est pas actif;<:li>
- si state <> 0, le contacteur est actif. La valeur empilée correspond au masque binaire du GPIO activé;
Voici comment est initialisé le contacteur:
7 constant SWITCH \ switch to GPIO 07 : init-switch ( -- ) SWITCH gpio_init ;
On peut maintenant tester le contacteur. N'activez pas le contacteur:
init-switch
7 gpio_get . \ display: 0
Activez le contacteur:
7 gpio_get . \ display: 128
En binaire, on aurait eu la valeur 10000000
. Le bit à 1 est bien le septème bit.
Pour rappel, les bits sont numérotés à partir de 0. Le bit b7 est donc ici à 1.
Cette position 7 est en concordance avec le GPIO 07 sur lequel est connecté notre
contacteur.
Exercice pratique avec notre contacteur
Notre cas pratique consiste simplemnet à allumer ou éteindre la LED qui est montée sur la carte RP pico en lien avec le GPIO 25. Un appui sur le contacteur allume la LED. Si on relâche le contacteur, cette LED reste allumée. Un nouvel appui éteint cette même LED.
On commence par redéfinir l'initialisation des deux ports GPIO qui vont nous servir:
7 constant SWITCH \ switch to GPIO 07 25 constant ONBOARD_LED \ led to GPIO 25 : gpios.init ( -- ) SWITCH gpio_init ONBOARD_LED gpio_init ONBOARD_LED GPIO-OUT gpio_set_dir ;
On définit ensuite le mot led.toggle
qui alterne l'état de la LED rattachée au GPIO 25:
\ toggle led : led.toggle ( gpio -- ) PIN_MASK GPIO_OUT_XOR ! ;
Le mot switch.wait
attend 20 millisecondes. Cette temporisation est nécessaire pour
éviter des rebonds de contact. Puis on bascule l'état de la LED rattachée au GPIO 25. Enfin, la boucle
se poursuit tant que le contact est actif. Le relâchement du contacteur provoque la sortie de boucle:
: switch.wait ( -- ) 20 ms \ anti-bounce delay ONBOARD_LED led.toggle begin 100 ms SWITCH gpio_get 0= until ;
Cette dernière définition initialise les ports GPIO.
Puis on exécute une boucle qui ne sera inrompue que par appui sur une touche du clavier.
Dans la boucle, on attend que le contacteur soit actif. Si c'est le cas, on exécute le
mot switch.wait
:
: main-loop ( -- )
gpios.init
begin
SWITCH gpio_get if
switch.wait
then
key? until
;
Les appuis successifs sur le contacteur alternent l'état de la LED rattachée au GPIO 25 exactement comme le ferait un télérupteur domestique pour commander un éclairage depuis plusieurs points distincts.
Legal: site web personnel sans commerce / personal site without seling