Gostaria de controlar equipamentos a distâncias pequenas, usando um controle remoto infravermelho, destes de TV? Com capacidade de acionar até 4 aparelhos diferentes? então, veja este artigo…
Existem muitos circuitos interessantes na Internet, usando controles remotos. Um deles, oferece o recurso de controlar até 3 canais com um pic pequeno. Pensei também em montar algo desta natureza, mas usando uma maior capacidade que um pequeno pic 12f675 pode oferecer: 4 canais!
Veja o esquema abaixo:
Muitos hoje tem em suas salas, controles remotos para satélite, de protocolo geralmente ‘NEC’. Poderá usa-lo para controlar cargas no ambiente, como ventiladores, abajures, luminarias ou qualquer outro equipamento que deseje controlar.
Foi feito de maneira que possamos aprender até 4 teclas do controle remoto, de preferência, teclas não usadas, para que não ocorra o acionamento de mais de um equipamento.
Também, é igualmente possível escolher por programação, se o rele do canal escolhido atuará de forma ‘pulso’ ou ‘retenção’.
Vamos ver, então, como se procede a programação:
1) Aperte o botão ‘Prog’ por 2 segundos. Começará a piscar o led ‘Prog’ de forma normal. O led do canal 1 se acende.
2) Aperte uma tecla do controle, da sua escolha, que deseje gravar na Eeprom, para comandar o canal 1. Ao ser aceito, apagará o led do canal 1 e acenderá o led do canal 2.
3) Aperte um outra tecla do controle, para comandar o canal 2.
Ao ser aceito, apagará o led do canal 2 e acenderá o led do canal 3.
4) Novamente, aperte uma outra tecla do controle, para comandar o canal 3. Ao ser aceito, apagará o led do canal 3 e acenderá o led do canal 4.
5) E finalmente, aperte uma última tecla do controle, para comandar o canal 4. Ao ser aceito, apagará o led do canal 4 e o led ‘Prog’ começará a piscar de forma mais rápida. Isto indica que entrou na programação do ‘modo de operação’.
Siga os seguintes passos para escolher entre atuação por ‘Pulso’ ou ‘Retenção’:
1) Aperte uma das teclas do controle que foi gravada. A cada aperto, o led do canal correspondente acenderá ou apagará. Deixando aceso será modo ‘pulso’ e deixando apagado será modo ‘retenção’ para este canal.
2) Repita com as outras 3 teclas que foram gravadas.
3) Feito a gravação, aperte momentaneamente o botão ‘Prog’ para sair do modo de programação.
Caso programe uma tecla que não desejava, aperte qualquer tecla varias vezes, até começar a piscar rápido o led ‘Prog’.
Então, aperte brevemente o botão ‘Prog’ para sair de programação. Refaça os passos com as teclas corretas.
Atenção: Aprenda teclas diferentes. Se for aprendido 2 ou mais teclas iguais, somente a primeira que for aprendida é que funcionará.
Usando o receptor de 4 canais:
Ao apertar no controle remoto uma tecla previamente gravada, ela acionará uma das saídas, em modo pulso ou retenção, dependendo de como foi programado. Os reles devem ter condições de suportar as cargas de correntes em seus contatos. Poderá controlar 4 cargas diferentes, como ventiladores, abajures, luminárias em geral, bem como outros aparelhos eletrodomésticos.
Nada impede de controlar cargas DC também, visto que os contatos dos reles, nos canais, são isolados entre si.
Use controle remoto com protocolo ‘NEC’ apenas. Outros protocolos não irão funcionar.
Para a recepção do protocolo ‘NEC’ foi usado o timer 1 para medir os tempos e determinar se o bit recebido é 1 ou 0. Este protocolo tem como característica um cabeçalho de 9 milisegundos, seguido por um período de 4,5 milisegundos de pausa, antes do envio do primeiro bit. Temos 8 bits de endereços , seguidos de 8 bits de endereço invertidos, mais 8 bits de comandos e 8 bit de comandos invertidos. É a distancia entre pulsos que determina um ‘0’ ou ‘1’. Se a tecla for mantida apertada, será enviada a primeira transmissão completa, seguida de transmissões com apenas o cabeçalho e um bit ‘1’, repetindo a cada 110 milisegundos.
Já o timer 0, foi usado em modo de interrupção, para testar o botão ‘Prog’ a cada 65 mseg, acionar o led ‘Prog’ em piscadas, normais e rápidas, e atuar contadores de tempo.
A rotina foi mantida bem simples, com muitas repetições, mas facilmente compreensíveis. Apesar disto, ainda sobram muitas linhas de flash.
Com respeito alimentação de tensão para o circuito, providencie uma fonte com transformador de 12 volts, bem como diodos retificadores, capacitores de filtro e regulador 7805 para os 5 volts do PIC.
Obs. Este dispositivo é apenas didático, sendo montado apenas em protoboard e sendo sujeito a bugs não identificados. O hex gerado poderá ser usado para gravar também no Pic 12f629.
Segue o arquivo ASM (atualizado em 12/08/13):
Segue o arquivo HEX:
Veja também, esta versão que utiliza triacs na saída, mas com o mesmo Hex -> Esquema com triacs
Agora está também disponível em arquivo “C” para os que não são muito fãs do Assembly. Segue pasta zipada com os arquivos em “C”:
Segue o desenho da placa de circuito impresso, uma gentileza realizada pelo colaborador ‘FOXCONN’, a quem agradecemos:
CONTROLE 675 IR NEC disponivel
Segue abaixo, o esquema para acionamento de 2 motores de 12 volts (note que a tensão poderá ser alterada visto que estamos usando reles), com o objetivo didático de acionar uma persiana de janela. Após a carga do Hex no chip, deverá ser gravado 4 teclas de um controle remoto (padrão NEC), todas em modo ‘pulso’. Usa-se reed switch ou microchaves para fins de curso (proteção), os quais, ao acionar, cortam a polarização do transistor que aciona o respectivo rele:
Manuais:
Curiosidades:
Petróleo — métodos de extração
Controle remoto e o gás de efeito estufa
Cirurgia robótica
Imitação das asas da gaivota
O passado e o presente dos brinquedos
Tortura à venda
“Ouro vermelho” do Mediterrâneo
Assista videos educativos
Outros assuntos:
Como criar filhos bondosos num mundo egoísta?
Como acabar com a tática do silêncio
Os milagres são possíveis – 3 objeções
Como enfrentar o bullying sem ter de partir para a briga (animação)
Como criar filhos responsáveis
Como administrar o seu dinheiro
Ensine valores morais a seus filhos
Ensine seus filhos bons principios com atividades de colorir
Como posso ter ânimo para exercitar
Como posso controlar meu peso?
Entrevista com um bioquímico
Adolescentes- O que fazer se estou sofrendo bullying?
Como evitar ferir com palavras?
Como tratar seu cônjuge com respeito?
Até o próximo artigo!!!
Boa tarde, gostaria de agradecer pelos projetos interessantes aqui disponibilizados e gostaria de deixar um comentário a respeito da placa de circuíto impresso postada pelo amigo foxconn: eu gostei do projeto e resolvi construir a pci, mas ao testar a “coisa” não funcionou como esperado, conferi as ligações e não havia nada de errado, então confrontei o desenho da pci com o desenho esquemático do projeto e pude perceber alguns erros;
1: No desenho esquemático do projeto eletronico a entrada de sinal vinda do receptor ir é gp3 (pino 4 do pic), porém, no desenho da pci postada pelo foxconn a entrada de sinal vinda do receptor ir está em gp4 (pino 3 do pic), está invertido, utilizando como está na pci o programa não funciona, então basta corrigir pelo esquema do circíto e pronto.
2: outra observação foi quanto aos resistores de 470R, um ligado no catodo do Led Prog e o outro aterrando um lado da chave Prog, ambos estão em um posicionamento diferente na placa de circuíto impresso, mas também observei que esta troca não ocasionou erros ao programar as teclas.
Fazendo as alterações do 1 a placa funciona e é possivel efetuar a programação das saídas e faze-las atuar como programado.
Olá Larios eu fiz uma modificação no teu código para simplesmente visualizar o comando no display e sem uso da eeprom,porém ele funcionou perfeitamente ,porém quando tento tratar cada botão apertado eu não consigo visualizar no display.EX aperto bt 1 acende led 1,bt 2 acende led 2 e por aí vai.Pode dar uma olhada no código e me ajudar.Obrigado
LIST P=16f628A , R=DEC
INCLUDE “P16F628A.INC”
;PALAVRA DE CONFIGURAÇÃO
ERRORLEVEL -302
__CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF & _XT_OSC & _BODEN_ON & _MCLRE_OFF
;DEFINIÇÕES
#DEFINE BANK0 BCF STATUS,RP0 ;SETA BANK0 DE MEMORIA
#DEFINE BANK1 BSF STATUS,RP0 ;SETA BANK1
#DEFINE FLAG FLAGS,0 ;FLAG DE SITUAÇÃO
#DEFINE FLAG1 FLAGS,1 ;FLAG DE NOVA LEITURA
#DEFINE FLAG_MR0 FLAGS,2 ;FLAG DE TRAVA
#DEFINE FLAGGR FLAGS,3 ;FLAG DE ‘LEARN’ APRENDER
#DEFINE FLAG_MR1 FLAGS,4 ;FLAG TRAVA
#DEFINE FLAG_T FLAGS,5 ;FLAG T
#DEFINE FLAG_PROG_ON FLAGS,6 ;FLAG DE MODO DE PROGRAMAÇÃO
#DEFINE FLAG_3H FLAGS,7 ;FLAG PISCADA EM 3HZ OU 1HZ
#DEFINE SIN PORTA,0
#DEFINE LED0 PORTB,0
#DEFINE LED1 PORTB,1
#DEFINE LED2 PORTB,2
;DEFINIÇÕES DE PORTAS DE SAIDA
;RAM
CBLOCK 0X20
RES3,RES2,RES1,RES0,AUX,AUX1,AUX2,TEMP,QB,FLAGS,LcdDelayCounter,LcdDelayCounter1
ADDRESS,TMP,R0,R1,R2,CONT_INT,CONT_INT1,T1_INT,STATUSTEMP,WTEMP,PASSO,ADDR_SALVO,d1,d2,d3,TECLA0,TECLA1,TECLA2,
ENDC
;EQUATES
TMAX EQU .50 ;TEMPO MAXIMO DO SINAL LOW
QBYTE EQU .32 ;QUANTIDADE DE BYTES A SER RECEBIDO (8+8+8+8)
T_PROG EQU .30 ;TEMPO DE BOTÃO APERTADO PARA ENTRAR EM MODO DE PROGRAMAÇÃO
T_DELAY EQU .11 ;TEMPO DE DELAY .10
T_DELAY1 EQU .2 ;TEMPO DE DELAY .10
;=========================================================================================================
; RESET
;=========================================================================================================
ORG 0X00
GOTO START
;=========================================================================================================
; INTERRUPÇÃO
;=========================================================================================================
ORG 0X04
GOTO START
;=========================================================================================================
; INICIO DO PROGRAMA
;=========================================================================================================
START:
BANK1
MOVLW 0x01
MOVWF TRISA
MOVLW 0X00
MOVWF TRISB
MOVLW 0X00
MOVWF INTCON
BANK0
MOVLW 0X07
MOVWF CMCON ;DESLIGA COMPARADORES
CLRF PORTA
CLRF PORTB
CLRF TMR0 ;ZERA TMR0
CLRF PASSO ;GERENCIADOR DE PASSOS
CLRF FLAGS ;APAGA REGISTRADOR DE FLAGS
;=========================================================================================================
; ROTINA PRINCIPAL
;=========================================================================================================
INICIO:
CLRF RES3
CLRF RES2
CLRF RES1
CLRF RES0
MOVLW QBYTE ;32 BITS PREPARA PARA A RECEPÇÃO COM NUMERO DE BITS A RECEBER
MOVWF QB
CLRF TMR1H
CLRF TMR1L
BCF PIR1,TMR1IF
BSF T1CON,TMR1ON
CLRF PORTB
GOTO SS5
;=========================================================================================================
; ROTINA DE RECEPÇÃO DE SINAIS DO PROTOCOLO ‘NEC’
; OBS. RECEPTOR INFRAVERMELHO FORNECE SINAL INVERTIDO
;=========================================================================================================
RECEIVE
SS5:
BTFSS SIN ; ‘S’ SIN ? TESTA SINAL DE ENTRADA DO RECEPTOR DE INFRAVERMELHO
GOTO IN_1
;=========================================================================================================
;SIN=0
BCF FLAG_MR1
BTFSC FLAG_MR0
GOTO SS5
BSF FLAG_MR0
BCF T1CON,TMR1ON ;DESLIGA TMR1
BTFSC PIR1,TMR1IF ;TESTA FLAG DO TIMER 1
GOTO RESETA_REC
MOVFW TMR1H
SUBLW 0X1F
BTFSC STATUS,C
GOTO CLR_TMR1
;——————————XXX
SAI_TAD
GOTO RESETA_REC ;RESETA RECEPÇÃO SE PULSO EM ‘1’ MAIOR QUE 8MS
;========================================================================================================
;ENTRADA SIN=1
IN_1
BCF FLAG_MR0
BTFSC FLAG_MR1
GOTO SS5
BSF FLAG_MR1
BCF T1CON,TMR1ON ;DESLIGA TMR1
BTFSC PIR1,TMR1IF ;TESTA FLAG DO TIMER 1
GOTO CLR_TMR1
MOVFW TMR1H
SUBLW 0X0F ;TESTA INTERVALO DE 4,5MS
BTFSS STATUS,C
GOTO CLR_TMR1 ;FOI INTERVALO DE 4,5MS
;=====================================================================TESTE
MOVFW TMR1H
SUBLW 0X05 ;TESTA POR INTERVALO DE 2,25 MS
BTFSS STATUS,C
CLRF CONT_INT1
;=====================================================================TESTE
MOVFW TMR1H
SUBLW 0X03 ;TESTA POR BIT ‘1’
BTFSC STATUS,C
GOTO SEGKW1
BSF STATUS,C
GOTO RODA_BYTE
SEGKW1
MOVFW TMR1H
SUBLW 0X00 ;TESTA POR BIT ‘0’
BTFSC STATUS,C
GOTO CLR_TMR1
BCF STATUS,C
GOTO RODA_BYTE
RESETA_REC
MOVLW QBYTE ;SETUP INICIAL PARA NOVA RECEPÇÃO
MOVWF QB
CLRF RES3
CLRF RES2
CLRF RES1
CLRF RES0
CLR_TMR1
;CLRF CONT_INT1 ;ZERA CONTADOR DE TEMPO EM MODO PULSO
CLRF TMR1L ;LIMPA TMR1
CLRF TMR1H
BCF PIR1,TMR1IF ;APAGA FLAG TMR1
BSF T1CON,TMR1ON ;RELIGA TIMER1
GOTO SS5 ;VOLTA AO LOOP
RODA_BYTE
RRF RES3,F ;DESLOCA BIT RECEBIDO
RRF RES2,F
RRF RES1,F
RRF RES0,F
DECFSZ QB,F ;VERIFICA SE JÁ RECEBEU TODOS OS BITS
GOTO CLR_TMR1 ;AINDA NÃO
;=====================================================================
; RECEBEU CORRETAMENTE UM NÚMERO DE CONTROLE REMOTO ‘NEC’
;=====================================================================
CLRF CONT_INT1 ;ZERA TEMPO MODO PULSO
MOVF RES2, W
GOTO TC0
TC0
MOVLW 0XA4
MOVWF TECLA0
MOVF RES2,W
XORWF TECLA0,W
BTFSS STATUS,Z
GOTO TC1
BSF LED0
CALL TEMPO
BCF LED0
GOTO INICIO
TC1
MOVLW 0x68
MOVWF TECLA1
MOVF RES2,W
XORWF TECLA1,W
BTFSS STATUS,Z
GOTO TC2
BSF LED1
CALL TEMPO
BCF LED1
GOTO INICIO
TC2
MOVLW 0X98
MOVWF TECLA2
MOVF RES2,W
XORWF TECLA2,W
BTFSS STATUS,Z
GOTO INICIO
BSF LED2
CALL TEMPO
BCF LED2
GOTO INICIO
TEMPO
movlw 0x0D
movwf d1
movlw 0x46
movwf d2
movlw 0x04
movwf d3
Delay_0
decfsz d1, f
goto $+2
decfsz d2, f
goto $+2
decfsz d3, f
goto Delay_0
RETURN
END
Olá Genilsonsa!
Analisando a porção de código que você passou, notei que a temporização está sendo feita pelo método normal do ’empaca’, ou seja, você trava o programa por um tempo e depois libera para prosseguir a execução do resto do programa. Se você fizer isto, não vai visualizar nada, porque o programa está ’empacado’ no delay e não tem como enviar nada para o LCD. Você terá que fazer este tempo de uma forma que não trave o programa. Poderá usar um ou mais registradores em cascata, com carga inicial de tempo no momento que liga o led correspondente a saída, e dentro do loop principal, faze-los decrementar até chegar a zero, quando então desligaria o led que foi acionado. Outra possibilidade, é usar uma interrupção de um timer livre para depois de determinado número de interrupções, desligar o led que foi acionado.
Por ex. no primeiro caso:
Você fez assim:
TC1
MOVLW 0×68
MOVWF TECLA1
MOVF RES2,W
XORWF TECLA1,W
BTFSS STATUS,Z
GOTO TC2
BSF LED1
CALL TEMPO
BCF LED1
GOTO INICIO
TC2
MOVLW 0X98
MOVWF TECLA2
MOVF RES2,W
XORWF TECLA2,W
BTFSS STATUS,Z
GOTO INICIO
BSF LED2
CALL TEMPO
BCF LED2
GOTO INICIO
Mas, ao invés de chamar a rotina de ‘call tempo’ fazer assim:
TC1
MOVLW 0×68
MOVWF TECLA1
MOVF RES2,W
XORWF TECLA1,W
BTFSS STATUS,Z
GOTO TC2
BSF LED1
CALL carga_tempo_led1
GOTO INICIO
TC2
MOVLW 0X98
MOVWF TECLA2
MOVF RES2,W
XORWF TECLA2,W
BTFSS STATUS,Z
GOTO INICIO
BSF LED2
CALL carga_tempo_led2
GOTO INICIO
Carga_tempo_led1
Movlw 0x60
Movwf reg_tempo_led1a
Movlw 0xff
Movwf reg_tempo_led1b
return
Carga_tempo_led2
Movlw 0x60
Movwf reg_tempo_led2a
Movlw 0xff
Movwf reg_tempo_led2b
return
E no ínicio colocar os decrementos destes registradores ‘dinâmicos’ de tempo:
INICIO:
Decfsz reg_tempo_led1b
Goto segue1
Decfsz reg_tempo_led1a
Goto segue 1
Bcf led1
Segue1
Decfsz reg_tempo_led2b
Goto segue2
Decfsz reg_tempo_led2a
Goto segue 2
Bcf led2
Segue2
CLRF RES3
CLRF RES2
CLRF RES1
CLRF RES0
MOVLW QBYTE ;32 BITS PREPARA PARA A RECEPÇÃO COM NUMERO DE BITS A RECEBER
MOVWF QB
CLRF TMR1H
CLRF TMR1L
BCF PIR1,TMR1IF
BSF T1CON,TMR1ON
CLRF PORTB
………………………….segue o programa normal
Fazendo desta forma, não travará o programa.
Se o tempo for pequeno demais, poderá usar quantos registradores for necessário para o tempo desejado. Em geral, 2 são suficientes. Quanto a calcular o valor a ser carregado, poderá usar o mplab ( na função ‘stopwatch’ do debug) contando quanto foi o tempo por loop, ou fazer por tentativa e erro.
Cláudio
Ola Larios eu fiz adaptação do seu código para o pic 16f628a só que sem o uso da eeprom.Demorei.porém,achei o porque que não estava visualizando o valor das teclas.Controle que estava tentando decodificar é um chinês que vende acompanhado com arduino e no manual que arrumei ele vem com código HEX de cada tecla,porém os códigos vieram todos errados então por isso não estava conseguindo visualizar no display de 7 seg duplo quando fazia a comparação da tecla escolhidas e sem osciloscopio fica ainda mais dificil,porém me virei aqui e achei todos codigos das teclas.Muito Obrigado
Postarei em breve todos os códigos do controle.Abraço e boa noite
Muito obrigado por me responder ESTOU USANDO A VERSÃO ASM.Entendi a tua explicação do protocolo NEC muito clara e objetiva.No caso do teu código os endereço ficam armazenados no registradores RES0,RES1,RES2,RES3..
No caso do teu codigo RES0 é ENDEREÇO
RES1 é ENDEREÇO INVERTIDO
RES2 é COMANDO
RES3 é COMANDO INVERTIDO
Olá Genilsonsa!
A recepção é conforme a porção do código abaixo:
RODA_BYTE
RRF RES3,F ;DESLOCA BIT RECEBIDO
RRF RES2,F
RRF RES1,F
RRF RES0,F
DECFSZ QB,F ;VERIFICA SE JÁ RECEBEU TODOS OS BITS
GOTO CLR_TMR1 ;AINDA NÃO
Notou que os bits recebidos são deslocados para direita até o pleno número recebido?
No final do processo RES0 terá o Address, RES1 o Address invertido, RES2 terá o Command, e RES3 terá o Command invertido.
Então sua conclusão está correta!
Cláudio
Larios muito obrigado pela tua resposta fico muito agradecido pelo teus esclarecimentos.Participo do teu blog já um tempo e gostaria de saber como eu posso lhe ajudar.Pois eu vejo aqui que vc ajuda muitas pessoas
Olá Genilsonsa!
Muito obrigado por sua disposição em ajudar!
Claudio
Minha dúvida maior é o protocolo NEC que estou tentando entender e não consigo o que me deixa muito triste.Gostaria apenas de reconhecer a tecla e fazer uma função para cada uma delas sem precisar de guardar na EEPROM.Me ajudar aí amigo.
Ola Lários excelente projeto,porém gostaria de saber se vc pode me ajudar.Gostaria de alterar esse projeto tenho um controle padrão NEC que contém 20 teclas eu queria na verdade é decodifica-la sem precisa-la guardar na EEPROM,ou seja aperto tecla 1 executa uma função,Tecla 2 outra função e por aí vai,porém eu não consigo entender em que parte do teu programa que vem com a tecla já decodificada.Pode me ajudar adapta-lo?
Olá Genilsonsa!
Você esta usando a versão ASM ou C? Quanto ao protocolo NEC, pesquise na internet sob o tema ‘NEC Infrared Transmission Protocol’ que tem um farto material explicativo. Basicamente, uma transmissão se inicia com um cabeçalho de 9 ms transmitindo seguido por uma pausa de 4,5 ms. Em seguida começa a transmitir 4 bytes de informação, sendo um byte normal e o próximo invertido.
Após a primeira transmissão mantendo a tecla apertada no controle remoto, não mais ocorrerá a transmissão total do cabeçalho mais os 4 bytes, mas apenas uma transmissão reduzida para indicar tecla apertada e uma pausa de 110 ms . Este é chamado de ‘repeat code’. O primeiro byte recebido é do ‘address’ ou seja, qual aparelho irá operar (tv, satélite, etc), o segundo é o ‘address’ invertido em seus bits para conferência , o terceiro é o ‘command’ ou seja , o comando ou tecla apertada (ligar, números de 0 a 9, canal, etc), e o quarto e último byte é o ‘command’ invertido para conferencia da transmissão, se o sinal não foi corrompido. Em uma aplicação simples, poderá apenas comparar o byte 3 com uma tabela que chamará a rotina desejada ao ser apertado tal tecla. Terá que pesquisar quais são estes comandos e montar esta tabela com eles. Creio que esta seja uma breve explicação e espero que tenha sido de ajuda.
Claudio