Télécommande infrarouge réseau

Videotron networked remote

Petit projet, mais très intéressant à réaliser.

Attention, ceci est un projet amateur fait par un amateur. Si jamais vous trouvez des erreurs dans mes propos, m’hésitez pas à me le faire savoir. Merci

Le problème initial

Voici d’où part l’idée: J’ai 3 télés chez moi, mais j’ai un seul décodeur videotron (Pour les non québecois, il s’agit d’un récepteur pour la TV par cable). Pour ne pas avoir à acheter 3 récepteurs / décodeurs, les 3 télévisions sont branchées sur le même. Évidement, c’est forcément la même image sur les 3. Par contre, si je suis dans la cuisine et que je veux changer de chaîne  il faut que je descende dans le salon pour aller la changer car la télécommande est infrarouge.  À partir de ce problème, il m’est venu à l’esprit de construire un petit montage qui me permettrait de changer de chaîne depuis n’importe qu’elle pièce.

Il existe plusieurs solutions pour cela, comme par exemple des amplificateurs ou des relais de signaux infrarouges, mais leur fiabilité est loin d’être parfaite et cela m’obligerait à déplacer la télécommande dans chacune des pièces (du coup je passerais plus de temps à me rappeler dans quelle pièce elle se trouve!).

J’ai opté pour une autre option: Un émetteur infrarouge qui va être placé juste devant le décodeur videotron. Il va recevoir le signal à transmettre via le réseau local. Le tout sera pilotable par un site web (mobile) et pourra donc être utilisé via n’importe quel téléphone en wifi.

Première étape: “Décoder les signaux infrarouges”

J’avais déjà utilisé par le passé l’excellente bibliothèque infrarouge de Ken Shirriff appelé “IRremote“. Cette bibliothèque permet d’émuler les protocoles infrarouges les plus courants comme celui de NEC, Sony SIRC, Philips RC5 ou RC6. De plus, dans les exemples qui viennent avec cette bibliothèque, il y en a un qui, une fois un récepteur infrarouge connecté à votre arduino,  vous permet de décoder ”live” les signaux d’une télécommande et de vous afficher la valeur reçue ainsi que le protocole utilisé.

Manque de chance, celle de mon décodeur videotron (modèle Explorer 4250HD) n’est pas reconnu. J’en déduis qu’elle utilise un protocole différent (propriétaire?).

IRremote permet aussi, lorsque le protocole n’est pas reconnu, d’afficher les valeurs “raw”, c’est à dire les temps de chaque impulsion (aussi bien les 1 logiques que les 0 logiques). Manque de chance une deuxième fois, cela ne fonctionne pas. Peut être parce qu’il y a trop de valeurs ou je ne sais pas.

J’avais déjà par le passé utilisé la technique de la capture via la carte son. C’est une technique qui consiste à brancher un récepteur infrarouge directement sur la prise micro d’une carte son, et ensuite d’enregistrer via un logiciel tel que Audacity la trame infrarouge qui est reconnu comme du son. A l’écran s’affiche alors le signal. Cela avait très bien fonctionné. Je pourrais en parler plus en détails dans un futur article éventuel.

J’avais acheté plus tôt dans l’année un analyseur logique “low cost” (50$, chez seed studio). Ce fut pour moi la première occasion pour le tester. Coté “software”, j’ai installé OLS qui est open source, et multi-plateforme (je suis sous linux).

J’ai commencé par capturer quelques trames pour tester. Voici ce que cela donne lorsque je cliques sur le bouton “0″ de la télécommande.

0

En fait, cette trame est répétée 3 fois à chaque fois que j’appuie sur la touche.

En me documentant sur différents sites/forum, j’ai pu comprendre ce que représente chaque variation dans cette trame. Il ne faut pas sauter  trop vite sur des conclusions et penser qu’a l’état haut, c’est un 1 logique, et à l’état bas, un 0 logique. Cela ne fonctionne comme cela. D’ailleurs, pour l’état haut, il y  2 temps différents (des créneaux larges, et des créneaux moins large). Ce protocole utilise des modulations différentes pour coder un 1 ou un 0 logique. Le “petit” créneaux à l’état haut représente un 0 et le “long” créneaux à l’état haut représente le 1. Chaque créneau est séparé par le même intervalle de temps (un créneaux court à l’état bas). Enfin, on peut noter qu’au tout début de la trame, on a un état bas un peu plus long, suivi d’un état haut lui aussi un peu plus long.

Une fois que l’on a compris ça, on est capable de transposer cette trame visuelle, en une liste de “timings”. L’excellente libraire IRremote nous permet de lui envoyer un tableau de timing en micro secondes qu’elle enverra à la led justement. C’est parfait!

Deuxième étape: “Récupérer tous les timings de chaque touche”

Ce qui m’intéresse vraiment, ce sont les touches de 0 à 9 sur la télécommande pour que je puisse changer de chaîne à distance. J’ai donc 10 trames qu’il va falloir analyser et convertir en “timing”. Un travail fastidieux si on fait cela manuellement.

Dans les options d’exportation du client OLS, j’ai découvert le format VCD (Value Change Dump).

Voici la trame du bouton 0 exporté en VCD:

 

Grâce à l’article wikipedia sur le VCD et le site suivant, j’ai pu comprendre la structure et me construire un petit script qui me “parse” ce fichier et me sort directement tous les “timings” qui m’intéressent. Quand j’ai le temps de bien faire, j’utilise en général python comme langage, mais quand je suis pressé, j’utilise PHP en CLI (une question d’habitude). Le code du script est loin d’être parfait mais il fait le travail qu’on lui demande:

 

Voici ce que donne le résultat du script pour la trame du chiffre 0:

La première ligne représente tous les timings (aussi bien les 0 et les 1 logiques que les espaces et le “header”). La deuxième ligne, quand à elle, représente la conversion binaire de ces timings interprétés (le script a ignoré tous les timing qui représentent des espaces)

Comme un arduino possède très peu d’espace flash et peu de ram, l’idée est de stocker les valeurs sous forme binaire plutôt que sous forme de timing car cela représente beaucoup moins d’espace (un court tableau de “byte”, versus un plus long tableau de “int”, faites le calcul). Il suffira juste de reconvertir ces valeurs binaires en timing au moment ou on simulera l’appui sur une touche.

 

Troisième étape: “Le montage”

J’ai d’abord commencé par un prototype composé de:

  • un clone d’arduino UNO
  • un module ethernet ENC28j60
  • une led infrarouge

C’est un montage très simple qui ne nécessite que très peu de composants comme vous pouvez le constater.
La libraire IRremote utilise la pin digitale 3 pour la led infrarouge. Pourquoi la pin 3? Pour le savoir, je vous invite à lire un (vieux) post très intéressant (écrit par l’auteur de la librairie) qui m’a appris beaucoup de chose que je ne connaissais pas sur les Atmega et leurs “timers”.
J’aime beaucoup le module ethernet ENC28j60 pour son très faible coût même s’il est moins performant et un peu plus compliqué à utiliser que son grand frère le “shield Wiznet 5100″. Quand j’en ai besoin, je les achète en chine via Ebay. Ils coûtent moins de 4$ shipping inclus! Impossible à battre…
Le module ethernet va être utilisé en tant que serveur web. C’est lui qui va recevoir une commande (un numéro de chaîne), puis convertir la séquence de numéro demandé en timing pour qu’il soit envoyé à IRremote. Niveau software, j’utilise (selon moi la meilleure bibliothèque) pour ce module: Ethercard. Cette bibliothèque communique avec le module via le protocole SPI. Il faut 6 pins pour relier le module ethernet avec l’arduino:

  • VCC (3.3v)
  • GND
  • SO (MISO / Master In – Master Out) Pin 12
  • SI (MOSI / Master Out – Slave In) Pin 11
  • SCK (Clock) Pin 13
  • CS (chip select) On peut choisir n’importe quelle pin (8 par défaut dans Ethercard)

Notez que ce module fonctionne en 3.3V pour l’alimentation mais il est 5V “tolérant” pour ses entrés-sorties. Inutile d’utiliser de buffer avec l’arduino UNO par exemple.

Voici ce que donne le schéma créé à l’aide de l’excellent (opensource et simple) Fritzing:

Arduino-videotron_schem

J’ai créé ce schéma dans le but de créer une version “standalone” de ce montage, c’est à dire sans utiliser un vrai Arduino Uno, mais un montage avec les seuls composants nécessaires. À partir de là, je me suis permis quelques changements très très largement inspirés des JeeNodes de JCW (Aussi l’auteur de la bibliothèque Ethercard). Le premier concerne le cristal 16Mhz de l’arduino qui a été remplacé par un tout petit résonateur céramique (qui contient  à l’internet les deux condensateurs normalement nécessaires avec le quartz). C’est un peu moins précis qu’un quartz normalement, mais pour l’utilisation dans un montage comme celui ci (comme pour bien d’autres), on n’y verra aucune différence. Le deuxième changement concerne l’alimentation. Normalement, pour faire tourner l’arduino en 16Mhz, il devrait être alimenté en 5V. Cependant, je l’alimente en 3.3V, ce qui me permet de pouvoir utiliser tous les senseurs ou modules qui fonctionnent en 3.3V directement. Je n’en aurai pas eu besoin dans ce montage, car comme je le disais précédemment  le module Ethernet est 5V tolérant  mais j’ai pris l’habitude de faire tous mes montages comme cela et je n’ai jamais eu de problème. Tous les JeeNodes fonctionnent aussi comme cela. Ce n’est pas pour cela que je vous le recommandes étant donné qu’on ne suit plus les instructions du constructeur. Vous faites comme vous voulez, vous êtres prévenu.

