Installer Lirc et les outils complémentaires
A noter qu'en marge de ce tuto, vous pouvez vous documenter sur LIRC et son installation, par exemple sur https://wiki.archlinux.org/title/LIRC ou https://www.sigmdel.ca/michel/ha/opi/ir_02_en.html.
Installation des paquets Debian
- Installation de lirc et des outils complémentaires
sudo apt install -y lirc setserial ir-keytable
- Vérification des services lirc installés et de leur état :
root@debian10:~# sudo systemctl status lirc* ● lircd.socket Loaded: loaded (/lib/systemd/system/lircd.socket; enabled; vendor preset: enabled) Active: active (running) since Thu 2021-04-29 08:27:09 CEST; 3 days ago Listen: /run/lirc/lircd (Stream) CGroup: /system.slice/lircd.socket Warning: Journal has been rotated since unit was started. Log output is incomplete or unavailable. ● lircd.service - Flexible IR remote input/output application support Loaded: loaded (/lib/systemd/system/lircd.service; enabled; vendor preset: enabled) Active: active (running) since Thu 2021-04-29 08:27:11 CEST; 3 days ago Docs: man:lircd(8) http://lirc.org/html/configure.html Main PID: 785 (lircd) Tasks: 2 (limit: 2065) Memory: 1.9M CGroup: /system.slice/lircd.service └─785 /usr/sbin/lircd --nodaemon
Les fichiers de configuration de lirc sont dans /etc/lirc.
- /etc/lirc/lirc_options.conf : configuration générale du driver et du périphérique de capture
- /etc/lirc/lircd.conf.d/ : répertoire contenant les configurations des différentes télécommandes supportées.
Première configuration de LIRC pour périphérique de capture Agirs
Il va donc nous falloir repérer la liaison série sur laquelle le périphérique Agirs est détecté, vérifier son bon fonctionnement puis l'intégrer dans les fichier de config. Il faut tout d'abord le brancher sur un port USB de disponible, puis :
- Détection du périphérique sur lequel est vu Agirs
dmesg | egrep --color 'serial|ttyS|ttyA'
- Le périphérique détecté apparait comme suit :
[ 5.015854] systemd[1]: Created slice system-serial\x2dgetty.slice. [338051.139147] cdc_acm 7-1:1.0: __ttyACM0__: USB ACM device
- Ici il est donc détecté en /dev/ttyACM0
- Ouvrir le terminal via screen
screen /dev/ttyACM0
- Vous devriez être accueilli par la bannière de Girs
GirsLite 1.0.3
- Vérifier la liste des modules supportés sur Agirs
modules
- Agirs renvoie la liste des modules supportés
Base Transmit Capture Receive Decoder Led Parameters Pronto
- Lancer une reconnaissance de code IR (et appuyer sur une touche de la télécommande pointée vers le dispositif de capture...)
Receive
- Agirs répond avec les timings de la touche. Un + correspond à un front montant et un - à un front descendant. Le chiffre correspond au temps en microsecondes.
+8900 -4500 +550 -1650 +550 -550 +550 -550 +600 -550 +550 -550 +550 -550 +550 -600 +500 -600 +550 -550 +550 -1700 +550 -1650 +550 -1650 +600 -1650 +550 -1700 +550 -1650 +550 -1700 +550 -550 +550 -550 +550 -600 +500 -600 +550 -550 +550 -550 +550 -550 +600 -1650 +550 -1700 +500 -1700 +550 -1700 +550 -1650 +550 -1650 +600 -1650 +550 -1700 +500 -600 +550 -39500 +8900 -2200 +600 -50100
- Quitter screen: Taper Ctr]+a puis :quit et ENTREE
- Tester la bonne réception avec le bon driver sur agirs
mode2 --driver girs --device /dev/ttyACM0
- Doit renvoyer une liste de pulses au format LIRC:
... space 39500 pulse 8900 space 2250 pulse 500 space 50100 ...
- Quitter mode 2 avec CTRL + C
A ce stade, nous avons pu vérifier qu'Agirs fonctionne convenablement et est bien vu par le système et LIRC. Il nous reste à l'intégrer dans le fichier de config de LIRC. Pour ce faire, éditer /etc/lirc/lirc_options.conf et remplacer les 2 lignes suivantes (en adaptant avec votre propre port bien sur)
driver = girs device = /dev/ttyACM0
Il ne reste plus qu'à redémarrer LIRC pour prendre en compte la config :
systemctl stop lircd.service systemctl stop lircd.socket systemctl start lircd.socket systemctl start lircd.service systemctl restart lircd-uinput.service
OU première configuration de LIRC pour récepteur IR intégré (Orange PI)
Si vous disposez d'une Orange Pi avec récepteur infrarouge intégré, vous pouvez bien sur ajouter Agirs comme à l'étape précédent OU utiliser ce récepteur intégré. Vous y perdrez la capacité d'émission, mais par contre vous utiliserez un périphérique interne, donc sans ajouter de hardware... A vous de voir en fonction du scénario d'usage que vous envisagez.
Il faut tout d'abord activer le périphérique de capture LIRC dans le noyau. Pour ce faire, lancer la commande
armbian-config
Puis aller dans "System" / "Hardware" / "CIR" et l'activer. Quitter et rebooter l'Orange PI
L'activation dans la config se fait en éditant le fichier /etc/lirc/lirc_options.conf
driver = default device = /dev/lirc0
Il ne reste plus qu'à redémarrer LIRC pour prendre en compte la config :
systemctl stop lircd.service systemctl stop lircd.socket systemctl start lircd.socket systemctl start lircd.service systemctl restart lircd-uinput.service
Configuration de LIRC
Intégration des configurations de vos télécommandes
C'est l'étape un peu critique dans LIRC. Nous avons vu dans l'article précédent comment utiliser Agirs pour reconnaitre les codes de votre télécommande.
A partir d'une télécommande recensée en base de données
LIRC dispose d'une base de données en ligne avec un certain nombre de télécommande. On ne va pas se mentir, la base de données n'est pas fabuleusement bien maintenue. Il n'y a pas toutes les télécommandes, et parfois les fichiers de config sont un peu fantaisistes. Nous avons vu que l'on peut générer des signaux soit en mode intelligent en précisant un protocole et les données, soit en mode 'raw' ou les signaux sont émis comme une suite de 0 et de 1, sans comprendre à quoi ils servent (comme lorsqu'une télécommande programmable fonctionne en mode apprentissage). Si vous avez la chance que votre télécommande soit supportée et que le contributeur ait fait l'effort de décrire le fichier de config de façon à utiliser le protocole, c'est clairement le mieux.
Pour rechercher dans la base de données, c'est assez simple, il suffit de taper irdb-get find suivi d'une chaine à chercher. Ce peut être la marque ou le modèle. Supposons que je cherche le fichier pour une télécommande NAD AVR-2 :
root@debian10:~# irdb-get find nad morgan's_daytona/Tornado.lircd.conf nad/451.lircd.conf nad/AVR2.lircd.conf nad/AVR2.lircd.conf nad/CDP-5425.lircd.conf nad/RC512.lircd.conf nad/SR6.lircd.conf nad/SR712.lircd.conf
ou
root@debian10:~# irdb-get find AVR2 harman_kardon/AVR210.irman.lircd.conf harman_kardon/AVR240.lircd.conf harman_kardon/AVR25.lircd.conf nad/AVR2.lircd.conf nad/AVR2.lircd.conf
J'ai de la chance, le modèle est supporté et est dans nad/AVR2.lircd.conf. Je vais donc pouvoir le récupérer :
irdb-get download nad/AVR2.lircd.conf Downloaded https://sourceforge.net/p/lirc-remotes/code/ci/master/tree/remotes/nad/AVR2.lircd.conf as AVR2.lircd.conf
Je vous encourage à revoir le fichier de config, avant de le copier dans /etc/lirc/lircd.conf.d/
Il existe d'autres bases de données de codes de télécommande en ligne, mais qui vont nécessiter un peu de travail pour créer le fichier de config LIRC. https://github.com/probonopd/irdb par exemple. Si je reprend mon exemple de télécommande NAD, en parcourant les répertoires par marque je trouve le fichier https://github.com/probonopd/irdb/blob/master/codes/NAD/Surround%20Processor/135%2C124.csv . Il décrit effectivement la plupart des commandes de ma télécommande en protocole NEC. Comme c'est un tableur CSV, il faut utiliser IR Scrutinizer pour créer chacun des codes (onglet generate), les copier dans l'onglet de génération de configuration ("To Param Remote"), puis lorsque la description de la télécommande est complete, l'exporter au format LIRC ("Export Param Remote" format "LIRC".
Remote Central (http://www.remotecentral.com) a pas mal de codes également, mais au format "pronto". IL faut ensuite les convertir dans IR Scrutinizer, puis les décoder avec Scrutinize pour en faire quelque chose...
à Partir de votre propre config
Vous pouvez également fabriquer votre propre fichier de configuration avec IR Scrutinizer (voir le premier article de la série pour les bases de l'usage). Tout d'abord, il peut être de bon ton d'utiliser des noms de fonctions standard dans linux. L'interfaçage avec des fonctions du système en sera simplifié. Si vous ne souhaitze pas déclencher des actions dans linux par votre télécommande, ce n'est pas indispensable, vous pouvez les nommer comme bon vous semble.
Pour obtenir la liste des codes standards dans LIRC, il vous suffit de faire :
irrecord --list-namespace
Une longue liste de noms s'en suivra.. Vous pouvez la copier coller dans un fichier texte pour référence lors de la constitution de votre fichier de configuration de télécommande.
Une fois la configuration de toutes les touches décrite dans l'onglet Scrutinize Remote, soit dans l'onglet "Parametric remote" si le protocole est connu/supporté, soit dans l'onglet "Raw remote" si le protocole est inconnu, vous allez pouvoir aller dans l'onglet d'exportation et choisir le format LIRC Raw (pour une télécommande "Raw", ou une sortie "Raw" sur une télécommande "Parametric"), soit le format LIRC (pour une télécommande "Parametric" uniquement ) puis cliquer sur le bouton correspondant à votre formar ("Export Parametric Remote" ou "Export Raw remote"). Une boite de dialogue va s'ouvrir pour vous demander de documenter votre format :
A l'issue de l'export, la fenêtre de status vous indique ou le fichier a été écrit et comment ils se nomme :
File C:\Users\jpcivade\Documents\IrScrutinizer\lirc_2021-05-06_07-20-01.lircd.conf was successfully written
Si l'on ouvre ce fichier avec un éditeur de texte, on va pouvoir voir plusieurs sections. Le documentation est ici : https://www.lirc.org/html/lircd.conf.html . La première est une section de commentaires, basées sur les informations d’identification saisies précédemment :
# IrScrutinizer parametric export # # Creating tool: IrScrutinizer version 2.3.0 # Creating user: jpcivade # Creating date: Thu May 06 07:20:01 CEST 2021 # Encoding: WINDOWS-1252 # # Manufacturer: NONAME # Model: IR-005 # Displayname: LED-IR-005 # Device Class: # Remotename: # # Protocol name: NEC1
La seconde est une section de description du protocole. La voici agrémentée de commentaires pour vous aider à comprendre les différentes directives :
# Début de la configuration d'une télécommande begin remote # Nom dans LIRC name LED-IR-005-nec1 # Le format fait 32 bits bits 32 # L'encodage utilisé repose sur la longeur de l'espace après l'impulsion de bit. # La trame est de longeur constante quelle que soient les données. flags SPACE_ENC|CONST_LENGTH # tolérance relative d'erreur en % eps 30 # tolérance d'erreur absulue en uS aeps 100 # Longeur de l'impulsion et de l'espace qui définissent un zéro (en microsecondes) zero 564 564 # Idem pour un 1 one 564 1692 # Impulsion précédant les données utiles (longueur de l’impulsion puis de l'espace en microsecondes) header 9024 4512 # Impulsion de fin, qui suit les données (longueur en us). ptrail 564 # Format de l’impulsion qui code une répétition de code (longueur de l’impulsion puis de l'espace en microsecondes) repeat 9024 2256 # espacement minimum entre 2 codes gap 108000 # Fréquence d'émission. Il peut pourrait être sage de le corrige et mettre 38000 (38Khz) qui est plus standard. frequency 38400 # Ici commencent les codes begin codes # Pour chaque touche, le code à transmettre. KEY_POWER 0x00000000807F01FE KEY_MODE 0x00000000807F41BE KEY_VOLUMEUP 0x00000000807F21DE KEY_BRIGHTNESSUP 0x00000000807FA15E KEY_DELAY 0x00000000807F619E KEY_VOLUMEDOWN 0x00000000807F11EE KEY_BRIGHTNESSDOWN 0x00000000807F916E KEY_CLEARDELAY 0x00000000807F51AE KEY_REDPLUS 0x00000000807F31CE KEY_GREENPLUS 0x00000000807FB14E KEY_BLUEPLUS 0x00000000807F718E KEY_REDMINUS 0x00000000807F09F6 KEY_GREENMINUS 0x00000000807F8976 KEY_BLUEMINUS 0x00000000807F49B6 KEY_CLEAR 0x00000000807F29D6 KEY_COLOR 0x00000000807FA956 KEY_SAVE 0x00000000807F6996 end codes end remote
J'ai plusieurs remarques à faire sur le format. Ici, il s'agit d'une petite télécommande format carte de crédit qui était livrée avec des bandeaux de Led. C'est au format NEC1 (2 octets). Chaque touche, est exprimée en 4 octets (les 2 octets et leur complément à 1, voir article précédent de la série pour un décodage NEC expliqué). Or, le code d'équipement est constant sur toutes les touches (807F). Il aurait probablement été plus simple de le matérialiser avec un entête constant de 16 bits (code équipement) pour ne garder que 16 bits sur les codes de touche.
Voici la configuration (sans les commentaires) remaniée pour tenir compte de ces remarques. A noter le passage en 16 bits au lieu de 32, et l'ajout d'un "pre_data" de 16 bits avec le code de l'équipement. Les codes quand à eux sont exprimés sur 16 bits également au lieu des 64 bits vus précédemment. C'est quand même plus lisible non? :
begin remote name LED-IR-005 bits 16 flags SPACE_ENC|CONST_LENGTH eps 30 aeps 100 zero 564 564 one 564 1692 header 9024 4512 ptrail 564 repeat 9024 2256 gap 108000 # Equipement code 0x80 0d128 pre_data_bits 16 pre_data 0x807F frequency 38000 begin codes KEY_POWER 0x01FE KEY_MODE 0x41BE KEY_VOLUMEUP 0x21DE KEY_BRIGHTNESSUP 0xA15E KEY_DELAY 0x619E KEY_VOLUMEDOWN 0x11EE KEY_BRIGHTNESSDOWN 0x916E KEY_CLEARDELAY 0x51AE KEY_REDPLUS 0x31CE KEY_GREENPLUS 0xB14E KEY_BLUEPLUS 0x718E KEY_REDMINUS 0x09F6 KEY_GREENMINUS 0x8976 KEY_BLUEMINUS 0x49B6 KEY_CLEAR 0x29D6 KEY_COLOR 0xA956 KEY_SAVE 0x6996 end codes end remote
Cela n'apporte rien d'un point de vue fonctionnel, à part la correction sur la fréquence de transmission que l'on a remise à 38Khz. Par contre, c'est plus facile à lire et maintenir.
Cette télécommande étant sérigraphiée "LED-IR-005", nous allons nommer ce fichier led-ir005.lircd.conf et le copier dans /etc/lirc/lircd.conf.d/ pour l'intégrer à LIRC.
Vérification des codes supportés
A l'étape précédente, nous avons copié au moins un fichier dans le répertoire /etc/lirc/lircd.conf.d/ qui contient les configurations des télécommandes. Il ne reste plus qu'à redémarrer LIRC pour prendre en compte la config :
systemctl stop lircd.service systemctl stop lircd.socket systemctl start lircd.socket systemctl start lircd.service systemctl restart lircd-uinput.service
Tests
Tout d'abord, nous allons interroger la configuration mise en place pour savoir quels sont les télécommandes dont la configuration a été intégrée/comprise dans lirc aux étapes précédentes. Ici nous avons 4 télécommandes, dont 2 comprises dans un même fichier (NAD) car c'est une télécommande multifonction avec un petit interrupteur pour passer du mode DVD au mode AMPLI.
root@debian10:/etc/lirc/lircd.conf.d# irsend LIST "" "" DENON_RC920-denon LED-IR-005 NAD_AVR2-RCVR NAD_AVR2-DVD
On peut descendre plus bas, en listant les codes supportés par une télécommande en particulier. Ici nous allons demander les codes de la petite télécommande format carte de crédit qui était utilisée sur le pilotage d'un bandeau de led :
root@debian10:/etc/lirc/lircd.conf.d# irsend LIST "LED-IR-005" "" 00000000807f01fe KEY_POWER 00000000807f41be KEY_MODE 00000000807f21de KEY_VOLUMEUP 00000000807fa15e KEY_BRIGHTNESSUP 00000000807f619e KEY_DELAY 00000000807f11ee KEY_VOLUMEDOWN 00000000807f916e KEY_BRIGHTNESSDOWN 00000000807f51ae KEY_CLEARDELAY 00000000807f31ce KEY_REDPLUS 00000000807fb14e KEY_GREENPLUS 00000000807f718e KEY_BLUEPLUS 00000000807f09f6 KEY_REDMINUS 00000000807f8976 KEY_GREENMINUS 00000000807f49b6 KEY_BLUEMINUS 00000000807f29d6 KEY_CLEAR 00000000807fa956 KEY_COLOR 00000000807f6996 KEY_SAVE
Si vous avez mis en périphérique réalisé dans le premier article du tuto (Agirs) et que celui-ci est bien configuré, vous pourez envoyer des codes infrarouge par la commande suivante. Cela ne sera bien sur pas supporté avec le récepteur intégré à l'orange pi, car il n'y a pas la fonction émission :
irsend SEND_ONCE NAD_AVR2-RCVR RCVR_POWER
Ici, nous allons envoyer une fois (SEND_ONCE ) un code d'allumage/extinction de l'appareil "RCVR_POWER" à l'ampli NAD "NAD_AVR2". Toutes les constantes de nom de code ou de télécommande auront bien sur été relevées par les commandes précédentes.
Il est également possible de tester la réception de codes infrarouge. Une commande spécifique permet de lire le socket et d'afficher les codes reçus. Il suffit de lancer "irw" et de pointer l'une des télécommandes configurées sur le récepteur. Le code est affiché à chaque réception ;
root@debian10:~# irw 00000000e13e01fe 00 RCVR_POWER NAD_AVR2-RCVR 00000000e13e01fe 01 RCVR_POWER NAD_AVR2-RCVR 00000000e13e01fe 02 RCVR_POWER NAD_AVR2-RCVR
Le premier nombre, nous donne le code recu sur la télécommande. Ici (protocole NEC2), le code Apareil est E1, le code fonction est 3E, et le code touche 01FE,. L'octet seul ensuite, nous donne le nombre de répétition. COMme je me suis un peu endori sur la touche, il voit l'appui (00) initial et 2 répétitions (01 et 02). Enfin, viennent en clair le nom la touche (RCVR_POWER ) et de l'appareil (NAD_AVR2-RCVR).
Notre LIRC recoit désormais les codes infrarouges émis par nos télécommandes!
Utilisation avancée
Déclencher des actions dans l'OS par des codes infrarouges
Il est possible de déclencher des actions dans le système d'exploitation via la télécommande infrarouge. Pour ce faire, il faut créer un fichier de configuration /etc/lirc/irexec.lircrc qui va contenir autant de bloc comme celui ci que de commandes souhaitées.
begin prog = irexec remote = LED-IR-005 button = KEY_MODE config = /usr/sbin/shutdown -h now repeat = 1 end begin prog = irexec remote = LED-IR-005 button = KEY_POWER config = /usr/sbin/shutdown -r now repeat = 1 end
Ici, j'ai assigné le bouton Power à l'arrêt du système, et le bouton mode à un reboot. En adaptant 'button' et 'config' vous pouvez pratiquement faire n'importe quoi. Peut être pour éviter de rebooter une commande "echo KEY_POWER" pourrait être une bonne idée...
Pour que cela fonctione, il faut lancer irexec en mode daemon avec
irexec -d
Si tout fonctionne il ne vous reste plus qu'à rendre permanent le démarrage du service avec
systemctl inlircd-uinput.service
Maintenant, votre télécommande contrôle certaines fonctions du système et notamment permet d'arrêter ou de redémarrer une raspberry sans se logger. Pratique !
Cet tout pour ce 2e volet, mais vous pourrez encore creuser le sujet qui offre de nombreuses possibilités en consultant la documentation de LIRC.
Sommaire des articles de la série:
- IR remote 1/4 : Comprendre et analyser les signaux d'une télécommande infrarouge
- IR remote 2/4 : Emission réception infrarouge via LIRC sur Raspberry PI ou Orange Pi
- IR remote 3/4 : Emetteur infrarouge / wifi sur ESP32
- IR remote 4/4 : Télécommande Wifi avec Nodered + LIRC + ESP32