Dommage !

Le connecteur GPIO du Raspberry Pi, comment l'utiliser sur les Mode A, B et B+

Modérateur : Francois

Répondre
Ferois
Messages : 39
Enregistré le : jeu. 16 mars 2017 09:08

Dommage !

Message par Ferois » ven. 10 nov. 2017 15:06

Boonjour,

J'ai un programme qui comprend :

Code : Tout sélectionner

control_B=38
GPIO.setmode(GPIO.BOARD)
GPIO.setup(control_B,GPIO.IN,pull_up_down=GPIO.PUD_UP)
if GPIO.add_event_detect(control_B,GPIO.BOTH):
    if GPIO.input(control_B):
        print ("contacts ouverts')
    else:
        time.sleep(100)
        print ("contacts fermes')
la réponse de python :
if GPIO.add_event_detect(control_B,GPIO.BOTH):
RuntimeError: Conflicting edge detection already enabled for this GPIO channel

J'ai l'impression que le programme considère que le GPIO est toujours à 1 du fait de la résistance pull-up, et qu'il juge impossible l’existence d'un front.

Alors j'ai modifié la première ligne du programme pour une résistance pull-up extérieure :

Code : Tout sélectionner

GPIO.setup(control_B,GPIO.IN)
et j'ai la même réponse!

Pourquoi ? Et comment contourner l'obstacle ?

jelopo
Raspinaute
Messages : 307
Enregistré le : mer. 11 oct. 2017 10:23

Re: Dommage !

Message par jelopo » ven. 10 nov. 2017 20:33

Bonjour,

Je crois qu'il dit que "GPIO.add_event_detect(control_B,GPIO.BOTH)" à déjà été fait. En fait à chaque boucle de if il le refait.
Il me semble que cette commande n'est pas une mesure d'état mais un début de détection.
Je pense qu'il faut qu'elle soit initialisée qu'une fois dans le script donc avant le if, ensuite pour la mesure il faut un "GPIO.event_dectect"

Si certains on l'habitude de manipuler les GPIO sous Python, merci de nous venir en aide.

A+

nexen
Raspinaute
Messages : 175
Enregistré le : lun. 29 sept. 2014 13:58

Re: Dommage !

Message par nexen » sam. 11 nov. 2017 09:02

bonjour,

Le add_event est à usage unique ... donc dans ta boucle il tente de rajouter à chaque fois un event


voici mon code pour tester un bouton et actionner un relay de mon coté

Code : Tout sélectionner

import RPi.GPIO as GPIO                 #bibliothèque RPi.GPIO
Button_Red = 5
Button_Green = 6
RelayPin = 20
RLed = 19
GLed = 16
print 'Debut ...' 
GPIO.setmode(GPIO.BCM)                  #utilisation des numéros de ports du
                                        #processeur
GPIO.setup(Button_Red, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(Button_Green, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(RelayPin, GPIO.OUT)
GPIO.setup(RLed, GPIO.OUT) 
GPIO.setup(GLed, GPIO.OUT) 
while True:
	time.sleep(0.5) # test tempo lecture fichier xml
	input_state_START = GPIO.input(Button_Green)
	input_state_STOP = GPIO.input(Button_Red)
	Relayinput = GPIO.input(RelayPin)
	RLedInput  = GPIO.input(RLed)
	GLedInput  = GPIO.input(GLed)

if (input_state_START == False and Relayinput == 0 ):
		print('Button_Green Pressed' + str(input_state_START))
		GPIO.output(RelayPin, GPIO.HIGH)
		GPIO.output(GLed, GPIO.HIGH)      #sortie 16 high

if (input_state_STOP == False and Relayinput == 1 )
		print('Button_RED Pressed' + str(input_state_START))
		GPIO.output(RelayPin, GPIO.LOW)
		GPIO.output(RLed, GPIO.HIGH)      #sortie 19 high
		

C'est un exemple mais dans ton cas :

Code : Tout sélectionner

control_B=38
GPIO.setmode(GPIO.BOARD)
GPIO.setup(control_B,GPIO.IN,pull_up_down=GPIO.PUD_UP)
while True :
    if GPIO.input(control_B):
        print ("contacts ouverts')
    else:
        time.sleep(100)
        print ("contacts fermes')
ou aprés lecture du Add_event : on ajoute une FONCTION sur un événement du bouton ;)

Code : Tout sélectionner



def buttonPressed():
    print ("contacts")
    
    
control_B=38
GPIO.setmode(GPIO.BOARD)
GPIO.setup(control_B,GPIO.IN,pull_up_down=GPIO.PUD_UP)
GPIO.add_event_detect(control_B, GPIO.FALLING, callback=lambda x: buttonPressed(), bouncetime=2000)

PS : tu as des erreurs entre ' et " sur tes prints ;)

Ferois
Messages : 39
Enregistré le : jeu. 16 mars 2017 09:08

Re: Dommage !

Message par Ferois » sam. 11 nov. 2017 16:06

Merci les Amis

Je comprends mieux cette commande add_event_detect.
Tout changement d'état de la broche 38 durant la boucle while entraine une interruption qui appelle un sous programme.
A l'issue de ce sous programme la boucle continue après le point d'interruption

Code : Tout sélectionner

control_B=38
GPIO.setmode(GPIO.BOARD)
GPIO.setup(control_B,GPIO.IN,pull_up_down=GPIO.PUD_UP)

def position_control_B()
    time.sleep(5)
    if GPIO.input(control_B):
        print ('contacts ouverts')
    else:
        print ('contacts fermes')

GPIO.add_event_detect(control_B,GPIO.BOTH, bouncetime=2000, callback=lambda x: position_control_B())

while True:
    mon programme
nexen a écrit :tu as des erreurs entre ' et " sur tes prints
Tu as l'oeil :D

Répondre

Retourner vers « Le GPIO »