fbpixel
Etiquetas: , , , ,
0
(0)

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

How useful was this post?

Click on a star to rate it!

Average rating 0 / 5. Vote count: 0

No votes so far! Be the first to rate this post.

As you found this post useful...

Follow us on social media!

We are sorry that this post was not useful for you!

Let us improve this post!

Tell us how we can improve this post?