Tags

, , ,

TÍTULO: DECODIFICADOR PARA O ENCODER HT6P20B COM ARDUINO
CRIADO POR: AFONSO CELSO TURCATO
E-MAIL: acturcato (at) gmail.com
LICENÇA: GPL

REVISÕES:
00 – 20/12/2013 – Versão inicial baseada no código do Jacques Moresco (veja nas Referências)
01 – 27/12/2013 – Correção do problema de travamento do código quando um ANTI-CODE inválido é recebido (agradecimento ao Gilson Oguime @oguime)
02 – 10/01/2014 – Otimização do código. Criação de uma função que retorna o ENDEREÇO e o BOTÃO pressionado, além da diminuição do uso de variáveis globais.
03 – 11-JAN-2014 – Nova otimização do código. Foi criada uma “struct” para os controles e removidas as variáveis globais
04 – 18-JUN-2014 – Nova otimização do código. Variável lambda foi declarada como Global para ficar “compatível” com o Arduino Nano (segundo orientação dada pelo Henrique Brancher Gravina)

O HT6P20B gera um código de 28 bits, sendo 22 bits de ENDEREÇO, 2 bits de DADOS e 4 bits de “ANTI-CODE” (código de verificação).

O ENDEREÇO é fixo para um mesmo CI, ou seja, sempre a mesma sequência de bits “0” e “1” (cada CI HT6P20 tem um ENDEREÇO diferente).
O DADO muda de acordo com o botão pressionado.
O ANTI-CODE é sempre o mesmo: “0101”

Para o modelo HT6P20D são 20 bits de ENDEREÇO e 4 bits de DADOS.
Para o modelo HT6P20F são 19 bits de ENDEREÇO e 5 bits de DADOS
(Veja tabela no Datasheet para maiores detalhes)

Os bits do ENDEREÇO e dos DADOS são transmitidos utilizando-se 3 ciclos de clock.

Ligando-se um resistor de 2M2 nos pinos 4 e 5 do HT6P20B, tem-se um clock interno de 2 KHz e portanto um ciclo de clock de 500 us. Assim cada bit será transmitido em 1500 us.
Ligando-se um resistor de 1M4 nos pinos 4 e 5 do HT6P20B, tem-se um clock interno de 3 KHz e portanto um ciclo de clock de 333 us. Assim cada bit será transmidito em 1000 us.
Alguns modelos mais novos de HT6P20 já possuem oscilador interno (não necessitam de resistor externo)

O código completo compreende 4 partes principais: Piloto, Endereço, Dado e Anti-Código.
– O Piloto é formado por 23 ciclos de “0” e um ciclo de “1”.
– O Endereço é formado por 22 bits (66 ciclos);
– O Dado é formado por 2 bits (6 ciclos).
– O Anti-Código é formado por 4 bits (12 ciclos) sendo sempre “0101”.

Veja a figura na página 4 do datasheet!

Para saber se o bit transmitido é “0” ou “1”, deve-se analisar o segundo ciclo de cada bit (lembrando q cada bit transmitido usa 3 ciclos):
– O “primeiro ciclo” de cada bit será sempre “0”;
– O “segundo ciclo” será “1” se o bit transmitido for “0” (ZERO) ou será “0” se o bit transmitido for “1” (UM).
– O “terceiro ciclo” será sempre “1”.

Assim, para saber qual o bit transmitido, basta “medir” a duração do pulso em “1” para cada três ciclos. Sendo:
– Se a duração do pulso em “1” for igual a de um ciclo, significa q o “segundo ciclo” foi “0”, então o bit transmitido é “1” (UM);
– Se a duração do pulso em “1” for igual a duas vezes a de um ciclo, significa q o “segundo ciclo” foi “1”, então o bit transmitido é “0” (ZERO).

Veja a figura na página 5 do datasheet!

A função da rotina então é identificar o período PILOTO e depois ler cada bit de ENDEREÇO e de DADO.

Para identificar o período PILOTO, monitora-se a saída do módulo receptor e verifica-se qnto tempo ela permanece em “0”.
Para considerar as variações que o código pode sofrer (devido a variações do resistor e/ou tensão da bateria), considera-se aqui um ciclo de clock interno entre 400 us e 600 us.
Assim, o intervalo de 23 ciclos em nível 0 deve ficar entre 9.2 ms (23 x 400us) a 13.8 ms (23 x 600us).
Valores fora dessa faixa são desprezados!

Após estes 23 ciclos em nível “0”, tem-se um ciclo em nível “1”, q no caso será um intervalo compreendido entre 400 us a 600 us.

Detectando-se esse tempo em “0” e logo após um ciclo em “1”, considera-se q este seja um período PILOTO. E assim, deve-se analisar os bits posteriores que serão o ADDRESS, DADO e ANTI-CODE.

Nesta parte, calcula-se o lambda (tempo de um pulso) como sendo o tempo q ficou em “0” dividido por 23.

Se nos 3 próximos ciclos, o tempo em “1” estiver compreendido entre 0.5 e 1.5 lambda(s), o bit transmitido será “1”;
Caso o tempo em “1” estiver compreendido entre 1.5 e 2.5 lambdas, o bit transmitido será “0”…
E assim por diante até o contador de bits alcançar o valor de 28 bits recebidos (22 de ADDRESS + 2 DADOS + 4 ANTI-CODE).

Qndo os 28 bits foram recebidos, a rotina verifica se o ANTI-CODE está OK, ou seja, verifica se é igual a “0101”.
Em caso afirmativo, os dados estão OK e podem ser utilizados…

Ligação dos componentes: Arduino MEGA 2560 R3 + Módulo Receptor RF 433MHz

Arduino MEGA com módulo RF

Arduino MEGA com módulo receptor RF

Referências: 

http://forum.clubedohardware.com.br/archive/rr3-433mhz-pic/383645

http://forum.clubedohardware.com.br/archive/resolvido-rx-controle/1143411

http://forum.arduino.cc/index.php/topic,175557.0.html

Datasheets:

http://www.holtek.com.cn/PDF/consumer/HT6P20x2v110.pdf

http://www.holtek.com.cn/pdf/consumer/6P20x2T3v100.pdf

http://www.holtek.com/pdf/consumer/6p20v170.pdf

Download através do GitHub:

ACT_HT6P20B_RX-04.ino (Rev. 04)

ACT_HT6P20B_RX-01.ino (Rev. 01)