Born to be wired

 Winter is coming – S01E03

Précédemment, sur AlphaK.net : j’ai réussi à capturer les codes infrarouges envoyés par la télécommande de ma clim réversible Airton CSH-12, et à en comprendre le fonctionnement. J’ai même rédigé, avec rigueur et amour, un document de spécifications sur le sujet, que je ne peux malheureusement pas rendre accessible en libre téléchargement sur ce site, pour des raisons légales. L’étape suivante consiste à remplacer la télécommande d’origine par un Arduino et lui faire émettre les mêmes codes. Allais-je y arriver ? C’est sur ce cliffhanger insoutenable que l’épisode précédent s’était arrêté, plongeant l’ensemble de mes lecteurs dans un état d’angoisse sans précédent. C’est justement là que nous reprenons le fil de l’histoire.

Cet épisode est dédié à Olivier et Jérémie, qui m’ont tanné les fesses pour que mes publications suivent un rythme plus soutenu. Merci à vous deux. Si cet épisode voit le jour, c’est un peu grâce à vous. Et aussi un peu parce que je suis bloqué dans un TGV pour un trajet de 3 heures avec pas grand chose de mieux à faire au moment où je rédige ces lignes.

L’étape de récupération et de compréhension des codes de la télécommande était une étape clé. Maintenant celle-ci réalisée, on est en droit de penser que l’émission de ces mêmes codes constituera une simple formalité pour quiconque est en mesure de pondre quelques lignes de codes assez proprement pour qu’elles compilent dans un environnement de développement pour Arduino. En principe, c’est mon cas. Mais si la théorie est une chose, la pratique en est une autre : après écriture d’un code source propre en apparence, permettant l’envoi de quelques codes de télécommande, et après câblage adéquat sur plaque d’essai, la clim ne réagit pas aux signaux envoyés. Je dois me rendre à l’évidence : ça ne fonctionne pas. Reste à trouver pourquoi.

À la recherche de la copie conforme du signal

Si ça ne fonctionne pas, c’est probablement parce que ce que j’envoie ne correspond pas à ce que je souhaite envoyer. Pour le vérifier, le mieux est de prendre la tension à l’oscilloscope aux bornes de la LED et de vérifier que le signal transmis est conforme à ce que j’attends. Les mesures à l’oscilloscope ne m’aident pas énormément : mon appareil de mesure étant assez ancien d’une part (à l’instar d’un T-800 : old, not obsolete), et le signal émis étant assez long d’autre part, enregistrer ou afficher à l’écran la totalité ce celui-ci ne s’effectue qu’au prix de l’impossibilité de distinguer précisément chaque bit.

Je dois donc trouver autre chose. J’adopte une solution que certains bidouilleurs de tout poil connaissent bien : récupérer et enregistrer le signal via l’entrée Line-In d’une carte son, et le visualiser grâce à un logiciel spécialisé comme Soundcard Scope, ou tout autre logiciel d’édition sonore à ma convenance.

Attention : balancer n’importe quoi en entrée de la carte son intégrée de votre tout dernier PC gamer de roxor est susceptible d’endommager irrémédiablement tout ou partie de celui-ci. Ne connectez JAMAIS un signal électrique en entrée d’une carte son sans en connaître les caractéristiques intrinsèques, et faites en toutes circonstances le nécessaire pour que le signal en sortie du système soit dissipé dans une résistance de valeur adéquate, afin que le signal effectivement transmis à l’entrée Line-In de la carte son soit sans danger pour l’électronique de la machine.

Les avertissements de circonstance étant lancés, passons à la démonstration. Je programme l’Arduino pour qu’il puisse émettre un signal Airton à la demande. J’ajoute la photodiode sur le montage, celle-ci est alimentée par l’Arduino, mais ici l’Arduino ne cherchera pas à lire le signal reçu par la photodiode. Le but est de mettre ce signal à portée de la carte son, grâce à un cordon Jack 3.5 mm, pour qu’il soit mesuré. Pour maximiser mes chances de ne pas flinguer ma carte son intégrée, j’ai pris soin d’atténuer le signal sorti de la photodiode, en utilisant un pont diviseur 4.7 kΩ + 470 Ω, et d’effectuer la mesure aux bornes de la résistance de 470 Ω, comme indiqué sur les schémas ci-dessous. J’ai également utilisé une technique communément dénommée « ceinture-bretelles » : j’ai acheté pour une bouchée de pain une petite carte son USB, que j’utilise pour les mesures en lieu et place de ma carte son intégrée, en me disant qu’avec un peu de chance c’est la carte son USB qui fumera avant ma carte-mère en cas d’erreur de câblage malencontreuse.

