Étiquettes : , , , ,

Il existent différents moyens de communiquer avec un système. L’un des plus utilisés, notamment avec la télévision, est la télécommande infrarouge. Nous allons voir comment piloter un Arduino à l’aide d’un récepteur et d’une télécommande IR.

Dans ce tutoriel, nous utilisons une télécommande IR couramment vendue dans les kits Arduino

Prérequis : Donnez des sens à votre robot

Matériel

  • Ordinateur
  • Carte Arduino
  • Câble USB ou adaptateur série/USB pour connecter la carte Arduino au PC
  • 1x télécommande IR
  • 1x récepteur IR
  • 3x câbles Dupont

Principe de fonctionnement

Une télécommande infrarouge, comme son nom l’indique, utilise la lumière pour envoyer des commandes entre l’émetteur et le récepteur. L’émetteur constitué d’une diode émet des rayons infrarouges qui voyagent dans l’air. Ces signaux sont ensuite réceptionnés par une photodiode, qui est capable de transformer le signal lumineux qu’elle reçoit en signal électrique.

La communication par infrarouge est limitée en distance à quelques mètres et doit être directe, c’est à dire qu’aucun objet ne doit se trouver sur la trajectoire du signal lumineux. Elle peut aussi être perturbée par les néons ou les rayons du soleil.

Schéma

Le récepteur IR est un capteur capable de réceptionner les ondes infrarouges. Pour lire le capteur il faut l’alimenter avec la sortie 5V de l’Arduino et lire le signal obtenu à l’aide d’une entrée digital. Ici, la broche 9.

Code

Pour décoder, les informations provenant de la télécommande nous allons utiliser la librairie IRremote.h . Elle va nous permettre de détecter quel bouton est appuyé. A chaque bouton correspond un code hexadécimale qui doit être identifié pour chaque télécommande IR. Le code suivant affiche la valeur hexadécimale lorsqu’on appuie sur un bouton et vous permet ainsi de configurer votre code en fonction de la télécommande.

//Library
#include "IRremote.h"

//Variable
int receiverPin = 9;
IRrecv irrecv(receiverPin);     
decode_results results;      

void setup(){
  Serial.begin(9600);
  Serial.println(F("IR Receiver Decoder")); 
  irrecv.enableIRIn(); // Start the receiver
}

void loop() {
  if (irrecv.decode(&results)){ // IR signal received?
    convertIR(); 
    irrecv.resume(); // receive the next value
  }  
}


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

  }
  delay(500);
}

Application

Une des applications les plus connues est de piloter la couleur d’une LED RGB à l’aide d’une télécommande. Pour chaque bouton de la télécommande nous allons faire correspondre une couleur. Il est possible d’utiliser les autres boutons pour réaliser une autre action comme baisser/augmenter la luminosité ou faire clignotter la LED.

//Library
#include "IRremote.h"
//Constant
const int receiverPin = 9;
#define ledRPin 11
#define ledGPin 5
#define ledBPin 6
//Variable
int power=50;
bool ledState=0;
IRrecv irrecv(receiverPin);     
decode_results results;      
void setup(){
 Serial.begin(9600);
 Serial.println(F("IR Receiver Decoder")); 
 irrecv.enableIRIn(); // Start the receiver
 pinMode(ledRPin,OUTPUT);
 pinMode(ledGPin,OUTPUT);
 pinMode(ledBPin,OUTPUT);
 lightRGB(255,0,0);
}
void loop()   /*----( LOOP: RUNS CONSTANTLY )----*/
{
 if (irrecv.decode(&results)){ // IR signal received?
   convertIR(); 
   irrecv.resume(); // receive the next value
 }  
}
void convertIR() // convert IR code
{
Serial.print(results.value);
Serial.print(F(" -> "));
 switch(results.value)
 {
 case 0xFFA25D: 
   Serial.print(F("POWER "));
   ledState=!ledState; 
   Serial.print(ledState);
   if(!ledState) lightRGB(0,0,0);
   break;
 case 0xFFE21D: Serial.print(F("FUNC/STOP")); break;
 case 0xFF629D: 
   Serial.print(F("VOL+ power:")); 
   power=power+10;
   power=min(power,100);
   Serial.print(power);
   break;
 
 case 0xFFA857: 
   Serial.print(F("VOL- power:")); 
   power=power-10;
   power=max(power,0);
   Serial.print(power);
   break;
 
 case 0xFF22DD: Serial.print(F("FAST BACK"));    break;
 case 0xFF02FD: Serial.print(F("PAUSE"));    break;
 case 0xFFC23D: Serial.print(F("FAST FORWARD"));   break;
 case 0xFFE01F: Serial.print(F("DOWN"));    break;
 case 0xFF906F: Serial.print(F("UP"));    break;
 case 0xFF9867: Serial.print(F("EQ"));    break;
 case 0xFFB04F: Serial.print(F("ST/REPT"));    break;
 case 0xFF6897: 
   Serial.print(F("0")); 
   if(ledState) lightRGB(255,255,255);   
   break;
 case 0xFF30CF: 
   Serial.print(F("1"));    
   if(ledState) lightRGB(255,0,0);
   break;
 case 0xFF18E7: Serial.print(F("2"));    
   if(ledState) lightRGB(0,255,0);
   break;
 case 0xFF7A85: Serial.print(F("3"));    
   if(ledState) lightRGB(0,0,255);
   break;
 case 0xFF10EF: Serial.print(F("4"));    
   if(ledState) lightRGB(255,55,55);
   break;
 case 0xFF38C7: Serial.print(F("5"));    
   if(ledState) lightRGB(55,255,55);
   break;
 case 0xFF5AA5: Serial.print(F("6"));    
   if(ledState) lightRGB(55,55,255);
   break;
 case 0xFF42BD: Serial.print(F("7"));    
   if(ledState) lightRGB(255,255,55);
   break;
 case 0xFF4AB5: Serial.print(F("8"));    
   if(ledState) lightRGB(255,55,255);
   break;
 case 0xFF52AD: Serial.print(F("9"));    
   if(ledState) lightRGB(55,255,255);
   break;
 case 0xFFFFFFFF: Serial.print(F(" REPEAT"));break;  
 default: 
   Serial.print(F(" unknown  "));
   lightRGB(0,0,0);
 }
 Serial.println();
 delay(500);
}
void lightRGB(int r, int g, int b){
 if(0){
   r=255-r;
   g=255-g;
   b=255-b;
 }
 analogWrite(ledRPin, r*power/100);
 analogWrite(ledGPin, g*power/100);
 analogWrite(ledBPin, b*power/100);
}

Sources

Retrouvez nos tutoriels et d’autres exemples dans notre générateur automatique de code
La Programmerie