FAÇA UM RECEPTOR PARA CONTROLE REMOTO INFRAVERMELHO DE 5 CANAIS – COM PIC 12F675 (REF131)

Muitos profissionais necessitam ligar e desligar vários dispositivos elétricos na execução de seu trabalho. Que tal usar um controle remoto de tv ou mesmo similar, para controlar até 5 equipamentos diferentes? Ainda com função de retenção ou pulso individual por canal? Veja mais…

Veja o esquema abaixo:

Esta aplicação é uma variante do receptor de 4 canais para controle remoto infravermelho, sendo que foi eliminado o led ‘prog’ para se obter um ‘quinto’ canal. O interruptor momentâneo (dactilar) para entrar em modo de programação (Prog) ficou junto com a entrada do sinal do controle remoto, no pino 4 (gp3). Quando este botão é apertado por mais de 65 ms, indicará que não se trata de uma pausa na transmissão do controle remoto, mas sim, de uma sinalização para entrar em modo de programação. Afinal, no protocolo NEC empregado aqui, temos pausa máxima de 9 ms (na condição de aterramento ao gnd, ou seja , nivel ‘0’).
Na versão anterior de 4 canais, o led ‘Prog’, não mais usado, piscava de forma lenta para gravar as 4 teclas do controle e depoís, piscava rápido para indicar a programação para retenção ou pulso em cada tecla gravada. Com a alteração para 5 canais, e a inexistência do led ‘Prog’, ao entrar em modo de programação, o próprio led da saída é que passará a piscar, isto somente em modo de gravação das teclas desejadas. Para o ajuste do modo para retenção ou pulso, reapertamos as teclas gravadas, sendo que, se deixamos com o led aceso indicará modo ‘pulso’ para aquela saída e se reapertamos a tecla,apagando, passará a ser modo ‘retenção’. Poderá ser usado reles miniaturas de 12 volts na bobina, com capacidade de 10 amperes nos contatos, sendo suficiente para a maioria das aplicações. Em caso de necessidade de controlar correntes maiores, altere o tipo de rele para maior corrente nos contatos. Quanto a fonte, poderá ser interna com transformador de 12 volts,mais retificadores, capacitores de filtros e regulador 7805 para os 5 volts para o pic. Poderá ser usado também uma fonte externa de parede, com saídas continua de 12 a 13 volts. Nesta versão, estava disponivel um módulo receptor infravermelho usado em aparelhos de tv, um TSOP 1550, logicamente reaproveitado da minha ‘chatarra’ eletrónica.
Quanto ao protocolo ‘NEC’, compreende um periodo inicial de 9 ms em nivel ‘0’, seguido por 4,5 ms em nivel ‘1’, dai em diante, sendo seguido por 32 bits de informação, sendo enviados primeiro o LSB e por ultimo, o MSB. O primeiro byte dos 4 enviados, é o chamado ‘ADDRESS’, seguido pelo ‘ADDRESS INVERTIDO’, ou seja, com os bits invertidos, usado na confêrencia da integridade da transmissão. O Terceiro byte é do chamado ‘COMMAND’ e o quarto, o ‘COMMAND INVERTIDO’, também com o mesmo propósito do segundo byte.
A diferença do bit ‘0’ em relação ao ‘1’ é a seguinte:
Após manter a saída em nível ‘0’ por 560 uS, em seguida, 560 uS em nivel ‘1’ sera entendido como um único bit ‘0’ de informação. Já o bit ‘1’ de informação será uma sequência mantendo a saída em nivel ‘0’ por 560 uS e em seguida, em nivel um por 1950 uS. Após uma transmissão completa, não maís é enviado outra, mas um trem de pulsos chamado de ‘repeat’ a cada 110 ms, sendo composto dos 9 ms(‘0’) + 2,25 ms(‘1’) + 560 us(‘0’). Este ‘repeat’será enviado continuamente, até soltar a tecla apertada do controle remoto.
Os periodos de 9 ms e 4,5 ms devem ser usados para sincronizar a recepção do sinal. Foi usado um buffer de 4 bytes para receber a transmissão, sendo depois confirmado a qualidade da recepção somando os bytes inversos e obtendo 0xff, se corretos. (Obs. Caso esteja tentando usar um controle remoto com padrão ‘NEC’ extendido, não irá funcionar. Neste modelo, para que possa funcionar, NÃO DEVERÁ ser comparado o ADDRESS com ADDRESS INVERTIDO, pois estes não serão complementares, mas uma extensão do endereço. Se for o seu caso, altere a linha de código:
if (!(buffer[0]+buffer[1]+buffer[2]+buffer[3]+0x2)){ flag_rok=1;} por if(!(buffer[2]+buffer[3]+1)){ flag_rok=1;}. )
Os 10 primeiros bytes da EEprom são usados para gravar os ADDRESS+COMMAND para cada tecla (5×2=10). Os próximos 5 bytes da EEprom guardam o modo de operação para cada canal, sendo 0x00 para retenção e 0xff ou 0x01 para pulso.
Caso necessite de usar controle remoto de protocolo Sony de 12 bits ao invés de NEC, poderá ver a pasta zipada citada abaixo.
Atenção: Este dispositivo foi montado e testado apenas em placa de protoboard, sujeito a bugs ainda não observados,sendo fornecido os arquivos que poderão ser alterados segundo a necessidade do hobista.

