sábado, 11 de agosto de 2012

Sensor Infra Vermelho e Controle Remoto

Arduino by my Self


Esta barra, indica o nível de dificuldade encontrado para cada experiência realizada.
sendo:
"VERDE", indicação de nível 1 a 5 (Fácil);
"AMARELO", indicação de nível 6 a 8 (Médio);
VERMELHO, indicação de nível 9 e 10 (Difícil);



Arduino Controle Remoto

Hoje vamos aprender a utilizar o controle Remoto Infra-Vermelho YK-001 com Arduino.

Com esta aplicação, podemos controlar ou comandar por exemplo, usando circuitos eletrônicos com Transistores MOS-FET, Darlington, acopladores ópticos ou relés, circuitos de potência para controlar lâmpadas ou pequenos motores, etc...




Usaremos a biblioteca de Infra-Vermelho  IRremote, que pode ser baixada em: http://www.4shared.com/zip/FHHwmplA/IRremote_library.html


O controle remoto utilizado, será o YK-001 com 21 teclas, muito comum no ramo de trabalhos com o Arduino.


como podemos ver na figura acima, a cada tecla temos um código numérico associado, devemos respeitar este código, que será recebido pelo Arduino e na hora de utilizar uma determinada tecla do controle remoto verificar se é a tecla correta para poder acionar un driver de dispositivo.

Neste link temos um arquivo contendo os códigos das respectivas teclas em Hexadecimal
http://www.4shared.com/file/lZO81VuK/YK-001.html

Em termos de software, iremos desenvolver dois programas; um para identificar as teclas quando apertadas e nos retornar os códigos (serve também para verificar se o controle está OK).
O outro será para acionar 7 saídas no Arduino, como se fossem 7 relés ou um outro dispositivo; neste caso será feito o acendimento de um LED (para termos uma interação com o sistema).

O receptor utilizado: Receptor IR 38 KHz TSOP4838, ou equivalente (por exemplo: IRM-3638)
No link o DataSheet do componente:
http://www.4shared.com/office/5pjFusnm/A-1551.html



COMPONENTES:

1 x Arduino Duemilanove, UNO ou MEGA
1 x Bread-Board
7 x LEDs (cores diversa e tamanho de acordo com a preferência)
7 x resistores de 220 Ohm
1 x Receptor Infra-Vermelho TSOP4838 ou equivalente (por exemplo: IRM-3638)
1 x controle remoto YK-001 de 21 teclas
Fios e Cabos para as conexões

DIAGRAMAS:

Abaixo o esquema de ligação dos componentes;
Observar que o pino onde será ligado o sensor Infra-Vermelho no Arduino, é o pino 2
Pinos 3 a 9 serão conectados aos LEDs para acionamento quando pressionado uma tecla do controle remoto.
Observar a pinagem do seu receptor Infra-Vermelho para não ligar invertido!


 É uma boa prática colocar um resistor de 10 K Ohm entre o pino "out" e o VCC para fazer pull-up do sensor (fica a seu critério usar ou não).



SOFTWARE:

Abaixo os dois programas usados;

1 - Programa para verificação dos dados recebidos a partir do controle remoto no Arduino

http://www.4shared.com/file/MHTyXGBZ/INFRA_RED_3_ino.html


/*
################################################################################
#   Arquivo:            INFRA_RED_3                                             
#       Micro-processador:  Arduino UNO         
#   Linguagem:    Wiring / C /Processing /Fritzing / Arduino IDE          
#
# Objetivo:           Scrolling LED dot Matrix
#  
# Funcionamento:    Recebe a informação do controle remoto e 
#                           mostra no console serial o código recebido
#                           
#
#   Autor:              Marcelo Moraes 
#   Data:               11/08/12
#   Local:              Sorocaba - SP
#
################################################################################
 Este exemplo é um código de domínio público.
 */


// inclui a biblioteca
#include <IRremote.h>
int RECV_PIN = 2; // define o pino do receptor infra vermelho
IRrecv irrecv(RECV_PIN);
decode_results results;
void setup()
{
Serial.begin(9600);
irrecv.enableIRIn(); // inicia o receptor infra vermelho
}
void loop() {
if (irrecv.decode(&results)) {
  Serial.println(results.value );
  irrecv.resume(); // recebe o próximo valor
}
}

// FIM DA COMPILAÇÃO


2 - acionamento de dispositivos remotamente

http://www.4shared.com/file/PwGKAHU9/INFRA_RED_4.html


/*
################################################################################
#   Arquivo:            INFRA_RED_4                                             
#       Micro-processador:  Arduino UNO         
#   Linguagem:    Wiring / C /Processing /Fritzing / Arduino IDE          
#
# Objetivo:           Scrolling LED dot Matrix
#  
# Funcionamento:    Recebe a informação do controle remoto e 
#                           aciona os dispositivos de saída (LEDs)
#                           
#
#   Autor:              Marcelo Moraes 
#   Data:               11/08/12
#   Local:              Sorocaba - SP
#
################################################################################
 Este exemplo é um código de domínio público.
 */

