É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.

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

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é.

//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