Récepteur Infra-rouge USB

Dans un précédent billet j’ai détaillé l’utilisation d’AVRlirc de Paul Fox. Voici un petit hack permettant consistant à le lier avec un adaptateur série/USB pour en faire un ensemble IR/USB.

Il n’y a pas grand chose à dire si ce n’est qu’on récupère directement le +5V sur le câble USB juste avant l’adaptateur. Une fois connecté le périphérique est vu comme un /dev/ttyUSB* qu’il suffit d’utiliser avec avrlirc2udp. Un peu de configuration Lirc et c’est un total bonheur pour des présentations ou toutes autres choses.

J’utilise ce montage pour palier au manque de sensibilité du capteur IR de mon ThinkPad x31 pourtant utilisable avec Lirc. La portée est impressionnante même avec des petites télécommandes comme celles qu’on peut trouvez pour quelques Euros sur ebay :

Fonera en récepteur infrarouge

Dans un précédent article, je vous parlais de la nouvelle solution pour mettre en place un récepteur IR compatible Lirc sous GNU/Linux sans utiliser de module kernel via un petit montage utilisant un AVR Attiny2313. Utilisant une simple ligne RX en TTL il devient possible de l’utiliser sur un système embarqué disposant d’un port série simple (RX/TX en TTL 0/5V), j’ai nommé : La Fonera !

La solution est toute simple. Puisque le montage AVRLirc utilise une ligne RX il est possible de le connecter au port série normalement utilisé pour la console série de La Fonera. Le connecteur dans le routeur se présent ainsi :

Il suffit de connecter la patte 3 de l’AVR sur RX sans oublier la masse et récupérer l’alimentation +5V sur le circuit du routeur, tout près du connecteur d’alimentation. Le Vcc du connecteur console ne délivre qu’une tension de 3.3V.

Il faut ensuite construire un firmware OpenWRT et le configurer pour ne plus utiliser la console série. Plusieurs éléments de configuration doivent être changés.
Configurer le kernel via make kernel_menuconfig puis retirer des arguments par défaut passés au kernel la mention de la console série (Kernel Hacking / Default kernel command string).
Toujours dans la configuration du kernel, supprimer la console série : Device Drivers / Character devices / Serial drivers / Console on 8250/16550 and compatible serial port doit être désactivé.
Désactiver la console série dans l’inittab du firmware. Il suffit de supprimer la ligne concernant ttyS0 dans package/base-files/files/etc/inittab.

Une fois le firmware construit et installé sur La Fonera, le seul moyen de contacter le système est Telnet. Laissez démarrer le système (la première fois cela met un peu de temps en raison de l’effacement de la Flash non utilisée), connectez-vous en Telnet et définissez un mot de passe pour l’utilisateur root. Ceci aura pour effet d’activer le serveur SSH et de désactiver telnetd.

Configurez le système pour qu’ipkg puisse être utilisé correctement puis installer avrlirc2udp, le client. Voici un paquet binaire pour Kamilaze 7.09 et un tarball des sources à placer dans le répertoire package de l’arborescence OpenWrt :
Paquet IPKG
Tarball sources

Il ne vous reste plus qu’à configurer Lircd sur la machine hôte de votre choix en réception UDP (comme dans le billet précédent sur le sujet) et, sur le routeur d’utiliser :
avrlirc2udp -H -t /dev/ttyS0 -h 192.168.0.1
Vous disposez maintenant d’un routeur capable de recevoir des signaux IR et de les transmettre au serveur Lirc via une liaison filaire ou Wifi.

RedBoot reste utilisable au démarrage du routeur et le fait qu’il envoi des données sur le port série n’est pas un problème. La ligne TX du port du routeur n’est pas connecté. Il en va tout autrement s’il s’agit d’utiliser ce port série pour autre chose comme un modem ou un afficheur LCD. Sans doute la prochaine étape du voyage dans le hack de La Fonera.

