Icono del sitio AranaCorp

Controla tu proyecto con un control remoto IR

Hay diferentes formas de comunicarse con un sistema. Uno de los más utilizados, especialmente con la televisión, es el control remoto por infrarrojos. Veremos cómo conducir un Arduino usando un receptor y un control remoto IR.

En este tutorial, usamos un control remoto IR comúnmente vendido en kits Arduino

Requisito previo: Dale sensores a su robot

Hardware

Principio de funcionamiento

Un control remoto infrarrojo, como su nombre lo indica, usa luz para enviar comandos entre el transmisor y el receptor. El transmisor que consiste en un diodo emite rayos infrarrojos que viajan en el aire. Estas señales son luego recibidas por un fotodiodo, que es capaz de transformar la señal de luz que recibe en una señal eléctrica.

La comunicación por infrarrojos está limitada en distancia a unos pocos metros y debe ser directa, es decir, ningún objeto debe estar en el camino de la señal luminosa. También puede ser perturbado por las luces de neón o los rayos del sol.

Diagrama

El receptor IR es un sensor capaz de recibir ondas infrarrojas. Para leer el sensor, debe recibir la salida de 5 V del Arduino y leer la señal obtenida mediante una entrada digital. Aquí, pin 9.

Código

Para decodificar, la información proveniente del control remoto usaremos la biblioteca IRremote.h . Nos permitirá detectar qué botón se presiona. Cada botón corresponde a un código hexadecimal que debe identificarse para cada control remoto IR. El siguiente código muestra el valor hexadecimal cuando se presiona un botón, lo que le permite configurar su código de acuerdo con el control 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);
}

Solicitud

Una de las aplicaciones más conocidas es controlar el color de un LED RGB mediante un control remoto. Para cada botón del control remoto haremos coincidir un color. Es posible usar los otros botones para realizar otra acción, como bajar / aumentar el brillo o parpadear el 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);
}

Fuentes

Encuentre otros tutoriales y ejemplos en el generador de código automático
Arquitecto de Código

Salir de la versión móvil