Accueil > Arduino, Matériel > Librairie IRremote pour Arduino

Librairie IRremote pour Arduino

Cette librairie permet d’émettre et de recevoir via l’infrarouge; elle permet de gérer les protocoles NEC, Sony, Philips RC5/RC6 et le traitement de données brutes. Nous allons voir comment la mettre en œuvre.

Les informations concernant l’utilisation de cette librairie se trouvent à l’adresse  http://www.righto.com/2009/08/multi-protocol-infrared-remote-library.html

La librairie peut être téléchargée à l’adresse https://github.com/shirriff/Arduino-IRremote

Il faut décompresser le fichier ZIP et copier le contenu dans le dossier Arduino ‘libraries\IRremote’.

Pour tester l’utilisation de celle-ci, il faut utiliser un récepteur infrarouge 38 KHz, une résistance de 100 Ohms et une LED émettrice infrarouge. Le câblage sera le suivant sur l’Arduino :

image

Pour la partie récepteur, il est possible d’indiquer la broche utilisée mais pour la partie émetteur la broche 3 est codée en dur dans la librairie.

La librairie comporte 2 fonctions essentielles, IRsend pour émettre un code et IRrecv pour recevoir un code.

Le programme de test pour la réception sera le suivant :

/*
   Reception infrarouge
*/

#include <IRremote.h>

int broche_reception = 11; // broche 11 utilisée
IRrecv reception_ir(broche_reception); // crée une instance
decode_results decode_ir; // stockage données reçues

void setup()
{
  Serial.begin(9600);
  reception_ir.enableIRIn(); // démarre la réception
}

void loop()
{
  if (reception_ir.decode(&decode_ir))
  {
    Serial.println(decode_ir.value, HEX);
    reception_ir.resume(); // reçoit le prochain code
  }
}

Télécharger le programme dans l’Arduino puis ouvrir le moniteur série; ensuite prenez une télécommande et appuyez sur une touche quelconque. Si le protocole est reconnu, l’affichage d’un code Hexadécimal devrait apparaitre :

image

J’ai essayé avec une télécommande ‘CGV’ (décodeur TNT) et une télécommande ‘SFR’, les 2 sont bien reconnues. Lorsque le code FFFFFFFF apparait, cela veut dire que vous êtes resté appuyer trop longtemps sur le bouton de la télécommande.

Maintenant que l’on peut obtenir les codes correspondant à chaque touche, on va s’intéresser à la partie émission.

Afin de pouvoir envoyer un code, il faut connaitre le protocole utilisé, pour cela il faut charger le programme d’exemple de la librairie IRremote ‘IRrecvDump’; télécharger le programme dans l’Arduino puis ouvrir le moniteur série. Taper la touche on/off de la télécommande :

image

on récupère le code en Hexadécimal, le protocole utilisé (NEC) et le codage effectué en 32 bits. Noter ces informations.

Le code sera le suivant qui permettra d’allumer et d’éteindre le décodeur TNT toutes les 10 secondes :

/*
  Emission infrarouge
*/

#include <IRremote.h>

IRsend emission_ir; // crée une instance

void setup()
{
}

void loop()
{
   emission_ir.sendNEC(0xff38c7, 32); // code télécommande CGV on/off
   delay(10000);
}

La fonction qui gère le protocole NEC est sendNEC(0xaaaaaa, b) où aaaaaa correspond au code Hexadécimal et b le nombre de bits.

Les fonctions disponibles pour les différents protocoles sont :

void sendNEC(unsigned long data, int nbits);
void sendSony(unsigned long data, int nbits);
void sendRaw(unsigned int buf[], int len, int hz);
void sendRC5(unsigned long data, int nbits);
void sendRC6(unsigned long data, int nbits);
void sendDISH(unsigned long data, int nbits);
void sendSharp(unsigned long data, int nbits);
void sendPanasonic(unsigned int address, unsigned long data);
void sendJVC(unsigned long data, int nbits, int repeat);

A vous de jouer Clignement d'œil

