Dommage !

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

Modérateur : Francois

Ferois
Messages : 32
Enregistré le : jeu. 16 mars 2017 10:08

Dommage !

Messagepar Ferois » ven. 10 nov. 2017 16: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
Messages : 21
Enregistré le : mer. 11 oct. 2017 10:23

Re: Dommage !

Messagepar jelopo » ven. 10 nov. 2017 21: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 : 126
Enregistré le : lun. 29 sept. 2014 13:58

Re: Dommage !

Messagepar nexen » sam. 11 nov. 2017 10: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 : 32
Enregistré le : jeu. 16 mars 2017 10:08

Re: Dommage !

Messagepar Ferois » sam. 11 nov. 2017 17: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


Retourner vers « Le GPIO »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité