infrarouge

Pour pouvoir fonctionner ASTROKIT doit recevoir les ordres d'une télécommande infrarouge avec un code bien précis
Cet article décrit comment programmer une télécommande infrarouge et l'utiliser avec ASTROKIT.

On utilisera le paquet LIRC, qui est sous licence GPL
Sur le système à télécharger, le paquet LIRC est déjà construit et installé
Il faut juste utiliser les commandes de ce paquet pour configurer une télécommande.

Electronique

  • il faut brancher une LED IR TSOP 38KHz sur les GPIOS de la raspberry (inutile si on utilise le module complémentaire : la LED est déjà connectée)
  • masse et vcc se branchent sur n'importe quel broche gpio masse et +3V (+3v suffisent)
  • l'entrée IR se branche par défaut sur le port GPIO 27 c'est le seul paramètre qui n'est pas défini dans le fichier de conf du programme principal
Installation du paquet LIRC pour une distribution Linux possésant un gestionnaire de paquets

$ apt-cache search mode2
lirc-x - infra-red remote control support - X utilities

 
$ dpkg -l | grep lirc
ii  liblircclient0    0.9.0~pre1-1.2  amd64  infra-red remote control support - client library
 

Sur un système disposant d'un gestionnaire de paquet, on peut installer le paquet avec apt-get install (ou un autre gestionnaire de paquet suivant le système)

Pour la cible, les outils sont faits pour ça.
On utilisera buildroot.
Mode de construction du paquet LIRC pour un linux embarqué

# uname -a
Linux rpi2-glibc-rt 4.1.13-rt5-v7 #1 SMP Mon Nov 23 18:16:31 CET 2015 armv7l GNU/Linux

Pour construire le paquet LIRC pour une cible embarquée via buildroot,
il suffit d'activer l'option  Target packages => Hardware Handling => lirc_tools 

 
Une fois le paquet buildé, installé sur la cible et le système complet construit et booté,
on a accès au démon lircd (qui lance /usr/bin/lirc) et aux commandes standards lirc
Le script de lancement se trouve classiquement dans /etc/init.d :

/etc/init.d/S25lircd

En dehors du démon, les commandes qui vont surtout nous intéresser sont :

- mode2 pour vérifier qu'un device infrarouge est présent et actif
- irrecord pour associer les signaux infrarouges émis par une télécommande à une configuration voulue (et définir ainsi les touches)
- irw pour vérifier cette association
 
La led infrarouge doit être correctement connectée entre un port GPIO (par exemple le 18) et la MASSE.
 
Pour l'activation des modules, il y a plusieurs solutions :
- activation au moment du boot via le mécanisme des overlays
- activation au moment du lancement du /etc/init.d/rcS
- activation via le démon lircd
 
Personnellement je préfère charger les modules dans le fichier rcS en incluant avant le lancement des services les lignes suivantes :
 
/sbin/modprobe lirc_dev
/sbin/modprobe lirc_rpi gpio_in_pin=18
 
On peut également noter les dépendances entre modules :
 
root@astro-gphoto-kit:/etc/lirc# modinfo lirc_rpi | grep depends
depends:        lirc_dev
root@astro-gphoto-kit:/etc/lirc# modinfo lirc_dev | grep depends
depends:        rc-core
root@astro-gphoto-kit:/etc/lirc# modinfo rc_core | grep depends
depends:

Je désactive alors le chargement des modules via le démon lircd :

 
 
Quelque soit la méthode, on peut vérifier avec un lsmod :
 
# lsmod
Module                  Size  Used by    Tainted: G 
ipv6                  324991 18 [permanent]
lirc_rpi                6114  0
lirc_dev                7722  1 lirc_rpi

rc_core                15792  1 lirc_dev

Pour trouver le numéro de port gpio utilisé, on peut le voir avec dmesg :

# dmesg | grep lirc
[    2.667984] lirc_dev: IR Remote Control driver registered, major 245
[    2.684264] lirc_rpi: module is from the staging directory, the quality is unknown, you have been warned.
[    3.666406] lirc_rpi: auto-detected active low receiver on GPIO pin 18
[    3.677712] lirc_rpi lirc_rpi.0: lirc_dev: driver lirc_rpi registered at minor = 0
[    3.689829] lirc_rpi: driver registered!