Segue pasta zipada com os arquivos hex e “C”:

INFRA_NEC_5C_C

Segue arquivo hex (zipado) para recepção da versão estendida:

infra_nec_5c_estendido_c

Segue pasta zipada com opção de protocolo ‘Sony 12 bits’, testado com controle universal _RCA_ _SYSTEMLINK4_ programado com código ‘002’:

infra_sony12b_5c

Manuais:
PIC12F675
Protocolos para controle remoto

Curiosidades:
A verdadeira história da criação
Por que choramos?
A lanterna do vaga-lume
Como aproveitar bem seu tempo
A enigmática cola da aranha
Admire o projeto; conheça o Projetista
O segredo da borboleta bela-dama
A capacidade de armazenamento do DNA
O resistente cérebro do esquilo-do-ártico
Os cosméticos nos tempos bíblicos
“A História não mente”
Sua vida é influenciada pelos astros?

Orientações que promovem a felicidade de casais:
Como controlar as birras
Quando seu casamento não é o que você esperava
A violência doméstica tem solução!
Como tratar o conjuge com respeito
Aprenda a perdoar
Sobreviver ao primeiro ano de casamento
Quando um dos cônjuges tem necessidades especiais
Como evitar ferir com palavras?
Como resolver problemas no casamento
Como criar filhos responsáveis
Como administrar o seu dinheiro
Ensine valores morais a seus filhos

Orientações para adolescentes:
O que fazer se estão falando mal de mim?
Por que eu me corto?
Como posso ter ânimo para exercitar
Como posso controlar meu peso?
Adolescentes- O que fazer se estou sofrendo bullying?
Como posso dar conta de tanta lição de casa?
Por que devo ajudar os outros?
Videos Bíblicos

Até o próximo artigo!!!