// inclui bliblioteca para Infra-Vermelho
#include <IRremote.h>

// definição de pinos
int RECV_PIN = 2;

int Relay1_PIN = 3;
int Relay2_PIN = 4;
int Relay3_PIN = 5;
int Relay4_PIN = 6;
int Relay5_PIN = 7;
int Relay6_PIN = 8;
int Relay7_PIN = 9;

// definição de variáveis
IRrecv irrecv(RECV_PIN);
decode_results results;

// executado na inicialização do sistema
void setup()
{
  // definição de modo dos pinos
  pinMode(Relay1_PIN, OUTPUT);
  pinMode(Relay2_PIN, OUTPUT);
  pinMode(Relay3_PIN, OUTPUT);
  pinMode(Relay4_PIN, OUTPUT);
  pinMode(Relay5_PIN, OUTPUT);
  pinMode(Relay6_PIN, OUTPUT);
  pinMode(Relay7_PIN, OUTPUT);
  
  pinMode(6, OUTPUT);
  irrecv.enableIRIn(); // Inicialização do receptor Infra-vermelho
}

int on = 1;


// loop principal do programa
void loop() {
  if (irrecv.decode(&results)) {
    if (results.value == 16724175) { // YK-001 button 1
       {
        on = !on;
        digitalWrite(Relay1_PIN, on ? HIGH : LOW);
      }
     }
{
    if (results.value == 16718055) { // YK-001 button 2
      
       {
        on = !on;
        digitalWrite(Relay2_PIN, on ? HIGH : LOW);
      }
      }    
  {
    if (results.value == 16743045) { // YK-001 button 3
     {
        on = !on;
        digitalWrite(Relay3_PIN, on ? HIGH : LOW);
      }
     }    
  {
    if (results.value == 16716015) { // YK-001 button 4
     {
        on = !on;
        digitalWrite(Relay4_PIN, on ? HIGH : LOW);
      }
     }
   {
    if (results.value == 16726215) { // YK-001 button 5
       {
        on = !on;
        digitalWrite(Relay5_PIN, on ? HIGH : LOW);
      }
     }
   {     
    if (results.value == 16734885) { // YK-001 button 6
       {
        on = !on;
        digitalWrite(Relay6_PIN, on ? HIGH : LOW);
      }
     }
   {  
    if (results.value == 16728765) { // YK-001 button 7
       {
        on = !on;
        digitalWrite(Relay7_PIN, on ? HIGH : LOW);
      }
     }
{     
//
//
//  COLOQUE MAIS IFs COM VALORES A SEREM IDENTIFICADOS E PINOS DEINIDOS
//
//
   
     
    irrecv.resume(); // recebe o próximo valor
  }
}}}}}}}}

// FIM DA COMPILAÇÃO




Atualização de MARÇO / 2023

CÓDIGO ATUALIZADO PARA TRABALHAR COM NOVAS VERSÕES DA BIBLIOTECA IRremote.h

A instrução irrecv.decode(&results) não mais está em funcionamento....

Este novo código é preser usado com o controle remoto YK-001

/*
 * SimpleReceiver.cpp
 *
 * Demonstrates receiving NEC IR codes with IRrecv
 *
 *  Copyright (C) 2020-2021  Armin Joachimsmeyer
 *  armin.joachimsmeyer@gmail.com
 *
 *  This file is part of Arduino-IRremote https://github.com/Arduino-IRremote/Arduino-IRremote.
 *
 *  MIT License
 */

/*
 * Specify which protocol(s) should be used for decoding.
 * If no protocol is defined, all protocols are active.
 */
//#define DECODE_DENON
//#define DECODE_SHARP        // the same as DECODE_DENON
//#define DECODE_JVC
//#define DECODE_KASEIKYO
//#define DECODE_PANASONIC    // the same as DECODE_KASEIKYO
//#define DECODE_LG
//#define DECODE_NEC
//#define DECODE_SAMSUNG
//#define DECODE_SONY
//#define DECODE_RC5
//#define DECODE_RC6

//#define DECODE_BOSEWAVE
//#define DECODE_LEGO_PF
//#define DECODE_MAGIQUEST
//#define DECODE_WHYNTER

//#define DECODE_HASH         // special decoder for all protocols

#include <Arduino.h>

#include <IRremote.h>

#define IR_RECEIVE_PIN 2
#define LED_1 3
//int LED_1 = 3;
bool LED_1_FLAG = false;
int value = 0;