Je lance mon logiciel d’édition sonore favori et programme un enregistrement sur la carte son USB avec un taux d’échantillonnage adéquat. Dans mon cas, 44100 Hz suffisent pour distinguer nettement le code binaire, mais j’ai été obligé de travailler en échantillonnant entre 96000 Hz et 192000 Hz pour m’assurer que les timings des fronts montants et descendants sont conformes à ceux observés quand le signal provient de la télécommande d’origine. Au final, l’affichage de l’allure du signal me permet de dissiper tout doute concernant les éventuels bugs de logique dans mon code, et de rectifier des inexactitudes de timings, provoquées en partie par la fonction delayMicroseconds().

Au terme de cette investigation, je suis en mesure de confirmer que le code binaire et les timings de codage émis par l’Arduino sont absolument conformes à l’attendu. Pourtant, en essayant à nouveau d’envoyer mon signal sur ma climatisation, celle-ci ne réagit toujours pas.

À la recherche de la solution évidente

Parfois, dans la vie, on a l’impression que le sort s’acharne. J’ai tout fait dans les règles : obtenu une copie conforme du signal, des timings réglés quasiment à la microseconde près, et pourtant la clim ne montre toujours aucun signe de vie. Avouons que c’est rageant.

À ce stade, après une période de réflexion dépassant le temps nécessaire pour taper violemment du poing sur mon bureau en vociférant des injures chamarrées, j’en arrive à émettre les hypothèses suivantes :

  1. La diode émet le bon code binaire mais à une intensité lumineuse insuffisante pour être captée par le récepteur de la clim.
  2. La diode émet le bon code binaire mais modulé à une fréquence non reconnue par le récepteur de la clim.
  3. La diode émet le bon code binaire mais pas à la longueur d’onde exacte acceptée par le récepteur de la clim.

La difficulté pour ces points réside dans l’impossibilité d’effectuer les mesures adéquates, tout le monde ne disposant pas chez soi d’un spectromètre. Je balaie alors les hypothèses dans l’ordre :

  • Intensité lumineuse : pour lever le doute sur le point n°1, je me rapproche et m’éloigne du récepteur de la clim pendant que mon montage émet les codes binaires en continu. Pas de changement. Je joue sur la valeur de la résistance en série avec la LED pour que la luminosité soit plus intense, en veillant à ne pas cramer la LED. S’entend : plus intense pour le récepteur de la clim, pas pour mes yeux, évidemment. Pas de changement. Je change alors de stratégie. Je dispose d’un ampli home cinéma qui se pilote lui-aussi par télécommande IR, et j’avais pu constater lors de mes essais précédents que cette télécommande diffuse des codes NEC. Je programme quelques-uns de ces codes dans l’Arduino et les rejoue en direction de l’ampli, à bonne distance. Aucun problème, les codes programmés sont bien reconnus par l’ampli jusqu’à environ 2m. Il ne s’agit pas à priori d’un problème d’intensité lumineuse.
  • Fréquence de la modulation : pour lever le doute sur le point n°2, j’ai la possibilité d’intervenir directement dans le code. C’est une intervention qui s’effectue une nouvelle fois à l’aveugle, car en réalité lorsque je positionne un niveau logique haut sur la patte de l4arduino pilotant la LED, celle-ci n’émet par réellement de manière continue mais plutôt par trains d’impulsions lumineuses à une fréquence donnée, par défaut à 38 kHz dans le code. Lorsque je mesure la tension aux bornes de ma photodiode, comme celle-ci intègre déjà un système de lissage du signal, il ne m’est pas possible de visualiser la fréquence de ces impulsions à l’oscilloscope. Je visualise à la place un autre niveau logique haut, dont la durée est proportionnelle à la quantité d’impulsions émises. Il ne m’est donc pas possible de mesurer simplement la fréquence des impulsions émises par la LED de la télécommande d’origine sans la démonter. Si le récepteur intégré à la clim est un peu capricieux, des impulsions dont la fréquence est par exemple trop faible ne seront pas reconnues comme un niveau logique haut. Quoi qu’il en soit, j’ai la possibilité de jouer sur cette fréquence d’émission directement dans le code. La bibliothèque IRremote de Ken Shirriff, dont je me suis largement inspiré (infos ici et ici), génère ces impulsions en utilisant les registres PWM (Pulse-Width Modulation) de l’Arduino, et fournit les fonctions de haut niveau pour générer ces impulsions sur une plage comprise entre 36 et 40 kHz. Je teste donc toutes les valeurs de cette plage par pas de 1 kHz, sans amélioration. Le doute n’est pas entièrement levé, mais les probabilités que le problème vienne de la fréquence des impulsions s’amenuise. Je reviens donc à la valeur de 38 kHz et passe au point suivant. Pour plus de détails sur l’utilisation du PWM sur Arduino, je conseille vivement la lecture de cet article.
  • Longueur d’onde : pour lever le doute sur le point n°3, peu d’options : je commande sur Conrad et DealeXtreme une dizaine de types de LED de longueur d’onde différentes (infrarouge, mais pas seulement, on ne sait jamais). La commande reçue, je teste chaque modèle de diode un par un sur ma plaque d’essai. Et enfin, bingo ! Sur la dizaine de LED différentes en ma possession, un seul modèle du lot fait réagir la clim ! Il va sans dire que partager cette information pourra épargner bien des peines à toute personne effectuant les mêmes recherches que moi, et mine de rien, je sais qu’il y en a. La LED miraculeuse provient de DealeXtreme, référence n° 124841.
Livraison de chez Conrad : un bel assortiment de LED pour usage immédiat et de microcontrôleurs pour usage futur.

Livraison de chez Conrad : un bel assortiment de LED pour usage immédiat et de microcontrôleurs pour usage futur.

Pour fêter ça, je mets à disposition le code source de mon framework pour Arduino « AirtonRemote » ainsi qu’un script basique d’émission de codes IR utilisant ce framework, sous la dénomination « Airton Emitter for Arduino », archive trouvable sur la page des téléchargements. Le schéma Fritzing de cet article est incorporé dans l’archive.

Incontestablement, de gros progrès ont été faits à ce stade. La prochaine étape serait d’arriver à optimiser la partie matérielle. Utiliser un Arduino entier pour juste pour piloter une LED, c’est un peu comme utiliser un rouleau compresseur pour assommer une mouche. Ça fonctionne, mais au prix d’une débauche de moyens. Des solutions similaires, mais plus légères et peu coûteuses, seraient parfaitement envisageables. Mais nous verrons cela ultérieurement.

