Radio Controle - esquema
Barão de Melgaço - MT - Brasil - 07/08/2009
Neste artigo iremos montar um Rádio Controle que acione alguns LEDs. Após algumas pesquisa na internet, decidimos usar o Transmissor TXC1 ou TX - C1 tanto faz (Figura 1) e o Receptor RXD1 (Figura 1b). Encontramos no Mercado Livre estes componentes para venda.O ID do vendedor é WORLDPIC e nos enviou via Correios no mesmo dia da compra.
Figura1a: Receptor RXD1
Figura1b: Transmissor TXC1
Encontramos o projeto Radio Remote Control of Appliances (Ver anexo), onde mostra como fazer um rádio controle. Então, iremos basear neste projeto para fazermos nosso radio controle.
No projeto, é mostrado o C.I. HT12E e o HT12D que são respectivamente um codigicador e um decodificador (Figura 2a e Figura 2b), onde conseguimos comprar também no Mercado Livre com o mesmo vendedor citado anteriormente.
Figura 2a: C.I. Codificador HT12E
Figura 2b: C.I. Decodificador HT12D
Abaixo segue um exemplo de como os C.I.'s são utilizados (Figura 3). Eles servem para evitar que um rádio controle interfira com o outro. Para isso, basta fazer as mesmas configurações das chaves do C.I. HT12E e do C.I. HT12D. Por exemplo, se no primeiro C.I. configurarmos a chave A0 como fechada e o restante (A1 até A7) deixarmos abertas, teremos então que fazer esta mesma configuração no outro C.I. para que haja uma comunicação entre eles.
Figura 3: Exemplo de um circuito usando os C.I.'s HT12E e HT12D.
A antena
Consultado o datasheet dos módulos de do Transmissor TXC1 e do Receptor RXD1, obtivemos os seguintes tamanhos para a antena:
- Transmissor TXC1: Comprimento = 22.6cm para 315MHz ; Comprimento = 17.2 cm para 434MHz.
- Receptor RXD1: Comprimento = 22.6cm para 315MHz ; Comprimento = 17.2 cm para 434MHz.
Como iremos trabalhar com a frequência de 433.92MHz, o tamanha da nossa antena será:
- Transmissor TXC1: Comprimento = 17.2cm
- Receptor RXD1: Comprimento = 17.2cm
A antena pode ser feita de fio rígido de cobre 26AWG [1] ou fio encontrado em cabo de rede.
O circuito
No esquema elétrico do Rádio Controle (Figura 4), configuramos o C.I. codificador HT12E com a chave A0 fechada. Sendo assim, obrigatoriamente, temos que manter a chave A0 do C.I. decodificador HT12D (Figura 5) também fechada.
Figura 4: Esquema elétrico do Rádio Controle.
Figura 5: Esquema elétrico do circuito receptor.
Este circuito foi montado em protoboard e funcionou muito bem. Testamos também sem antena e a transmissão ocorreu normalmente.
Para quem precisa de um controle remoto com mais botões, podemos adicionar ao circuito um microcontrolador. Fizemos isso utilizando um microcontrolador PIC 16F628A da Microchip. Com isso, podemos obter até 8 chaves. Lembrando que poderíamos usar um outro microcontrolador com mais portas para expandir ainda mais o número de chaves.
Os pinos RA1, RA2, RA3 e RA4, foram ligados em chaves para serem utilizados como configuração de endereço. Sendo assim, se no circuito transmissor (Figura 7) todas as chaves estiverem abertas, então todas as chaves do circuito receptor (Figura 8) também devem estar abertas para que o circuito receba os dados. Observe que temos apenas 4 chaves para configuração de endereço. Isso possibilita fazer até 16 endereçamento diferente. Para quem precisa de mais endereçamentos, pode utilizar um PIC com mais portas ou entao escrever esse endereçamento no próprio software. Para isso, basta inserir um número de 0 a 255 nas variáveis Codigo e CodigoLocal que encontram-se respectivamente no código fonte do transmissor e do receptor. Veja um exemplo abaixo de como deve ficar o código.
Trecho do código Transmissor - Demonstração de como deve ficar o código caso haja a necessidade de expandir o número de endereçamento.
.
.
.
Do
Codigo = 130
Dado = PORTB 'Copia o valor do PORTB para a variável Dado
Transmita 'Chama a sub-rotina para transmitir o dado
Loop
.
.
.
Trecho do código Receptor - Demonstração de como deve ficar o código caso haja a necessidade de expandir o número de endereçamento.
.
.
.
'Lendo o código local
CodigoLocal = 130
'Verifica se é o código correto
If CodigoLocal = CodigoRecebido Then
PORTB = DadoRecebido 'Se o código é correto, então PORTB recebe o valor do dado recebido.
end if
Loop
.
.
.
Figura 7: Circuito transmissor do rádio controle com PIC 16F628A.
Figura 8: Circuito receptor do rádio controle com PIC 16F628A.
O código fonte foi escrito para o compilador GCBASIC (http://gcbasic.sourceforge.net/). A vantagem de se usar o GCBASIC está na sua facilidade e também por ele ser Open Source. Para facilitar a compilação do GCBASIC, usamos o programa Prithvi Portable que é um portatil do programa Prithvi Development Studio (http://sourceforge.net/projects/prithvi/). Pra quem nunca utilizou o programa Prithvi, assista este vídeo que demonstra como compilar um código fonte: http://youtu.be/NFfLw_ibIcY
O compilador GCBASIC vem com uma função para transmissão serial. Porém, para melhor entender a transmissão, resolvi criar um pacote de transmissão usando a codificação Manchester [2]. Para sincronizar os dados, foi criado um pulso alto de 2000 microssegundos seguido de um nível baixo de 100 microssegundos (Figura 10). Em seguida, é transmitido um byte com o endereço (ou código) e outro byte contendo o dado. A codificaçao Manchester usada foi a IEEE 802.3 (Figura 11).
Figura 9 - Sinal do pacote transmitido.
Figura 10 - Analise dos pulsos de cada pacote transmitido.
Figura 11 - Codificação Manchester. Disponível em http://en.wikipedia.org/wiki/Manchester_code
Os arquivos transmissor.hex e receptor.hex podem ser baixados no final desta página. Logo abaixo existe um vídeo mostrando o funcionamento do circuito através de simulação.
Código fonte - Transmissor
#chip 16F628A, 4
#define TX PORTA.0 'Define o pino RA0 como TX
Dir TX Out 'Define TX como saída
Dir PORTA.1 In 'Define PORTA.1 como entrada
Dir PORTA.2 In 'Define PORTA.2 como entrada
Dir PORTA.3 In 'Define PORTA.3 como entrada
Dir PORTA.4 In 'Define PORTA.4 como entrada
Dir PORTB in 'Define todo o PORTB como entrada
Do
Codigo.1 = PORTA.1 'Copia o valor do pino RA1 para o bit 1 da variável Código
Codigo.2 = PORTA.2 'Copia o valor do pino RA2 para o bit 2 da variável Código
Codigo.3 = PORTA.3 'Copia o valor do pino RA3 para o bit 3 da variável Código
Codigo.4 = PORTA.4 'Copia o valor do pino RA4 para o bit 4 da variável Código
Dado = PORTB 'Copia o valor do PORTB para a variável Dado
Transmita 'Chama a sub-rotina para transmitir o dado
Loop
Sub Transmita
' 01 é igual a 1
' 10 é igual a 0
'Inicio da transmissao
'Rotina para transmitir pulso longo
TX = 1
Wait 2000 us
TX = 0
Wait 100 us
If Codigo.0 = 1 Then
Transmita1
Else
Transmita0
end if
If Codigo.1 = 1 Then
Transmita1
Else
Transmita0
end if
If Codigo.2 = 1 Then
Transmita1
Else
Transmita0
end if
If Codigo.3 = 1 Then
Transmita1
Else
Transmita0
end if
If Codigo.4 = 1 Then
Transmita1
Else
Transmita0
end if
If Codigo.5 = 1 Then
Transmita1
Else
Transmita0
end if
If Codigo.6 = 1 Then
Transmita1
Else
Transmita0
end if
If Codigo.7 = 1 Then
Transmita1
Else
Transmita0
end if
If Dado.0 = 1 Then
Transmita1
Else
Transmita0
end if
If Dado.1 = 1 Then
Transmita1
Else
Transmita0
end if
If Dado.2 = 1 Then
Transmita1
Else
Transmita0
end if
If Dado.3 = 1 Then
Transmita1
Else
Transmita0
end if
If Dado.4 = 1 Then
Transmita1
Else
Transmita0
end if
If Dado.5 = 1 Then
Transmita1
Else
Transmita0
end if
If Dado.6 = 1 Then
Transmita1
Else
Transmita0
end if
If Dado.7 = 1 Then
Transmita1
Else
Transmita0
end if
end sub
Sub Transmita1
TX = 0
Wait 100 us
TX = 1
Wait 100 us
end sub
Sub Transmita0
TX = 1
Wait 100 us
TX = 0
Wait 100 us
end sub
Código fonte - Receptor
#chip 16F628A, 4
#define RX PORTA.0 'Define o pino RA0 como RX para receber a transmisão
Dir RX In 'Define a RX como entrada
Dir PORTA.1 In 'Define o pino RA1 como entrada
Dir PORTA.2 In 'Define o pino RA2 como entrada
Dir PORTA.3 In 'Define o pino RA3 como entrada
Dir PORTA.4 In 'Define o pino RA4 como entrada
Dir PORTB Out 'Define todo PORTB como saida
Wait 10 ms
'Zera variáveis
CodigoLocal = 0
Do
'=============================================================================
'Identifica Pulso de 2000 ms para iniciar a leitura do dado
'=============================================================================
Inicio:
Contador = 0 'Zera contador
Volta:
If RX = 1 Then 'Testa se o sinal está em nível alto
Contador = Contador + 1 'Incrementa contador
wait 15 us 'Aguarda 15 microsegundos
Goto Volta 'Volta para testar o pulso novamente
End if 'Fim da rotina If
If Contador < 95 Then 'Se contador menor que 95, cancela e volta p/ Inicio
Goto Inicio
end if
'Se contador maior que 95, receba o dado
'=============================================================================
Receba 'Chama sub-rotina para receber o dado
DecodificaManchester 'Chama sub-rotina para decodificar o dado recebido
DadoRecebido = dado 'Salva valor do dado recebido
'Verificar codificação
dadoA = codigoA 'Copia o codigoA na variável dadoA para decodifica-lo usando a sub-rotina DecodificaManchester
dadoB = codigoB 'Copia o codigoA na variável dadoA para decodifica-lo usando a sub-rotina DecodificaManchester
DecodificaManchester 'Chama sub-rotina para decodificar o Código recebido
CodigoRecebido = dado 'Salva valor do codigo recebido
'Lendo o código local
CodigoLocal.1 = PORTA.1 'Copia o estado do pino RA1 no bit 1 da variável CodigoLocal
CodigoLocal.2 = PORTA.2 'Copia o estado do pino RA2 no bit 2 da variável CodigoLocal
CodigoLocal.3 = PORTA.3 'Copia o estado do pino RA3 no bit 3 da variável CodigoLocal
CodigoLocal.4 = PORTA.4 'Copia o estado do pino RA4 no bit 4 da variável CodigoLocal
'Verifica se é o código correto
If CodigoLocal = CodigoRecebido Then
PORTB = DadoRecebido 'Se o código é correto, então PORTB recebe o valor do dado recebido.
end if
Loop
Sub Receba
Wait 145 us 'Aguarda 145 microsegundo para sincronizar os pulsos
codigoA.0 = RX
Wait 100 us
codigoA.1 = RX
Wait 100 us
codigoA.2 = RX
Wait 100 us
codigoA.3 = RX
Wait 100 us
codigoA.4 = RX
Wait 100 us
codigoA.5 = RX
Wait 100 us
codigoA.6 = RX
Wait 100 us
codigoA.7 = RX
Wait 100 us
codigoB.0 = RX
Wait 100 us
codigoB.1 = RX
Wait 100 us
codigoB.2 = RX
Wait 100 us
codigoB.3 = RX
Wait 100 us
codigoB.4 = RX
Wait 100 us
codigoB.5 = RX
Wait 100 us
codigoB.6 = RX
Wait 100 us
codigoB.7 = RX
Wait 100 us
dadoA.0 = RX
Wait 100 us
dadoA.1 = RX
Wait 100 us
dadoA.2 = RX
Wait 100 us
dadoA.3 = RX
Wait 100 us
dadoA.4 = RX
Wait 100 us
dadoA.5 = RX
Wait 100 us
dadoA.6 = RX
Wait 100 us
dadoA.7 = RX
Wait 100 us
dadoB.0 = RX
Wait 100 us
dadoB.1 = RX
Wait 100 us
dadoB.2 = RX
Wait 100 us
dadoB.3 = RX
Wait 100 us
dadoB.4 = RX
Wait 100 us
dadoB.5 = RX
Wait 100 us
dadoB.6 = RX
Wait 100 us
dadoB.7 = RX
End sub
Sub DecodificaManchester
If dadoA.0=1 Then
If dadoA.1=1 Then GOTO erro
MyData_recebendo.0 = 0
else
If dadoA.1=0 Then GOTO erro
MyData_recebendo.0 = 1
end if
If dadoA.2=1 Then
If dadoA.3=1 Then GOTO erro
MyData_recebendo.1 = 0
else
If dadoA.3=0 Then GOTO erro
MyData_recebendo.1 = 1
end if
If dadoA.4=1 Then
If dadoA.5=1 Then GOTO erro
MyData_recebendo.2 = 0
else
If dadoA.5=0 Then GOTO erro
MyData_recebendo.2 = 1
end if
If dadoA.6=1 Then
If dadoA.7=1 Then GOTO erro
MyData_recebendo.3 = 0
else
If dadoA.7=0 Then GOTO erro
MyData_recebendo.3 = 1
end if
If dadoB.0=1 Then
If dadoB.1=1 Then GOTO erro
MyData_recebendo.4 = 0
else
If dadoB.1=0 Then GOTO erro
MyData_recebendo.4 = 1
end if
If dadoB.2=1 Then
If dadoB.3=1 Then GOTO erro
MyData_recebendo.5 = 0
else
If dadoB.3=0 Then GOTO erro
MyData_recebendo.5 = 1
end if
If dadoB.4=1 Then
If dadoB.5=1 Then GOTO erro
MyData_recebendo.6 = 0
else
If dadoB.5=0 Then GOTO erro
MyData_recebendo.6 = 1
end if
If dadoB.6=1 Then
If dadoB.7=1 Then GOTO erro
MyData_recebendo.7 = 0
else
If dadoB.7=0 Then GOTO erro
MyData_recebendo.7 = 1
end if
dado = MyData_recebendo
end sub
erro:
Goto Inicio
end
Referências:
[1] Rogercom, Disponível em <http://www.rogercom.com/pparalela/LptWireless.htm>; acessado em 10 de Agosto de 2009.
[2] Wikipédia, Manchester code. Disponível em <http://en.wikipedia.org/wiki/Manchester_code>; acessado em 09 de Abril de 2013.
[3] GCBASIC, Great Cow BASIC. Disponível em <http://gcbasic.sourceforge.net/>; acessado em 09 de Abril de 2013.
[4] Prithvi Development Studio. Disponível em <http://sourceforge.net/projects/prithvi>; acessado em 09 de Abril de 2013.
Fórum, http://74.125.47.132/search?q=cache:-bfz2kd6VzkJ:forum.clubedohardware.com.br/archive/controle-remoto-rf/487527+Ht12d+esquema&cd=4&hl=pt-BR&ct=clnk&gl=br