Page 1 of 1

[resolu] Filtrer les rebonds d'un bouton

Posted: Sat Jun 01, 2013 5:44 pm
by eavel
Bonjour,

Pour détecter l'appuie sur un bouton connecté au GPIO j'utilise un évenement en python dont voici le code :

Code: Select all

GPIO.setup(23,GPIO.IN, pull_up_down=GPIO.PUD_UP)

def my_callback(channel):
        global busy
        global sequence
        var=1
        if busy==0:
                busy=1
                print "sequence"

                if sequence==3:
                        sequence=1
                else :
                        sequence=sequence+1
                while var<=5 :
                        time.sleep(0.5)
                        var=var+1
                busy=0

GPIO.add_event_detect(23, GPIO.RISING, callback=my_callback)
J'ai déjà effectué un premier filtre grâce à la variable globale busy. Elle permet d'indiquer qu'il y a déjà un appuie qui est en cours de traitement mais j'ai toujours un rebond qui arrive à passer.

si quelqu'un à une idée...
Merci ;)

Re: Filtrer les rebonds d'un bouton

Posted: Sat Jun 01, 2013 10:43 pm
by mickyway
Pourquoi ne pas utiliser un condensateur pour filtrer directement ton entrée GPIO ? Ca serait plus efficace à mon avis

Re: Filtrer les rebonds d'un bouton

Posted: Sun Jun 02, 2013 9:55 am
by eavel
Pourquoi pas mais je débute en électronique, je ne saurais pas quoi choisir...

Re: Filtrer les rebonds d'un bouton

Posted: Sun Jun 02, 2013 3:18 pm
by lhoic
Bonjour,

Pour un condensateur, un simple 100nF (mais en fait la valeur n'est pas critique) devrait convenir. Il faut le mettre en parallèle de ton bouton.
Il absorbera et restituera alors de l'énergie lors des changements d'états rapide qui se créaient lors de l'appui sur le bouton.

Si ce n'est pas déjà le cas , une résistance pourra peut-être être nécessaire pour y connecter le bouton avant la tension direct.
A titre informatif, on se retrouvera alors avec un filtre passe-bas RC dont la fréquence de coupure est de f = 1 / 2*Pi*R*C.

[Résolu] Filtrer les rebonds d'un bouton

Posted: Mon Jun 03, 2013 12:12 pm
by eavel
Bonjour,

Merci pour vos réponses,
J'ai trouvé sur la page http://raspi.tv/tag/interrupts-in-python-with-rpi-gpio, le moyen de le faire par logiciel. Il faut avoir la dernière version de la librairie : RPi.GPIO.
Lors de la déclaration de l’événement il faut ajouter :

Code: Select all

bouncetime=500
où 500 est exprimé en millisecondes.

ex :

Code: Select all

GPIO.add_event_detect(channel, GPIO.RISING, callback=my_callback, bouncetime=500)