Page 2 sur 3
Re: Python et PiFace
Posté : lun. 20 oct. 2014 12:08
par salade
Manfraid a écrit :Je pense avoir trouver
voici le nouveau fichier chiffre.py
Code : Tout sélectionner
#############################
# Définitions des nombres
# et des lettres
# affichables
#############################
import pifacedigitalio as p
class SevenSegment:
# table conversion hexadecimal (row 1 = 0..9, row 2 = A..F)
digits = [ 0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F, \
0x77, 0x7C, 0x39, 0x5E, 0x79, 0x71 ]
# Constructeur
def __init__(self):
self.p = p.PiFaceDigital()
def writeDigitRaw(self, value):
"Sets a digit using the raw 16-bit value"
# Set the appropriate digit
self.p.output_port.value = value
def writeDigit(self, value):
if (value > 0xF):
return
# Set the appropriate digit
print(str(value))
self.p.output_port.value = self.digits[value]
def clear(self):
self.p.output_port.value = 0
ça fonctionne en partie, trop fort
Quand je presse start, ça compte
Quand je presse rev., ça décompte
ça se gate avec la variable speed+ et speed-
message d'erreur :
Code : Tout sélectionner
Valeur : 2 mode Decrementation
2
Valeur : 1 mode Decrementation
1
Valeur : 0 mode Decrementation
0
Exception in thread Thread-1:
Traceback (most recent call last):
File "/usr/lib/python3.2/threading.py", line 740, in _bootstrap_inner
self.run()
File "compteur.py", line 28, in run
sleep(self.tc)
IOError: [Errno 22] Invalid argument
Unhandled exception in thread started by <bound method App._bootstrap of <App(Thread-1, started -1243306896)>>
Traceback (most recent call last):
File "/usr/lib/python3.2/threading.py", line 713, in _bootstrap
self._bootstrap_inner()
File "/usr/lib/python3.2/threading.py", line 789, in _bootstrap_inner
self._stop()
TypeError: 'bool' object is not callable
Re: Python et PiFace
Posté : lun. 20 oct. 2014 12:16
par Manfraid
la je pense qu'on approche de ton but
voici la correction du fichier compteur.py
Code : Tout sélectionner
import pifacedigitalio as p
from chiffre import SevenSegment
from time import sleep
from threading import Thread
import os
import random
import sys
class App(Thread):
def __init__(self):
Thread.__init__(self)
self.tc = 0.1
self.s = SevenSegment()
self._inc = 1
self._Stop = False
self.v = 0
def run(self):
while not self._Stop:
# Incrementation ou decrementation
self.v += self._inc
# Vérification de la plage d'utilisation
if self.v > 9:
self.v = 0
elif self.v < 0:
self.v = 9
print("Valeur : {} mode {}".format(self.v, {1 : "Incrémentation", -1 : "Décrémentation"}[self._inc]))
self.s.writeDigit(self.v)
sleep(self.tc)
self.s.clear()
print("Fin du programme")
sys.exit(1)
def Start(self,event):
print("Start")
self.start()
def Stop(self,event):
self._Stop = True
def Inverse(self,event):
if self._inc == 1:
self._inc = -1
else:
self._inc = 1
def SpeedUp(self,event):
# Vérouillage pour eviter d'avoir un temp null
self.tc = min(self.tc - 0.1,0.1)
def SpeedDown(self,event):
# Vérouillage pour eviter d'avoir un temp trop long 5seconde
self.tc = max(self.tc + 0.1, 5)
p.init()
pfd = p.PiFaceDigital() #pour listerner
app = App()
os.system('clear')
print ("")
print ("DIGIT")
print ("")
print ("Appuyer sur un des boutons pour commencer")
print ("")
print ("Bouton 1 = Start")
print ("Bouton 2 = Stop")
print ("Bouton 3 = Inverse")
print ("Bouton 4 = + rapide")
print ("Bouton 5 = + lent")
print ("")
########################
# Evenements
########################
listener = p.InputEventListener(chip=pfd)
listener.register(0, p.IODIR_FALLING_EDGE, app.Start)
listener.register(1, p.IODIR_FALLING_EDGE, app.Stop)
listener.register(2, p.IODIR_FALLING_EDGE, app.Inverse)
listener.register(3, p.IODIR_FALLING_EDGE, app.SpeedUp)
listener.register(4, p.IODIR_FALLING_EDGE, app.SpeedDown)
listener.activate()
Re: Python et PiFace
Posté : lun. 20 oct. 2014 12:58
par salade
Manfraid a écrit :la je pense qu'on approche de ton but
voici la correction du fichier compteur.py
Code : Tout sélectionner
import pifacedigitalio as p
from chiffre import SevenSegment
from time import sleep
from threading import Thread
import os
import random
import sys
class App(Thread):
def __init__(self):
Thread.__init__(self)
self.tc = 0.1
self.s = SevenSegment()
self._inc = 1
self._Stop = False
self.v = 0
def run(self):
while not self._Stop:
# Incrementation ou decrementation
self.v += self._inc
# Vérification de la plage d'utilisation
if self.v > 9:
self.v = 0
elif self.v < 0:
self.v = 9
print("Valeur : {} mode {}".format(self.v, {1 : "Incrémentation", -1 : "Décrémentation"}[self._inc]))
self.s.writeDigit(self.v)
sleep(self.tc)
self.s.clear()
print("Fin du programme")
sys.exit(1)
def Start(self,event):
print("Start")
self.start()
def Stop(self,event):
self._Stop = True
def Inverse(self,event):
if self._inc == 1:
self._inc = -1
else:
self._inc = 1
def SpeedUp(self,event):
# Vérouillage pour eviter d'avoir un temp null
self.tc = min(self.tc - 0.1,0.1)
def SpeedDown(self,event):
# Vérouillage pour eviter d'avoir un temp trop long 5seconde
self.tc = max(self.tc + 0.1, 5)
p.init()
pfd = p.PiFaceDigital() #pour listerner
app = App()
os.system('clear')
print ("")
print ("DIGIT")
print ("")
print ("Appuyer sur un des boutons pour commencer")
print ("")
print ("Bouton 1 = Start")
print ("Bouton 2 = Stop")
print ("Bouton 3 = Inverse")
print ("Bouton 4 = + rapide")
print ("Bouton 5 = + lent")
print ("")
########################
# Evenements
########################
listener = p.InputEventListener(chip=pfd)
listener.register(0, p.IODIR_FALLING_EDGE, app.Start)
listener.register(1, p.IODIR_FALLING_EDGE, app.Stop)
listener.register(2, p.IODIR_FALLING_EDGE, app.Inverse)
listener.register(3, p.IODIR_FALLING_EDGE, app.SpeedUp)
listener.register(4, p.IODIR_FALLING_EDGE, app.SpeedDown)
listener.activate()
Le SpeedDown incrémente de 5 sec. en un appui.
le SpeedUp incrémente également de 5 sec.
Pour le SpeedDown c'est mesurable à l'oeil.
Pour le SpeedUp, j'ai changé le self.tc à 5 pour voir ce qui se passait, et c'est bien ça, un repasse à 0.1 en 1 appui.
Tu initialises bien la valeur de tc en ligne 12 ?
Ce que je remarque aussi, c'est que l'incrémentation n'est pris en compte qu'après le délai (soit 5 sec.)
Quand je décompte, je ne peux plus compter (revenir à start).
En fait, j'aurais du définir :
- Compter en lieu et place de start
- Décompter en lieu et place de rev.
Je n’essaie pas de décrypter ton code tout de suite, je me contente de tester pour l'instant.
Ceci étant, chapeau pour ta réactivité ...
Merci !
Re: Python et PiFace
Posté : lun. 20 oct. 2014 13:13
par Manfraid
oki, c'est encore une erreur de ma part pour le changement de vitesse, voici le code avec la correction
Code : Tout sélectionner
import pifacedigitalio as p
from chiffre import SevenSegment
from time import sleep
from threading import Thread
import os
import random
import sys
class App(Thread):
def __init__(self):
Thread.__init__(self)
self.tc = 0.1
self.s = SevenSegment()
self._inc = 1
self._Stop = False
self.v = 0
def run(self):
while not self._Stop:
# Incrementation ou decrementation
self.v += self._inc
# Vérification de la plage d'utilisation
if self.v > 9:
self.v = 0
elif self.v < 0:
self.v = 9
print("Valeur : {} mode {}".format(self.v, {1 : "Incrémentation", -1 : "Décrémentation"}[self._inc]))
self.s.writeDigit(self.v)
sleep(self.tc)
self.s.clear()
print("Fin du programme")
sys.exit(1)
def Start(self,event):
print("Start")
self.start()
def Stop(self,event):
self._Stop = True
def Inverse(self,event):
if self._inc == 1:
self._inc = -1
else:
self._inc = 1
def SpeedUp(self,event):
# Vérouillage pour eviter d'avoir un temp null
self.tc = max(self.tc - 0.1,0.1)
def SpeedDown(self,event):
# Vérouillage pour eviter d'avoir un temp trop long 5seconde
self.tc = min(self.tc + 0.1, 5)
p.init()
pfd = p.PiFaceDigital() #pour listerner
app = App()
os.system('clear')
print ("")
print ("DIGIT")
print ("")
print ("Appuyer sur un des boutons pour commencer")
print ("")
print ("Bouton 1 = Start")
print ("Bouton 2 = Stop")
print ("Bouton 3 = Inverse")
print ("Bouton 4 = + rapide")
print ("Bouton 5 = + lent")
print ("")
########################
# Evenements
########################
listener = p.InputEventListener(chip=pfd)
listener.register(0, p.IODIR_FALLING_EDGE, app.Start)
listener.register(1, p.IODIR_FALLING_EDGE, app.Stop)
listener.register(2, p.IODIR_FALLING_EDGE, app.Inverse)
listener.register(3, p.IODIR_FALLING_EDGE, app.SpeedUp)
listener.register(4, p.IODIR_FALLING_EDGE, app.SpeedDown)
listener.activate()
et en fait mon code fait démarrer le compteur en appuyant sur Start et tu change le sens a chaque fois que tu appuis sur rev
Re: Python et PiFace
Posté : lun. 20 oct. 2014 13:49
par salade
Manfraid a écrit :oki, c'est encore une erreur de ma part pour le changement de vitesse, voici le code avec la correction
Code : Tout sélectionner
import pifacedigitalio as p
from chiffre import SevenSegment
from time import sleep
from threading import Thread
import os
import random
import sys
class App(Thread):
def __init__(self):
Thread.__init__(self)
self.tc = 0.1
self.s = SevenSegment()
self._inc = 1
self._Stop = False
self.v = 0
def run(self):
while not self._Stop:
# Incrementation ou decrementation
self.v += self._inc
# Vérification de la plage d'utilisation
if self.v > 9:
self.v = 0
elif self.v < 0:
self.v = 9
print("Valeur : {} mode {}".format(self.v, {1 : "Incrémentation", -1 : "Décrémentation"}[self._inc]))
self.s.writeDigit(self.v)
sleep(self.tc)
self.s.clear()
print("Fin du programme")
sys.exit(1)
def Start(self,event):
print("Start")
self.start()
def Stop(self,event):
self._Stop = True
def Inverse(self,event):
if self._inc == 1:
self._inc = -1
else:
self._inc = 1
def SpeedUp(self,event):
# Vérouillage pour eviter d'avoir un temp null
self.tc = max(self.tc - 0.1,0.1)
def SpeedDown(self,event):
# Vérouillage pour eviter d'avoir un temp trop long 5seconde
self.tc = min(self.tc + 0.1, 5)
p.init()
pfd = p.PiFaceDigital() #pour listerner
app = App()
os.system('clear')
print ("")
print ("DIGIT")
print ("")
print ("Appuyer sur un des boutons pour commencer")
print ("")
print ("Bouton 1 = Start")
print ("Bouton 2 = Stop")
print ("Bouton 3 = Inverse")
print ("Bouton 4 = + rapide")
print ("Bouton 5 = + lent")
print ("")
########################
# Evenements
########################
listener = p.InputEventListener(chip=pfd)
listener.register(0, p.IODIR_FALLING_EDGE, app.Start)
listener.register(1, p.IODIR_FALLING_EDGE, app.Stop)
listener.register(2, p.IODIR_FALLING_EDGE, app.Inverse)
listener.register(3, p.IODIR_FALLING_EDGE, app.SpeedUp)
listener.register(4, p.IODIR_FALLING_EDGE, app.SpeedDown)
listener.activate()
et en fait mon code fait démarrer le compteur en appuyant sur Start et tu change le sens a chaque fois que tu appuis sur rev
Bravo, ça fonctionne !
Si je veux redémarrer après le stop, python me dit que le thread ne peut-être démarré qu'une fois.
ça changerait beaucoup la structure du programme que le stop soit une remise à zéro et non un exit ?
Je remarque par ailleurs que les input sont pris en compte après le délai tc, mais que pendant phase la d’exécution, rien ne se passe. Cela n'a pas d'incidence quand tc est faible, la réactivité est bonne. Cela devient en revanche plus notable quand la valeur de tc augmente, la réactivité du programme devient alors proportionnelle à la valeur tc.
En tout cas super merci et encore bravo !
Le code est complètement différent, je vais devoir digérer
Re: Python et PiFace
Posté : lun. 20 oct. 2014 13:55
par Manfraid
Merci, c'est vrai que la gestion du restart n'est pas du tout pris en compte. j’essaierai de voir ce que je peu faire pour pouvoir le gérer. par contre je ne comprends pas ce que tu veux dire sur la réactivité quand le temps d'attente devient long. c'est une réaction normal, car quand si le temps d'attente est de 3sec même si tu le baisse il restera a 3sec jusqu'à la fin de ce temps la la nouvelle valeur ne sera prise en compte qu'au prochain cycle
Re: Python et PiFace
Posté : lun. 20 oct. 2014 14:23
par salade
Manfraid a écrit :Merci, c'est vrai que la gestion du restart n'est pas du tout pris en compte. j’essaierai de voir ce que je peu faire pour pouvoir le gérer. par contre je ne comprends pas ce que tu veux dire sur la réactivité quand le temps d'attente devient long. c'est une réaction normal, car quand si le temps d'attente est de 3sec même si tu le baisse il restera a 3sec jusqu'à la fin de ce temps la la nouvelle valeur ne sera prise en compte qu'au prochain cycle
Oui, je voulais dire qu'il fallait attendre la fin du cycle pour changer de fonction.
Si on a un delai de 4sec., le reverse n'est opéré qu'après les 4 sec., moi je pensais qu'on pouvait opérer le changement tout de suite, dès l'appui sur le bouton
C'est vrai que c'est moins logique pour la tempo ...
Re: Python et PiFace
Posté : lun. 20 oct. 2014 14:25
par salade
Voilà ce que cela donne au final:
http://youtu.be/fWSw2MxrEHM
Un grand merci à Manfraid pour son aide et sa réactivité !
Re: Python et PiFace
Posté : lun. 20 oct. 2014 14:27
par EVOTk
C'est beau
Re: Python et PiFace
Posté : lun. 20 oct. 2014 14:29
par Manfraid
Mais de rien c'est un plaisir d'aider