Utiliser l’infrarouge avec une carte Arduino

1- Les composants

Utilisation d’un décodeur IR TSOP_4838. Ce composant intègre un démodulateur. Le signal doit être modulé en PWM à 38Khz et la led IR avoir une longueur d’onde accordée au spectre du décodeur, soit 950nm. Ces 2 valeurs sont optimales, il est possible de travailler sur les plages indiquées dans le datasheet moyennant une baisse des performances. Le décodeur renvoie la masse en présence du signal modulé et Vs au repos.

Un décodeur infrarouge offre 2 avantages par rapport aux cellules photo-sensible. Le premier est de supprimer le bruit ambiant, l’infrarouge émis par des sources de lumières ambiantes par exemple. Le deuxième est de faire émettre la led IR à forte puissance.

Caractéristique du TSOP 4838 :

  • Tension de fonctionnement : 2.7V – 5.5V
  • Courant max de sortie : 5mA
  • Pin : 1-OUT / 2-GND / 3-VS

2- Lire le signal IR avec Arduino

Source Adafruit

// We need to use the 'raw' pin reading methods
// because timing is very important here and the digitalRead()
// procedure is slower!
//uint8_t IRpin = 2;
// Digital pin #2 is the same as Pin D2 see
// http://arduino.cc/en/Hacking/PinMapping168 for the 'raw' pin mapping
#define IRpin_PIN      PIND
#define IRpin          2

// the maximum pulse we'll listen for - 65 milliseconds is a long time
#define MAXPULSE 65000

// what our timing resolution should be, larger is better
// as its more 'precise' - but too large and you wont get
// accurate timing
#define RESOLUTION 10

// we will store up to 100 pulse pairs (this is -a lot-)
uint16_t pulses[100][2];  // pair is high and low pulse
uint8_t currentpulse = 0; // index for pulses we're storing

void setup(void) {
  Serial.begin(9600);
  Serial.println("Ready to decode IR!");
}

void loop(void) {
  uint16_t highpulse, lowpulse;  // temporary storage timing
  highpulse = lowpulse = 0; // start out with no pulse length

//  while (digitalRead(IRpin)) { // this is too slow!
    while (IRpin_PIN & (1 << IRpin)) {      // pin is still HIGH      // count off another few microseconds      highpulse++;      delayMicroseconds(RESOLUTION);      // If the pulse is too long, we 'timed out' - either nothing      // was received or the code is finished, so print what      // we've grabbed so far, and then reset      if ((highpulse >= MAXPULSE) && (currentpulse != 0)) {
       printpulses();
       currentpulse=0;
       return;
     }
  }
  // we didn't time out so lets stash the reading
  pulses[currentpulse][0] = highpulse;

  // same as above
  while (! (IRpin_PIN & _BV(IRpin))) {
     // pin is still LOW
     lowpulse++;
     delayMicroseconds(RESOLUTION);
     if ((lowpulse >= MAXPULSE)  && (currentpulse != 0)) {
       printpulses();
       currentpulse=0;
       return;
     }
  }
  pulses[currentpulse][1] = lowpulse;

  // we read one high-low pulse successfully, continue!
  currentpulse++;
}

void printpulses(void) {
  // print it in a 'array' format
  Serial.println("ON, OFF (in microseconds)");
  for (uint8_t i = 0; i < currentpulse-1; i++) {
    Serial.print(pulses[i][1] * RESOLUTION, DEC);
    Serial.print(", ");
    Serial.print(pulses[i+1][0] * RESOLUTION, DEC);
    Serial.println(",");
  }
  Serial.print(pulses[currentpulse-1][1] * RESOLUTION, DEC);
}

Important :Les résultats retournés par Arduino ne sont pas fiables, les écarts entre deux mesures consécutives sont trop importants. Raspberry se montre plus rapide pour cette tâche, il est donc nécessaire de passer par ce dernier pour relever du code infrarouge brut.

3- Lire le signal infrarouge avec LIRC

Il est nécessaire de créer un fichier pour récupérer les résultats au format RAW. Le nom du bouton sera KEY_POWER.

L’instruction est la suivante :

sudo irrecord -f --device=/dev/lirc0 readIR.tmp

Se reporter à cette page pour plus d’informations.

