Python et PiFace

Python est le langage de prédilection du Raspberry Pi

Modérateurs : Francois, Manfraid

salade
Messages : 26
Enregistré le : dim. 19 oct. 2014 20:36

Re: Python et PiFace

Message par salade » lun. 20 oct. 2014 12:08

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 :D

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

Avatar du membre
Manfraid
Modérateur
Messages : 1402
Enregistré le : ven. 3 oct. 2014 14:50
Contact :

Re: Python et PiFace

Message par Manfraid » lun. 20 oct. 2014 12:16

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()
NAS : DIY OS Debian: DD250Go + 3x2To + 6To
Raspberry pi : 2B OS : Raspbian
Se tromper est humain, Vraiment foutre la merde nécessite le mot de passe de root.

salade
Messages : 26
Enregistré le : dim. 19 oct. 2014 20:36

Re: Python et PiFace

Message par salade » lun. 20 oct. 2014 12:58

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 ?

Code : Tout sélectionner

        self.tc = 0.1
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 !

Avatar du membre
Manfraid
Modérateur
Messages : 1402
Enregistré le : ven. 3 oct. 2014 14:50
Contact :

Re: Python et PiFace

Message par Manfraid » lun. 20 oct. 2014 13:13

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
NAS : DIY OS Debian: DD250Go + 3x2To + 6To
Raspberry pi : 2B OS : Raspbian
Se tromper est humain, Vraiment foutre la merde nécessite le mot de passe de root.

salade
Messages : 26
Enregistré le : dim. 19 oct. 2014 20:36

Re: Python et PiFace

Message par salade » lun. 20 oct. 2014 13:49

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 :oops:

Avatar du membre
Manfraid
Modérateur
Messages : 1402
Enregistré le : ven. 3 oct. 2014 14:50
Contact :

Re: Python et PiFace

Message par Manfraid » lun. 20 oct. 2014 13:55

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
NAS : DIY OS Debian: DD250Go + 3x2To + 6To
Raspberry pi : 2B OS : Raspbian
Se tromper est humain, Vraiment foutre la merde nécessite le mot de passe de root.

salade
Messages : 26
Enregistré le : dim. 19 oct. 2014 20:36

Re: Python et PiFace

Message par salade » lun. 20 oct. 2014 14:23

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

salade
Messages : 26
Enregistré le : dim. 19 oct. 2014 20:36

Re: Python et PiFace

Message par salade » lun. 20 oct. 2014 14:25

Voilà ce que cela donne au final:

http://youtu.be/fWSw2MxrEHM

Un grand merci à Manfraid pour son aide et sa réactivité !
Modifié en dernier par salade le mar. 21 oct. 2014 15:13, modifié 2 fois.

EVOTk

Re: Python et PiFace

Message par EVOTk » lun. 20 oct. 2014 14:27

C'est beau 8-)

Avatar du membre
Manfraid
Modérateur
Messages : 1402
Enregistré le : ven. 3 oct. 2014 14:50
Contact :

Re: Python et PiFace

Message par Manfraid » lun. 20 oct. 2014 14:29

Mais de rien c'est un plaisir d'aider :)
NAS : DIY OS Debian: DD250Go + 3x2To + 6To
Raspberry pi : 2B OS : Raspbian
Se tromper est humain, Vraiment foutre la merde nécessite le mot de passe de root.

Répondre

Retourner vers « Python »