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

Python et PiFace

Message par salade » dim. 19 oct. 2014 22:18

Bonjour,

Je débute avec Python et Raspberry Pi, j’ai quelques notions d’électronique et de programmation.
J’ai réalisé un afficheur 7 segment dans l’idée de contrôler l’affichage de chiffres (0 à 9) en utilisant un Raspberry Pi, une carte d’extension PiFace et Python 3.
La maquette est réalisée à base de plaques d'acrylique (3 mm d'épaisseur) découpées au laser (je post les plan si cela intéresse quelqu'un)
Les segments sont illuminés par 5 led, chaque segment est relié à une sortie du Piface.
Les boutons poussoir sont reliés aux entrées du PiFace.
digit_01_s.jpg
Photo de la maquette
digit_01_s.jpg (155.43 Kio) Vu 7347 fois
Après quelques heures (...), j’arrive à compter ou à décompter en fonction de l’entrée activée, yes !
Voilà ce que cela donne en vidéo :

http://youtu.be/ulUchnfMnOQ

J’utilise 2 fichiers :
  • compteur : le programme à proprement parler

    Code : Tout sélectionner

    import pifacedigitalio as p
    import chiffre as ch
    from time import sleep
    import os
    import random
    import sys
    p.init()
    pfd = p.PiFaceDigital() #pour listerner
    ########################
    tc = 0.1 # delai de comptage
    ########################
    #   compter
    ########################
    def compter():
    	print ("Je compte")
    	print ("")
    	for i in [ch.zero, ch.one, ch.two, ch.three, ch.four, ch.five, ch.six, ch.seven, ch.eight, ch.nine]:
    		i()
    		sleep(tc)
    		ch.digit_off()
    	os.system('clear')	
    ########################
    #  decompter
    ########################
    def decompter():
    	print ("Je décompte")
    	print ("")
    	for i in [ch.nine, ch.eight, ch.seven, ch.six, ch.five, ch.four, ch.three, ch.two, ch.one, ch.zero]:
    		i()
    		sleep(tc)
    		ch.digit_off()
    	os.system('clear')	
    ########################
    def compte(event):
    	for x in range(0, 4):
    		compter()
    ########################		
    def decompte(event):
    	for x in range(0, 4):
    		decompter()
    ########################		
    def quitter(event):
    	print ("")
    	print("C'est fini !")
    	print ("")
    	sys.exit(1) 
    ########################
    os.system('clear')
    print ("")
    print ("DIGIT")
    print ("")
    print ("Appuyer sur un des boutons pour commencer")
    print ("")
    print ("Bouton 1 = Compter")
    print ("Bouton 2 = Décompter")
    print ("Bouton 3 = + rapide")
    print ("Bouton 4 = + lent")
    print ("Bouton 5 = Quitter")
    print ("")
    ########################
    # Evenements
    ########################
    listener = p.InputEventListener(chip=pfd)
    listener.register(0, p.IODIR_FALLING_EDGE, compte)
    listener.register(1, p.IODIR_FALLING_EDGE, decompte)
    #listener.register(2, p.IODIR_FALLING_EDGE, speed+)
    #listener.register(3, p.IODIR_FALLING_EDGE, speed-)
    listener.register(4, p.IODIR_FALLING_EDGE, quitter)
    listener.activate()
    
  • chiffre : le module ou je défini les chiffres en associant les sorties du PiFace aux segments à illuminés en fonction du chiffre.

    Code : Tout sélectionner

    #############################
    # Définitions des nombres 
    # et des lettres 
    # affichables
    #############################
    import pifacedigitalio as p
    #############################
    # ZERO
    ############################
    def zero() : 
    	print('0')
    	p.digital_write(0,1)
    	p.digital_write(1,1)
    	p.digital_write(2,1)
    	p.digital_write(3,1)	
    	p.digital_write(4,1)
    	p.digital_write(5,1)
    #############################
    # UN
    #############################
    def one() : 
    	print('1')
    	p.digital_write(1,1)
    	p.digital_write(2,1)
    #############################
    # DEUX
    #############################
    def two() : 
    	print('2')
    	p.digital_write(0,1)
    	p.digital_write(1,1)
    	p.digital_write(3,1)	
    	p.digital_write(4,1)
    	p.digital_write(6,1)	
    #############################
    # TROIS
    #############################
    def three() : 
    	print('3')
    	p.digital_write(0,1)
    	p.digital_write(1,1)
    	p.digital_write(2,1)
    	p.digital_write(3,1)	
    	p.digital_write(6,1)
    #############################
    # QUATRE
    #############################
    def four() : 
    	print('4')
    	p.digital_write(1,1)
    	p.digital_write(2,1)
    	p.digital_write(5,1)
    	p.digital_write(6,1)
    #############################
    # CINQ
    #############################	
    def five() : 
    	print('5')
    	p.digital_write(0,1)
    	p.digital_write(2,1)
    	p.digital_write(3,1)
    	p.digital_write(5,1)	
    	p.digital_write(6,1)
    #############################
    # SIX
    #############################
    def six() : 
    	print('6')
    	p.digital_write(0,1)
    	p.digital_write(2,1)
    	p.digital_write(3,1)	
    	p.digital_write(4,1)
    	p.digital_write(5,1)
    	p.digital_write(6,1)	
    #############################
    # SEPT
    #############################	
    def seven() : 
    	print('7')
    	p.digital_write(0,1)
    	p.digital_write(1,1)
    	p.digital_write(2,1)
    #############################
    # HUIT
    #############################				
    def eight() : 
    	print('8')
    	p.digital_write(0,1)
    	p.digital_write(1,1)
    	p.digital_write(2,1)
    	p.digital_write(3,1)	
    	p.digital_write(4,1)
    	p.digital_write(5,1)
    	p.digital_write(6,1)
    #############################
    # NEUF
    #############################	
    def nine() : 
    	print('9')
    	p.digital_write(0,1)
    	p.digital_write(1,1)
    	p.digital_write(2,1)
    	p.digital_write(3,1)	
    	p.digital_write(5,1)
    	p.digital_write(6,1)
    #############################
    # OFF
    #############################
    def digit_off() :
    	p.digital_write(0,0)
    	p.digital_write(1,0)
    	p.digital_write(2,0)
    	p.digital_write(3,0)	
    	p.digital_write(4,0)
    	p.digital_write(5,0)
    	p.digital_write(6,0)
    	p.digital_write(7,0)
    #############################
    # A
    #############################				
    def a() : 
    	print('A')
    	p.digital_write(0,1)
    	p.digital_write(1,1)
    	p.digital_write(2,1)
    	p.digital_write(3,0)	
    	p.digital_write(4,1)
    	p.digital_write(5,1)
    	p.digital_write(6,1)
    #############################
    # B
    #############################				
    def b() : 
    	print('B')
    	p.digital_write(0,0)
    	p.digital_write(1,0)
    	p.digital_write(2,1)
    	p.digital_write(3,1)	
    	p.digital_write(4,1)
    	p.digital_write(5,1)
    	p.digital_write(6,1)
    #############################
    # C
    #############################				
    def c() : 
    	print('C')
    	p.digital_write(0,1)
    	p.digital_write(1,0)
    	p.digital_write(2,0)
    	p.digital_write(3,1)	
    	p.digital_write(4,1)
    	p.digital_write(5,1)
    	p.digital_write(6,0)
    #############################
    # D
    #############################				
    def d() : 
    	print('D')
    	p.digital_write(0,0)
    	p.digital_write(1,1)
    	p.digital_write(2,1)
    	p.digital_write(3,1)	
    	p.digital_write(4,1)
    	p.digital_write(5,0)
    	p.digital_write(6,1)
    #############################
    # E
    #############################				
    def e() : 
    	print('E')
    	p.digital_write(0,1)
    	p.digital_write(1,0)
    	p.digital_write(2,0)
    	p.digital_write(3,1)	
    	p.digital_write(4,1)
    	p.digital_write(5,1)
    	p.digital_write(6,1)
    #############################
    # F
    #############################				
    def f() : 
    	print('F')
    	p.digital_write(0,1)
    	p.digital_write(1,0)
    	p.digital_write(2,0)
    	p.digital_write(3,0)	
    	p.digital_write(4,1)
    	p.digital_write(5,1)
    	p.digital_write(6,1)
    


Après pas mal de recherche, j’avoue que je suis surpris d'avoir été aussi loin dans la réalisation de ce projet mais je n'arrive pas encore à faire ce que je voulais pour 2 raisons :
1 - Je ne trouve pas ou ne comprends pas la documentation. http://piface.github.io/pifacecommon/re ... interrupts
2 - Mes connaissances en programmations sont limitées (structure, logique ...)
Ou l'inverse mais ça revient au même :oops:


Les questions :

Pour définir un chiffre, j’active ou désactive les sorties une par une.
Est-ce possible d’envoyer une commande hexadécimal ?
Si oui, quelle est la syntaxe ?

Exemple du chiffre 8 :

Code : Tout sélectionner

import pifacedigitalio as p
#############################
# HUIT
#############################				
def eight() : 
	print('8')
	p.digital_write(0,1)
	p.digital_write(1,1)
	p.digital_write(2,1)
	p.digital_write(3,1)	
	p.digital_write(4,1)
	p.digital_write(5,1)
	p.digital_write(6,1)
Au niveau des événements, j’ai utilisé l’exemple fourni avec PiFace et la doc trouvée ici : http://piface.github.io/pifacecommon/re ... interrupts

J’utilise le code suivant :

Code : Tout sélectionner

########################
# Evenements
########################
listener = p.InputEventListener(chip=pfd)
listener.register(0, p.IODIR_FALLING_EDGE, compte)
listener.register(1, p.IODIR_FALLING_EDGE, decompte)
#listener.register(2, p.IODIR_FALLING_EDGE, speed+)
#listener.register(3, p.IODIR_FALLING_EDGE, speed-)
listener.register(4, p.IODIR_FALLING_EDGE, quitter)
listener.activate()
Cela fonctionne bien, quand j’active l’input 1, je lance la fonction compte, ça compte, parfait.
Ceci étant, je pensais que ce “listener” me permettrait de sortir d’une fonction pour en lancer une autre mais il n’en est rien. Si je mets en boucle la fonction “compte”, l’appuie sur l’input 2 qui devrait lancer la fonction “décompte” ne fonctionne pas.
Est-ce lié à un problème de structure de mon programme ou est-ce du au limite du matériel/logiciel ?

De la même manière, j’aurais voulu pouvoir changer la variable “tc” qui défini la vitesse de comptage mais je n’y arrive pas.
Je pensais naïvement qu’un créant 2 fonctions speed+, speed- et qu’en les associant à 2 inputs via le listener j’arriverais à mes fins ;-)
Je touche ici mes limites de “programmeur” puisque le message retourné par python suite au essais suivant est fort légitime:

