Forum Programmation.python Bouton Volume MPD

Posté par  . Licence CC By‑SA.
Étiquettes : aucune
2
26
sept.
2024

Bonjour,

J'ai fait une petite radio avec Raspberry Pi Zero W.
J'ai simplement ajouté une carte son et j'écoute la radio via MPD.
MPD daemon est contrôlé via l'interface "mpc".

On peut contrôler le volume avec la commande 'mpc volume 50' par exemple.

Pour éviter le terminal, j'ai ajouté un encodeur rotatif.
J'utilise ce petit script ci-dessous que j'ai trouvé sur github.
Ca marche plutôt à une chose prêt.

La limite de volume est 100. Si on tape la commande 'mpc volume 110' on a une erreur et le volume reste à son état actuel.

Le problème avec l'encodeur rotatif c'est que, si on le tourne trop loin, le volume va aller jusqu'à 100 mais la variable "currVolume" augmente avec la rotation. On peut dépasser les 100 si on tourne trop vite a fond ! Du coup pour baisser le volume ensuite, il faut d'abord baisser la valeur à 100 (sans effet sonore donc). Le volume se baissera à partir de 100 seulement.

J'ai essayé de bidouiller ce script mais sans succès.
Quelqu'un aurait une idée de la modification nécessaire ?

Vous allez me dire que c'est du chichi et j'ai qu'a faire attention.
Mais cette petite radio, c'est pour donner aux vieux. Un petit bruit au fond de la cuisine :) Plus c'est simple mieux c'est.

#!/usr/bin/python
#Control MPD Client volume using a physical rotary encoder
#pip install mopidy-spotify

from RPi import GPIO
from time import sleep
import os

clk = 17
dt = 27

