comportement incompréhensible GPIO.wait_for_edge()

Python est le langage de prédilection du Raspberry Pi

Modérateurs : Francois, Manfraid

Répondre
Korhm
Raspinaute
Messages : 232
Enregistré le : ven. 19 sept. 2014 08:13
Localisation : Toulouse

comportement incompréhensible GPIO.wait_for_edge()

Message par 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 : 1587
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()

Message par 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/d ... h_debounce
  • BananaPI : Gentoo, disque SATA de 2 To
  • Domotique : 1-wire, TéléInfo, Tablette passée sous Gentoo, ESP8266
  • Multimedia par DNLA
  • Et pleins d'idées ... et bien sûr, pas assez de temps.
Un descriptif de ma domotique 100% fait maison.

Korhm
Raspinaute
Messages : 232
Enregistré le : ven. 19 sept. 2014 08:13
Localisation : Toulouse

Re: comportement incompréhensible GPIO.wait_for_edge()

Message par 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.

Répondre

Retourner vers « Python »