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
$ apt-cache search mode2
lirc-x - infra-red remote control support - X utilities
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)
# 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
/etc/init.d/S25lircd
En dehors du démon, les commandes qui vont surtout nous intéresser sont :
- 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
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 :
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.
La commande irrecord quand à elle permet d'associer les signaux à des touches.
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
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
...
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
...