comportement incompréhensible GPIO.wait_for_edge()

Python est le langage de prédilection du Raspberry Pi

Modérateurs : Francois, Manfraid

Korhm
Raspinaute
Messages : 199
Enregistré le : ven. 19 sept. 2014 08:13
Localisation : Val de Marne

comportement incompréhensible GPIO.wait_for_edge()

Messagepar Korhm » sam. 9 sept. 2017 18:51

Bonjour à tous,

j'ai mis un place un bouton poussoir (un interrupteur en sailli) relié d'un côté sur le PIN 24, et de l'autre sur le GND.
Le but est de lancer des actions quand on appuie dessus.

Pour cela, j'utilise la fonction GPIO.wait_for_edge(24, GPIO.RISING) qui est censé attendre un changement d'état bas vers haut, et continue l'exécution du script. J'ai mis le tout dans une boucle infinine.
Cependant, si je laisse le bouton appuyer trop longtemps (plus de quelques millisecondes), au moment de relâcher, mon script se re-déroule quand même. Et c'est là que je ne comprend pas. Si le relâche le bouton, je suis censé être en GPIO.FALLING, non ? Du coup il est censé toujours attendre, non ?

Pour resumer:
Il détecte le RISING, exécute les actions, se remet en attente, et semble redétecter un RISING alors qu'il s'agit d'un FALLING.

Ci-dessous mon script.

Code : Tout sélectionner

#!/usr/bin/python3.4

import RPi.GPIO as GPIO  # Gestion des GPIO
import requests
import json
from time import sleep   # Gestion du temps

PIN_BTN = 24

GPIO.setmode(GPIO.BCM)
GPIO.setup(PIN_BTN, GPIO.IN, pull_up_down=GPIO.PUD_UP)


print ("Started")
while(1):
   try: 
      print("Waiting for rising edge on port 24")

      channel = GPIO.wait_for_edge(PIN_BTN, GPIO.RISING) 

      #Tout plein de belles choses qui s'exécute une deuxième fois quand le bouton est appuyé trop longtemps....

      
 
   except KeyboardInterrupt:
      print("\nInterruption par clavier.")

GPIO.cleanup()

destroyedlolo
Raspinaute
Messages : 944
Enregistré le : dim. 10 mai 2015 18:44
Localisation : Dans la campagne à côté d'Annecy
Contact :

Re: comportement incompréhensible GPIO.wait_for_edge()

Messagepar destroyedlolo » sam. 9 sept. 2017 21:22

Je n'ai pas regardé de pret ton code ... mais je pense simplement que fait fasse à un classique phénomène de rebond.
Google m'a amené là : http://home.roboticlab.eu/fr/examples/digi/switch_debounce
  • BananaPI : Gentoo, disque SATA de 2 To
  • Domotique : 1-wire, TéléInfo, Tablette passée sous Gentoo.
  • Multimedia par DNLA
  • Et pleins d'idées ... et bien sûr, pas assez de temps.
Sur mon site un descriptif de ma domotique 100% fait maison.

Korhm
Raspinaute
Messages : 199
Enregistré le : ven. 19 sept. 2014 08:13
Localisation : Val de Marne

Re: comportement incompréhensible GPIO.wait_for_edge()

Messagepar Korhm » lun. 11 sept. 2017 10:26

Bonjour et merci pour le lien, ça explique clairement le boucing (je n'avais pas compris comme ça au début....).

Je vais voir si je peux mettre une tempo du genre : n'effectuer les actions que si après x milliseconds le gpio est toujours à l'état HIGH.
Ce devrait éliminer les problème de rebonds mécaniques sans affecter le reste des mon script.


Retourner vers « Python »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 2 invités