terça-feira, outubro 08, 2013

Controle Remoto Infravermelho Parte 4

Neste post vamos começar a brincar de usar um controle remoto IR para comandar um Arduino.


Vamos começar com algo bastante simples: acender um LED conforme a tecla pressionada no controle remoto. Para facilitar as coisas, vou usar a biblioteca que vimos no post anterior.

O primeiro passo é levantar quais os comandos gerados pelas teclas. Para isto basta conectar um módulo receptor IR no pino 11 de um Arduino e rodar o sketch IRrecvDemo. Para o controle remoto do meu tocador MP3 eu obtive os seguintes comandos:


O código é bastante simples:
/*
 * Exemplo de comando do Arduino via IR
 */

#include <IRremote.h>

// variaveis para recepção dos comandos IR
const int RECV_PIN = 11;
IRrecv irrecv(RECV_PIN);

// comandos
typedef unsigned long dword;
const dword addr = 0;
const dword cmdPlay = 0x22;
const dword cmdNext = 0xC2;
const dword cmdPrev = 0x02;
#define CMD_IR(cmd) ((addr << 24) | \
                     ((~addr & 0xFF) << 16) | \
                     (cmd << 8) | \
                     (~cmd & 0xFF) )

// pinos dos LEDs
const int LED_R = 4;
const int LED_Y = 3;
const int LED_G = 2;

void setup()
{
  // Configura conexões dos LEDS
  pinMode (LED_G, OUTPUT);
  pinMode (LED_Y, OUTPUT);
  pinMode (LED_R, OUTPUT);

  // Inicia recepção IR
  irrecv.enableIRIn();
}

void loop() {
  decode_results results;
  
  if (irrecv.decode(&results) && results.decode_type==NEC) {
    // recebeu um comando NEC
    switch (results.value) {
      case CMD_IR(cmdPlay):
        digitalWrite(LED_G, HIGH);
        digitalWrite(LED_Y, LOW);
        digitalWrite(LED_R, LOW);
        break;        
      case CMD_IR(cmdPrev):
        digitalWrite(LED_G, LOW);
        digitalWrite(LED_Y, HIGH);
        digitalWrite(LED_R, LOW);
        break;        
      case CMD_IR(cmdNext):
        digitalWrite(LED_G, LOW);
        digitalWrite(LED_Y, LOW);
        digitalWrite(LED_R, HIGH);
        break;        
    }
    // decodificar o próximo comando
    irrecv.resume();
  }
}

O único detalhe significativo é a macro CMD_IR, que monta o valor correspondente a cada comando, acrescentando o endereço e os complementos do endereço e comando, como vimos na parte 2.

O vídeo abaixo mostra o funcionamento:



No próximo post vamos fazer algo um pouco mais emocionante que acender LEDs.

3 comentários:

Haoji disse...

Esta biblioteca é muito legal!
Usei ela no https://garoa.net.br/wiki/TV-B-Garoa

fernando44797 disse...

Bom dia, tem com fazer esse codigo alem de receber ele tbem enviar ir no mesmo sketch
obrigado

Daniel Quadros disse...

Fernando: sim dá para enviar. O post anterior descreve o hardware (basicamente um LED IR em série com um resistor de 100 ohms ligado ao pino 3). A biblioteca possui funções para envio, veja os exemplos IRsendDemo e IRrecord.