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
Cool
Bonjour, quand je lance le programme, dans le moniteur série, il ne m’affiche pas les valeurs en hexadécimal, et ce n’est jamais les même. il me mets <> (logique). Pouvez-vous m’aidez ?
Pour afficher le valeur en hexadécimal il faut utiliser la commande Serial.print(valeur, HEX);
Si la valeur est toujours différente, ça peut venir d’une perturbation de lumière extérieure ou la télécommande n’est pas suffisamment dans l’axe
moi ca me met unknow pour tout les boutons
Bonjour,
quelle est la valeur reçue?
Serial.println(results.value, HEX);
Si le programme retourne « unknown », c’est que la valeur n’est pas présente dans la liste du switch case.
C’est vrai, C’est la quatrième fois que je consulte ce site.
J’ai 84 ans et je débute. PITIE et MERCI ! ! !