Si votre machine est dotée d'un récepteur infra-rouge (IR), vous pouvez réutiliser n'importe quelle télécommande pour contrôler cette machine et notamment pour contrôler un serveur de son comme mpd. Dans le cas du RaspberryPi, il va falloir acheter et relier un recepteur IR. Vous pouvez trouver des infos sur cette page D'autres machines commes la Cubox, la Cubieboard, le Fit-pc, sont déjà dotés d'un récepteur IR.

Introduction et principe de fonctionnement

Le principe est le suivant :

Une touche de la télécommande est pressée et un signal IR avec un code hexadécimal propre à cette télécommande est envoyé puis reçu par le récepteur IR. À la réception de ce signal, un logiciel (Lirc) qui « écoute » sur ce récepteur IR va traduire ce code en un code unifié, spécifique (du type : KEY_NEXT pour la touche « piste suivante »). Ce code peut donc être récupéré par tout logiciel pouvant s'interfacer avec Lirc. A chaque pression, c'est la séquence suivante qui est donc réalisée :

Touche pressée > envoi code hexa > réception par LIRC > code Lirc correspondant > réception par logiciel tiers > envoi commande correspondante

Tout d'abord, il faut installer le programme qui va gérer l'IR :

apt-get install lirc

Dans le cas du RaspberryPi, activez le module en décommentant la ligne suivante (enlever le "#" au début de la ligne) dans le fichier /boot/config.txt :

dtoverlay=lirc-rpi

Redemmarer le raspberry

Configuration de base de Lirc

Configurer le driver dans le fichier /etc/lirc/hardware.conf :

# /etc/lirc/hardware.conf
#
# Arguments which will be used when launching lircd
LIRCD_ARGS=""

#Don't start lircmd even if there seems to be a good config file
#START_LIRCMD=false

#Don't start irexec, even if a good config file seems to exist.
#START_IREXEC=false

#Try to load appropriate kernel modules LOAD_MODULES=true

# Run "lircd --driver=help" for a list of supported drivers.
DRIVER="default"
# usually /dev/lirc0 is the correct setting for systems using udev 
DEVICE="/dev/lirc0"
MODULES="lirc_rpi"

# Default configuration files for your hardware if any
LIRCD_CONF=""
LIRCMD_CONF=""

(à adapter selon le nom de votre module)

Enfin, lancer le service :

service lirc start

Vérifiez que le signal passe de votre télécommande au récepteur. Lancez la commande suivante :

irw

puis appuyez sur des touches. Si vous avez des éléments qui s'affichent dans votre terminal, c'est bon !

Configurer les télécommandes :

Les télécommandes interagissant avec lirc sont listées dans un fichier de configuration : /etc/lirc/lircd.conf.

C'est dans ce fichier que se fait le « lien » entre les codes hexadécimaux propres à chaque touche de la télécommande et le code propre à lirc (et donc interprétable par tout logiciel gérant lirc).