Code : Tout sélectionner

def speed+(event):
	tc = tc + 0.1

def speed-(event):
	tc = tc - 0.1

#listener.register(2, p.IODIR_FALLING_EDGE, speed+)
#listener.register(3, p.IODIR_FALLING_EDGE, speed-)
Python me dit que la variable “tc” ne peut pas être modifiée car elle a été déclaré plus tôt, ce qui est parfaitement vrai puisque je l'a défini en tout début de programme (au moins c'est limpide ...)
Est-il possible de changer la valeur d'une variable "à la volée" ?
Quelle serait la structure du programme ?

Voilà, si vous avez la connaissance, des idées, des liens, je suis preneur.

Cordialement,

Laurent
Modifié en dernier par salade le mar. 21 oct. 2014 15:12, modifié 3 fois.

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 09:21

Salut,

déjà pour quelqu'un de novice en programmation c'est déjà un bon début. je vais essayer de te faire quelque chose de plus complet mais je ne pourrais tester chez moi car je n'ai pas de piface. donc il va falloir que tu me confirme si cela fonctionne
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 10:23

Manfraid a écrit :Salut,

déjà pour quelqu'un de novice en programmation c'est déjà un bon début. je vais essayer de te faire quelque chose de plus complet mais je ne pourrais tester chez moi car je n'ai pas de piface. donc il va falloir que tu me confirme si cela fonctionne
Merci, je me réjouis de pouvoir avancer sur ce projet.

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 10:44

J'ai quelque idée pour t'aider, mais pour être sur quel est le fonctionnement que tu voudrais, car quand je regarde ton code et le nom des boutons que tu as noté sur ton montage il n'y a pas vraiment de rapport
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.

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 11:19

donc voila je te donne une première version si tu veux plus d'explication n'hésite pas
  • 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
    
        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
       
  • 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):
            self.tc -= 0.1
            # Vérouillage pour eviter d'avoir un temp null
            self.tc = min(self.tc,0.1)
        def SpeedDown(self,event):
            self.tc += 0.1
            # Vérouillage pour eviter d'avoir un temp trop long 5seconde
            self.tc = max(self.tc, 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 11:28

Manfraid a écrit :J'ai quelque idée pour t'aider, mais pour être sur quel est le fonctionnement que tu voudrais, car quand je regarde ton code et le nom des boutons que tu as noté sur ton montage il n'y a pas vraiment de rapport
Ok, c'était un peu confus, les options sur la maquette ne sont pas très judicieuses mais c'est un prototype ...

Voilà une version qui correspond aux entrées de la maquette :

Bouton 1 (start) = Input 0 => Compter (on lance la fonction compter via la fonction compte)
Bouton 2 (stop) = Input 1 => Quitter (on stoppe via la fonction quitter)
Bouton 3 (rev.) = Input 2 => Décompter (on lance la fonction decompter via la fonction decompte)
Bouton 4 (speed +) = Input 3 => + lent (on ajoute 0.1 à la variable tc à chaque appuie du bouton 4)
Bouton 5 (speed -) = Input 4 => + rapide (on soustrait 0.1 à la variable tc à chaque appuie du bouton 5)

Pour être cohérent, "start" aurait su s'appeler "Compter" et "rev." "Décompter" :oops:

Le code correspondant:

Code : Tout sélectionner

import pifacedigitalio as p
import chiffre as ch
from time import sleep
import os
import random
import sys
p.init()
pfd = p.PiFaceDigital() #pour listerner
########################
tc = 0.1 # delai de comptage
########################
#   compter
########################
def compter():
	print ("Je compte")
	print ("")
	for i in [ch.zero, ch.one, ch.two, ch.three, ch.four, ch.five, ch.six, ch.seven, ch.eight, ch.nine]:
		i()
		sleep(tc)
		ch.digit_off()
	os.system('clear')	
########################
#  decompter
########################
def decompter():
	print ("Je décompte")
	print ("")
	for i in [ch.nine, ch.eight, ch.seven, ch.six, ch.five, ch.four, ch.three, ch.two, ch.one, ch.zero]:
		i()
		sleep(tc)
		ch.digit_off()
	os.system('clear')	
########################
def compte(event):
	for x in range(0, 4):
		compter()
########################		
def decompte(event):
	for x in range(0, 4):
		decompter()
########################		
def quitter(event):
	print ("")
	print("C'est fini !")
	print ("")
	sys.exit(1) 
########################
os.system('clear')
print ("")
print ("DIGIT")
print ("")
print ("Appuyer sur un des boutons pour commencer")
print ("")
print ("Bouton 1 = Compter")
print ("Bouton 2 = Quitter")
print ("Bouton 3 = Decompter")
print ("Bouton 4 = + lent")
print ("Bouton 5 = + rapide")
print ("")
########################
# Evenements
########################
listener = p.InputEventListener(chip=pfd)
listener.register(0, p.IODIR_FALLING_EDGE, compte)
listener.register(1, p.IODIR_FALLING_EDGE, exit)
listener.register(2, p.IODIR_FALLING_EDGE, decompte)
#listener.register(3, p.IODIR_FALLING_EDGE, speed+)
#listener.register(4, p.IODIR_FALLING_EDGE, speed-)
listener.activate()
Je n'ai pas mis les fonctions speed+ et speed- car je ne sais pas comment procéder ...

Ce que je souhaite obtenir :

Quand j'appuie sur start, on compte indéfiniment (là j'ai mis 4 boucles pour les tests)
Quand j'appuie sur rev. on décompte indéfiniment (là j'ai mis 4 boucles pour les tests)
Quand j'appuie sur start, on compte indéfiniment
Quand j'appuie sur speed + on ralenti la fréquence
Quand j'appuie sur speed - on ralenti la fréquence

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 11:40

