Utiliser un récepteur infrarouge

Réaliser des commandes à distance peut être utile dans de nombreux cas.

Bien évidement on a tout de suite en tête la télé, mais on peut aussi commander à distance une ambiance lumineuse, que ce soit pour avoir différentes ambiance lumineuse chez soi, ou pour faciliter le tournage d’une vidéo.

C’est aussi un moyen de configurer son circuit en évitant de rajouter trop de bouton.

Voici le montage de base :

Montage de haut
Montage de côté

Le récepteur infrarouge utilisez est un CHQ1838 dont voici la documentation :

https://datasheetspdf.com/pdf-file/788244/CHQ/CHQ1838/1

Ce qu’il y a retenir c’est que la fréquence de transmission est de 38 kHz.

Et pour se faciliter la tâche on utilise un module que l’on peut trouver facilement et à prix raisonnable sur les différents site de e-commerce :

Module CHQ1838 sur Amazon

La broche G correspond à la masse, la broche R à l’alimentation 5V et la broche Y à la data collectées (qui dans notre exemple est branché à la broche 11 de l’Arduino Uno et sera configuré en INPUT).

Pour envoyer les informations infrarouge, il faut utiliser une télécommande compatible. Le mieux étant bien sur d’acheter un kit.

Kit complet

Voici la télécommande que j’utilise dans mon cas :

Télécommande IR

Maintenant passons au code. Il serait très intéressant de développer tout le code qui décode les impulsions infrarouge pour déterminer l’information envoyé. Cependant, cela prendrait pas mal de temps, et notre objectif est de construire des dispositifs.

Nous allons donc utiliser une bibliothèque présente dans l’écosystème Arduino. C’est justement le grand avantage d’Arduino, c’est de pouvoir réaliser des dispositifs techniques sans se soucier de programmation bas niveau.

Sans avoir de grande compétence technique nous pouvons réaliser des dispositifs, ce qui est parfait dans l’optique de la réalisation d’un prototype. Bien évidemment si nous voulions industrialiser notre solution, il sera nécessaire de réaliser des optimisations, et ainsi comprendre comment fonctionne les bibliothèques que nous utilisons.

Voici comment installer une bibliothèque (ici IRremote) :

Se rendre dans Gérer les bibliothèque
Installer la bibliothèque IRRemote

Dans le code nous allons ensuite notre bibliothèque :

#include "IRremote.h"

Ensuite nous allons instancier 2 objets (IRrecv et decode_results) de la bibliothèque :

#define RECEIVER 11

IRrecv irrecv(RECEIVER);
decode_results results;  

Le but de ce montage sera de lire l’information sur le moniteur de série. Nous créons une fonction qui traduit l’information transmisse par la télécommande en une chaîne de caractère qui correspond aux information sur la télécommande :

void translateIR() {
  switch(results.value) {
    case 0xFFA25D: Serial.println("POWER");         break;
    case 0xFFE21D: Serial.println("FUNC/STOP");     break;
    case 0xFF629D: Serial.println("VOL+");          break;
    case 0xFF22DD: Serial.println("FAST BACK");     break;
    case 0xFF02FD: Serial.println("PAUSE");         break;
    case 0xFFC23D: Serial.println("FAST FORWARD");  break;
    case 0xFFE01F: Serial.println("DOWN");          break;
    case 0xFFA857: Serial.println("VOL-");          break;
    case 0xFF906F: Serial.println("UP");            break;
    case 0xFF9867: Serial.println("EQ");            break;
    case 0xFFB04F: Serial.println("ST/REPT");       break;
    case 0xFF6897: Serial.println("0");             break;
    case 0xFF30CF: Serial.println("1");             break;
    case 0xFF18E7: Serial.println("2");             break;
    case 0xFF7A85: Serial.println("3");             break;
    case 0xFF10EF: Serial.println("4");             break;
    case 0xFF38C7: Serial.println("5");             break;
    case 0xFF5AA5: Serial.println("6");             break;
    case 0xFF42BD: Serial.println("7");             break;
    case 0xFF4AB5: Serial.println("8");             break;
    case 0xFF52AD: Serial.println("9");             break;
    case 0xFFFFFFFF: Serial.println(" REPEAT");     break;  
    default:
      Serial.print("Value : "); 
      Serial.print(results.value, HEX);
      Serial.print("\n");
  }

  delay(500);
}

Maintenant nous en venant à l’initialisation du programme :

void setup() {
  pinMode(RECEIVER, INPUT);
  Serial.begin(9600);
  Serial.println("IR Receiver Button Decode :"); 
  irrecv.enableIRIn();
}

Puis on voici la boucle principale du programme :

void loop() {
  if (irrecv.decode(&results)) {
    translateIR(); 
    irrecv.resume();
  }  
}

Ainsi lorsque nous appuyons sur un bouton de la télécommande en direction du récepteur, on peut voir sur le moniteur de série que l’information a bien été réceptionnée.