En d’autres termes, c’est tout pour aujourd’hui. Dans mon prochain article, le SMS automatisé fera son come-back pour des raisons inattendues.

 17 commentaires pour “Winter is coming – S01E03”

  1.  Jérémie

    Merci pour ce nouvel article !
    On attend le prochain avec impatience.
    A bientôt,

  2.  kornesque

    Salut et bravo
    Sacré travail que voila, je me suis mis il y a peu à la prog arduino et je souhaiterai discuter en MP avec toi concernant tes travaux (je possède une clim airton moi aussi) tu peux bien sure me contacter avec le mail mis en dans le formulaire du commentaire.
    Attendant avec impatience de tes nouvelles
    A+
    Et encore bravo

  3.  AlphaK

    Salut et merci de l’intérêt que tu portes à ce projet.

    J’essaie de rester ouvert à la discussion sur mes différents projets mais j’ai tendance a éviter les discussions privées. Cela permet de faire en sorte que les lecteurs ayant les mêmes questions, ou les réflexions sur les mêmes sujets, puissent tirer parti du résultat des conversations précédentes.
    Accessoirement, cela représente un gain de temps non négligeable pour moi, car cela me permet de ne pas avoir à répondre plusieurs fois à la même question posée par plusieurs lecteurs. Je t’invite donc à discuter du sujet via les commentaires associés à cet article.

  4.  kornesque

    Bonjour
    Je viens d’essayer la partie receiver sur ma télécommande airton et j’avoue n’y rien comprendre le programme principal Ariton Receiver me renvoie l’info : (48 bits) MSB-first
    Quand j’utilise l’exemple dans la librairie modifiée par tes soin celui me renvoie des codes de panasonic

    Vois-tu d’ou viens le probleme?

  5.  kornesque

    Bon après quelques essai , j arrive avec IRRemote 2 à envoyé et recevoir en mode RAW
    Je pense que le protocole utilisé est légèrement différent , mais bon du coup je peux au moins envoyer des info à mon climatiseur .
    J espère comprendre un jour le fonctionnement du protocole.

  6.  AlphaK

    Bonjour,
    Effectivement rien ne garantit que d’un modèle à l’autre ce soit le même protocole qui soit utilisé.
    En fonction des timings mesurés dans l’en-tête de la commande, le programme peut croire que le protocole est du Panasonic, alors qu’en réalité le début de la commande ressemble simplement à un code Panasonic. Par exemple avec le code original de la lib, le programme pensait que les signaux issus de ma télécommande étaient du NEC. Les timings étaient proches, mais pas complètement identiques, et la quantité de données transmise était plus importante.

  7.  AlphaK

    Update :
    En faisant du tri dans mes composants électroniques, j’ai retrouvé des notes indiquant qu’une autre référence de LED avait fonctionné.
    Les refs de LED qui ont été reconnues avec succès chez moi sont donc :
    * DealeXtreme, référence n° 124841
    * Conrad, référence n° 184307 (modèle OS-5038F)

  8.  fred

    Salut,

    Ton projet est super!!!
    Malheureusement le recepteur ne se compile pas chez moi.
    AIRTON pas declaré puis en supprimant la condition longvalue non plus.
    J’ai bien extrait IRremote redemarrer IDE arduino, vérifier que tes modifs étaient présentes dans IRremoteInt.h .
    Une idée?

  9.  AlphaK

    Salut,
    Il manque peut-être quelques explications sur la manière de déployer les programmes dans les packages que je mets à disposition :
    Le répertoire IRremote que je fournis est une modification de la lib d’origine. Pour que le programme principal puisse compiler, il faut que mon répertoire IRremote soit positionné dans le répertoire « libraries », lui-même présent dans le répertoire d’installation de l’IDE Arduino.

  10.  fred

    C’est exactement ce que j’ai fait

  11.  fred

    J’ai pas précisé ton émetteur fonctionne lui. C’est peut-etre que les autres ont juste testé ton émetteur.

  12.  AlphaK

    Je viens de retester, ça compile bien chez moi.

    Le croquis que tu essaies de compiler, c’est bien E05_AirtonReceiver ?
    Quelle est la version de ton IDE Arduino ?
    Dans Outils / Type de carte, tu as sélectionné quoi ?
    Et enfin, le plus important, quel est le message d’erreur à la compilation ?

  13.  fred

    désolé, finalement il se compile chez moi mais en IDE version 1.0.6.

  14.  AlphaK

    OK, je suis en 1.6.6 de mon côté.

  15.  mars-eyes

    Enfin l’épisode 3 !

    Merci AlphaK moi aussi toujours coincé avec mon inverter Airton

    j’ai réussi via l’oscilloscope à reproduire le 22° chaud… mais vraiment un coup du hasard 🙁 je viens de commander les LED que tu préconise on va voir si ça marche mieux !!!

    merci en tout cas pour ton partage !

  16.  aymenzayani

    salut , comment je peux trouver la réference du capteur infrarouge pour un climatiseur

  17.  AlphaK

    Ça dépend de ce que tu veux faire au final. Il n’existe pas de méthode miracle.

 Laisser un commentaire