Como receber sinal de um controle remoto com infravermelho (TV, DVD, outros) com o arduino

Olá, amantes de robótica!
Como ler o sensor de infra vermelho de controle remoto.
Com o receptor infravermelho você poder receber o código do controle remoto da tv, dvd e outros.
Neste post irei falar como receber os dados do controle.



Veja o vídeo do receptor de infravermelho em funcionamento:





Vamos ao material que precisamos: 



Qtd     Itens:
1      -  Arduino UNO ou qualquer outra versão;
1      -  Receptor de infravermelho;
1      -  Controle remoto pode ser de tv, dvd, mp3;
1      -  Resistor 20 ohms (para usar no receptor);
1      -  Led vermelho;
1      -  Led verde;
1      -  Led Amarelo;
3      -  Resistor 200 ohms (para o led);
6      -  Jumpers (Fios).

Não sabe onde comprar as peças, confira esse post:  onde comprar arduino e componentes

Vamos à montagem:



Basta fazer as mesmas conexões da imagem abaixo:
(clique na imagem pra ampliá-la)

Atenção:
Cuidado com o ligamento do infravermelho, porque você pode ligar errado e esquentá-lo até que ele queime.


Veja as fotos do projeto:








O mais importante, o código fonte:



Não sabe programar? Então acesse: Como programar em Arduíno, fazer robôs e projetos diversos
Se você é iniciante veja:Como enviar (upload) o programa pronto para a placa do arduino uno, mega entre outros