Sur la partie droite, on peut voir un petit transistor NPN qui à pour but de s’assurer que le courant dans la led infrarouge soit bien proche des 100ma qu’elle nécessite.

Enfin, sur la partie gauche du schéma, on aperçoit un port FTDI qui me permet de facilement de reprogrammer l’ATMEGA en cas de mise à jour. Mon câble FTDI “maison” n’offre pas de 3.3V directement. C’est pour cette raison que j’ai ajouté une diode sur le 5V du FTDI qui va ensuite alimenter l’entrée du régulateur de tension 3.3V.

Quatrième étape: “Le programme”

Voici le programme actuel (Arduino IDE 1.0.4) . Il n’est pas très compliqué, mais il peut être amélioré. Par exemple, au lieu de stocker les valeurs binaires de chacune des touches, j’aurais pu essayer d’aller plus loin et de comprendre la logique pour les générer moi même. Si vous voyez des morceaux de code qui peuvent être améliorés, surtout, je suis ouvert aux critiques (constructives), ne vous gênez pas. Les commentaires sont là pour ça.

L’interface web est plus que simple: Un simple formulaire en GET. Pour que ce soit un peu “design”, j’utilise jquery mobile par dessus. Après le plus compliqué, c’est de faire tenir tout cela dans l’espace alloué.  Dans le code ci dessous, vous pouvez voir qu’il y a 920 octets d’alloués pour le buffer lié au module. Le contenu de la page HTML ( + les entêtes) doit rentrer dans ces 920 octets. J’aurais pu augmenter encore un peu cette valeur, mais la RAM est une denrée précieuse sur un petit atmega328P.
Pour gagner quelques octets par-ci, par là, j’ai hébergé jquery et jquery mobile dans le même fichier JS sur mon propre serveur avec un nom court, et j’ai fait de même pour la feuille de style… Des économies de bouts de chandelles comme on dit.

J’aurais pu faire un simple formulaire avec une zone de texte ou nous avons à saisir avec le clavier la chaîne que l’on désire syntoniser, mais comme ma femme (j’ai l’impression d’être Colombo quand je dis ça) ne regarde pas beaucoup de chaîne différente, j’ai préféré faire une liste déroulante des choix disponibles.

Lorsqu’on accède au serveur web sur le réseau local, cela donne ça:

Interface web

Très basique. Mais bon, ça fait le travail parfaitement.

Cinquième étape: “Le PCB”

Une fois que mon prototype était concluant, je me suis empressé de faire le schéma sous Fritzing pour pouvoir réaliser un vrai montage sur un circuit imprimé maison. Vu la simplicité du montage et le nombre de composant réduit, un circuit simple face fait très bien l’affaire. Après une petit heure de routage manuel dans fritzing, j’obtient ceci:

PCB

Je l’ai fait exactement de la même taille que le module ethernet ENC28j60 pour que je puisse superposer les deux l’un sur l’autre (le module ethernet en dessous, et mon montage au dessus). Le deux seront “espacés” avec des vis hexagonales M3 (lorsque je les aurais reçu de chine. Merci Ebay)

Pour créer le PCB, j’utilise la méthode très connu de l’imprimante laser, qui consiste a imprimé le PCB en noir en blanc sur une feuille de papier photo, puis, à l’aide d’un fer a repassé, de faire coller le toner  (qui contient du plastique) qui est sur la papier photo sur ma plaque de cuivre. Ensuite vient l’étape habituelle de la gravure à l’aide de composant chimique tel que le perchlorure de fer. Le résultat est très correcte et on est capable d’avoir un circuit imprimé en 1h trop chrono. Pour moi, le pire dans tout cela est le perçage des trous. Je déteste ça!

 

Conclusion

Le montage fonctionne très bien, j’en suis contant. C’était un projet amusant pour le hobbyiste que je suis. Au niveau des coûts, engendré, c’est très minime: il  y en a pour 10 à 12$ gros max (en commandant l’ensemble des pièces sur ebay).