Récepteur infrarouge
J'utilise plusieurs types de récepteurs infrarouges qui sont soit à fabriquer puis à brancher sur le port série soit en hackant un modèle Xbox via USB. Lirc est utilisé dans les 2 cas pour mapper les boutons de la télécommande avec des actions. Il fonctionne en mode client / serveur : le serveur s'interface avec le matériel, mappe les touches et notifie les clients. Ainsi, j'utilise irexec
pour lancer des scripts shell ou pour s'interfacer Mythtv ou mpc
en mappant une touche avec un action de l'application…
Récepteur sur port série
06/2010 : j'ai réalisé un montage de récepteur infrarouge de télécommande “standard du marché” se connectant via le port série d'un ordinateur. Il exploite un mode de fonctionnement que seul lirc
est capable d'interpréter et n'est pas compatible RS232. Il nécessite un récepteur infrarouge reconnaissant la fréquence d'émission des télécommandes la plus répandue du marché : 38 KHz.
Liste des composants :
- Récepteur Infrarouge TSOP 1738
- Condensateur chimique de 4.7 µF
- Résistance 4.7 kΩ
- Diode 1N4148
- Régulateur de tension 78L05
- Connecteur RS232
Ce montage nécessite peu de composants tout est étant très fiable. J'ai directement soudé les composants entre eux pour gagner un maximum de place et diminuer l'épaisseur de l'ensemble.
Je l'ai installé dans une petite boite d'allumettes fixée sur le meuble en dessous de la télé. Seul le récepteur infrarouge dépasse pour être visible.
J'utilise avec la télécommande infrarouge fournie avec l'une de mes cartes DVB-T :
Voici le mapping des touches LIRC pour celle ci :
- /etc/lirc/lircd.conf
begin remote name Hauppauge bits 13 flags RC5|CONST_LENGTH eps 30 aeps 100 one 969 811 zero 969 811 plead 1097 gap 114605 toggle_bit 2 begin codes Go 0x00000000000017BB Power 0x00000000000017BD TV 0x000000000000179C Videos 0x0000000000001798 Music 0x0000000000001799 Pictures 0x000000000000179A Guide 0x000000000000179B Radio 0x000000000000178C Up 0x0000000000001794 Left 0x0000000000001796 Right 0x0000000000001797 Down 0x0000000000001795 OK 0x00000000000017A5 Back/Exit 0x000000000000179F Menu/i 0x000000000000178D Vol+ 0x0000000000001790 Vol- 0x0000000000001791 Prev.Ch 0x0000000000001792 Mute 0x000000000000178F Ch+ 0x00000000000017A0 Ch- 0x00000000000017A1 Record 0x00000000000017B7 Stop 0x00000000000017B6 Rewind 0x00000000000017B2 Play 0x00000000000017B5 Forward 0x00000000000017B4 SkipBackward 0x00000000000017A4 Pause 0x00000000000017B0 SkipForward 0x000000000000179E 1 0x0000000000001781 2 0x0000000000001782 3 0x0000000000001783 4 0x0000000000001784 5 0x0000000000001785 6 0x0000000000001786 7 0x0000000000001787 8 0x0000000000001788 9 0x0000000000001789 Asterix 0x000000000000178A 0 0x0000000000001780 Sharp 0x000000000000178E Red 0x000000000000178B Green 0x00000000000017AE Yellow 0x00000000000017B8 Blue 0x00000000000017A9 end codes end remote
Montage sur l'enceinte
07/2012 J'ai remplacé la boite d'allumettes par une fixation du récepteur sur l'enceinte centrale situé sur le meuble de la TV afin d'être “visible” pour la télécommande.
Démon LIRC
LIRC est un programme permettant de mapper des touches de télécommandes vers des actions : augmenter le volume, lancer un script shell etc… Il fonctionne en mode client ⇔ serveur. La configuration du démon indique les modules noyaux à charger, l'association entre les codes de télécommandes avec un nom de touche. Coté client, un fichier décrit l'association entre une touche et une action coté application ou un script à lancer. Plusieurs types de clients existent : soit un lanceur de commande shell comme irexec
ou un client intégré au frontend MythTV.
La configuration complète pour MythTV est décrite dans la page d'installation d'une Debian
Récepteur de Xbox
12/2010 : les récepteurs IR et télécommande de la première Xbox ne sont pas cher et peuvent être adaptés pour fonctionner sur le port USB d'un PC.
Le connecteur du dongle USB est une version modifiée de l'USB avec les 4 fils traditionnels (VCC, GND, D+ et D-) auxquels s'ajoutent une fil pour piloter le retour de force des manettes de jeu. Il est possible de souder un câble USB “normal” directement sur le circuit imprimé en ne connectant que les 4 fils habituels.
Assignation des broches :
- Rouge = +5V
- Blanc = Data -
- Vert = Data +
- Jaune = Retour de force ⇒ Inutilisé
- Noir = Masse, 0V DC
J'ai également dessoudé le récepteur infrarouge et l'ai installé au bout de plusieurs centimètres de fils afin de le déporter et le rendre plus discret.
Une fois terminé, le récepteur est reconnu par le noyau avec le module lirc_atiusb
. En configurant lirc
, je pilote mpd via irexec
et mpc
(client en ligne de commande pour mpd
) pour jouer de la musique pour le garage.
Fichier de mapping des touches :
- /etc/lirc/lircd.conf
begin remote name Xbox_Remote bits 8 eps 30 aeps 100 one 0 0 zero 0 0 gap 163983 toggle_bit_mask 0x0 begin codes left 0xA9 up 0xA6 right 0xA8 down 0xA7 enter 0x0B 1 0xCE 2 0xCD 3 0xCC 4 0xCB 5 0xCA 6 0xC9 7 0xC8 8 0xC7 9 0xC6 0 0xCF menu 0xF7 display 0xD5 rewind 0xE2 ffwd 0xE3 play 0xEA pause 0xE6 stop 0xE0 skip- 0xDD skip+ 0xDF title 0xE5 info 0xC3 back 0xD8 end codes end remote
Configuration d' irexec
:
- ~/.lircrc
# play button begin prog = irexec button = play delay = 2 config = mpc toggle end # right button begin prog = irexec button = right delay = 2 config = mpc next end # skip+ button begin prog = irexec button = skip+ delay = 2 config = mpc next end # skip- button begin prog = irexec button = slip- delay = 2 config = mpc prev end # rewind button begin prog = irexec button = rewind delay = 2 config = mpc prev end [...] # up button begin prog = irexec button = up delay = 2 config = mpc volume +7 end # down button begin prog = irexec button = down delay = 2 config = mpc volume -7 end
Macro pad
Log de connexion du macro pad :
[ven. nov. 6 14:18:54 2020] usb 3-1.2: new full-speed USB device number 26 using xhci_hcd [ven. nov. 6 14:18:54 2020] usb 3-1.2: New USB device found, idVendor=4b1d, idProduct=4321 [ven. nov. 6 14:18:54 2020] usb 3-1.2: New USB device strings: Mfr=1, Product=2, SerialNumber=3 [ven. nov. 6 14:18:54 2020] usb 3-1.2: Product: MPC control pad [ven. nov. 6 14:18:54 2020] usb 3-1.2: Manufacturer: Coliss86 [ven. nov. 6 14:18:54 2020] usb 3-1.2: SerialNumber: 0 [ven. nov. 6 14:18:54 2020] input: Coliss86 MPC control pad as /devices/pci0000:00/0000:00:14.0/usb3/3-1/3-1.2/3-1.2:1.0/0003:4B1D:4321.0012/input/input40
Règle udev pour fixer le nom de chemin du device /dev/mpc_pad
- /etc/udev/rules.d/90-usb-devices.rules
ATTRS{idVendor}=="4b1d", ATTRS{idProduct}=="4321", KERNEL=="event*", SYMLINK="mpc_pad"
Recharger la configuration de udev
:
sudo udevadm control --reload-rules
Déconnecter et reconnecter le macro-pad. Un lien symbolique /dev/mpc_pad
est créé pointant vers le device /dev/input/eventXX
.
Arréter et désactiver les services lirc
inutilisés :
$ sudo systemctl stop lircmd.service lircd-uinput.service $ sudo systemctl disable lircmd.service lircd-uinput.service
Arreter les services lircd
et irexec
le temps de la configuration :
sudo systemctl stop lircd irexec
Configuration de lircd
:
- /etc/lirc/lirc_options.conf
[lircd] nodaemon = False driver = devinput device = /dev/mpc_pad output = /var/run/lirc/lircd pidfile = /var/run/lirc/lircd.pid plugindir = /usr/lib/x86_64-linux-gnu/lirc/plugins permission = 666 allow-simulate = No repeat-max = 600 [lircmd] uinput = False nodaemon = False
Ce macro pad possède 3 touches qui envoient F13, F14 et F15.
Configuration du client irexec
de lirc
:
- /etc/lirc/irexec.lircrc
begin prog = irexec button = KEY_F13 config = echo "KEY_F13" end begin prog = irexec button = KEY_F14 config = echo "KEY_F14" end begin prog = irexec button = KEY_F15 config = echo "KEY_F15" end
Relancer le service lircd
:
sudo systemctl restart irexec
Puis relancer le service irexec
et non les 2 en même temps, irexec
démarre avant que lircd
ai pu ouvrir la socket /var/run/lirc/lircd
et ne réagit pas :
sudo systemctl restart irexec
Consulter les logs de irexec
:
journalctl -f /usr/bin/irexec
appuyer sur les touches du macro pad, les logs doivent s'enrichir :
-- Logs begin at Tue 2019-07-16 23:15:53 CEST. -- nov. 06 14:05:57 olive irexec[12967]: KEY_F13 nov. 06 14:05:57 olive irexec[12967]: KEY_F14 nov. 06 14:05:58 olive irexec[12967]: KEY_F15
Debug
Si rien ne se passe, voici comment débugger et vérifier que la bonne réception des évennements.
Au préalable, il faut stopper lircd
et irexec
.
Vérifier que le macro pad est reconnu en lancant lsinput
:
lsinput /dev/input/event0 bustype : BUS_USB vendor : 0x4b1d product : 0x4321 version : 273 name : "Coliss86 MPC control pad" phys : "usb-0000:00:14.0-1/input0" uniq : "0" bits ev : (null) (null) (null) (null) (null) [...]
Ici, le macro pad est reconnu sous /dev/input/event0
. Cette valeur peut varier d'un boot à l'autre.
Ensuite, lancer l'utilitaire mode2
: il se branche directement sur le device et affiche les signaux reçus.
sudo mode2 -d /dev/mpc_pad -H devinput Using driver devinput on device /dev/mpc_pad Trying device: /dev/mpc_pad Using device: /dev/mpc_pad Running as regular user pad <appui sur la touche F13> code: 0x29a5a65f0000000035260c0000000000040004006a000700 code: 0x29a5a65f0000000035260c00000000000100b90001000000 code: 0x29a5a65f0000000035260c00000000000000000000000000 code: 0x29a5a65f00000000671a0e0000000000040004006a000700 code: 0x29a5a65f00000000671a0e00000000000100b90000000000 code: 0x29a5a65f00000000671a0e00000000000000000000000000
Le macro pad est bien lu, l'étape suivante consiste à relancer lircd
, exécuter irw
qui affiche les signaux interprétés par lircd
et appuyer sur toutes les touches du macro pad pour vérifier la bonne reconnaissance :
irw 00000000800100b7 00 KEY_F13 devinput 00000000800100b8 00 KEY_F14 devinput 00000000800100b9 00 KEY_F15 devinput
Finalement vérifier le fichier de configuration /etc/lirc/irexec.lircrc
de irexec
à partir des noms de touches donnés par irw
ci dessus.