Atenção:
Para o código fonte funcionar é necessário baixar as bibliotecas: Baixar Library.

 /*   
  >>>>> Criando Robô Com Arduino <<<<<   
  ##### Robôs, Projetos e Tutoriais! #####  
  .:: Site principal: http://www.CriandoRoboComArduino.com/     
  .:: Site secundário: http://www.TestCriandoRoboComArduino.com/  
  ========== IMPORTANTE ==========   
  O código está livre para usar, citar, alterar e compartilhar,  
  desde que mantenha o site como referência.   
  Obrigado.  
  --------------------------------------------------------------------------------------------------  
  Projeto: Como receber sinal de um controle remoto com infravermelho (TV, DVD, outros) com o arduino   
  ---------------------------------------------------------------------------------------------------  
 */   
  #include <IRremote.h>// incluindo a biblioteca do infravermelho    
  const int RECEBE_PINO = 2; // pino 6 no arduino    
  int ledverde = 7;// led no pino 10    
  int ledamarelo = 6;    
  int ledvermelho = 5;    
  IRrecv ir_recebe(RECEBE_PINO); // declarando a variável do sensor    
  decode_results codigo_recebido; // resultado    
  void setup()    
  {    
  Serial.begin(9600); //mostra o resultado no computador    
  ir_recebe.enableIRIn(); // inicia a recepção    
  pinMode(ledverde, OUTPUT); //defini led como saída    
  pinMode(ledamarelo, OUTPUT);    
  pinMode(ledvermelho, OUTPUT);    
  }    
  void loop() {    
  if (ir_recebe.decode(&codigo_recebido)) {//verifica se um codigo foi recebido    
   if (codigo_recebido.value != 0 ){   
   Serial.println(codigo_recebido.value, HEX); //mostra no serial o resultado    
   }   
   //tem que colocar o 0x antes do numero hexadecimal, pois só assim para poder comparar no if    
   //liga led verde    
   if ((codigo_recebido.value == 0x39C618E7) || (codigo_recebido.value == 0xFF30CF)){// verifica se foi pressionado o numero 1 dos controles    
   digitalWrite(ledverde, HIGH);    
   delay(500);    
   }    
   //desliga led verde    
   if ((codigo_recebido.value == 0x39C658A7) || (codigo_recebido.value == 0xFF10EF)){// verifica se foi pressionado o numero 4 dos controles    
   digitalWrite(ledverde, LOW);    
   delay(500);    
   }    
   //liga led amarelo    
   if ((codigo_recebido.value == 0x39C69867) || (codigo_recebido.value == 0xFF18E7)){// verifica se foi pressionado o numero 2 dos controles    
   digitalWrite(ledamarelo, HIGH);    
   delay(500);    
   }    
   //desliga led amarelo    
   if ((codigo_recebido.value == 0x39C628D7) || (codigo_recebido.value == 0xFF38C7)){// verifica se foi pressionado o numero 5 dos controles    
   digitalWrite(ledamarelo, LOW);    
   delay(500);    
   }    
   //liga led vermelho    
   if ((codigo_recebido.value == 0x39C6D02F) || (codigo_recebido.value == 0xFF7A85)){// verifica se foi pressionado o numero 3 dos controles    
   digitalWrite(ledvermelho, HIGH);   
   delay(500);    
   }    
   //desliga led vermelho    
   if ((codigo_recebido.value == 0x39C6E01F) || (codigo_recebido.value == 0xFF5AA5)){// verifica se foi pressionado o numero 6 dos controles    
   digitalWrite(ledvermelho, LOW);    
   delay(500);    
   }    
   ir_recebe.resume(); // recebe o próximo código   
   delay(200);    
  }    
  }   
 /*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::  
   >>>>> Acesse os sites: <<<<<  
   .:: Robôs, Projetos e Tutoriais  
     http://www.CriandoRoboComArduino.com/     
   .:: Testes dos robôs, noticias sobre robótica e muito mais  
     http://www.TestCriandoRoboComArduino.com/  
   >>>>> Inscreva-se nos canais no Youtube: <<<<<  
   .:: Vídeos dos robôs, projetos e tutoriais  
     Criando Robô Com Arduino  
     https://www.youtube.com/CriandoRoboComArduin  
   .:: Mostrando os testes dos robôs e projetos  
     Test Criando Robô Com Arduino  
     https://www.youtube.com/TestCriandoRoboComAr  
   :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/  

Código Atualizado!

Atenção:
Nos ifs do código, coloquei duas comparações, porque usei dois controles diferentes.


Pronto, qualquer duvida é só deixar nos comentários ou entrar em Contato 

Quer ajuda ou quer ajudar? Clique em Ajuda e veja como você pode ajudar ou ser ajudado.



44 comentários:

  1. O meu controle estava recebendo o próprio código e mais uma sequência de "FFFFFFFF", coloquei um delay de 200 e ficou normal. =D

    ResponderExcluir
  2. amigo como eu faço para mover 2 servos motor hackeado com este codigo?

    ResponderExcluir
    Respostas
    1. Olá, veja o código desse post: http://www.criandorobocomarduino.com/2013/10/caraut-v1-criando-um-carrinho-autonomo.html , é só pegar as funções do servo motor e adaptar ao seu código.

      Excluir
  3. cara estou tentado fazer essa biblioteca rodar mas não dá certo já instalei desinstalei e nada dá esses erros..!!


    C:\Program Files (x86)\Arduino\libraries\RobotIRremote\src\IRremote.cpp:70: error: 'IRsend' has not been declared
    C:\Program Files (x86)\Arduino\libraries\RobotIRremote\src\IRremote.cpp: In function 'void sendNEC(long unsigned int, int)':
    C:\Program Files (x86)\Arduino\libraries\RobotIRremote\src\IRremote.cpp:72: error: 'enableIROut' was not declared in this scope
    C:\Program Files (x86)\Arduino\libraries\RobotIRremote\src\IRremote.cpp:73: error: 'mark' was not declared in this scope
    C:\Program Files (x86)\Arduino\libraries\RobotIRremote\src\IRremote.cpp:74: error: 'space' was not declared in this scope
    C:\Program Files (x86)\Arduino\libraries\RobotIRremote\src\IRremote.cpp: At global scope:
    C:\Program Files (x86)\Arduino\libraries\RobotIRremote\src\IRremote.cpp:90: error: 'IRsend' has not been declared
    C:\Program Files (x86)\Arduino\libraries\RobotIRremote\src\IRremote.cpp: In function 'void sendSony(long unsigned int, int)':
    C:\Program Files (x86)\Arduino\libraries\RobotIRremote\src\IRremote.cpp:91: error: 'enableIROut' was not declared in this scope
    C:\Program Files (x86)\Arduino\libraries\RobotIRremote\src\IRremote.cpp:92: error: 'mark' was not declared in this scope
    C:\Program Files (x86)\Arduino\libraries\RobotIRremote\src\IRremote.cpp:93: error: 'space' was not declared in this scope
    C:\Program Files (x86)\Arduino\libraries\RobotIRremote\src\IRremote.cpp: At global scope:
    C:\Program Files (x86)\Arduino\libraries\RobotIRremote\src\IRremote.cpp:108: error: 'IRsend' has not been declared
    C:\Program Files (x86)\Arduino\libraries\RobotIRremote\src\IRremote.cpp: In function 'void sendRaw(unsigned int*, int, int)':
    C:\Program Files (x86)\Arduino\libraries\RobotIRremote\src\IRremote.cpp:110:

    ResponderExcluir
    Respostas
    1. Cara, você esta testando os exemplos que vem na biblioteca, certo?
      se sim, infelizmente da erros mesmo, porem se você testar com o meu código, ele funciona de boa.

      Excluir
    2. Caros colegas, como faço para ele reconhecer a tecla pressionada. pois quando pressiono o codigo da tecla correspondente aparece mas se permaneço com a tecla pressionada o codigo fica fffffff. e eu queria manter a tecla pressionada e ele executando a açao repetidas vezes.

      Excluir
  4. Boa noite,gostaria de saber como fazer para funcionar com qualquer controle remoto,pois só consegui acender os leds com um controle menor semelhante ao seu,controle de tv,dvd...não acende,poderia me ajudar?
    Parabéns pelo trabalho!

    ResponderExcluir
    Respostas
    1. Filipe, para fazer ele funcionar com um controle diferente, basta você abrir o serial monitor apertar a tecla do controle copiar o código que apareceu e alterar no código fonte.
      Porem controle de ar condicionado acho não funciona.
      obrigado!

      Excluir
    2. Boa noite,obrigado pelo retorno.
      Poderia me dizer como substituir os leds por lampadas ?
      Procurei como usar lampada 110 V no arduino,mas não consegui juntar ao circuito

      Excluir
    3. Boa noite, por nada.
      Para você usar qualquer equipamento elétrico de mais de 5v basta usar um relé.
      Faça uma busca com: como usar rele com arduino
      vai aparecer muitas resultados, ai é só adaptar na pratica pois no código não precisa alterar nada.
      abraços

      Excluir
    4. Olaa no meu arduino esta dando o erro:
      IRrecv ir_recebe(RECEBE_PINO);
      ERRO:
      ir_1_exemplo:5: error: 'IRrecv' does not name a type
      ir_1_exemplo:6: error: 'decode_results' does not name a type
      ir_1_exemplo:10: error: 'ir_recebe' was not declared in this scope

      Excluir
    5. Olá , Anônimo. Você já baixou a biblioteca do site e instalou como esta no post http://www.criandorobocomarduino.com/p/bibliotecas-do-arduino.html
      Caso já tenha instalada, desinstale e instale novamente, pro favor.

      Excluir
  5. Olá amigo, o meu está a mesma coisa quando pressiono e solto a tecla on/off
    aparece no serial "FFFFFF" quando eu pressiono a mesma tecla duas vezes rápido ai aparece o código correto FFA25D na tecla no serial, vc pode me explicar onde vc colocou esse delay para ficar normal? joneppa@yahoo.com.br

    ResponderExcluir
    Respostas
    1. Olá Jone, o código já esta com alteração feita.
      Faça o seguinte: aonde no código tem "delay(500);" altere para "delay(250);" e veja se resolveu. se não me avisa que eu entro em contato por e-mail para mais detalhes.
      Abraço

      Excluir
  6. ola não estou conseguindo copilar o Arduíno com o seu código sempre da estes erros


    In file included from F:\arduino-1.5.7\libraries\IRremote\IRremote.cpp:15:0:
    F:\arduino-1.5.7\libraries\IRremote\IRremoteInt.h:292:2: error: #error "Please add OC4A pin number here\n"
    #error "Please add OC4A pin number here\n"
    ^
    F:\arduino-1.5.7\libraries\IRremote\IRremote.cpp: In member function 'void IRsend::enableIROut(int)':
    F:\arduino-1.5.7\libraries\IRremote\IRremote.cpp:202:11: error: 'TIMER_PWM_PIN' was not declared in this scope
    pinMode(TIMER_PWM_PIN, OUTPUT);

    ResponderExcluir
    Respostas
    1. Olá Jonas, o erro acontece pois você não instalou a biblioteca IRremote, faça o download e veja como instalar nesse link: http://www.criandorobocomarduino.com/p/bibliotecas-do-arduino.html

      Excluir
  7. controle de ar funciona sim, tem amigo postou video you... e automatizou ap dele, inclusive liga ar. parabens pelos exemplos e dicas a todos . cada um coopera pouquinho final temos bastante. Deus continue nos abençoando. abç´s

    ResponderExcluir
    Respostas
    1. Que bom Reinaldo!
      Obrigado, é assim que funciona se cada um cooperar, tudo fica bem melhor!

      Excluir
  8. TCM bravissimo olha amigo eu consegui fiz um robo ir com asseguintes funções IR - FRENTE
    IR - TRAS
    GIRAR HORARIO
    GIRAR ANTI-HORARIO
    Liga Buzzer
    Desliga Buzzer
    acende os Faroes
    Desliga os Faroes
    liga a seta direita
    Desliga a seta direita
    liga a seta esquerda
    Desliga a seta esquerda
    Parada Total
    obrigado grato.

    ResponderExcluir
    Respostas
    1. Que bom Jonas!
      Parabéns!
      Caso queira compartilhar o código fonte com todos, entre em contato conosco.
      Obrigado

      Excluir
  9. passo sim amigio aqui esta

    #include

    int receiver = 2;
    int motor1pin1 = 3;
    int motor1pin2 = 4;
    int motor2pin1 = 5;
    int motor2pin2 = 6;
    int Farol = 8;
    int setadireita = 9;
    int setaesquerda = 10;
    int buzzer = 11;

    IRrecv irrecv(receiver);
    decode_results results;

    void setup() {
    pinMode(motor1pin1, OUTPUT);
    pinMode(motor1pin2, OUTPUT);
    pinMode(motor2pin1, OUTPUT);
    pinMode(motor2pin2, OUTPUT);
    pinMode(Farol, OUTPUT);
    pinMode(setadireita, OUTPUT);
    pinMode(setaesquerda, OUTPUT);
    pinMode(buzzer, OUTPUT);
    pinMode(receiver, INPUT);
    Serial.begin(9600);
    irrecv.enableIRIn();
    }

    void loop() {

    if (irrecv.decode(&results)) {
    switch (results.value) {

    //CONTROLE

    case 0XB54A02FD: { // seta cima
    digitalWrite(motor1pin1, HIGH);
    digitalWrite(motor1pin2, LOW);
    digitalWrite(motor2pin1, HIGH);
    digitalWrite(motor2pin2, LOW);
    Serial.println("IR - FRENTE");
    break;
    }
    case 0XB54AC23D: { // seta direita
    digitalWrite(motor1pin1, HIGH);
    digitalWrite(motor1pin2, LOW);
    digitalWrite(motor2pin1, LOW);
    digitalWrite(motor2pin2, HIGH);
    Serial.println(" GIRAR HORARIO ");
    break;
    }
    case 0XB54A42BD: { // seta esquerda
    digitalWrite(motor1pin1, LOW);
    digitalWrite(motor1pin2, HIGH);
    digitalWrite(motor2pin1, HIGH);
    digitalWrite(motor2pin2, LOW);
    Serial.println("GIRAR ANTI-HORARIO");
    break;
    }
    case 0XB54A827D: { // seta para baixo
    digitalWrite(motor1pin1, LOW);
    digitalWrite(motor1pin2, HIGH);
    digitalWrite(motor2pin1, LOW);
    digitalWrite(motor2pin2, HIGH);
    Serial.println("IR - TRAS");
    break;
    }
    case 0XB54A28D7: { // acende os Faroes
    digitalWrite(Farol, HIGH);

    Serial.println("acende os Faroes");
    break;
    }
    case 0XB54A48B7: { // Desliga os Faroes
    digitalWrite(Farol, LOW);
    Serial.println("Desliga os Faroes");
    break;
    }

    case 0XB54A50AF: { // liga a seta direita
    digitalWrite(setadireita, HIGH);
    Serial.println("liga a seta direita");
    delay(5000);
    digitalWrite(setadireita, LOW);
    Serial.println("Desliga a seta direita");
    break;
    }
    case 0XB54AD02F: { // liga a seta esquerda
    digitalWrite(setaesquerda, HIGH);
    Serial.println("liga a seta esquerda");
    delay(5000);
    digitalWrite(setaesquerda, LOW);
    Serial.println("Desliga a seta esquerda");
    break;

    }
    case 0XB54A7887: { // liga Buzzer
    digitalWrite(buzzer, HIGH);
    Serial.println("Liga Buzzer");
    delay(5000);
    digitalWrite(buzzer, LOW);
    Serial.println("Desliga Buzzer");
    break;
    }
    case 0XB54A38C7: { // parada total
    digitalWrite(Farol, LOW);
    digitalWrite(motor1pin1, LOW);
    digitalWrite(motor1pin2, LOW);
    digitalWrite(motor2pin1, LOW);
    digitalWrite(motor2pin2, LOW);
    digitalWrite(buzzer, LOW);
    Serial.println("Parada Total");
    break;
    }
    }
    delay(100);
    irrecv.resume();
    }
    }

    ResponderExcluir
  10. este codigo e de um rogo ir com as funcoes
    FRENTE
    IR - TRAS
    GIRAR HORARIO
    GIRAR ANTI-HORARIO
    Liga Buzzer
    Desliga Buzzer
    acende os Faroes
    Desliga os Faroes
    liga a seta direita
    Desliga a seta direita
    liga a seta esquerda
    Desliga a seta esquerda
    Parada Total
    eles esta a disposição de todos
    ele controla duas ponte h 3 tres ociladores digitais
    ate mais amigos

    ResponderExcluir
  11. Parabens, este codigo me ajudou bastante a controlar minha junkbox com um controle IR. No entanto ao inves de IF eu utilizei Switch case para o codigo não ficar muito extenso. Ficou show de bola! eu pressiono uma tecla do controle e o arduino envia uma combinacão de caracteres que é interpretada pelo computador atraves da serial como se fosse uma determinada tecla do teclado sendo pressionada. valeu pela ajuda.

    ResponderExcluir
  12. Será que há um outro modo de fazer esta operação sem usar Arduíno ou PIC?

    ResponderExcluir
  13. Sempre que tento abrir o monitor serial para adicionar novos códigos aparece a msg: "Board at COM7 is not available". O Arduíno realmente está conectado à esta porta e com outros códigos consigo fazer o monitor serial funcionar normalmente. Oque pode estar havendo?

    ResponderExcluir
    Respostas
    1. Bruno, provavelmente você ligou o fio do receptor infravermelho no pino 2(TX) e não no 3 que é o correto, se você ligar no pino 2 ele fica ocupando a saída de informações e com isso o monitor não abre.

      Excluir
  14. Já troquei o delay e nada! qualquer tecla pressionada só aparece FFFFF algúem pode ajudar??

    ResponderExcluir
  15. Boa tarde, estou fazendo um projeto onde tenho 04 servos (cintura, cabeça, braço 1 e braço 2) de um robozinho controlados por IR.
    O IR funciona perfeitamente, lendo o número do controle, mas quando adiciono os servos e leitura do IR fica louca, o mesmo botão do controle gera códigos diferentes a cada clique.
    O que pode estar acontecendo? Os servos (MG995) estão ligados diretamente ao arduino - alimentação).

    ResponderExcluir
    Respostas
    1. Olá, pode ser por causa da alimentação dos motores, alimente o motor externamente e veja se funciona.

      Excluir
  16. Boa Noite Amigos!

    Tenho uma Duvida...

    CONSIGO LIGAR MAIS DE "1" SENSOR NO MESMO "ARDUINO"?


    Pois quero deixar o "ARDUINO COMO CENTRAL".... e mandar outros sensores para outros cômodos...

    Por gentileza...Alguem poderia me explicar se é Possível..?
    Obrigado!



    ResponderExcluir
    Respostas
    1. Boa tarde, Daniel.
      Tem como sim, é só fazer o mesmo processo porem alterando a porta e o nome do IR.

      Excluir
  17. Preciso de juntar dois valores do controle, exemplo, quero acender um led com o botão 59, então preciso preciosas o botão 5 e o 9 no controle, como eu faço isso?

    ResponderExcluir
    Respostas
    1. Olá Julio. pegue o resultado em HEX do numero 5 e do numero 9 e faça:
      if ((codigo_recebido.value == 0xHEXA NUMERO 5) &&(codigo_recebido.value == 0xHEXA NUMERO 9)){
      ...
      esper der ajudado

      Excluir
  18. Teria alguma forma de identificar os controles? Digo tenho 20 controles da mesma marca e modelo, eles tem os mesmo códigos infravermelhos, existe algum jeito que eu consiga pegar alguma númeraçao única de cada controle? como por exemplo um ID?

    ResponderExcluir
    Respostas
    1. Olá, Herbert. Infelizmente não, só através do comentário na frete do código mesmo.

      Excluir
  19. Oi pessoal, montei esse ir. Mas quando liguei ele com um resistor de 100ohms no 5 v ele nao parava de receber codigos... Dai coloquei um resistor de 1k, melhorou. Mas quando eu pressiono uma tecla, ele me da um codio e se eu pressiono essa mesma tecla ele da outro codigo. O que pode ser?

    ResponderExcluir
    Respostas
    1. Olá Mateus, tudo bem?
      Isso acontece por causa do resistor que esta cortando o sinal, o idela é você usar um Resistor 20 ohms para resolver esse problema.
      Sucesso no projeto!

      Excluir
  20. Boa noite, li o tutorial e os comentários e achei bem interessante e agradavel a presteza que vocês respondem as questões. Parabéns e sucesso a todos. Vanerson Mendes

    ResponderExcluir
    Respostas
    1. Olá, Obrigado Vanerson por acessar e comentar!
      Fazemos o possível para poder resolver os problemas de nossos visitantes.
      Acesse o nosso novo site: SeuRobo.com.br

      Excluir
  21. Boa noite amigos, segui a explicaçao abaixo mas para de responer.


    "Preciso de juntar dois valores do controle, exemplo, quero acender um led com o botão 59, então preciso preciosas o botão 5 e o 9 no controle, como eu faço isso?

    Criando Robô Com Arduino29/01/2016 20:54
    Olá Julio. pegue o resultado em HEX do numero 5 e do numero 9 e faça:
    if ((codigo_recebido.value == 0xHEXA NUMERO 5) &&(codigo_recebido.value == 0xHEXA NUMERO 9)){
    ...

    COMO FAÇO PARA CONSEGUIR ACIONAR O LED COM DOIS NUMEROS COMO POR EXEMPLO 59?
    GRATO

    ResponderExcluir
    Respostas
    1. Olá Vanerson.
      Não tem como fazer uma comparação com o numero 59, e sim como falado no código acima, tem como comprar se apertou o 5 e logo em sequencia o 9 isso ira resulta no 59 e ira fazer o que você quer.
      Caso tenha mais duvidas pode nos contatar pelo email: Contato@SeuRobo.com.br

      Acesse o nosso novo site: SeuRobo.com.br
      Acesse nossa loja virtual também: Loja.SeuRobo.com.br
      E veja os serviços que prestamos: SeuRobo.com.br/servicos

      Excluir
  22. Só um comentário simples: parabéns pelo site, pelo esforço e pela gentileza em compartilhar seu conhecimento e permitir que pessoas também façam o mesmo. Aprendo muito com seu site. Você faz a diferença. Obrigado.

    ResponderExcluir
    Respostas
    1. Olá, Tulio.
      Muito obrigado!
      A intensão da nossa empresa é essa mesmo, ajudar a todos a der mais conhecimento e conseguir fazer seu próprio robô!
      Muito obrigado mesmo, e agradeço muito a você por ser nosso usuário e gostar do nosso conteúdo!

      Acesse o nosso novo site: SeuRobo.com.br
      Acesse nossa loja virtual também: Loja.SeuRobo.com.br
      E veja os serviços que prestamos: SeuRobo.com.br/servicos

      Excluir

O seu comentário estará aguardando aprovação.