GPIO.setmode(GPIO.BCM)
GPIO.setup(clk, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
GPIO.setup(dt, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)

counter = 0
clkLastState = GPIO.input(clk)
currVolume = 50

try:
        while True:
                clkState = GPIO.input(clk)
                dtState = GPIO.input(dt)
                if clkState != clkLastState:
                        if dtState != clkState:
                                currVolume += 5
                        else:
                                currVolume -= 5
#                       print currVolume
                        os.system("mpc volume " + str(currVolume))
                        clkLastState = clkState
                        sleep(0.01)
finally:
        GPIO.cleanup

Merci pour votre aide.

  • # Une idée....

    Posté par  . Évalué à 8 (+7/-0). Dernière modification le 26 septembre 2024 à 14:03.

    if dtState != clkState:
        currVolume += 5
    else:
        currVolume -= 5
    
    if currVolume > 100:
        currVolume = 100
    if currVolume < 0:
        currVolume = 0
    • [^] # Re: Une idée....

      Posté par  (Mastodon) . Évalué à 4 (+1/-0).

      Simple et efficace, je valide !

      En théorie, la théorie et la pratique c'est pareil. En pratique c'est pas vrai.

    • [^] # Re: Une idée....

      Posté par  . Évalué à 1 (+0/-0).

      Grand merci ! Maintenant tout fonctionne parfaitement à ce niveau.

  • # Suite :)

    Posté par  . Évalué à 1 (+0/-0).

    Bon. J'ai rajouté un deuxième encodeur rotatif et j'ai repris le code ci-dessus.
    J'ai essayé de l'adapter pour changer les radios cette fois-ci.

    Le fonctionnement (si ça marche).

    1. Créer une playlist m3u dans laquelle il y a plusieurs radios (liens). Cinq dans mon cas.
    2. Faire un crontab au démarrage et lancer la première radio avec la commande mpc play 1. Chaque radio peut être lancée en fonction de sa position dans la liste

    Le point 1 et 2 fonctionnement correctement.

    3. Exécuter le script qui permet de changer les radios avec l'encodeur:
    a) Si l'encodeur va trop loin par rapport au nombre de ligne de la liste (ex: mpc play 20), lancer la ligne 1 (revenir au début quoi)
    b) Si l'encodeur va dans le négatif, jouer la ligne 1

    J'ai modifié ce code mais ça ne donne rien.

    Si vous avez des idées, je veux bien.

    Merci d'avance.

    #!/usr/bin/python
    #Control MPD Client volume using a physical rotary encoder
    #pip install mopidy-spotify
    
    from RPi import GPIO
    from time import sleep
    import os
    
    clk = 23
    dt = 24
    
    GPIO.setmode(GPIO.BCM)
    GPIO.setup(clk, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
    GPIO.setup(dt, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
    
    
    clkLastState = GPIO.input(clk)
    # Donne le nombre de ligne dans le fichier de la playlist. Ne pas depasser
    # Si ajout des liens dans le fichier plus tard, pas besoin de changer le code 
    nombre_lignes_playlist = os.system("wc -l < /home/jasmin/.mpd/playlists/radio.m3u")
    
    #La Station jouée au démarrage est toujours 1 (crontab)
    station_actuelle = 1
    
    try:
            while True:
                    clkState = GPIO.input(clk)
                    dtState = GPIO.input(dt)
                    if clkState != clkLastState:
                        if dtState != clkState:
                            station_actuelle += 1
                        else:
                            station_actuelle -=1    
    
                        # Si encodeur envoi des valeur négative, remettre la station à 1
                        if station_actuelle < 1:
                            station_actuelle = 1
    
                        # Idem si dépassement. Jouer le premier lien de la liste
                        if station_actuelle > nombre_lignes_playlist:
                            station_actuelle = 1
    
                        # lacer la lecture 
                        os.system("mpc play " + str(station_actuelle))
                        clkLastState = clkState
                        sleep(0.01)
    finally:
            GPIO.cleanup
    • [^] # Re: Suite :)

      Posté par  . Évalué à 1 (+0/-0).

      Re.

      Je pense avoir trouvé.
      Après avoir fait des test, le tout semble fonctionner.
      Je poste le résultat final. Peut-être que ça peut aider.

      Ma première erreur était le fait que j'ai utilisé os.system()
      Il fallait utiliser os.popen.
      Cette variable étant fausse, tout le reste était dans les choux.

      La variable station_actuelle reste dans la limite du nombre de liens présents dans ma playlist.

      Merci encore pour votre aide.

      #!/usr/bin/python
      #Control MPD Client volume using a physical rotary encoder
      #pip install mopidy-spotify
      
      from RPi import GPIO
      from time import sleep
      import os
      
      clk = 23
      dt = 24
      
      GPIO.setmode(GPIO.BCM)
      GPIO.setup(clk, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
      GPIO.setup(dt, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
      
      
      clkLastState = GPIO.input(clk)
      # Donne le nombre de ligne dans le fichier de la playlist. Ne pas depasser
      # Si ajout des liens dans le fichier plus tard, pas besoin de changer le code 
      nombre_lignes_playlist = os.popen("wc -l < /home/jasmin/.mpd/playlists/radio.m3u").read()
      
      #La Station jouée au démarrage est toujours 1 (crontab)
      station_actuelle = 1
      
      try:
              while True:
                      clkState = GPIO.input(clk)
                      dtState = GPIO.input(dt)
                      if clkState != clkLastState:
                          if dtState != clkState:
                              if station_actuelle > 0 and station_actuelle < int(nombre_lignes_playlist):
                                  station_actuelle += 1
                              else:
                                   pass
                          else:
                              if station_actuelle > 1:
                                  station_actuelle -=1
                              else:
                                   pass
                          # lacer la lecture 
                          os.system("mpc play " + str(station_actuelle))
                          print("La station actuelle est de : " + str(station_actuelle))
                          print("Le nombre de lignes dans la palylist est de : " + nombre_lignes_playlist)
                          clkLastState = clkState
                          sleep(1)
      finally:
              GPIO.cleanup

Envoyer un commentaire

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.