Bon, j'en était pas loin lol, déjà si tu peu essaye le code que je t'ai fourni, car comme je ne peu tester moi même c'est plus compliquer
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 11:50

Manfraid a écrit :Bon, j'en était pas loin lol, déjà si tu peu essaye le code que je t'ai fourni, car comme je ne peu tester moi même c'est plus compliquer
Mazette, quelle rapidité !
Ceci étant, le code se complique :?

J'ai essayé le code, j'ai supprimé les accents car python me renvoyait des messages d'erreur.
Voilà le code sans accent :

compteur:

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
            # Verification 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 : "Incrementation", -1 : "Decrementation"}[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):
        self.tc -= 0.1
        # Verouillage pour eviter d'avoir un temp null
        self.tc = min(self.tc,0.1)
    def SpeedDown(self,event):
        self.tc += 0.1
        # Verouillage pour eviter d'avoir un temp trop long 5 secondes
        self.tc = max(self.tc, 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()
chiffre:

Code : Tout sélectionner

#############################
# Definitions 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

    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
Quand je lance compteur, j'ai le "menu"
Quand je presse start, j'obtiens l'erreur suivante :

Code : Tout sélectionner

DIGIT

Appuyer sur un des boutons pour commencer

Bouton 1 = Start
Bouton 2 = Stop
Bouton 3 = Inverse
Bouton 4 = + rapide
Bouton 5 = + lent

Start
Valeur : 1 mode Incrementation
1
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 27, in run
    self.s.writeDigit(self.v)
  File "/home/pi/Documents/Digit/1.0/chiffre.py", line 29, in writeDigit
    self.p.output_port.value = self.digits[value]
AttributeError: 'module' object has no attribute 'output_port'

Unhandled exception in thread started by <bound method App._bootstrap of <App(Thread-1, started -1243118480)>>
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 11:52

oki, pour les accent désolé c'est une mauvaise habitude de ma part pour ça faut déclarer ton fichier en utf-8 pour ne plus avoir le soucis

je me doutais un peu de l'erreur car jai trouver ça en fouillant dans le code source du piface et je pensais que ça allais marcher, je vais essayer de voir ce qui cloche
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.

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 11:55

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