Il est possible de renseigner plusieurs télécommandes dans ce fichier et donc de pouvoir les utiliser simultanément (une pour la musique, l'autre pour de la vidéo, etc…). Vous pouvez récupérer des fichiers déjà prêts pour certaines télécommandes sur cette page et copier le contenu dans le fichier /etc/lirc/lircd.conf.

Testez si cela fonctionne en lançant les commandes :

service lirc restart
irw

Si vous voyez bien le lien entre un code télécommande et un code lirc, c'est bon.

Si vous ne trouvez pas votre bonheur ou si cela ne marche pas après avoir utilisé un fichier tout prêt, vous pouvez configurer vous-même une télécommande. Pour cela on va utiliser un utilitaire qui va générer un fichier de configuration pour mettre dans votre /etc/lirc/lircd.conf.

irrecord

Pour plus de précisions, vous pouvez suivre ce tutoriel

Lancer des commandes grâce à Lirc

Maintenant que le lien est fait entre chaque touche de votre télécommande et les codes-fonctions de Lirc, il faut relier une commande système à chaque code de lirc.

Un programme se charge de lancer une commande correspondant à un code Lirc activé. Ce programme devrait être installé avec Lirc et se nomme irexec. Il fonctionne comme un démon, c'est à dire un programme en arrière-plan qui reste toujours actif et « à l'affût » d'un évènement. Pour lancer le démon sous votre utilisateur, tapez cette commande :

irexec -d

Pour relancer irexec après un changement de configuration :

killall irexec 
irexec -d

Un fichier de correspondance entre les touches et les commandes effectuées se trouve dans le /home de l'utilisateur qui lance ces commandes. Créez ce fichier (sous votre utilisateur, pas en root ! ) :

touch ~/.lircrc

Ce fichier se constitue d'un enchaînement de séquences équivalentes, chacune spécifique d'une touche :

begin 
  prog = irexec 
  remote = <nom-de-la-télécommande> 
  button = <code-lirc-du-bouton> 
  config = <commande-à-lancer> 
  repeat = <0 or 1> 
end

Notes :

  • la fonction « remote » n'est nécessaire que si on utilise différentes télécommandes (renseignées dans le fichier /etc/lircd.conf)

  • la fonction repeat permet d'activer le maintien de la touche. Si on l'active (mettre 1), la commande se répétera tant que l'on appuiera sur la touche.

Si on la désactive (mettre 0), la commande se lancera une seule fois, même si l'on reste appuyé.

Prenons un exemple :

begin 
  prog = irexec 
  remote = bidule 
  button = KEY_STOP 
  config = mpc stop
  repeat = 0 
end

Ici, le programme irexec permet, à chaque fois que la touche stop de la télécommande nommée bidule est pressée, d'envoyer une seule fois la commande mpc stop qui a pour but d'arrêter la diffusion de musique par le serveur de musique mpd. Vous pouvez bien évidemment assigner n'importe quelle commande qui sera lancée sous l'utilisateur ayant lancé le démon irexec.

Utiliser Lirc pour contrôler Mpd

Comme nous l'avons vu, il va falloir remplir le fichier .lircrc avec les commandes spécifiques à Mpd (pour rappel, le contrôle de Mpd en ligne de commande se fait via la commande mpc. Tapez mpc help pour plus de détails sur les commandes).

Voici un exemple à récupérer

Si vous n'avez pas d'affichage sur votre serveur de son, il peut être intéressant d'avoir un retour utilisateur, notamment par l'émission de sons liés à certaines commandes qui se font en arrière plan (par exemple, « ajouter la playlist », « vider la playlist », « mettre l'aléatoire » etc…) afin d'être certain que la commande a bien été lancée. Pour cela, il suffit de stocker des fichiers de son dans un répertoire de l'utilisateur de Mpd et d'ajouter ce type de commande dans votre fichier .lircrc :

begin 
  prog = irexec 
  remote = bidule 
  button = KEY_MODE 
  config = aplay /chemin/vers/un/fichier/son.wav && mpc random 
  repeat = 0 
end

Ici, nous pouvons voir que le fichier est joué par la commande aplay juste avant le lancement de la commande de mise en aléatoire de Mpd.

Permettre le "mute" avec mpd

La fonction « mute » permet, en pressant un bouton de la télécommande, de mettre transitoirement le volume à zéro puis de retourner au volume initial en pressant à nouveau cette même touche. Il n'y a pas cette fonction dans mpd et donc il n'y a pas de commande mpc à associer avec une touche de la télécommande ! Nous contournerons cela par l'ajout d'un script dans le répertoire ~/bin de l'utilisateur de Mpd. Ce fichier se nommera par exemple mute-mpd.sh. Créer le fichier et l'éditer :

nano ~/bin/mute-mpd.sh

et y mettre dedans :

#!/bin/bash
for i in $(mpc | grep volume | colrm 1 7 | colrm 4 | sed 's/^[ \t]*//;s/[\t]*$//') 
  do
    if [ $i -eq 0 ]   
    then vol=$(cat /home/$USER/.volume) 
    mpc volume $vol 
    exit 0 
  else 
    echo $i > /home/$USER/.volume && 
    mpc volume 0 ; 
    exit 0
 fi 
 done

Le rendre exécutable :

chmod +x ~/bin/mute-mpd.sh

et lancer ce script en association avec une touche de votre télécommande. Pour cela ajoutez une section de ce type dans le fichier .lircrc de l'utilisateur de mpd :

nano ~/.lircrc

et mettre :

## Mute 
begin
  prog = irexec 
  remote = bidule 
  button = KEY_MUTE 
  config = /home/$USER/bin/mute-mpd.sh 
  repeat = 0 
 end

Remplacez $USER par le nom de l'utilisateur faisant tourner mpd et possédant le script dans son dossier ~/bin. Remplacez bidule par le nom de la télécommande configurée dans /etc/lirc/lircd.conf.

Contrôler le lecteur CD avec Lirc

Il suffit d'ajouter des sections dans le fichier .lircrc de l'utilisateur qui contrôle le lecteur CD (voir plus haut pour les explications)

  • Éjecter le CD

    begin 
      prog = irexec 
      remote = default 
      button = KEY_N 
      config = aplay /home/$USER/sons/device-removed.wav & eject 
      repeat = 0 
    end
    

    Ici, lors de la pression de la touche correspondante à KEY_N, un son est joué (info utilisateur) et la commande eject est lancée.

  • Jouer un CD

    begin
      prog = irexec 
      remote = default 
      button = KEY_M 
      config = aplay /home/$USER/sons/device-added.wav & mpc clear && mpc ls cd-audio | mpc add && mpc play 
      repeat = 0 
    end
    

    Ici, lors de la pression de la touche correspondante à KEY_M, un son est joué (info utilisateur) et la lecture du CDaudio par mpd est lancée.

    Explication de la commande :

    • mpc clear vide la playlist de Mpd
    • mpc ls cd-audio | mpc add ajoute les pistes du CD à la playlist de Mpd. Cela prend en compte le fait que vous avez fait un lien vers le répertoire du CDaudio (dans ce cas, le lien se nomme « cd-audio ») et que ce lien se trouve à la racine du répertoire de musiques de Mpd. Pour plus de détails, voir cette section.
    • mpc play lance la lecture du CDaudio
  • Ripper un CD

    Cela nécessite d'avoir installé et configuré le logiciel « ripit ». Pour cela, consultez cette page.

    begin 
      prog = irexec 
      remote = default 
      button = KEY_K 
      config = aplay /home/$USER/sons/alert.wav && ripit & 
      repeat = 0 
    end
    

    Ici, lors de la pression de la touche correspondante à KEY_K, un son est joué (info utilisateur) et la commande ripit est lancée.

    Pour pouvoir ripper dans un autre format, il faut le notifier dans la commande de ripit. Par exemple, pour riper en .flac, on mettra la commande

    ripit -c 2
    

Pour cela, reportez-vous à la section sur ripit