CONTROLE REMOTO 8 CANAIS ON/OFF – PIC 16F628A

Controlar brinquedos por controle remoto tem sido um dos passatempos mais apreciados por crianças e também ‘adultos’. Muitos gastam ‘fortunas’ comprando replicas de carros, locomotivas, etc. Os menos afortunados nas finanças , preferem ser mais ‘economicos’, montando suas proprias réplicas e construindo seus próprios circuitos eletrônicos. Em alguns casos, queremos apenas controlar alguma coisa a distância, como por exemplo, um aparelho colocado no telhado ou em um prédio distante. Será que poderiamos tirar proveito das facilidades de programação de um microcontrolador para fazermos isto? Veja a resposta…

Veja o esquema abaixo:

Este projeto experimental, utiliza 2 PIC’s 16F628A , sendo um no transmissor e outro no receptor. No transmissor, temos 8 chaves ligadas aos pinos do PIC, que quando acionadas, setarão as respectivas saidas no receptor (led 0 a led 7). Esta saidas poderão controlar reles de carga, controlando assim maior potência. Cargas pequenas poderão ser controladas por transistores, também pode-se usar foto acopladores como MOC3021 para controlar triac’s diretamente em corrente alternada (lampadas, motores,etc). Use sua imaginação!!!

O protocolo usado, basicamente envia um startbit, seguido por um numero de 8 bit, correspondente ao ‘NÚMERO IDENTIFICADOR’ do aparelho, após o que, vem os 8 bits correspondentes ao estado dos botões e um intervalos final entre transmissões. A idéia do numero do aparelho, é poder usar varios conjuntos tx + rx de numeros diferentes, sem que um controle o outro (pelo menos em teoria). Este número poderá ser alterado no arquivo asm e deverá ser recompilado para obter o novo arquivo hex.
Um bit ‘0’ é formado por 1 periodo de tempo ‘low’ + 2 periodos de tempo ‘high’ na saida, pino 17. O bit ‘1’ corresponde a 2 periodos de tempo em nivel ‘low’, seguido de 1 periodo de tempo em nivel ‘high’ na saida, pino 17.
A rotina de recepção examina a cada 50 microsegundos o estado do pino 17 (entrada de rf) e se=0 incrementa o contador ‘LC’. Se for =’1′, incrementa o contador ‘HC’. A diferença entre eles corresponde ao bit a ser transferido no contador de saida (Res1,Res0). Em uma recepção bem sucedida, o byte Res0 é comparado com um número fixo do aparelho, e se for igual, irá colocar na saida (Portb), os valores recebidos. Caso cesse a transmissão, os contadores de tempos NOTX1 E NOTX, serão decrementados pela rotina, e , chegando em ‘zero’, irão apagar todas as saidas (clrf portb).

Deverá ser usado transmissor e receptor na frequencia cedida a controle remotos na faixa de 27 mhz . Existe muitos vendidos comercialmente, mas poderão ser também montados. Abaixo temos um exemplo ilustrativo de circuito transmissor e receptor, comum nos sites da internet, (porém, não tendo sido testado por mim, nem tenho algum em especial para recomendar):

Como se trata de uma montagem experimental, foi testada apenas em protoboard, com um tx + rx de 433 mhz, mas, para uso em brinquedos, não é permitido, porque nesta frequencia, poderá atrapalhar o funcionamento de equipamentos como portões, alarmes, etc.

Segue abaixo o arquivo ASM para TX:

CR27_TX_ASM

Segue abaixo o arquivo HEX para TX:

CR27_TX_HEX

Segue abaixo o arquivo ASM para RX:

CR27_RX_ASM

Segue abaixo o arquivo HEX para RX:

CR27_RX_HEX

Adicionalmente, pode-se aproveitar as portas que sobram do portA para colocar uma chave ‘DIP’ externa, com o
objetivo de com um único transmissor, poder controlar vários receptores que usem o mesmo ‘serial number’ escolhido no ASM.
Aquele que tiver a combinação da chave “DIP’ igual a do transmissor é que será acionado naquele momento.
Veja o esquema para esta opção de montagem abaixo:

Como temos 6 bits disponíveis, isto permite usar até 64 receptores em um grupo de mesmo ‘serial number’.
Note que o acionamento é apenas momentâneo, uma vez que paramos de apertar a tecla, a saída do receptor desliga.
Assim, deverá ser previsto circuitos do tipo flip-flop ligados na saída do microcontrolador, quando se desejar funções de ‘retenção’.

Segue o arquivo ASM do TX desta versão com chave ‘DIP’:

CR_TX_8C_SEL_ASM

Segue o arquivo HEX do TX desta versão com chave ‘DIP’:

CR_TX_8C_PROG_HEX

Segue o arquivo ASM do RX desta versão com chave ‘DIP’:

CR_RX_8C_SEL_ASM

Segue o arquivo HEX do RX desta versão com chave ‘DIP’:

CR_RX_8C_PROG_HEX

Em 15/03/2014, foi realizado modificações no receptor para que se possa escolher entre modo pulso ou retenção, alterando o ASM e recompilando. O esquema é o mesmo, apenas foi ajustado o arquivo ASM. Portanto, segue abaixo a pasta com esta nova versão configurável pino a pino de saída, com atualização em 01/12/2015 (eliminado bug que alternava saída em modo retenção se interruptor fosse continuamente acionado):

CR_8C_PROG_RET_v4

Em 16/12/2015 foi feita esta versão abaixo que grava na EEprom a situação das saídas programadas para modo ‘Retenção’, retornando os valores após um reset (como na falta de energia elétrica da rede doméstica):

CR_8C_SEL_RET_V5_EEPROM_FILES

Caso queira uma versão PWM de 8 canais e 5 botões on/off veja o artigo ‘FAÇA UM CONTROLE REMOTO PWM 8 CANAIS (1MS A 2MS) – COM PIC 16F628A’
Caso deseje outra versão PWM de 2 canais e 3 botões on/off, veja o artigo ‘FAÇA UM PEQUENO CONTROLE REMOTO PWM DE 2 CANAIS (1MS A 2MS) – COM PIC 12F675’
Caso deseje ainda outra versão PWM de 2 canais (sendo uma de 0-5v) e 3 botões on/off, veja o artigo ‘FAÇA UM ‘VERSÁTIL’ CONTROLE REMOTO REMOTO – COM PIC12F675’

Curiosidades:
Filas
Petróleo – acabará algum dia?
Gás Natural – energia para o lar
Ponte da torre – Uma entrada para Londres

Outros assuntos:
Qual o objetivo dos pais ao criar os filhos?
Como lidar com os sogros?
Desempenhem bem o papel de pais
Como reagir ao assédio sexual
Como lidar com problemas financeiros e dívidas
Converse com seus filhos sobre sexo

Assista a este vídeo: O que é um amigo de verdade?

Até o próximo artigo!!!

156 comments on “CONTROLE REMOTO 8 CANAIS ON/OFF – PIC 16F628A

  1. Olá, Claudio!

    Agradeço as dicas, tem ajudado bastante;
    Estou usando o MPLAB e simulando no PROTEUS.
    Alterei para 4 canais com retenção e separadamente funcionou; mas qdo juntei os programas no mesmo PIC, então só funciona o TX, pois ele é executado primeiro; se inverter, executando primeiro o RX, então o TX pará de funcionar e o RX funciona…Estou tentando entender a lógica de transmissão e recepção…
    Mas, se puder, dê uma olhada no programa abaixo, e se puder dar uma dica… Agradeço

    ;TRANSCEPTOR DE 4 CANAIS – BASEADO NO RX/TX DE 8 CANAIS (CLAUDIO LÁRIUS).
    ;LIGA/DESLIGAR COM 4 CANAIS, MANTENDO O ULTIMO ESTADO DE ACIONAMENTO.
    ;
    ;JAMIL RAMOS 01/11/2012
    ;

    LIST P=16F628A , R=DEC

    INCLUDE “P16F628A.INC”
    ;————————–
    ERRORLEVEL -302
    __CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT & _BODEN_ON & _MCLRE_ON & _LVP_OFF

    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

    #DEFINE BANK0 BCF STATUS,RP0 ;SETA BANK0 DE MEMORIA
    #DEFINE BANK1 BSF STATUS,RP0 ;SETA BANK1
    #DEFINE OUT_RF PORTA,0 ;OUT RF PINO 15
    #DEFINE BT1 PORTB,0 ;BOTÃO 1
    #DEFINE BT2 PORTB,1 ;BOTÃO 2
    #DEFINE BT3 PORTB,2 ;BOTÃO 3
    #DEFINE BT4 PORTB,3 ;BOTÃO 4
    #DEFINE FLAG FLAGS,0 ;FLAG DE SITUAÇÃO
    #DEFINE FLAG1 FLAGS,1 ;FLAG DE NOVA LEITURA
    #DEFINE FLAG_1 FLAGS,2 ;FLAG DE SITUAÇÃO SAIDA 1
    #DEFINE FLAG_2 FLAGS,3 ;FLAG DE SITUAÇÃO SAIDA 2
    #DEFINE FLAG_3 FLAGS,4 ;FLAG DE SITUAÇÃO SAIDA 3
    #DEFINE FLAG_4 FLAGS,5 ;FLAG DE SITUAÇÃO SAIDA 4
    #DEFINE SIN PORTA,7 ;PINO 16 IN RF
    #DEFINE LED1 PORTB,4 ;SAIDA 1 – PINO
    #DEFINE LED2 PORTB,5 ;SAIDA 2 – PINO
    #DEFINE LED3 PORTB,6 ;SAIDA 3 – PINO
    #DEFINE LED4 PORTB,7 ;SAIDA 1 – PINO

    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

    CBLOCK 0X20
    RES1,RES0,RES1A,RES0A,FLAGS,BITCOUNTER,LC,HC,CONT,R0,R1,R2,NOTX,
    NOTX1,AUX,OUT,RES1TX,RES0TX,R6,R5,R7,BTS ;registradores
    ENDC

    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

    QBYTE EQU .16 ;QUANTIDADE DE BYTES A SER ENVIADO/RECEBIDO
    TMAX EQU .50 ;TEMPO MAXIMO DO SINAL LOW
    VNOTX1 EQU .1 ;HIGH TEMPO MAXIMO SEM TRANSMISSÃO PARA ZERAR SAIDAS
    VNOTX EQU .50 ;LOW TEMPO MAXIMO SEM TRANSMISSÃO PARA ZERAR SAIDAS
    FILTRO EQU .50 ;FILTRO PARA ACIONAMENTOS

    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

    ORG 0X00
    GOTO START
    ORG 0X04
    RETFIE

    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

    START:
    MOVLW 0X07
    MOVWF CMCON ;DESLIGA COMPARADORES
    MOVLW .0
    MOVWF PORTA
    MOVWF PORTB
    BANK1
    CLRF OPTION_REG ;HABILITA PULL-UP

    ;DEF. PORT_B B’76543210
    MOVLW B’11111111′ ;TUDO ENTRADA
    MOVWF TRISB

    ;DEF. PORT_A B’76543210
    MOVLW B’10000000′ ;(PA7=RFIN); (PA0=RFOUT); (PA3,PA2,PA1,PA0 = LEDS 4,3,2,1)
    MOVWF TRISA

    BANK0
    CLRF FLAGS ;APAGA REGISTRADOR DE FLAGS

    MOVLW VNOTX
    MOVWF NOTX
    MOVLW VNOTX1
    MOVWF NOTX1

    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

    INICIOTX:

    MOVLW 0XAA ;CÓDIGO DO TRANSMISSOR
    MOVWF RES0TX ;ENVIA CODIGO PARA O 1°BYTE DE TRANSMISSÃO
    MOVFW PORTB ;PEGA INFORMAÇÃO DAS TECLAS
    MOVWF BTS ;ENVIA PARA BTS, FORMAR 2°BYTE DE TRANSMISSÃO
    BSF BTS,7 ;IGNORA BIT 7 DA PORTA B
    BSF BTS,6 ;IGNORA BIT 6 DA PORTA B
    BSF BTS,5 ;IGNORA BIT 5 DA PORTA B
    BSF BTS,4 ;IGNORA BIT 4 DA PORTA B
    MOVFW BTS ;PEGA INFORMAÇÃO DAS TECLAS
    XORLW 0XFF ;COMPARA COM LOGICA “OU EXCLUSIVO”
    BTFSC STATUS,Z ;O RESULTADO FICA NO REGISTRADOR “STATUS,Z”
    GOTO INICIOTX ;SE RESULTADO “1”, ENTÃO AGUARDA TECLA SER APERTADA
    MOVFW BTS ;SE RESULTADO “0”, ENTÃO SERÁ O 2° BYTE DE TRANSMISSÃO
    MOVWF RES1TX ;ENCAMINHA PARA REGISTRADOR DO 2°BYTE

    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ENVIAR:
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

    PAUSA:
    MOVLW .23 ;23 UNIDADES BASICAS DE BIT
    MOVWF R6
    RTY:
    CALL DELAY1CK
    DECFSZ R6,F
    GOTO RTY

    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    CALL STARTBIT
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

    MOVLW QBYTE ;QUANTIDADE DE BITS A TRANSMITIR
    MOVWF R5
    VOLT10:
    BCF STATUS,C
    RRF RES1TX,F
    RRF RES0TX,F
    BTFSC STATUS,C
    GOTO EB1
    CALL BIT0
    VV13:
    DECFSZ R5,F
    GOTO VOLT10
    GOTO INICIOTX ;
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    EB1:
    CALL BIT1
    GOTO VV13
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

    ;ROTINAS

    DELAY1CK:
    MOVLW .120
    MOVWF R7 ;158D PARA 330 MICROSEG. DE LAMBDA
    DECFSZ R7,F
    GOTO $-1
    RETURN
    BIT0:
    BCF OUT_RF
    CALL DELAY1CK
    BSF OUT_RF
    CALL DELAY1CK
    CALL DELAY1CK
    BCF OUT_RF
    RETURN
    BIT1:
    BCF OUT_RF
    CALL DELAY1CK
    CALL DELAY1CK
    BSF OUT_RF
    CALL DELAY1CK
    BCF OUT_RF
    RETURN
    STARTBIT:
    BSF OUT_RF
    CALL DELAY1CK
    BCF OUT_RF
    RETURN

    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

    INICIORX:

    ;BANK0
    CLRF FLAGS ;APAGA REGISTRADOR DE FLAGS
    MOVLW VNOTX ;APAGA REGISTRADOR
    MOVWF NOTX ;APAGA REGISTRADOR
    MOVLW VNOTX1 ;APAGA REGISTRADOR
    MOVWF NOTX1 ;APAGA REGISTRADOR

    CLRF RES1 ;LIMPA REGISTRADOR DO 2°BYTE (TECLAS)
    CLRF RES0 ;LIMPA REGISTRADOR DO 1°BYTE (CÓDIGO)
    MOVLW QBYTE ;PREPARA A RECEPÇÃO PARA 16 BITS A RECEBER
    MOVWF BITCOUNTER ;ARMAZENA O VALOR DE 16 NO REG.”BITCOUNTER”
    L0
    BCF FLAG ;LIMPA O “FLAG0″, REGISTRO DE RECEPÇÃO
    CLRF HC ;LIMPA O REG.”HC”
    CLRF LC ;LIMPA O REG.”LC”
    L1
    L1H
    SS5:
    BTFSS FLAG ;TESTA FLAG DE HUM/ZERO RECEBIDO
    GOTO L2 ;FLAG=0

    1. Olá Jamil! Você está indo muito bem. Pense no seguinte: Cada um dos programas em sí, forma um loop fechado para funcionarem. Se voce colocar o tx antes do rx, nunca vai funcionar o rx e vice-versa. O que voce tem de fazer é ,de alguma forma , interromper o loop individual e de um passar para o outro e do outro para um. Mas tem que levar a questão da prioridade. Se uma recepção está em progresso, deverá terminar primeiro, antes de começar a transmitir, ou seja, recepção tem prioridade. A milhares de jeito diferente de fazer a coisa funcionar (e isto me maravilha!). Você poderá usar o desvio de rotina (goto) para isto. Mas , parece, olhando por cima, que se você iniciar a rotina de recepção primeiro, e escolher um ponto desta rotina em que você poderá usar um ‘call testa_tx’ para ver se algum botão foi apertado da parte da transmissão, ou seja, você vai colocar toda rotina da transmissão como se fosse uma subrotina. Se não estiver recebendo nenhum sinal, ela irá imediatamente enviar o sinal para transmissão e acabando , voltará para a rotina de recepção. O ponto critico é de onde você chamaria esta subrotina, levando em conta a prioridade da recepção (logicamente, se desejar, por ser subrotina, poderia ser chamada de varios pontos estratégicos. Você deve estudar como funciona tanto a recepção como a transmissão, que fica mais facil achar este ponto. Eu procuro, ao estudar programas de colegas, desenhar um fluxograma em uma folha de papel, a medida que vou lendo o arquivo ASM. Isto ajuda a ‘ver’ o que está acontecendo.) Espero que estas dicas te ajudem.
      Claudio

  2. Bom dia, Claudio!
    Como o 16F628A só tem 16 portas, então não dá, pois precisaria de 18 portas… Fiz alguns anos atrás um curso bem basico do pic em assembler (acender e piscar leds, etc), alguns comandos descritos no seu projeto são familiares… Como o serial é composto por 8 bits fixo (código do tx) + 8 bits (leituta da porta B), então pensei em utilizar apenas 8 bits(codigo do tx) + 4 bits(4 teclas); desta forma seria utilizado 10 portas do pic(4 teclas, 4 leds, 1 entrada, 1 saida). Mas como faço pra inserir apenas 4 bits da porta B na serialização? Pensei em utilizar o seu receptor p/ HCS PIC16F628A, por sinal muito bom, mas fica além dos meus conhecimentos, e não teria como explicar o funcional na banca do TCC… O projeto inicial eu estava fazendo com um par de HT12D e HT12E, 2 ci com portas AND, 2 ci 4013 pra manter os leds acesos (liga/desliga). A idéia do projeto é simple: é um controle remoto de luzes para 4 comodos com leds para monitorar quais comodos (luzes) estão acesos e poder ligar e desligar qualquer das 4 luzes de qualquer comodo; ao transmitir o comando pra acionar um comodo, este comando é enviado pra todos transceptores, atualizando o respectivo led de status. Pra acionar a lampada utilizo um rele ligado em um dos 4 leds com um transistor. Mas como vou colocar isto dentro do interruptor de luz, então o espaço não deu… Usando apenas o PIC + (TX e RX), então daria… Outra dúvida, como faço pra alterar as saidas em liga/desliga a cada acionamento do tx?
    Desde já agradeço

    1. Olá Jamil! Você poderá baixar o MPLAB-IDE (editor,compilador e debugador), O WINPIC800 para programar e alguns datasheets dos microcontroladores que irá usar. Em seguida , ler alguns tutoriais, e tentar fazer programas simples em asm, depois compilar, usar o debugador e ver o que acontece nos registradores e saidas. Deverá providenciar um hardware para transferir o arquivo HEX para o chip (poderá usar o SIMPLES PROGRAMADOR). Depois que voce pegar o jeito, pegue o arquivo asm acima e tente rodar no debugador para estudar o funcionamento. Dai faça as alterações que deseja, no caso, a união dos dois arquivos , Altere as portas para entrada e saidas desejadas e gradativamente va testando e eliminando os ‘bugs’ (erros) que forem dando. É um pouco cansativo, mas é muito legal fazer tais programas. Para alterar a saida em modo ‘retenção’ ,voce primeiro precisa testar se está ligado ou não a saida desejada e depois inverte-la a cada sinal recebido. Precisará identificar quando ocorreu uma nova transmissão, pela ‘pausa’ entre transmissão, visto que ao apertar o botão, irá rapidamente ocorrer varias transmissões sucessivas.
      Claudio

  3. Podem ser varios tx/rx(transceptor) em “espera”( ninguém transmitindo); Ao acionar a tecla-1 do tx/rx, ele vai transmitir alguns frames de comando p/ acionar o led-1 dos demais tx/rx; Os tx/rx ao decodificar os frames, acionará a saida do led-1, mantendo-a acionada. se o prox. comando for igual, então a saida led-1 será desligada.
    Como o 16F628A tem 16 portas, então seria 4 teclas, 4 leds, 1 saida tx, 1 entrada rx, reset.

    1. Olá Jamil! Creio que não terá problemas para fazer isto. Basta colocar os dois arquivos juntos (tx e rx) fazendo o loop final de um ir para o loop inicial do outro. Deverá acertar na inicialização, as io’s correspondentes aos pinos de entrada e saida em apenas um dos arquivos ( o que voce escolher como inicial). Elimine a inicialização do outro. Dai, bastaria montar varios circuitos para teste.
      Claudio

  4. Olá, Larios! A idéia é um transceptor que envia e recebe comandos, sendo de 3 ou 4 canais; exemplo:ao acionar a tecla(1), ele transmite o comando pra outros transceptores, que acionarão o led(1), que ficará aceso até receber o prox. comando da tecla(1). Como o tx e rx ficará na mesma placa, então usar só um 16F628A será show.
    Desde já, agradeço. Se quiser te envio o esquema…

    1. Olá Jamil! Entendi bem. Quantos destes “transceptores” seriam montados? Se mais de 2, haveria a possibilidade de conflito de sinais, ou somente seria acionado um por vez (como em uma apresentação escolar)? Haveria diferença na frequência transmissora da receptora?
      Claudio

  5. Muito bom, todos aplicativos. Pra mim será de grande aprendizado…
    Estou fazendo meu TCC, com um projeto de Transceptor para ligar e desligar 3 leds, utilizando modulos tx e rx 433mhz e Holtek HT12D e HT12E. Se reduzir os 2 softwares p/ 3 canais, caberiam no pic? Grato

    1. Olá Jamil! Obrigado pelo seu comentário. Não entendi bem o que você deseja fazer. Colocar 2 softwares em um unico Pic? Se for isto, qual o objetivo?
      Cláudio

Comments are closed.

Back To Top