Catégories :Arduino, Matériel Étiquettes : ,
  1. je5650
    13/08/2013 à 13:10

    Qui peu m aider pour ma T/C handicapée ?

  2. je5650
    13/08/2013 à 13:49

    Bonjour merci d avoir répondu, si vous voulez bien je envois sur le forum suivant :

    http://forum.snootlab.com/viewtopic.php?f=36&t=996&start=20

    lisez le dernier message, je suis michel5650 sur ce forum
    si vous préférer je transmet les éléments ici

    • 13/08/2013 à 18:57

      Ok je regarde cela demain et vous tiens au courant si je peux vous aider

  3. je5650
    13/08/2013 à 19:03

    Merci l’objectif est de simplifier une T/C IR d’un WC japonais pour handicapée qui est pas simple pour une personne en difficulté, sur la nouvelle tc elle doit appuyer sur un seul bouton et tout le cycle se fait en auto qui est loin d’être le cas aujourd’hui hui, et je ne suis pas suffisamment qualifier

    Pour simplifier je récupère ce protocole le voici :
    FFFFFFFF
    FFFFFFFF (0 bits)
    Raw (82): -8000 500 -600 400 -1500 500 -1500 550 -400 550 -1450 500 -500 550 -1450 500 -1500 550 -450 500 -500 550 -450 500 -600 400 -500 500 -500 500 -1450 650 -350 550 -450 600 -1400 550 -550 450 -1450 500 -1500 500 -500 500 -1550 450 -1500 550 -450 500 -1450 500 -1600 450 -450 500 -1500 550 -450 550 -1450 500 -1500 500 -500 450 -550 500 -500 550 -400 500 -1500 550 -450 550 -450 500 -1550 400

    Que je n’arrive pas transmette
    Merci de m’aider

    • 13/08/2013 à 19:09

      Pour récupérer les données transmises, utilisez vous la librairie iremote ?
      Ensuite si c’est le cas, il faut que votre télécommande utilise un protocole supporté par la librairie (NEC…)

      • je5650
        14/08/2013 à 11:45

        Bonjour, j ai pas encore fait le teste, je pense que la TC va générer beaucoup de lignes quand il faudra les transmettes mon prog risque d être très long, surtout que je vais appel plusieurs fois au même protocole
        Question: sera t il possible de les mettre dans un fonction Void?
        Bonne journée

  4. je5650
    13/08/2013 à 19:22

    oui j utilise iremtote , je récupère le code avec IRrecvDump vous voyez le resultat plus haut

  5. je5650
    13/08/2013 à 19:31

    je poste mon programme teste pour l émission ir

    int buzzer=6; // Sonnerie debut fin cycle
    // Del infarouge en dur sur IRremote cabler sur pin 3
    int alim=12; // Sortie 12 maintient l alimentation le temps du cycle

    int entree1 = 1; //Bouton lavage + bidet + sechage

    void setup() {
    pinMode(entree1, INPUT);

    pinMode(6,OUTPUT); // Met la pin 6 sur sortie qui est le buzzer
    pinMode(alim,OUTPUT); // Met la pin 12 sur sortie qui est l auto alimentation
    }

    #include

    IRsend irsend;

    unsigned int lavage[82]={500,600,400,1500,500,1500,550,400,550,1450,500,500,550,1450,500,1500,550,450,500,500,550,450,500,600,400,500,500,500,500,1450,650,350,550,450,600,1400,550,550,450,1450,500,1500,500,500,500,1550,450,1500,550,450,500,1450,500,1600,450,450,500,1500,550,450,550,1450,500,1500,500,500,450,550,500,500,550,400,500,1500,550,450,550,450,500,1550,400};

    void loop(){

    // ************************************* Cycle de nettoyage complet ****************

    if (digitalRead(entree1) == HIGH) { //Auto alimentation bouton sur l entrée 1 pour lavage complet sortie 12 pour l alime
    digitalWrite(alim, HIGH); // Met la pin 12 a 1 pour s auto-alimenter a travers le relais reed

    digitalWrite(buzzer, HIGH); // Sonne le buzzer pour prevenir le lavage
    delay(100);
    digitalWrite(buzzer, LOW);
    Serial.begin(9600);

    irsend.sendRaw(lavage,82,38);
    delay(6*1000); // Temps que la buse arrive en position
    }

    digitalWrite(alim, LOW); // coupe l alimentation
    delay(1000);
    }

    • 13/08/2013 à 20:54

      J’insiste sur le fait de la capture des données de la télécommande. Car je n’ai pas pu utiliser librairie irremote pour capturer une télécommande d’appareil photo canon et émettre ces même signaux par exemple

      • je5650
        13/08/2013 à 21:11

        oui c est possible il faut trouver un moyens pour la capture, peut etre un oscilo
        si tu as une autre idée

      • 13/08/2013 à 21:15

        J’ai écrit un article pour décoder la télécommande canon : Utiliser un capteur infrarouge pour décoder une télécommande IR | iTechnoFrance

        Utiliser un capteur infrarouge pour décoder une télécommande IR

      • 13/08/2013 à 21:16

        Sinon effectivement c’est l’utilisation d’un oscilloscope qui est le meilleur moyen

      • je5650
        13/08/2013 à 22:09

        Merci je vais tester

      • je5650
        14/08/2013 à 11:50

        Bonjour, j ai pas fait le teste, mais je pense que ma TC va générer beaucoup de lignes
        pour simplifier mon prog d émission est il possible t utiliser la fonction Void pour chaque protocole?
        Bonne journée

  6. je5650
    16/08/2013 à 10:44

    Bonjour un petit mot pour dire que ca marche
    Merci

  7. alexandre
    30/03/2014 à 23:40

    bonjour
    Je suis débutant en Arduino et il me faut un code pour mesurer le temps entre deux obstacles franchi l’un après l’autre et l’affiché sur l’afficheur de l’arduino. Si quelqu’un peut m’aider ces très important je suis en DUT informatique et je suis loin de trouver ce que je cherche.
    Merci

    • 02/04/2014 à 08:42

      Bonjour, vous pouvez en dire plus car je ne comprends pas votre besoin

  8. Olivier
    03/06/2014 à 16:03

    Bonjour, j’aurais besoin d’aide. Quand je test ma télécommande, je reçoit ce code :
    68733A46
    Unknown encoding: 68733A46 (32 bits)
    Raw (68): -31068 4450 -4500 550 -1650 650 -1600 550 -1650 550 -600 600 -550 500 -600 600 -500 500 -600 550 -1650 550 -1700 550 -1650 550 -600 600 -500 600 -550 500 -600 500 -600 550 -1650 550 -1700 550 -1650 550 -600 550 -600 500 -600 500 -600 600 -500 550 -550 550 -550 550 -600 500 -1700 550 -1650 550 -1750 550 -1650 550 -1650 550

    Que dois-je faire pour pouvoir le reproduire ?
    faut-il mettre  » void sendRaw  » ou autre chose ? Merci

    • Houssem94
      21/01/2016 à 00:43

      c-a-d tu veux envoyé le code ou tu veux le convertitr en 0 et 1 et s’avoir qu’elle protocole tu utilise ?

  9. houssem94
    04/02/2015 à 18:48

    Salut svp , est ce que ce programme la peut générer le protocole philips rc6 (36bits )!! car j’ai essayer de le faire en utilisant la librairie IRremote https://github.com/shirriff/Arduino-IRremote/blob/master/IRremote.cpp , le module « décode » fonctionne mais le problème est dans le module « send » ne marche pas , j’ai essayer de chmager le code comme de changer le type de « resutls->value » de long (32 bits)vers long long(64 bits ) pour que je puisse stocké la trame , en plus je suis pas vraiment satisfait par la parti de « HEADER » dans le module « send » , qui as déjà essayer de tester ce protocole la !!?
    Bon journée

  10. Pierre
    11/04/2015 à 19:52

    Bonjour,
    Bien que la réception de données fonctionne, l’envoie ne marche pas. Je reçois un message d’erreur:

    Arduino : 1.6.3 (Windows 7), Carte : « Arduino Uno »

    sketch_apr11a.ino: In function ‘void loop()’:

    sketch_apr11a.ino:15:16: error: ‘class IRsend’ has no member named ‘sendNEC’

    Erreur lors de la compilation.

    Je n’arrive pas à solutionner ce problème, quelqu’un aurait il une piste?
    Merci d’avance

    • 23/07/2015 à 03:00

      Il faut prendre la dernière version de cette librairie:
      https://github.com/shirriff/Arduino-IRremote/releases/tag/MAJOR

    • Nervious
      25/07/2015 à 16:32

      Je suis dans le même cas que vous, une solution serait la bien venu

      • Houssem94
        21/01/2016 à 00:38

        voici le module de transmission qui fonctionne :

        /*
        * The RC6 protocol also phase encodes databits although the phasing is opposite of RC5.
        */
        #define RC6_HDR_MARK 2666
        #define RC6_HDR_SPACE 889
        #define RC6_T1 444
        void IRsendRC6::send(unsigned long data, unsigned char nbits)
        {
        enableIROut(36);
        data = data << (32 – nbits);
        Extent=0;
        mark(RC6_HDR_MARK); space(RC6_HDR_SPACE);
        mark(RC6_T1); space(RC6_T1);// start bit "1"
        int t;
        for (int i = 0; i < nbits; i++) {
        if (i == 3) {
        t = 2 * RC6_T1; // double-wide trailer bit
        }
        else {
        t = RC6_T1;
        }
        if (data & TOPBIT) {
        mark(t); space(t);//"1" is a Mark/space
        }
        else {
        space(t); mark(t);//"0" is a space/Mark
        }
        data <<= 1;
        }
        space(107000-Extent); // Turn off at end
        }

  11. 28/06/2016 à 22:37

    Je débute et bute avec ce programme ; )
    Je viens de transférer le croquis dans mon arduino. Lorsque je test une télécommande, la led « L » de la carte clignote donc quelque chose se passe mais rien n’est jamais afficher dans le moniteur série. Où est donc le problème.
    NB : j’ai le même problème avec d’autre croquis IR/télécommande trouvés sur le net
    Merci de votre aide avisée 🙂
    Thierry

  12. marco
    29/08/2016 à 04:05

    bonjour j’ai réussi a faire fonctionner le système avec plusieurs télécommandes mais je bute sur la télécommande du décodeur de canal sat y a t il une particularité avec la télécommande de canal sat

  13. augu49
    02/01/2017 à 21:39

    bonjour, j ai fait ce code pour faire une deuxième télécommande :
    #include

    IRsend irsend;

    int power = 0;
    int source = 0;

    void setup()
    {
    Serial.begin(9600);
    pinMode(6,INPUT);
    pinMode(7,INPUT);
    }

    void loop() {
    power = digitalRead(6);
    source = digitalRead(7);

    if (power == HIGH) {
    irsend.sendRC5(2A, 12);
    delay(40);

    }
    }

    mais la ligne
    irsend.sendRC5(2A, 12);
    me fait une erreur car le A n existe pas alors que j ai bien fait toutes les instructions et le code de la télécommande est bon

    • augu49
      02/01/2017 à 21:41

      mais sinon le programme fonctionne avec une autre tv

  14. jeanlouisquero
    01/03/2017 à 18:46

    merci pour ces infos cela fonctionne mais j’ai un 2ème infrarouge
    et je n’arrive pas à le déclarer

    merci de votre aide

    je découvre arduino alors !! pas facile

  15. jeanlouisquero
    01/03/2017 à 18:48

    c’est lui

    Obstacle infrarouge IR Avoidance Sensor Module pour Arduino Smart Car Robot 3 fils

  16. RANDRIAMANAMPY
    30/06/2017 à 18:27

    does not name a type Message d,erreur apres verification .J ai deja telecharger le IRremote.h et deja recopie dans la librairie Le programe s,arrete au niveau du code IRsend irsend; QUE ferais je pour corriger erreur .Le montage me semble correct. un diode IR et un module recepteur infra rouge trois broches .

  17. Tetralia
    09/02/2019 à 22:43

    Bonjour je n’arrive pas a détecter le protocole d’un fusil laserX , la réponse donnée est :

    Encoding : UNKNOWN
    Code : 33EBDD7A (32 bits)
    Timing[17]:
    +6250, – 550 + 450, – 600 +1500, – 550 + 500, – 550
    +1550, – 550 + 450, – 600 + 450, – 650 +1500, – 550
    +1500
    unsigned int rawData[17] = {6250,550, 450,600, 1500,550, 500,550, 1550,550, 450,600, 450,650, 1500,550, 1500}; // UNKNOWN 33EBDD7A

    • Tetralia
      09/02/2019 à 22:48

      Comment savoir quel protocole est utilisé et comment l’ajouter ?

    • 09/02/2019 à 22:51

      bonsoir,
      2 solutions, soit le protocole est inconnu comme dans votre cas et dans ce cas notez les valeurs brut (raw) à envoyer en émission et effectuer un test; soit votre fusil n’utilise pas la modulation à 38 Khz des télécommandes standards.
      J’ai déjà était confronté à ce genre de problème avec une télécommande d’appareil photo Nikon, et dans ce cas il faut brancher sur votre Led Infrarouge un analyseur logique pour étudier le signal

      • Tetralia
        09/02/2019 à 22:53

        Merci de cette réponse très rapide 😉 Comment tester avec les valeurs brut ?

      • 10/02/2019 à 13:45

        La librairie le permet

  18. un random
    11/03/2019 à 22:04

    bonsoir, comment peut-on réutiliser les données réceptionnées? merci d’avance

    • 12/03/2019 à 18:31

      bonsoir, regardez mes différents articles qui parlent de la réception infrarouge et notemment de la modification d’une lampe de bureau où j’utilise simplement cette librairie

  19. ibtihèl brini
    01/05/2019 à 00:11

    bonsoir , je compte commander un climatiseur via une carte nodemcu esp8266 j’ai trop essayé mais pas de résultat , en fait je peux lire la trame mais cela ne fonctionne pas avec le irsend sachant que la trame est de type unkown et j’ai trouvé une autre SAMSUNG , y a t il une solution svp ?? c urgent . merci

  20. Rai
    16/05/2019 à 01:43

    Bonjour je suis élève en 1er et je débute actuellement mon projet comporte une partie récepteur j’aimerai savoir comment peut on faire pour télécharger irrevdump dans l’arduino je n’ai pas compris cette partie merci d’avance de m’accorder un peu de votre temps pour me répondre. Bonne continuation

    • 25/05/2019 à 21:10

      Bonsoir
      Il suffit de sélectionner le programme irrevdump fournie par la librairie dans l’ide arduino

  1. 30/04/2013 à 14:40
  2. 15/02/2016 à 12:16

Répondre à je5650 Annuler la réponse.