Existem diferentes formas de comunicar com um sistema. Uma das mais utilizadas, especialmente com a televisão, é o controle remoto por infravermelho (ou IR). Veremos como controlar um Arduino com um receptor e um controle remoto IR.
Neste tutorial, utilizamos um controle remoto IR frequentemente vendido em kits Arduino.
Pré-requisito : Dê sentidos ao seu robô
Material
- Computador
- Placa Arduino
- Cabo USB ou adaptador serial/USB para ligar a placa Arduino ao PC
- Controle remoto IR
- Receptor IR
- 3 Cabos Dupont
Princípio de funcionamento
Um controle remoto por infravermelho, como o nome sugere, utiliza luz para enviar comandos entre o transmissor e o receptor. O transmissor, que consiste num diodo, emite raios infravermelhos que viajam pelo ar. Esses sinais luminosos são recebidos por um fotodíodo, que é capaz de transformá-los em sinais elétricos.
A comunicação por infravermelho é limitada a alguns metros de distância e deve ser direta, ou seja, não pode haver nenhum objeto no caminho do sinal luminoso. Luzes de neon ou a luz solar também podem perturbar a transmissão.
Esquema
O receptor IR é um sensor capaz de receber ondas infravermelhas. Para ler o sensor, é necessário alimentá-lo pela saída 5V do Arduino e ler o sinal obtido com uma entrada digital (aqui, o pino 9).

Código
Para decodificar a informação proveniente do controle remoto, usaremos a biblioteca IRremote.h. Ela permite detectar qual botão foi pressionado. Cada botão corresponde a um código hexadecimal, que deve ser identificado para cada controle remoto IR. O código a seguir mostra o valor hexadecimal quando um botão é pressionado. Com ele, pode configurar o seu código de acordo com o seu controle remoto.
//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);
}
Aplicação
Uma das aplicações mais populares é controlar a cor de um LED RGB com um controle remoto. Vamos atribuir uma cor diferente a cada botão do controle remoto. É possível utilizar os outros botões para realizar outras ações, como aumentar/diminuir o brilho ou fazer piscar o 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);
}
Fontes
Retrouvez nos tutoriels et d’autres exemples dans notre générateur automatique de code
La Programmerie