Le démon lircd étant arrêté, on peut vérifier avec mode2 que la télécommande infrarouge envoie des trames.

C'est la première chose à faire pour vérifier qu'un device est connecté physiquement sous /dev/lirc0
A partir de ce moment, on sait que /dev/lirc0 est actif et reçoit bien des trames infrarouges.

La commande irrecord quand à elle permet d'associer les signaux à des touches.

Le man est suffisamment explicite pour s'en sortir avec à peu près la plupart des télécommandes.
 
Par exemple, j'ai essayé une vieille télécommande de marque lamnda ("GOWELL"..)
Une fois la programmation fastidieuse de la télécommande fait, cela donne un joli fichier de conf :)
Avec la nouvelle version de LIRC, on peut mettre plusieurs fichiers de conf de télécommandes dans un répertoire dédié.
D'où le renommage du fichier en "01-gowell.conf" =>
# cat /etc/lirc/lircd.conf.d/01-gowell.conf | more
...
begin remote

  name  01-gowell.conf
  flags RAW_CODES|CONST_LENGTH
  eps            30
  aeps          100

  gap          107709

      begin raw_codes

          name KEY_0
             9026    4439     581     545     594     511
              616     515     593     538     620     485
              623     507     621     510     597     508
              589    1672     595    1640     595    1640
              647    1614     601    1635     590    1645
              621    1641     563    1673     618     512
              591     514     594     536     622     509
              599     505     622     509     640     491
              596     508     620    1647     598    1633
              612    1622     594    1669     612    1622
              593    1642     619    1643     593    1643
              592

          name KEY_1
             9044    4424     643     483     614     517
              601     504     624     506     622     509
              598     507     621     510     618     513
              629    1606     616    1618     627    1636
              600    1635     620    1626     610    1641
              594    1641     615    1621     625    1635
              604     502     622     509     639     491
              596     509     619     512     616    1618
              627     505     623     508     604    1631
              641    1594     620    1642     594    1641
              615    1625     621     505     642    1594


...

La commande irw permet alors de vérifier que la télécommande fonctionne bien.
Le démon lircd doit être démarré à cet effet (comme pour toutes les commandes en ir*)

# ps aux | grep lirc
  234 root     grep lirc

# irw
connect: Connection refused

Démarrons donc le démon, éxécutons la commande, et appuyons sur des touches :

La télécommande est alors utilisable en tant que telle : il existe un autre binaire du paquet LIRC pour associer

l'appui sur une touche à l'exécution d'un script / binaire par exemple, via un code hexa récupérable : irexec
 
Dans mon projet, j'ai plutôt utilisé la librairie C qui permet d'interagir avec le démon LIRC et la configuration effectuée.
Le code se présente sous la forme suivante :
..
#include <lirc_client.h>
..
char *code;
 
  // ATTENTION la fonction lirc_nextcode est bloquante
  // de plus elle conserve dans un tampon les touches lues
  // au fil de l'eau

  while(lirc_nextcode(&code)==0) {
    TRACE1("on a lu quelquechose ..") ;
    // code ..
  }

Il faut dans un programme placer lirc_nextcode dans un thread d'écoute (car la fonction est bloquante)
On compile avec le header file lirc_client.h et -llirc_client pour l'édition de lien

root@debian-host:/home/save/astrokit/src/reel20# cat Makefile | grep lirc
...
INCS     = -I${TARGET}/include -I${TARGET}/include/lirc -I${SRC} -I${EPE}
LIBS    = -L${TARGET}/lib -L/home/save/kernel/lib -L/usr/lib -L${EPE} -lpthread -lm -lrt -llirc_client -lss
...
Ces fichiers sont générés lors du build dans buildroot : il faut aller les chercher et les placer proprement dans son répertoire d'include et de lib.
Un exemple de compilation complet sur la machine host pour la cible armv7 :