Note : L’enregistrement requiert plusieurs codes infrarouges pour retrouver le protocole constructeur, il est nécessaire d’avoir une télécommande à portée de main pour générer du remplissage. C’est à l’enregistrement du nom du bouton qu’on s’affranchira du surplus.

Lire le signal Infrarouge avec la librairie IRremote d’Arduino

Le sketch IRrecvdump retourne le standard fabricant, le code hexa et brut du code IR reçu. Cette librairie est plus optimisée que le code Adafruit et plus simple d’utilisation que LIRC. C’est la meilleure solution.

4- Envoyer un code IR

Sous Arduino il existe la librairie IRremote qui remplit parfaitement ce rôle. Certainement que le code fournit par Adafruit pour lire un signal IR n’est pas optimisé pour cette plateforme. Par défaut la librairie supporte de nombreux protocoles constructeurs mais offre également la possibilité d’envoyer un code personnalisé de manière très simple. Par défaut la led IR doit être branché sur la sortie PWM 3.

Lien vers la librairie et son téléchargement ici

#include <IRremote.h>
IRsend irsend;

unsigned int shoot[9] = {3041,3751,836,2798,829,2792,2311,869,2341}; //

void setup()
{
  Serial.begin(9600);
}

void loop() {
      irsend.sendRaw(shoot,9,38); // 9=> longueur tableau , 38 => fréquence porteuse
      delay(5000);
}

Même code mais avec un standard fabricant :

#include <IRremote.h>

IRsend irsend;

void setup()
{
  Serial.begin(9600);
}

void loop() {
  if (Serial.read() != -1) {
    for (int i = 0; i < 3; i++) {
      irsend.sendSony(0xa90, 12); // Le code Sony et RC5/6 doit être répété 3 fois
      delay(40);
    }
    irsend.sendNEC(0xFF00FF,32);// arg1: code Hexa retourné par le sketch IRrecvdump / arg2: nbr de bits utilisés par l'encodage.
  }
}

Note :Plus d’infos sur la page IRremote de Ken Shirriff.

Une led IR consomme plus qu’une led classique, elle peut également dissiper une puissance plus élevée à l’utilisation d’un signal PWM. La modulation d’impulsion avec son rapport cyclique à 1/2 la laissant refroidir suffisamment.

Il est donc conseillé de se reporter au datasheet de la led IR pour calculer au plus juste la valeur de la résistance servant à limiter le courant la traversant.

Attention : Une sortie Arduino ne peut délivrer que 40mA au maximum !

5- Télécommande IR

Il existe des télécommandes IR à 2 euros sur Ebay. Ces télécommandes utilisent l’encodage NEC et envoie les données de 0 à 26, à l’exception des numéros 3.7.11.15.19 et 23, à l’adresse 0. La led IR a une longueur d’onde de 940nm et la porteuse est à 38kHz.

Disponible chez Mc Hobby ou chez

6- Gérer l’infra-rouge sur Attiny45/85

La librairie IRremote utilisée précédemment ne fonctionne pas sur les Attiny entre autres à cause des timers. Il est nécessaire dans un premier temps de récupérer un patch pour ces MCU afin de les utiliser dans l’IDE Arduino 1.0.1. Il est à installer dans le dossier sketch en créant un répertoire hardware.

Attention : Le patch ne fonctionne pas sur Arduino 1.5.6-r2, utiliser la version 1.0.1.

Le patch installé permet d’utiliser une majorité des librairies destinées initialement aux autres microcontrôleurs mais ne corrige pas la librairie IRremote. Heureusement un portage a été effectué, la librairie porte le même nom mais supporte les Attiny. La pin gérant l’émission IR est la 6, il n’a pas été possible de modifier cette dernière.

La librairie IRremote pour Attiny est disponible ici.

Deux autres librairies ont été déclinées à partir de IRremote_Attiny. L’une, IRtinyTX, uniquement pour l’émission de code NEC et brut, l’autre, IRtinyRX, uniquement pour la réception.

Télécharger les librairies IRTinyRX et IRTinyTX

7- Annexes

Une autre façon de procéder très intéressante est décrite dans cette page, l’auteur propose une solution légère en code sans recourir à des librairies.


So, what do you think ?

You must be logged in to post a comment.