PS : Si, comme moi, vous avez reconfiguré RedBoot pour un délai plus important (10s) il est possible de se passer du port série. Au moment du démarrage du routeur, RedBoot est en attente de connexion sur le port 9000 (à condition qu’il soit configuré correctement, IP, masque, etc). 10 secondes laissent largement le temps de se connecter avec un telnet. Malheureusement, je n’ai pas trouvé d’autre moyen pour envoyer un ^C que de faire :
% cd /tmp
% cat > break
[CTRL+V][CTRL+C][Entrée]
[CTRL+D]
puis
% nc -vvv 192.168.0.12 9000 < break; telnet 192.168.0.12 9000
C’est pas beau, il y a sûrement mieux, mais ça marche.

Télécommande Infrarouge

Il y a quelque temps déjà, j’avais écrit un article dans GLMF à propos du projet Lirc permettant d’utiliser n’importe quelle télécommande infrarouge pour contrôler des applications sous GNU/Linux. Le montage principal proposé par le projet est fort simple : un récepteur TSOP1736 connecté via quelques composants sur un port série. Malheureusement, le montage utilise directement la ligne DCD du port série via un module kernel. Ceci rend la chose impossible à utiliser via un convertisseur USB/série ou un système ne disposant pas de la ligne en question. De plus, l’utilisation d’un module rend difficile le portage sur un autre système. En cherchant un peu, je suis tombé sur le projet avrlirc de Paul Fox. Un pur bonheur…

Comme son nom l’indique la solution proposée par Paul utilise un microcontrôleur Atmel AVR. Un Attiny2313 pour être précis (mon préféré).

Côté hardware, le montage est simpliste. L’AVR est tout simplement utilisé avec un quartz de 14.7475 Mhz afin de pouvoir communiquer sans erreur avec un port série en 115200bps (voir page 140 du datasheet Attiny2313) . D’autres configuration, même sans quartz sont possibles. Le récepteur TSOP1736, le même que pour le montage série Lirc, est directement connecté à la broche 11 du microcontrôleur. La led connectée sur 9 est optionnelle, elle permet de visualiser une réception IR. Le reste relève de la mise en oeuvre classique de l’Attiny2313.

Attention toutefois, il ne faut en aucun cas connecter directement RX/TX sur le port série d’un PC, les tensions sont totalement incompatibles et cela risque de fumer et sentir mauvais très rapidement. Il existe plusieurs solutions pour ajuster les niveaux de tensions. La mise en oeuvre d’un MAX232 en est une. Pour ma part, j’ai tout simplement utilisé le montage permettant d’accéder à la console de la Fonera. Mon propre montage d’interface TTL/RS232.

Côté software nous avons deux éléments. D’une part le firmware pour l’AVR. Ecrit en C et compilable avec GCC. Il ne nécessite qu’une petite modification concernant la vitesse du port série (macro FOSC). On compile et on charge dans l’AVR via AVRdude (n’oubliez pas de configurer les fuses pour l’utilisation du quartz).

Enfin, nous avons un sympathique code, avrlirc2udp. C’est la partie cliente écoutant le port série et envoyant les données au démon lircd.

Une fois tout cela joyeusement assemblé on installe, avec Debian, le paquet lirc. Pour enregistrer une télécommande on utilisera :
% ./avrlirc2udp -H -t /dev/ttyUSB0 -h localhost
Puis :
% sudo irrecord –driver=udp mon_fichier
Il suffit ensuite de suivre les indications et on obtient un fichier contenant les associations bouton/code pour la télécommande en question. On copie simplement de fichier sous /etc/lirc/lircd.conf puis on configure /etc/lirc/hardware.conf en spécifiant :
LOAD_MODULES=false
DRIVER= »udp »
DEVICE= »none »
Et voilà. Il ne reste plus qu’à configurer son ~/.lircrc pour associer les boutons aux actions des applications supportant Lirc (xmms, mplayer, etc). Chose intéressante, comme tout se passe en UDP il est parfaitement possible de mettre le récepteur sur un machine différente de celle qui est pilotée. Mieux encore, comme l’utilisation du port série est devenu parfaitement normale (utilisation de RX et non de DCD) ceci devient utilisable sur, par exemple, une Fonera. C’est la prochaine étape pour moi : le portage d’avrlirc2udp sur la fonera et la configuration du port série, non plus pour une console mais comme un port standard pour la connexion du montage. Au final, ma Fonera sera donc en mesure de recevoir des codes IR/RC5 et, soit les utiliser, soit les forwarder à une autre machine en UDP via Wifi.