Les ports GPIO en entrée

publication: 29 décembre 2023 / mis à jour 30 décembre 2023

Read this page in english

 


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:

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:

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:

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