61 comments on “FAÇA UM RECEPTOR PARA CONTROLE REMOTO INFRAVERMELHO DE 5 CANAIS – COM PIC 12F675 (REF131)

  1. Olá Claudio! Parabéns pelos projetos,eu queria saber se é possível fazer uma alteração.
    Quando o led 1 ficar aceso,ao acionar o led 2 o led 1 vai apagar.E ao contrário ,quando o led 2 estiver aceso, só vai apagar quando acionar o led 1.É possível?Valeu!

    1. Olá Geraldo!
      Você terá que alterar a rotina com cabeçalho ‘acionar saídas conforme programação’ conforme porção abaixo:

      //=============================================================================
      // ACIONAR SAÍDAS CONFORME PROGRAMAÇÃO
      //==============================================================================

      De:

      if((!flag_prog)&&(flag_rok)){
      if(mem(0)){
      if(read_eeprom(10)){s1=1;flag_m1=1;cnt1=TLIGADO;}
      else{s1=!s1; flag_m1=0;}
      }
      else
      if(mem(2)){
      if(read_eeprom(11)){s2=1;flag_m2=1;cnt2=TLIGADO;}
      else{s2=!s2; flag_m2=0;}
      }

      else
      if(mem(4)){
      if(read_eeprom(12)){s3=1;flag_m3=1;cnt3=TLIGADO;}
      else{s3=!s3; flag_m3=0;}
      }
      .
      .
      .

      Para:

      //=============================================================================
      // ACIONAR SAÍDAS CONFORME PROGRAMAÇÃO
      //==============================================================================

      if((!flag_prog)&&(flag_rok)){
      if(mem(0)){
      if(read_eeprom(10)){s1=1;flag_m1=1;cnt1=TLIGADO;}
      else{s1=1; s2=0; flag_m1=0;} //alterado aqui para ligar s1 e desligar s2
      }
      else
      if(mem(2)){
      if(read_eeprom(11)){s2=1;flag_m2=1;cnt2=TLIGADO;}
      else{s2=1;s1=0; flag_m2=0;}//alterado aqui para ligar s2 e desligar s1
      }

      else
      if(mem(4)){
      if(read_eeprom(12)){s3=1;flag_m3=1;cnt3=TLIGADO;}
      else{s3=!s3; flag_m3=0;}
      }
      .
      .
      .

      Depois compile novamente no CCS C Compiler para obter o novo Hex.
      Não testei mas acredito que deva funcionar.
      Lembrando que estes dois canais devem ser programados para modo retenção para funcionar nesta modificação.

      Cláudio

  2. olá larios em que linha do código desse programa eu devo alterá para se obter as saídas invertidas(se iniciava em estado baixo para iniciar em estado alto)? ❓

    1. Olá Morais! Neste código não tem opção específica para mudar de saída normal para invertida. Terá que fazer isto na ‘unha’, trocando em cada linha que tenha menção a saídas.
      Cláudio

    1. Olá Carlucio!
      Infelizmente, eu não tenho disponível, pois tenho me concentrado no programa ao invés da montagem prática em placa. Mas pode ser que algum colaborador tenha feito. Se for este o caso, alguém poderia fornecer estes arquivos?

      Cláudio

    2. Montei uma pci e conferi tudo. Ao checar o momento de testar o circuito aciona o rele 1 como um pisca pisca sem comando nenhum dado e não aceita entrar no modo de gravação. Estou utilizando o sensor de ir vs1838b, e também já troquei o pic e gravei o código novamente e continua o problema. Quando se retira o pic da placa não aciona a saída a não ser se eu mandar o 5v no pino 3 referente a saída 1 do rele. O que pode estar fazendo isso? Tem alguma dica?

      1. Olá Carlucio!
        Eu nunca usei este sensor. Tente ver no datasheet se não tem diferença de pinagem. Também alguns sensores necessitam de um resistor pull up, entre 10 a 50 k (do pino out ao vcc). Neste caso, ele talvez esteja ‘meio que aterrando’ , imitando o botão de aprendizado pressionado. Tente conferir se não esqueceu alguma trilha na hora de fazer o desenho da placa, seguindo pino a pino e conferindo.
        Cláudio

      2. os problemas eram solda fria, não estava chegando tensão de 5v para o ir, so 2,38v no sensor de ir, código de usar era o nec estendido e sensor ir aparentemente havia apresentado defeito. Feito isso esta funcionando.

  3. Amigo no caso tem como eu alterar o tempo do modo pulso para mias rapido o acionamento e desligamento ? pois ele funciona mas pro que eu preciso tem que ser metade do tempo de espera que esta

    1. Olá Liliano!
      Em modo pulso é necessário um pequeno tempo em que se mantém ligado a saída até que se receba o novo trem de pulsos. No arquivo “c” temos a seguinte constante que determina este tempo:
      int const TLIGADO=30; //tempo mínimo para manter acionamento com botão apertado

      Se for muito menor, poderá fazer a saída pulsar mesmo com o controle constantemente apertado, pois não dará tempo de receber um novo trem de pulso.
      Se for aumentado, ficará mais tempo ligado após soltar o botão.
      Sugiro que tente reduzir experimentalmente este valor até um que satisfaça a sua necessidade. Terá que ser por tentativa e erro (altere e recompile com o CCS ).

      Cláudio

      1. mas no caso o que acontece que fico segurando quando solto aidna fica uns milisegundos acionado , então se eu reduzir esse tempo de 30 isso deve resolver , mas esse tempo é 30 segundos ? no caso o modo pulso so fica por 30 segudos armado dai faz uma nova leitura de botão pressionado ?

        1. Olá Liliano!
          O tempo relativo a constante TLIGADO foi obtido experimentalmente no desenvolvimento. Eu não sei informar quantos milissegundos exatos corresponde, mas é um pouco mais de 10 ms. Portanto, não é 30 segundos como possa ter imaginado. Na realidade, esta constante determina quanto loops do while principal precisam ser feitos para então desligar uma saída acionada em modo pulso. Com valor 30 teremos:
          30 x 0,01 seg = 0,3 segundos (300 ms) aproximadamente, já que tem um pouco mais de 10 ms em cada loop.

          A recepção e decodificação acontece por interrupção por mudança de estado da porta de entrada do infrared, mas a interpretação se foi recebida ou não, ocorre nos ‘ loops’ da rotina principal, a cada 10 ms.
          Dito de outra forma, a cada 10 ms é verificado se existe uma transmissão recebida e lido qual botão foi pressionado no controle.
          Mas o tempo de uma transmissão de código do tx demora muito mais que 10 ms ( a cada 110 ms é enviado um trem de pulsos pelo tx).
          Portanto, o programa tem que manter a saída em modo pulso acionada até poder receber um novo trem de pulsos com a informação do novo estado dos botões. Pela lógica, o valor de TLIGADO
          não poderá ser menor que 11 (110 ms).
          Sugiro que tente alterar para 15 e ver se funciona a contento, pois irá reduzir a metade deste tempo. Um detalhe importante é que os loops da rotina principal podem não ter tempos iguais devido as interrupções e os acionamentos. Portanto, poderá acontecer que com um valor como 15 ele funcione, mas as vezes fique instável, piscando uma saída, sendo que devia continuar acionada estando o botão do tx acionado direto. Neste caso, terá que alterar para 16, e ir mudando até obter um valor estável.
          Espero que tenha entendido alguma coisa do acima, porque sei que as vezes é muito difícil passar uma informação de forma compreensível para outros.

          Cláudio

          1. Muito obrigado melhor explicação que essa impossivel , vou ir tentando então ate achar o melhor valor obrigado e Fique com Jesus .

Comments are closed.

Back To Top