groskanel
Posts: 17
Joined: Wed Feb 12, 2014 6:15 pm

bouton en python

Fri Aug 22, 2014 1:05 pm

bonjour

j'aimerais pouvoir commander mpc via des boutons connecté sur les port gpio du raspberry

Code: Select all

#!/usr/bin/env python2.7
# script by Alex Eames http://RasPi.tv
from time import sleep
import signal
import sys
import threading
import os
import RPi.GPIO as GPIO
import subprocess
GPIO.setmode(GPIO.BCM)
GPIO.setup(23, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(24, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
def next(self):
     print 'pp'
     os.system("mpc next")
#raw_input("Press Enter when ready\n>")
GPIO.add_event_detect(24, GPIO.FALLING, callback=next, bouncetime=200)
try:
    GPIO.wait_for_edge(23, GPIO.FALLING)
    print "Falling edge detected. Here endeth the second lesson."
except KeyboardInterrupt:
    GPIO.cleanup()       # clean up GPIO on CTRL+C exit
GPIO.cleanup()           # clean up GPIO on normal exit 
ca marche a peut pres.. mais dés que l'on clique pour faire next, du coup le programme se ferme, y'a t'il une solution pour eviter cela ?

Merci

jelopo
Posts: 1604
Joined: Wed Oct 17, 2012 7:53 pm

Re: bouton en python

Fri Aug 22, 2014 7:57 pm

Bonjour,

Je suis pas trop sur de mon coup mais tentes d'ajouter
GPIO.add_event_detect(24, GPIO.FALLING, callback=next, bouncetime=200)
sous et au même niveau que
os.system("mpc next")
ainsi après l'appui d'une touche il repart en attente de détection d’événement ?

a voir ...

A+

groskanel
Posts: 17
Joined: Wed Feb 12, 2014 6:15 pm

Re: bouton en python

Fri Aug 22, 2014 9:17 pm

bonsoir

j'ai donc essayer ceci :

Code: Select all

#!/usr/bin/env python2.7
# script by Alex Eames http://RasPi.tv
from time import sleep
import signal
import sys
import threading
import os
import RPi.GPIO as GPIO
import subprocess
GPIO.setmode(GPIO.BCM)
GPIO.setup(23, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(24, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
def my_callback(self):
     print 'pp'
     os.system("mpc toggle")
GPIO.add_event_detect(24, GPIO.FALLING, callback=my_callback, bouncetime=200)
#raw_input("Press Enter when ready\n>")
GPIO.add_event_detect(24, GPIO.FALLING, callback=my_callback, bouncetime=200)
try:
    GPIO.wait_for_edge(23, GPIO.FALLING)
    print "Falling edge detected. Here endeth the second lesson."
except KeyboardInterrupt:
    GPIO.cleanup()       # clean up GPIO on CTRL+C exit
GPIO.cleanup()           # clean up GPIO on normal exit 


qui me retourne ca :

Code: Select all

Traceback (most recent call last):
  File "/etc/init.d/bouton.py", line 18, in <module>
    GPIO.add_event_detect(24, GPIO.FALLING, callback=my_callback, bouncetime=200)
RuntimeError: Edge detection already enabled for this GPIO channel

jelopo
Posts: 1604
Joined: Wed Oct 17, 2012 7:53 pm

Re: bouton en python

Fri Aug 22, 2014 10:58 pm

Re
sous et au même niveau que
Il faut respecter l'indentation, pour que cela fasse partie de la def my_callback

A+

groskanel
Posts: 17
Joined: Wed Feb 12, 2014 6:15 pm

Re: bouton en python

Sat Aug 23, 2014 5:43 am

bon.. j'essaie mais je n'arrive a rien..
faut dire que j'ai decouvert python hier...

Code: Select all

def my_callback(self):
     print 'pp'
     os.system("mpc toggle")
     GPIO.add_event_detect(24, GPIO.FALLING, callback=my_callback, bouncetime=200)

	 
GPIO.add_event_detect(24, GPIO.FALLING, callback=my_callback, bouncetime=200)
try:
mais toujours la même erreur :

Code: Select all

IndentationError: unexpected indent

jelopo
Posts: 1604
Joined: Wed Oct 17, 2012 7:53 pm

Re: bouton en python

Sat Aug 23, 2014 8:42 am

Bonjour,

Un des grands avantages des programmes Python c'est leur visibilité grâce à l'indentation.
Si c'est plus facile à lire quand on a un peu d'expérience, c'est souvent galère quand on débute.

Un seul conseil, toujours utiliser le même nombre d'espaces pour l'indentation et jamais des tabulations, ou bien toujours des tabulations et jamais des espaces.
Quand il y a un mixe des 2 dans la même partie de code, ça paraît normal à l'affichage dans l'éditeur, mais ça génère l'erreur ce-dessus :evil:

Bonne correction.

A+

groskanel
Posts: 17
Joined: Wed Feb 12, 2014 6:15 pm

Re: bouton en python

Sat Aug 23, 2014 9:04 am

ha forcément faut le savoir..

bon je regarde ca et je te dis ce que ca donne :)


merci !

groskanel
Posts: 17
Joined: Wed Feb 12, 2014 6:15 pm

Re: bouton en python

Sun Aug 24, 2014 6:30 am

bonjour

bon alors, plus d'erreur d'indentation.. par contre

Code: Select all

File "/etc/init.d/bouton.py", line 16, in next
    GPIO.add_event_detect(24, GPIO.FALLING, callback=next, bouncetime=200)
RuntimeError: Edge detection already enabled for this GPIO channel
Traceback (most recent call last):
  File "/etc/init.d/bouton.py", line 19, in <module>
    GPIO.wait_for_edge(23, GPIO.FALLING)
RuntimeError: Error #5 waiting for edge
si je comprends bien, il dis qu'il y a deja une action definie définie pour le bouton..?

jelopo
Posts: 1604
Joined: Wed Oct 17, 2012 7:53 pm

Re: bouton en python

Sun Aug 24, 2014 10:32 pm

Bonjour,

en fait quand je disais
"Je suis pas trop sur de mon coup''
, j'avais raison, c'est pas bon :oops: .
Il faut enlever cette ligne foireuse et j'espère que tu auras plus de chance en utilisant un "while True:" dans la linge au dessus de try:
ça devrait donner ça :

Code: Select all

#!/usr/bin/env python2.7
import os
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setup(23, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(24, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)

def next(self):
     os.system("mpc next")
GPIO.add_event_detect(24, GPIO.FALLING, callback=next, bouncetime=200)
while true:
    try:
        GPIO.wait_for_edge(23, GPIO.FALLING)
        print "Falling edge detected. Here endeth the second lesson."
    except KeyboardInterrupt:
        GPIO.cleanup()       # clean up GPIO on CTRL+C exit
    GPIO.cleanup()           # clean up GPIO on normal exit 
A+

groskanel
Posts: 17
Joined: Wed Feb 12, 2014 6:15 pm

Re: bouton en python

Mon Aug 25, 2014 3:21 am

hé bah non :)

Code: Select all

 File "/etc/init.d/bouton.py", line 13, in <module>
    GPIO.wait_for_edge(23, GPIO.FALLING)
RuntimeError: Error #5 waiting for edge
avec ce code :

Code: Select all

#!/usr/bin/env python2.7
import os
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setup(23, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(24, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)

def next(self):
     os.system("mpc next")
GPIO.add_event_detect(24, GPIO.FALLING, callback=next, bouncetime=200)
while True:
    try:
        GPIO.wait_for_edge(23, GPIO.FALLING)
        print "Falling edge detected. Here endeth the second lesson."
    except KeyboardInterrupt:
        GPIO.cleanup()       # clean up GPIO on CTRL+C exit
    GPIO.cleanup()           # clean up GPIO on normal exit 

jelopo
Posts: 1604
Joined: Wed Oct 17, 2012 7:53 pm

Re: bouton en python

Mon Aug 25, 2014 4:58 pm

Bonjour,

Je pige pas l'erreur. J'ai juste repris le code initial avec une boucle while pour tourner en rond !
Tu n'avais pas cette erreur avec le programme initial ?
Si non, peux tu remettre le programme initial qui fonctionnait une fois, puis ajouter la ligne while au dessus du try avec l'indentation qui va bien.

A+

groskanel
Posts: 17
Joined: Wed Feb 12, 2014 6:15 pm

Re: bouton en python

Wed Aug 27, 2014 8:40 am

bon..
ca me donne ca :

Code: Select all

Traceback (most recent call last):
  File "/etc/init.d/bouton.py", line 13, in <module>
    GPIO.wait_for_edge(23, GPIO.FALLING)
RuntimeError: Error #5 waiting for edge
avec ce code :

Code: Select all

#!/usr/bin/env python2.7
# script by Alex Eames http://RasPi.tv
from time import sleep
import signal
import sys
import threading
import os
import RPi.GPIO as GPIO
import subprocess
GPIO.setmode(GPIO.BCM)
GPIO.setup(23, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(24, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
def next(self):
	print 'pp'
	os.system("mpc next")
    #raw_input("Press Enter when ready\n>")
GPIO.add_event_detect(24, GPIO.FALLING, callback=next, bouncetime=200)
while True:
try:
	GPIO.wait_for_edge(23, GPIO.FALLING)
	print "Falling edge detected. Here endeth the second lesson."
except KeyboardInterrupt:
GPIO.cleanup()       # clean up GPIO on CTRL+C exit
GPIO.cleanup()           # clean up GPIO on normal exit 
et la je pige rien..

JeromeV
Posts: 55
Joined: Wed Aug 07, 2013 5:32 pm

Re: bouton en python

Wed Aug 27, 2014 10:18 am

Avec une indentation correcte, ce code a l'air de fonctionner.

groskanel
Posts: 17
Joined: Wed Feb 12, 2014 6:15 pm

Re: bouton en python

Wed Aug 27, 2014 10:22 am

l'intendation peut me retourner une erreur de ce genre :

RuntimeError: Error #5 waiting for edge ?

jelopo
Posts: 1604
Joined: Wed Oct 17, 2012 7:53 pm

Re: bouton en python

Thu Aug 28, 2014 10:35 am

Bonjour,

Il faut indenter try car il dépend de while. Mais ce n'est pas sûr que ça explique l'erreur.

Code: Select all

#!/usr/bin/env python2.7
# script by Alex Eames http://RasPi.tv
from time import sleep
import signal
import sys
import threading
import os
import RPi.GPIO as GPIO
import subprocess
GPIO.setmode(GPIO.BCM)
GPIO.setup(23, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(24, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
def next(self):
   print 'pp'
   os.system("mpc next")
    #raw_input("Press Enter when ready\n>")
GPIO.add_event_detect(24, GPIO.FALLING, callback=next, bouncetime=200)
while True:
    try:
       GPIO.wait_for_edge(23, GPIO.FALLING)
       print "Falling edge detected. Here endeth the second lesson."
    except KeyboardInterrupt:
    GPIO.cleanup()       # clean up GPIO on CTRL+C exit
GPIO.cleanup()           # clean up GPIO on normal exit 

groskanel
Posts: 17
Joined: Wed Feb 12, 2014 6:15 pm

Re: bouton en python

Thu Aug 28, 2014 1:47 pm

bon..
ca avance.

je me suis dis que le code était peut être un peu trop brouillon.. du coup je suis parti sur un seul bouton, plus simple a mon avis pour commencer !

Code: Select all

#!/usr/bin/env python2.7
import RPi.GPIO as GPIO
import os
GPIO.setmode(GPIO.BCM)

# Le GPIO 23 est initialise en entree. Il est en pull-up pour eviter les faux signaux
GPIO.setup(23, GPIO.IN, pull_up_down=GPIO.PUD_UP)

print "Veuillez verifier que vous avez un bouton connecte de telle maniere"
print "qu il connecte le port GPIO 23 (pin 16) au GND (pin 6)\n"
#raw_input("Pressez Entree quand vous etes pret\n>")

print "En attente de signal sur le port GPIO 23"
# a partir de la, le script ne fera plus rien jusqu a ce que 
# le signal sur le port 23 commence a chuter vers zero. C est
# la raison pour laquelle nous avons utilise le pull-up pour 
# garder le signal "HIGH" et empecher un faux signal

print "Pendant ce temps votre Rapsberry Pi ne gaspille pas" 
print "de ressources en attendant un appui sur le bouton.\n"
print "Pressez le bouton quand vous voulez lancer un signal."
while True:
    try:
	GPIO.wait_for_edge(23, GPIO.FALLING)
	print "\nAppui detecte. Maintenant votre script va"
        os.system("squeezeslave 127.0.0.1 -L")
    except KeyboardInterrupt:
	GPIO.cleanup()       # reinitialisation GPIO lors d'une sortie CTRL+C
et la ca fonctionne, le programme ne quitte plus une fois le bouton cliqué

deux choses cependant, est il possible d'avoir une précision moindre sur le bouton (en fait en appuyant une fois, parfois je declenche deux actions..)
et l'autre chose plus importante, c'est que le bouton, est censé piloter squeezeslave...
j'ai jeter un oeil aux option, en tapant la commande :

Code: Select all

 os.system("squeezeslave 127.0.0.1 -L")
ca me donne bien la liste de périphérique audio..

mais si je remplace par :

Code: Select all

 os.system("squeezeslave 127.0.0.1 -D - P")
ca ne passe pas en pause..

faut dire, je ne suis pas sur de la syntaxe.. j'ai plus l'impression que cela ne fonctionne qu'au clavier, mais dans ce cas, comment piloter squeezeslave avec des boutons ?

http://wiki.slimdevices.com/index.php/S ... .28Unix.29

Return to “Français”