Les informations s’affichent sur le moniteur de série

C’est sympa d’afficher des informations sur le moniteur de série, mais ce n’est pas palpitant.

Par conséquent j’ai décidé d’ajouter des LEDs qui seront commandées par la télécommande.

Rappel important, chacune des LEDs est protégées par des résistances de 220 Ohms.

Toutes les LEDs sont activés
La LED blanche est désactivée

Pour réaliser cette extension, on crée tout d’abord les constantes qui lient nos LEDs aux broches de l’ARDUINO Uno:

#define RED_LED 4
#define WHITE_LED 3
#define BLUE_LED 2

Ensuite au sein de la fonction translateIR() nous réalisons les modifications suivantes :

    case 0xFF30CF: 
      Serial.println("1");
      digitalWrite(RED_LED, HIGH);             
      break;
    case 0xFF18E7: 
      Serial.println("2");
      digitalWrite(RED_LED, LOW);             
      break;
    case 0xFF7A85: 
      Serial.println("3");         
      digitalWrite(WHITE_LED, HIGH);    
      break;
    case 0xFF10EF: 
      Serial.println("4");   
      digitalWrite(WHITE_LED, LOW);           
      break;
    case 0xFF38C7: 
      Serial.println("5");
      digitalWrite(BLUE_LED, HIGH);
      break;
    case 0xFF5AA5: 
      Serial.println("6");             
      digitalWrite(BLUE_LED, LOW); 
      break;

Ainsi lorsque nous appuyons sur le bouton 1, nous allumons la LED rouge, et nous l’éteignons lorsque nous appuyons sur le bouton 2. Et ainsi de suite pour les LEDs blanche et bleu.

Aucune modification n’est nécessaire sur la boucle principale, par contre il est nécessaire d’apporter certains ajouts lors de l’initialisation (la fonction setup()) :

  pinMode(RED_LED, OUTPUT);
  pinMode(WHITE_LED, OUTPUT);
  pinMode(BLUE_LED, OUTPUT);

Enfin voici le code dans son intégralité :

#include "IRremote.h"
#define RECEIVER 11
#define RED_LED 4
#define WHITE_LED 3
#define BLUE_LED 2

IRrecv irrecv(RECEIVER);     // create instance of 'IRrecv'
decode_results results;      // create instance of 'decode_results'

void translateIR() {
  switch(results.value) {
    case 0xFFA25D: Serial.println("POWER");         break;
    case 0xFFE21D: Serial.println("FUNC/STOP");     break;
    case 0xFF629D: Serial.println("VOL+");          break;
    case 0xFF22DD: Serial.println("FAST BACK");     break;
    case 0xFF02FD: Serial.println("PAUSE");         break;
    case 0xFFC23D: Serial.println("FAST FORWARD");  break;
    case 0xFFE01F: Serial.println("DOWN");          break;
    case 0xFFA857: Serial.println("VOL-");          break;
    case 0xFF906F: Serial.println("UP");            break;
    case 0xFF9867: Serial.println("EQ");            break;
    case 0xFFB04F: Serial.println("ST/REPT");       break;
    case 0xFF6897: Serial.println("0");             break;
    case 0xFF30CF: 
      Serial.println("1");
      digitalWrite(RED_LED, HIGH);             
      break;
    case 0xFF18E7: 
      Serial.println("2");
      digitalWrite(RED_LED, LOW);             
      break;
    case 0xFF7A85: 
      Serial.println("3");         
      digitalWrite(WHITE_LED, HIGH);    
      break;
    case 0xFF10EF: 
      Serial.println("4");   
      digitalWrite(WHITE_LED, LOW);           
      break;
    case 0xFF38C7: 
      Serial.println("5");
      digitalWrite(BLUE_LED, HIGH);
      break;
    case 0xFF5AA5: 
      Serial.println("6");             
      digitalWrite(BLUE_LED, LOW); 
      break;
    case 0xFF42BD: Serial.println("7");             break;
    case 0xFF4AB5: Serial.println("8");             break;
    case 0xFF52AD: Serial.println("9");             break;
    case 0xFFFFFFFF: Serial.println(" REPEAT");     break;  
    default:
      Serial.print("Value : "); 
      Serial.print(results.value, HEX);
      Serial.print("\n");
  }

  delay(500);
}

void setup() {
  pinMode(RECEIVER, INPUT);
  pinMode(RED_LED, OUTPUT);
  pinMode(WHITE_LED, OUTPUT);
  pinMode(BLUE_LED, OUTPUT);
  Serial.begin(9600);
  Serial.println("IR Receiver Button Decode :"); 
  irrecv.enableIRIn();
}

void loop() {
  if (irrecv.decode(&results)) {
    translateIR(); 
    irrecv.resume();
  }  
}

Pour marque-pages : Permaliens.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *