IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Programmation multimédia/Jeux Python Discussion :

utilisation clavier matriciel et IR pour Jukebox


Sujet :

Programmation multimédia/Jeux Python

  1. #1
    Membre à l'essai
    Homme Profil pro
    Retraité
    Inscrit en
    Septembre 2016
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Septembre 2016
    Messages : 10
    Points : 11
    Points
    11
    Par défaut utilisation clavier matriciel et IR pour Jukebox
    Bonjour,
    Je débute en Python, il fallait bien qu'un jour je m'amuse avec ce langage. Je me suis débrouillé seul jusqu'à present, mais la je suis tombé sur un os, j'ai beau essayé de le ronger dans tous les sens, je n'arrive pas en extraire la moelle qui me permettra d'avancer et de passer à l'os suivant .

    Le principe est : j'ai un vieux jukebox avec un systeme laser obsolète et surtout plus maintenu pas Pioneer (pour ne pas le dire). Donc j'ai eu l'idée d'utilisé un Raspberry Pi 3 avec un Raspbian Jessie. Au debut, j'ai voulu utilisé un Raspbian Stretch, mais il semblerait que Stretch ne gère plus simplement l'interface IR, donc downgrade vers Jessie.
    J'ai installe MPD et MPC pour faire jouer les morceaux de musique, mais voulant conserver les interfaces IHM d'origine du jukebox (clavier, afficheurs 7 segments et télécommande) j'ai eu l'idée de faire un petit programme Python pour m'interfacer avec MPC.
    Actuellement Le clavier matriciel fonctionne seul ou la télécommande IR fonctionne seul, mais si j'essaie de faire fonctionner la télécommande IR avec le clavier la réception IR me bloque le clavier car le système reste en attente d'une réception IR avant de passer au clavier.
    Mon coté débutant en python me bloque sur ce point, c'est peut-être pas grand chose ou surement une erreur de ma part, mais je bloque. Alors si quelqu'un a la solution je veux bien un coup de main.


    Merci.


    Je vous met mon code (attention les yeux vont saigner, devant les erreurs, en lisant mon code )
    Mon code principal
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    import os
    import time
    import subprocess
    from subprocess import Popen,PIPE
    import envoiMPC
    from clavierCJV50 import keypad
    import pyirw
     
     
    #for disc in range(10,99):
    #    d = int(disc/10)
    #    d = disc-(d*10)
    #    if d < 7 and d > 0:
    #        os.system('mpc add '+str(disc)+'/01.mp3')
    # lecture du volume en cours
    kp = keypad()
     
    sockid = pyirw.init_irw() 
    print ('--- IR pret ---') 
    p = os.popen('mpc -f %file%') 
    for cpt in range(0,5):
        out=p.readline()
        if 'volume:' in out:
            volume = int(out[7]+out[8]+out[9])
            print ('volume = '+str(volume))
     
    Cpt=0
    toPlay=''
    print ('--- Clavier pret ---')
    # Boucle principale
    while True:
        digit = None
        #print('att digit')
        while digit == None:
            #print('att ir')
            key=None
            key = pyirw.next_key()
            if key:
                cle=key[0]
                if cle == b'KEY_VOLUMEUP':
                    digit='+'
                if cle == b'KEY_VOLUMEDOWN':
                    digit='-'
                if cle == b'KEY_MUTE':
                    digit='M'
                if cle == b'KEY_CANCEL':
                    digit='A'
                if Cpt==0:
                    digit=None
                    Cpt=1
                else:
                    Cpt=0
            if digit==None:
                #print('att keyb')
                digit = kp.getKey()
     
        if digit == 'C':
            toPlay = ''
        elif digit == 'R':
            dummy = 0
        elif digit == 'B':
            dummy = 0
        elif digit == '+':
            if volume < 100:
                volume = volume + 5
                os.popen('mpc volume '+str(volume))
        elif digit == '-':
            if volume > 0:
                volume = volume - 5
                os.popen('mpc volume '+str(volume))
        elif digit == 'M':
            if volume > 0:
                oldvolume = volume
                volume=0
                os.popen('mpc volume '+str(volume))
            else:
                volume=oldvolume
                os.popen('mpc volume '+str(volume))
        elif digit == 'A':
            os.popen('mpc next')
            #os.popen('mpc clear')
        else:
            toPlay = toPlay + str(digit)
            if (len(toPlay)>0 and int(toPlay[0]) < 1) or (len(toPlay)>1 and (int(toPlay[1]) < 1 or int(toPlay[1])) > 6):
                #beepbeep()
                print('beep beep')
                toPlay=''
            if len(toPlay) == 4:
                toPlay = toPlay[0]+toPlay[1]+'/'+toPlay[2]+toPlay[3]
                toPlay = 'mpc add '+toPlay+'.mp3'
                p = os.popen(toPlay)
                #out1 = p.readerror()
                #out2 = p.readline()
                #out3 = p.readline()
     
                #print(p.read())
                #print(out2)
                #print(out3)
                if 'error' in p.read():
                    #beepbeep()
                    print('beep beep')
                else:
                    # beep
                    print('beep')
                    p = os.popen('mpc play')
     
                toPlay = ''
     
        print(toPlay)
        time.sleep(0.5)
    le code pour le clavier matriciel
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    # Gestion du clavier pour le Juke Box
    # Pionner CJ-V50
    # Pionner CJ-V51
    # La connection au GPIO doit se faire ainsi:
    # Key1 <-> GPIO4  [07]
    # Key2 <-> GPIO17 [11]
    # Key3 <-> GPIO27 [13]
    # Col1 <-> Non connecté
    # Col2 <-> GPIO22 [15]
    # Col3 <-> GPIO25 [22]
    # Col4 <-> GPIO24 [18]
    # Col5 <-> GPIO23 [16]
    # Col6 <-> GPIO26 [37]
     
    # coding=utf-8
    import time
    import RPi.GPIO as GPIO
    GPIO.setwarnings(False)
     
    class keypad():
        def __init__(self, columnCount = 3):
            GPIO.setmode(GPIO.BCM)
    # Définition des paramètres
            if columnCount is 3:
                self.KEYPAD = [
                    [1,2,3],
                    [4,5,6],
                    [7,8,9],
                    [0,'C','+'],
                    ['B','-','R']
                    ]
                # Affectation des broches
                self.ROW = [26,23,24,25,22]
                self.COLUMN = [4,17,27]
            else:
                return
     
        def getKey(self):
            # Définition des colonnes en sorties
            for j in range(len(self.COLUMN)):
                GPIO.setup(self.COLUMN[j], GPIO.OUT)
                GPIO.output(self.COLUMN[j],GPIO.LOW)
            # Définition des lignes en entrées
            for i in range(len(self.ROW)):
                GPIO.setup(self.ROW[i], GPIO.IN, pull_up_down=GPIO.PUD_UP)
            # Regarde si un bouton est poussé
            rowVal = -1
            for i in range(len(self.ROW)):
                tmpRead = GPIO.input(self.ROW[i])
                if tmpRead == 0:
                    rowVal = i
            if rowVal < 0 or rowVal > 4:
                self.exit()
                return
            for j in range(len(self.COLUMN)):
                GPIO.setup(self.COLUMN[j], GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
                GPIO.setup(self.ROW[rowVal],GPIO.OUT)
                GPIO.output(self.ROW[rowVal], GPIO.HIGH)
                colVal = -1
                for j in range(len(self.COLUMN)):
                    tmpRead = GPIO.input(self.COLUMN[j])
                    if tmpRead == 1:
                        colVal = j
                if colVal < 0 or colVal > 2:
                    self.exit()
                    return
                # Retourne la position du bouton pressé
                self.exit()
                return self.KEYPAD[rowVal][colVal]
        def exit(self):
            # Retourne le nom du bouton pressé
            for i in range(len(self.ROW)):
                GPIO.setup(self.ROW[i], GPIO.IN, pull_up_down=GPIO.PUD_UP)
            for j in range(len(self.COLUMN)):
                GPIO.setup(self.COLUMN[j], GPIO.IN, pull_up_down=GPIO.PUD_UP)
     
    #if __name__ == '__main__':
    #    # Initialisation du clavier
    #    kp = keypad()
    #    print ('--- Clavier prêt ---')
    #    # Boucle principale
    #    while True:
    #        digit = None
    #        while digit == None:
    #            digit = kp.getKey()
    #        # Affiche le nom de la touche enfoncée
    #        print (digit)
    #        time.sleep(0.5)
    le code pour la reception IR
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    #!/usr/bin/env python
     
    # Read lirc output, in order to sense key presses on an IR remote.
    # There are various Python packages that claim to do this but
    # they tend to require elaborate setup and I couldn't get any to work.
    # This approach requires a lircd.conf but does not require a lircrc.
    # If irw works, then in theory, this should too.
    # Based on irw.c, https://github.com/aldebaran/lirc/blob/master/tools/irw.c
     
    import socket
     
    SOCKPATH = "/var/run/lirc/lircd"
     
    sock = None
     
    def init_irw():
        global sock
        sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
        #print ('starting up on %s' % SOCKPATH)
        sock.connect(SOCKPATH)
     
    def next_key():
        '''Get the next key pressed. Return keyname, updown.
        '''
        print('ent ir')
    #    while True:
        print('lit ir')
        data = sock.recv(128)
            # print("Data: " + data)
        data = data.strip()
    #        if data:
    #            break
        words = data.split()
        return words[2], words[1]
     
    #if __name__ == '__main__':
    #    init_irw()
    #
    #    while True:
    #        keyname, updown = next_key()
    #        print('%s (%s)' % (keyname, updown))

  2. #2
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    salut,

    c'est probablement le sock.recv() qui est bloquant, il va au minimum falloir rendre la socket non-bloquante ou apprendre à jongler avec le module select

  3. #3
    Membre à l'essai
    Homme Profil pro
    Retraité
    Inscrit en
    Septembre 2016
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Septembre 2016
    Messages : 10
    Points : 11
    Points
    11
    Par défaut
    Merci pour ta réponse BufferBob, c’est exactement ma conclusion, car après avoir mis des print un peu partout le dernier print affiché est celui juste avant le recv.
    Par contre la je bloque je ne sais pas rendre un socket non bloquant. Je vais chercher, mais si j’ai une astuce avant je prends.

    Merci pour cette direction de recherche.

    [Edit]
    Merci encore BufferBob pour cette mise sur la voie.
    Effectivement en ajoutant un socket.settimeout(0.2) et la gestion qui va avec, j'ai une très bonne interaction entre le clavier et la telecommande IR.

    Merci pour ton aide et ton orientation.

    Pour le reste je m'oriente plus vers le forum dédié au Raspberry Pi.

    Merci.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [MySQL] Utilisation d'une itération foreach pour le parcours du résultat
    Par jexl dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 27/01/2006, 10h27
  2. [PDO] Utiliser l'Objet de PHP pour gérer sa base de données
    Par Viau dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 25/01/2006, 18h16
  3. Réponses: 1
    Dernier message: 13/01/2006, 19h37
  4. [DOM] Utilisation de l'API DOM pour créer du HTML sous IE
    Par pedouille dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 11/01/2006, 14h48
  5. [VB6] utilisation de Property LET / GET pour un tableau
    Par titounne dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 18/10/2004, 22h06

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo