jeudi 17 janvier 2013

Clonage d'une télécommande infrarouge avec un Arduino (2)

Cette rubrique fait suite à "Clonage d'une télécommande infrarouge avec un Arduino (1)".  Cette fois, je vais décrire comment j'ai cloné la télécommande d'un téléviseur de marque Sharp (modèle G1395SA), dont le protocole n'a pas été reconnu par la librairie IRremote.

J'effectue donc les mêmes étapes décrites à la rubrique précédente, en pointant la télécommande vers un détecteur à infrarouge TSOP4836 branché à la pin 11 d'un Arduino qui exécute le sketch "IRrecvDump", et voici ce qu'affiche le moniteur série de l'IDE:

6D5D1DB3
Unknown encoding: 6D5D1DB3 (32 bits)
Raw (32): 22194 350 -1750 300 -700 350 -700 350 -700 350 -700 350 -700 300 -1750 350 -1750 350 -700 300 -1750 350 -700 350 -700 350 -700 350 -1750 300 -700 350
Pas de panique:  bien que la librairie n'ait pas reconnu le protocole utilisé, elle  fournit malgré tout les données brutes, c'est à dire une liste de durées, en microsecondes, pendant lesquelles la LED est soit allumée (nombres positifs), soit éteinte (nombres négatifs).  En principe, il s'agit de mettre ces valeurs dans un "array", d'utiliser la commande "sendRaw" 3 fois de suite, et tout fonctionne à merveille!

...Sauf que dans mon cas, ça n'a pas fonctionné du tout:  le téléviseur restait obstinément sourd à toutes mes tentatives de le soumettre aux ordres de l'Arduino.

J'ai donc été obligé d'observer directement le signal émis par la télécommande au moyen d'un oscilloscope (l'oscilloscope est branché à la sortie du détecteur TSOP4836).

Voici ce que ça donne:


Chaque fois que j'appuie sur le bouton "on/off", la télécommande émet 3 salves consécutives de signaux qui, à première vue, pourraient sembler identiques.

Je fais un zoom sur la première salve:


Le protocole est de type "pulse distance encoding", ce qui signifie que c'est le temps écoulé entre deux allumages successifs de la LED qui détermine la valeur logique "1" ou "0". Pour cette télécommande, la LED s'allume pendant 300 microsecondes (le signal mesuré sur le détecteur TSOP4836 est alors de 0 volt) .  Pour envoyer le signal "0", elle demeure éteinte pendant 800 microsecondes avant l'allumage suivant.  Pour envoyer le signal "1", elle demeure éteinte deux fois plus longtemps, soit 1600 microsecondes.

Cette première salve peut donc se résumer par le nombre binaire 100000110100010.

Voyons maintenant la deuxième salve, émise environ 45 millisecondes plus tard:


Elle est différente de la première, puisqu'elle correspond au message 100001001011101 (les cinq premiers bits sont identiques à ceux de la première salve, mais les 10 derniers sont inversés).

Quand à la troisième salve, elle est identique à la première.


Je comprend maintenant pourquoi ma première tentative n'avait pas fonctionné:  la librairie irRemote ne m'a fourni que les durées de la première salve; en émettant cette même salve 3 fois de suite, l'Arduino émettait un signal incorrect.

Voici le sketch permettant d'allumer et éteindre mon téléviseur toutes les 5 secondes (une LED infrarouge doit être branchée dans la sortie numéro 3 de l'Arduino).


Yves Pelletier (Twitter: @ElectroAmateur)

9 commentaires:

  1. Bonjour,

    Merci pour votre article qui m'a donné envie de tester le clonage d'une télécommande de climatiseur afin de le rendre accessible en réseau

    Voici ce que me donne le moniteur série sur l'allumage de la climatisation:

    997C9085
    Could not decode message
    Raw (100): 7860 3600 -1500 500 -1200 450 -1150 550 -500 450 -500 500 -500 400 -1250 500 -500 400 -600 550 -1100 450 -1250 500 -500 500 -1100 550 -450 500 -500 450 -1200 500 -1150 550 -450 500 -1150 500 -1150 500 -500 500 -500 500 -1150 450 -550 500 -500 500 -1150 500 -500 500 -450 550 -500 450 -500 500 -500 500 -500 500 -500 500 -500 500 -500 500 -500 500 -500 500 -500 500 -450 450 -550 500 -500 500 -500 500 -500 500 -1150 500 -500 500 -500 450 -1150 550 -500 450 -500 450


    Si je joue la trame en éliminant la première valeur, rien ne se passe.
    J'utilise : irsend.sendRaw(salve, 99, 38);

    Je précise que l'ir send fonctionne avec une autre télécommande qui est en mode NEC (irsend.sendNEC(0xC1CC8679, 32);)

    Auriez-vous une idée ?
    Merci beaucoup de votre aide.

    RépondreSupprimer
  2. Je crois que la seule façon d'en avoir le coeur net serait d'observer le signal émis par la télécommande au moyen d'un bon oscilloscope. C'est peut-être un problème similaire à celui que j'ai rencontré, quand la librairie ne tient pas compte de la totalité du signal émis.

    RépondreSupprimer
  3. hi,
    je trouve ton article super intéressant, il m'a beaucoup aidé dans mon projet, mais il y a une petite erreur car le décodage utilisé est le" Pulse Lenght Encoding" car c'est la largeur de tes impulsions qui diffèrent et non la distance qu'il y a entre elles.
    Mais en tout cas bravo pour ton article.

    RépondreSupprimer
  4. Non, dans mon cas les impulsions sont toutes de la même largeur et c'est le temps entre deux impulsions consécutives qui est variable (le signal mesuré sur le capteur IR est inversé: bas quand la LED est allumée, et haut quand la LED est éteinte).

    RépondreSupprimer
  5. Bonsoir,
    j'essaie de comprendre ce que représente la valeur hexadécimale (dans votre exemple sur cette page 6D5D1DB3) lorsque qu'il ne réussit pas à détecter le code (Unknown encoding).
    Est-ce que cette valeur a un sens ? Est-ce que c'est une quelconque transposition de la valeur brute en hexadécimale ?
    En vous remerciant,
    Stephane

    RépondreSupprimer
    Réponses
    1. Je m'étais posé la même question: je n'en ai aucune idée!

      Supprimer
  6. Bonjour,
    J'essaye de reproduire le signal de mes télécommandes mais je suis face à un problème. Rien ne se produit lorsque j'émmet un signal. Que ce soit en Raw, en Net ou que je reproduise le signal suite à une analyse Oscilloscope.
    Pour cibler le souci, j'ai chargé un sketch de lecture IR sur ma carte Nano et le sketch IRsend démo de la librairie sur ma Uno.
    Et voici ce que me donne mon moniteur à la réception:

    Unknown encoding: 4CB0FADF (32 bits)
    Raw (6): -10100 6400 -900 50 -2850 300
    CFB1259D
    Unknown encoding: CFB1259D (32 bits)
    Raw (10): -7000 50 -3050 4600 -150 150 -800 50 -50 2100

    alors que ma Uno envoi le code suivant:

    irsend.sendSony(oxa90,12);


    Par ailleurs, j'ai dû sortir la commande irsend de la boucle if de l'exemple car rien n'était encoyé dans le sketch original...

    J'ai du mal comprendre pourquoi le signa émis ne correspond pas au signal reçu...

    Merci d'avance pour les conseils que vous pourriez me donner.

    Bien à vous,

    Julien

    RépondreSupprimer
  7. bonjour,

    J'ai un peu de mal pour recopier le code d'un climatiseur mitsubishi. Tout d'abord j'ai du augmenter le nb de raw à 300. La telecommande envoie 291 raw.
    Le code de cette télécommande n'est pas reconnu bien sur.
    J'arrive difficilement à controler la clim avec les codes recopiés. Après vérification les codes ne sont pas totalement identique quand je les recoit sur l'arduino.
    C'est l'arduino qui n'est pas assez précis?
    Je n'ai pas d'osciloscope comment faire???

    Merci d'avance et tres bon tuto par ailleur

    RépondreSupprimer
  8. Bonjour,

    L'arduino est-il assez precis pour enregistrer un code non reconnu?
    J'ai du agrandir les raw à 300.
    Ca fonctionne pas super bien quand je comande mon appareil car le code recu semble pas assez précis.

    RépondreSupprimer