Site icon AranaCorp

Controle o seu projeto com um controle remoto IR

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

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

Exit mobile version