Hoje encontramos no mercado, transmissores de controle remoto para portão e alarmes com vários circuitos integrados. Que tal um único código em que pudéssemos optar qual modelo usar?
Analisando as muitas situações de uso para os controles remotos, desejei tentar fazer um programa que atendesse as mais variadas necessidades dos hobistas. Por exemplo: Um artigo é postado para um receptor usando um HT6P20b, com 2 canais. Surge alguém que precisa de 3 canais. Outro hobista deseja um canal invertido. Ainda outro, que a saída seja em modo ‘retenção’ para todos os pinos. Sem falar dos que desejam um pino em modo ‘pulso’ e outros em ‘retenção’. Realmente se torna um pouco ‘enfadonho’, escrever e reescrever os códigos já publicados, com estas simples alterações. Também, em muitas localidades não se encontra determinado integrado usado na montagem, mas existe de outros modelos. Surgiu a ideia de escrever um código em que fosse possível montar nosso receptor a ‘LA CARTE’. Cada hobista escolheria sua opção e marcaria no código. Depois é só compilar e carregar o PIC.
As características desejadas obtidas neste código são estas:
1) Opção de escolher qual integrado do transmissor iremos decodificar. Assim, poderá ser optado pelo ci HT6P20B, PT2262,PT2240B e família HCS 200 …301 (somente em modo fixo, sem usar o HOPPING CODE).
Obs. Apenas um modelo pode ser usado por vez.
2) Opção de escolher de forma individual, se as saídas serão em modo ‘PULSO’ ou ‘RETENÇÃO’.
3) Opção de escolha de forma também individual, se as saídas serão ‘invertidas’ ou ‘normais’.
4) Opção por aprendizado único de todos os botões (para uso em um único aparelho) ou aprendizado individual (para uso com vários aparelhos)
5) Escolher entre o PIC 12f675 ou 629.
6) Escolher carregar um byte de calibração provisório (em situações de perda deste de forma acidental). Os Pics ‘encostados’ , por não funcionarem em programas gerados em compiladores ‘C’, pela falta deste byte de calibração, poderão ser reaproveitados.
7) Possibilidade de mudar quais pinos serão usados, respeitando as limitações para pinos específicos.
Outra necessidade é que fosse em uma linguagem mais ‘usual’ e não no ‘Assembly’, pois muitos tem ‘aversão’, uma genuína ‘idiossincrasia’ só da menção do nome desta nobre linguagem. Dando os primeiros passos na linguagem “C”, portanto, esta foi a linguagem escolhida para este humilde projeto de iniciante. Creio que, para quem já é experiente nesta linguagem, não terá dificuldade em alterar e talvez simplificar as linhas de código. Mas foi o que consegui e portanto, estou compartilhando. Todas sugestões serão bem recebidas, de como fazer de uma forma melhor.
Voltando ao código, foi usado o compilador CCS C para a compilação, podendo ser usado a versão de demonstração. Logo no início do programa, podemos alterar nossas escolhas em ‘Opções do Usuário’, por comentar ou descomentar as linhas relacionadas as opções.
A rotina faz uso da interrupção do Timer 0 a cada 100 microssegundos, para analisar o estado da entrada que tem o sinal do receptor de 433mhz (RFIN, pino 3). Se for ‘0’, irá incrementar o contador ‘LC’ e acionar o flag_L. Depois, quando a entrada ficar ‘1’, irá incrementar o contador ‘HC’. Quando a entrada rfin ficar ‘0’ novamente, será analisado se o contador ‘LC’ estourou um valor máximo, o que indicaria um intervalo grande (pausa entre transmissões) e que servirá de sincronização do sinal. Se o valor de ‘LC’ ficou abaixo do permitido, haverá uma subtração de ‘LC’- ‘HC’, cujo valor do ‘carry’ será deslocado para dentro do buffer de recepção de 3 bytes e resetando ‘LC’, ‘HC’ e o ‘flag_L’, em preparação para um novo bit a ser recebido. Ao final de 24 bits recebidos (ou 64 no HCS) teremos uma recepção completa. Isto será sinalizado por setar o ‘flag_rok’. São feitas 2 recepções para comparar e eliminar erros de transmissão. Depois a rotina procura na memória pelo número transmitido (serial number), se já foi aprendido na memória. Se foi, irá acionar as saídas de acordo com as opções escolhidas pelo usuário. Se não, irá verificar se o botão ‘LEARN’ foi apertado (e o led ‘learn’ deverá estar aceso). No caso de ter sido apertado, será gravado este número recebido na EEprom e apagará o led “LEARN’. Com respeito a recepção do HCS, foi aproveitado apenas parte do serial number (HCS usa 28 bits + 4 botões= 32 bits ou 4 bytes da parte ‘fixa’ + 32 bits ou 3 bytes na parte encriptada, mas são gravados na EEprom apenas 22 bits + 2 bits dos botões). A razão desta decisão foi dar compatibilidade com os outros controles que usam apenas 3 bytes para o serial number.
Atenção: Este programa é de caráter didático apenas, sujeito a bugs ainda não detectados.
Segue o arquivo ‘C’:
Segue pasta zipada com os arquivos do projeto (10/11/2013):
Segue pasta zipada com os arquivos do projeto ( atualizada em 17/12/2016):
Segue pasta zipada com os arquivos do projeto, sendo esta uma versão que salva o estado das saídas em retenção na EEprom do pic e retorna no seu reset ( 17/12/2016):
E versão (em teste) para ht6p20d também:
Como a montagem permite muitíssimas combinações de circuitos integrados e modos de operação, ficará evidente porque não tentei fornecer o arquivo Hex. Cada hobista deverá escolher a suas opções e recompilar, para obter o arquivo HEX.
Obs. Ainda não obtive retorno do funcionamento do código para PT2262, sendo testado apenas com o clone do PT2262 deste blog.
Segue os esquemas de 4 sugestões de montagens, onde temos receptores de 1 a 4 canais:
Manuais:
HCS200
PT2262
PT2240b
Pic12F675
Curiosidades:
O rio que teve seu curso invertido
Outros grandes terremotos estão por vir
Será que Deus é o responsável?
Teve um Projeto? O econômico peixe-cofre
Por que a cooperação é essencial
Como poderá manter um conceito equilibrado sobre o dinheiro?
Sou viciado em aparelhos eletrônicos?
20 modos de criar mais tempo
Dengue — uma ameaça crescente
Preservados numa gota dourada
O “mundo perdido” da Bolívia
Outros assuntos:
Um site para você
Como disciplinar seu filho adolescente
Por que eu me corto?
Desempenhem bem o papel de pais
Como fazer seu segundo casamento dar certo
O que acontece quando morremos?
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?
Perguntas Bíblicas Respondidas
Até o próximo artigo!!!
Olá Lário tudo bem? Você é uma bênção. Esse blog tem projetos que são muito além de materiais didáticos. Mais uma vez agradecido por compartilhar seu conhecimento. Antes de mais nada, gostaria de tirar uma dúvida contigo.Como faria para gravar mais de um botão do mesmo controle chaveirinho na memória para ligar o mesmo relé na linguagem C? Por exemplo. Quero utilizar dois botões do controle para ligar o relé 01. Desde já agradeço. Um abraço.
Olá Xuguinho! Obrigado por seu comentário apreciativo pelas matérias deste blog. Para fazer o que você deseja terá que mudar a lógica de acionamento no próprio código ‘C’.
Observe a porção de código, para exemplo, referente a recepção do Ht6p20b abaixo:
#ifdef CHIP_HT6P20B
#ifndef s2_ret
#ifdef s2_invertido
if((bit_test(botoes,6))&&(bit_test(botoes,7))) _s2=0; else _s2=1;// pino 5 ‘0’ // Note que aqui precisa estar os 2 botões acionados para acionar a saida s2 pino 5 (lógica and &&)
#else
if((bit_test(botoes,6))&&(bit_test(botoes,7))) _s2=1; else _s2=0;// pino 5 ‘1’ //idem para opção normal (sem inverter)
#endif
#endif
#ifndef s0_ret
#ifdef s0_invertido
if((bit_test(botoes,7))&&(!bit_test(botoes,6)))_s0=0; else _s0=1;// pino 2 ‘0’ // aqui exige que bit 7 seja ‘1’ e bit 6 seja ‘0’ para ligar saída S0.
#else
if((bit_test(botoes,7))&&(!bit_test(botoes,6)))_s0=1; else _s0=0;// pino 2 ‘1’ //idem sem inversão
#endif
#endif
#ifndef s1_ret
#ifdef s1_invertido
if((bit_test(botoes,6))&&(!bit_test(botoes,7)))_s1=0; else _s1=1;// pino 3 ‘0’ // aqui exige que bit 6 seja ‘1’ e bit 7 seja ‘0’ para ligar saída S1.
#else
if((bit_test(botoes,6))&&(!bit_test(botoes,7)))_s1=1; else _s1=0;// pino 3 ‘1’ // idem sem inversão
#endif
#endif
#endif
Você poderá alterar a lógica acima, para o chip que irá usar, reescrevendo código conforme necessitar acionar uma saída ou mais ao mesmo tempo e com quais botões:
Por ex.
if((bit_test(botoes,7))||(!bit_test(botoes,6)))_s0=1; else _s0=0;// pino 2 ‘1’ // se bit 7 ou 6 for ‘1’, acione a saída ‘S0 ‘
Ou com mais de uma saída:
if((bit_test(botoes,7))||(!bit_test(botoes,6))){_s0=1;_s2; }else {_s0=0;_s2;}// pino 2 ‘1’ // se bit 7 ou 6 for ‘1’, acione a saída ‘S0 ‘ e ‘S2’
Fique atento que o código faz uso de funções como ‘inverter saída’, ‘modo pulso/retenção’ . Assim, tem que acertar as modificações em várias partes do programa, como na inicialização, no modo retenção, no modo pulso,etc , para que tudo fique a contento. Dá um pequena ’embaralhada’ na cabeça, mas é bom para treinar nossos neurônios ‘sobreviventes’ ( ‘tico e teco’).
Cláudio
lario estou aqui novamente aproveitando minha folguinha.
eu montei este receptor generico que na verdade é uma joia,mais estou tendo uns problemas com extra_ terrestre,pois os mesmos estão invadindo meu receptor e desativando rsrsr não sei se voce entende étê e poderá me ajudar proteger destes invasores penetras?.note ai, quando o relé sem hora marcada ele desliga, testei por varias vezes, e por ultimo ativei o relé e desliguei a saida entre o receptor e o pic dai não ele não desliga tem alguma explicaçao para este paranormal?rsrsr estou usando protocolo ht6p20b
Olá José Luiz! Experimente usar um outro controle remoto( chaveirinho) diferente para teste. Tem um vizinho de um amigo que seu portão acionava quando outro vizinho acionava seu controle remoto. Pode ser que alguém tenha um código parecido nas vizinhanças.
Cláudio
lario favor desconsiderar a pergunta que te fiz quanto ao receptor não tem nada de errado.
lario tudo bem? lario eu montei este receptor para apenas uma saida pelo qual está funcionando muito bem
no modo htp620b é muito versatil,so tenho uma pequena duvida,exemplo meu controle chaveirinho e de 2 botoes
e apenas 1 aprende o codigo ou seja apenas um botão funciona.será que estou tendo engano,ou erro? pode me dar uma luz?obrigado
Olá Claudio!
Desejo felicidade para você.Já agora para todo mundo,também.
Este projeto é muito interessante.
Resolvi montá-lo,em placa de ensaios.
Mas o meu programador,fabrico caseiro,não deteta o pic 12f675,uso o winpic800. O programador parece-me bem, já experimentei com os pics 16f84A, 16f628A, 16f676, 16f877A. Todos estes foram detetados e seguidamente foram programados com sucesso em outros projetos,obviamente; alguns de sua autoria.
Mesmo assim tentei programar o pic 12f675, dá o seguinte erro:
Erro ao escrever no endereço 0x000000 escrito: 0x3000 Lido:0x3FFF.
Descomentei: #define PERDI_BYTE_CALIBRAÇÂO. tentei novamente, seguinte erro:
O valor OSCALL do Pic é… 0x3FFF Deseja utilizar o valor do buffer 0x34FC. Em qualquer opção, sim ou não, dá o erro acima citado, o primeiro erro.
Defeito, Será o programador ou o pic? Ou do utilizador? 😀
Se o claudio poder dar uma dica, ou seja, dizer de sua sabedoria!. Desde já muito obrigado.
Grato.
Costa.
Olá Costa!
Eu acredito que está acontecendo o seguinte: Como o pino do ‘MCLR’ está sendo usado como entrada, após a programação, quando se tenta ler o pic irá indicar apenas 0x3ff em todos os endereços. Porque?
Porque a comunicação com o pic necessita de haver ‘reset’ em dados momentos. Sem o pino ‘MCLR’ atuando, não haverá reset. Pronto! Não se consegue ler mais nada e nem sequer identificar o pic. Parece até que ele queimou! Como resolver o problema? Para resolver isto, o único jeito de resetar o pic sem o ‘MCLR’ é desligando a alimentação do pic. Então, somente nesta situação, terá que usar um esquema diferente de simples programador. Estou postando junto ao artigo original, mais 2 versões com este recurso: Um usa mais 2 transistores comuns (npn e pnp) e a outra, apenas um irf640 ou equivalente. Experimente montar uma destas versões no protoboard e testar. Se tiver já feito o simples programador (com placa e tudo), a versão com mosfet fica mais fácil de adaptar.
Claudio
Olá Claudio.
Muito obrigado por me responder.
O meu programador já tem essa função, é o Tait,porta paralela.
Vou adquirir o material necessário e montar novo programador. Mas, terá que ser outro esquema,pois, o meu PC não tem porta serial,DB9. -Tenho gravado os Pics através da porta paralela, DB25.
Vou tentar resolver o problema.
Dar-lhe-ei notícias se tal acontecer.
Bem haja!
Costa.
Olá Claudio!
A minha dificuldade em gravar o PIC 12F675 finalmente foi superada.
Instalei 2 portas serial -COM- no meu PC e com o novo programador,pic gravado, pronto! Dá uma trabalheira para quem pouco, ou quase nada, percebe do assunto. Mas,a meu ritmo, vou evoluindo,desde que comecei a visitar o seu blog.
Por tudo o que tenho aprendido aqui, muito obrigado!
Grato.
Costa.
Olá Costa! Parabéns! É isto mesmo! Seja persistente para conseguir seus objetivos. Obrigado por retornar suas expressões sinceras.
Cláudio