void setup() {
    pinMode(IR_RECEIVE_PIN, INPUT);
    pinMode(LED_1, OUTPUT);
    
    Serial.begin(9600);
    // Just to know which program is running on my Arduino

    Serial.println(F("INICIALIZANDO ...  " __DATE__ "\r\nUSando biblioteca versião " VERSION_IRREMOTE));

    /*
     * Start the receiver, enable feedback LED and take LED feedback pin from the internal boards definition
     */

    IrReceiver.begin(IR_RECEIVE_PIN, ENABLE_LED_FEEDBACK);

}

void loop() {
    if(IrReceiver.decode()){
        //value = String(IrReceiver.decodedIRData.command, DEC).toInt();
        value = IrReceiver.decodedIRData.command;
        IrReceiver.resume();
        delay(100);
        //Serial.println("recebido: " + String(value));


        switch(value){
          
          case 69: Serial.print("Recebido valor: " + String(value) + "  POWER\r\n"); LED_1_FLAG = !LED_1_FLAG; break; 
          case 70: Serial.print("Recebido valor: " + String(value) + "  MODE\r\n"); break;
          case 71: Serial.print("Recebido valor: " + String(value) + "  MUTE\r\n"); break;
          case 68: Serial.print("Recebido valor: " + String(value) + "  BACKWARD\r\n"); break;
          case 64: Serial.print("Recebido valor: " + String(value) + "  FORWARD\r\n"); break;
          case 67: Serial.print("Recebido valor: " + String(value) + "  PLAY/PAUSE\r\n"); break;
          case 7: Serial.print("Recebido valor: " + String(value) + "  MINUS\r\n"); break;
          case 21: Serial.print("Recebido valor: " + String(value) + "  PLUS\r\n"); break;
          case 9: Serial.print("Recebido valor: " + String(value) + "  EQ\r\n"); break;
          case 22: Serial.print("Recebido valor: " + String(value) + "  0\r\n"); break;
          case 25: Serial.print("Recebido valor: " + String(value) + "  100+\r\n"); break;
          case 13: Serial.print("Recebido valor: " + String(value) + "  UNDO\r\n"); break;
          case 12: Serial.print("Recebido valor: " + String(value) + "  1\r\n"); break;
          case 24: Serial.print("Recebido valor: " + String(value) + "  2\r\n"); break;
          case 94: Serial.print("Recebido valor: " + String(value) + "  3\r\n"); break;
          case 8: Serial.print("Recebido valor: " + String(value) + "  4\r\n"); break;
          case 28: Serial.print("Recebido valor: " + String(value) + "  5\r\n"); break;
          case 90: Serial.print("Recebido valor: " + String(value) + "  6\r\n"); break;
          case 66: Serial.print("Recebido valor: " + String(value) + "  7\r\n"); break;
          case 82: Serial.print("Recebido valor: " + String(value) + "  8\r\n"); break;
          case 74: Serial.print("Recebido valor: " + String(value) + "  9\r\n"); break;
          
        }
        resetLEDs();
    }
}

void resetLEDs(){
  digitalWrite(LED_1, LED_1_FLAG);
// FIM DA COMPILAÇÃO


OBS.: Estes sketches não funcionam bem com a versão 1.0 e 1.01 da IDE do Arduino, por favor utilizem a versão 0023 da IDE.
Provavelmente problema com a versão da biblioteca IRremote, que não foi detectado pela equipe de desenvovimento

Assistam ao vídeo!


TESTES E VÍDEOS:

Abaixo o complemento com o "dump" e "raw code" de controle remotos:
Esse sketch é da própria biblioteca IRremote.
http://www.youtube.com/watch?v=eNw-_KqS2Pc



Então é isso!
Até o próximo projeto!

Dúvidas e sugestões enviem para: arduinobymyself@gmail.com



6 comentários:

  1. muito bom me ajudou bastante!! parabens

    ResponderExcluir
    Respostas
    1. Obrigado.
      Divulgo o blog para podermos divulgar conhecimento.
      Hardware e Software livre para todos

      Excluir
  2. Olá Marcelo!

    Estou com problemas na biblioteca IRremote.
    A miinha IDE é versão 1.0.2, e simplesmente nao compila.
    Você tem alguma idéia de como resolver?

    Grato
    Alexandre

    ResponderExcluir
    Respostas
    1. Tente baixar e instalar uma das bibliotecas abaixo.

      Observação: Nunca testei na versão1.0.2 da IDE do arduino, use preferencialmente a 0023.

      http://www.4shared.com/zip/0aPw_ZJn/IRremote_library.html
      http://www.4shared.com/zip/QVWV-fAT/IRremote.html

      Excluir
  3. Olá, você têm os códigos das demais teclas deste controle, consegui apenas a 1,2,3,4,5,6,7 e 0(16738455) se puder repassar as demais agradeço.
    Grato.
    Elias

    ResponderExcluir
  4. Olá

    Os códigos estão na figura do blog que representa o controle remoto YK-001. É só conferir!

    Abraço

    Marcelo Moraes

    ResponderExcluir