Raccorder un bouton poussoir sur Raspberry PI

Introduction
Savoir lire l'état d'une entrée du port GPIO du Raspberry PI est une action fondamentale en hacking électronique.
La détection de la pression d'un bouton permet de re-initialiser un programme, de passer à l'étape suivante, jouer du son, etc.
Voici un exemple qui vous propose de lire l'état d'un bouton (actuateur) placé sur le broche 24 du GPIO.
Note: Cet exemple aurait pu également utiliser la broche 23 ou 25.
En fonction de l'état du bouton, le programme allumera la led Rouge ou Verte.
Un Pi Cobbler d'AdaFruit (disponible chez MC Hobby) est utiliser pour faciliter le montage.

Raccordement du bouton
Un bouton se raccorde comme suit sur un Raspberry Pi

3.3v --> Résistance pull-up de 10k --> GPIO --> Bouton --> GND

Source: AdaFruit.com
Pour tester ce montage, nous allons utiliser des LED (avec Résistances de 330 Ohms) et un bouton poussoir utilisant une résistance de 10KOhms.
Montage d'un bouton poussoir sur Raspberry PI en utilisant un Pi Cobbler
Code Python
#!/usr/bin/env python
# -*- coding: latin-1 -*-

import RPi.GPIO as GPIO, time

GPIO.setmode(GPIO.BCM)
GREEN_LED = 18
RED_LED = 23
BUTTON1 = 24

GPIO.setup(GREEN_LED, GPIO.OUT)
GPIO.setup(RED_LED, GPIO.OUT)
GPIO.setup(BUTTON1, GPIO.IN)

while True:
        # Si le bouton est pressé, la broche GPIO est raccordée
        #   à la masse. Le GPIO est donc à LOW (bas).
        # Bouton pressé -> Input = LOW = False 
        if( GPIO.input( BUTTON1 ) == False ):
         GPIO.output(GREEN_LED, True)
         GPIO.output(RED_LED, False)
 else:
         GPIO.output(GREEN_LED, False)
         GPIO.output(RED_LED, True)

Pour savoir comment télécharger et rendre ce code exécutable sur votre Pi; nous vous proposons la lecture de notre tutoriel PiButton (nettement plus complet)... ainsi que notre autre article "Copier/Coller super facile pour copier du code python vers un Raspberry super facilement".

Déparasitage logiciel du bouton sur Raspberry PI
Le contact d'un bouton poussoir momentané (actuateur) n'est pas franc.
Il s'accompagne généralement d'une série de "contacts parasites" avant le contact franc et définitif.
Exemple d'effet transitoire...
parasitage des boutons poussoirs

Voici un exemple issus d'un article dédié au déparasitage des boutons pour Arduino (voir cet article sur notre blog).
Cette période de "contact parasite" est appelée période transitoire.
Comme un Raspberry est terriblement rapide, il pourrait détecter plusieurs fois les signaux haut et bas durant la période transitoire.
Dans le cadre de ce projet, cela pourrait se manifester de différentes façon:
  • La Led rouge semble clignoter légèrement avant de s'éteindre ou l'allumer.
  • La Led verte ne semble pas s'allumer d'un coup et clignote un peu.
  • Les deux leds "semblent" allumées en même temps pendant une très courte période.
Bouton poussoir avec déparasitage logiciel
#!/usr/bin/env python
# -*- coding: latin-1 -*-

import RPi.GPIO as GPIO, time

GPIO.setmode(GPIO.BCM)
GREEN_LED = 18
RED_LED = 23

BUTTON1 = 24
# Dernier état connu du bouton
# Par defaut: le bouton n'est pas considéré comme activé
BUTTON1_STATE = False

GPIO.setup(GREEN_LED, GPIO.OUT)
GPIO.setup(RED_LED, GPIO.OUT)
GPIO.setup(BUTTON1, GPIO.IN)

while True:
        # -- Lecture avec déparasitage logiciel
        # Si le bouton est pressé, la broche GPIO est raccordée
        #   à la masse. Le GPIO est donc à LOW (bas).
        #   Bouton pressé -> Input = LOW = False         
        gpioRead1 = GPIO.input( BUTTON1 )
        state1    = not(gpioRead1)
        # SI changer d'etat ALORS refaire lecture de déparasitage
        if( state1 != BUTTON1_STATE ):
                # - attendre 10ms
                time.sleep( 10 / 1000 )
                # faire une 2ieme lecture
                gpioRead2 = GPIO.input( BUTTON1 )
                state2 = not(gpioRead2)
                # SI les deux lectures concordent
                # ALORS memoriser le nouvel etat du bouton
                if( state1 == state2 ):
                        BUTTON1_STATE = state2


        # -- Programme principal --
        # SI le bouton est pressé
        # ALORS allumer la LED verte  
        if( BUTTON1_STATE == True ):
                GPIO.output(GREEN_LED, False)
                GPIO.output(RED_LED, True)
        else:
                GPIO.output(GREEN_LED, True)
                GPIO.output(RED_LED, False)

Ressource
Cet article est issus de notre tutoriel PiButton (voir aussi nos autres Tutoriels Raspberry PI

Soutenez les travaux de MC Hobby
Nos documentations et traductions sont libres d'accès et aussi détaillées que possible.
Cependant documenter et traduire est un travail long et fastidieux.
Soutenez nos efforts de traduction en achetant vos produits chez MC Hobby.
  
Ou Acheter
Vous trouverez tous les articles nécessaires chez MC Hobby.