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
        https://itechnofrance.wordpress.com/2013/02/23/utiliser-un-capteur-infrarouge-pour-dcoder-une-tlcommande-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
        }

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

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s

%d blogueurs aiment cette page :