Ou melhor dizendo - Tentando desvendar Controle Remoto RF.

Depois que consegui fazer funcionar o Analisador Lógico com o Arduino, tenho feito várias verificações que sempre quis fazer. Fiz uma análise de controle remoto usando a Luz infravermelha e agora estou fazendo uma análise mais apurada de controle remoto que usa Rádio-frequência RF).

Tutorial - Analisador Lógico com Arduino:

http://labdegaragem.com/profiles/blogs/tutorial-analisador-l-gico-c...

Decodificando Controle Remoto infravermelho:

http://labdegaragem.com/profiles/blogs/6223006:BlogPost:315534

Já li em vários Blogs do Lab de Garagem, que muitos desejam usar o Controle Remoto RF com o Arduino.

Para a minha decepção e acredito que  muitos se decepcionarão também, os controles remotos atuais são criptografados.Por isso, alguns já tentaram usar e falharam.

Para entender melhor, fiz uma análise do Controle Remoto do fabricante Rossi. (aciona a abertura e fechamento de portões de garagem). Esse controle usa o chip HCS201 da Microchip:

http://ww1.microchip.com/downloads/en/DeviceDoc/41098c.pdf

Possui dois botões (chaves) S0 e S1. A frequência da portadora é de 433,92 MHz. Usa uma pilha de 12V.

O link da Rossi portões, com os circuitos de controle de portões:

http://www.rossiportoes.com.br/produtos/120-central-de-comando.html

Lendo o data sheet do chip HCS201 da Microchip, percebi que a tecnologia usada é bem segura.

Ele é bem versátil - cada chip tem um número de série programável de 28 bits e uma chave de criptografia de 64 bits (acredito que é impossível descobri-la) . Essas informações são gravadas pelo fabricante do controle remoto (no caso a Rossi).

Cada transmissão tem um código diferente, por isso, se o circuito receptor não souber a chave criptográfica do fabricante, não haverá rotina de decodificação que permita identificar qual código foi transmitido. Fiz vários testes e comprovei ! Pressionei várias vezes o botão S1 e a cada momento o trem de pulsos era de um formato diferente.

Seria possível usar o controle remoto, desde que usasse um chip programado pelo desenvolvedor.

Assim a rotina de decodificação usaria a chave gravada no chip.

Vejam que interessante as várias telas capturadas usando o Analisador Lógico com o Arduíno.

Minhas medições foram no saída TX OUT do chip HCS201. Alimentei o controle remoto com 5V para não danificar o Arduino.

Essa captura foi feita pressionando o botão S1 - taxa de amostragem de 5 KHz :

Vejam que tem 12 pulsos de preambulo para sincronização :

Taxa de amostragem de 10 Khz.

Os 12 pulsos de preambulo usam a largura de pulso de 780 us:

(taxa de amostragem 50 KHz) 

Para decodificar os bits 0 e bit 1 :

Esse é o formato do Bit 0 : (taxa de amostragem 50 KHz) 

E esse é o formato do Bit 1 : (taxa de amostragem 50 KHz) 

Exibições: 87365

Responder esta

Respostas a este tópico

Continuando o tema sobre Controle Remoto RF:

Existem inúmeros fabricantes de controles remotos RF no Brasil. Como eu já disse, os mais modernos usam código criptografado para maior segurança. Desse tipo é impossível usá-lo com um Arduino.

Mas os controles mais antigos tinham pouca "inteligência". Esses transmitem códigos pré-gravados pelo fabricante, mas que não se alteram. Assim é possível usa-los com Arduino.

Vou desvendar então, um controle antigo que usa o Chip da Holtek, o HT6P20B. Ele transmite 24 bits codificados. Pode ser programado uma vez somente, pelo fabricante do controle remoto.

Data sheet :http://www.holtek.com.tw/pdf/consumer/6p20v170.pdf

Creio que essa versão nem é mais fabricada, mas ainda existem muitos controles remotos com esse chip.

A Holtek que é um dos maiores fabricantes desse tipo de encoder para controle remoto, lançou uma nova versão.

http://www.holtek.com.tw/english/tech/faq/learning_faq.htm

Esse é um controle remoto que usa esse chip HT6P20B:

Usa pilha de 12V, tem dois botoes CH1 e CH2, frequência portadora de 433,92 MHz.

Como eu tinha um outro controle remoto estragado com um chip HT6P20B, eu retirei-o e montei-o em um protoboard.

Na minha montagem liguei o VDD diretamente nos 5V e o VSS conectei-o ao terra (ground).

O resistor do oscilador que usei foi o de 2,2 M ohms. A frequência do oscilador foi de 2,02 KHz.

A saida DOUT conectei à entrada do canal 0 do Analisador Lógico com Arduino.

Vejam as medições com o Analisador Lógico com Arduino:

Esse medição é no pino 4 (oscilador) do chip HT6P20B. Essa frequência é proporcional ao valor do resistor usado.

(Taxa de amostragem : 200 KHz)

Agora medindo a saida de DOUT :

Acionando a chave  D0 (taxa de amostragem 10 KHz) 

Acionando a Chave D1:

Sabendo-se a codificação  dos Bits - o periodo de cada Bit é de 1,5 ms.

Assim é possível decodificar a transmissão dos dados.

Chave D0 acionada ( taxa de amostragem : 20 KHz)

O Chip HT6P20B transmite 22 bits de endereçamento e 2 bits de dados (chaves D0 e D1) .

O primeiro bit, creio que seja para sincronismo. ( 1 ) 

Os próximos 22 bits são para endereçamento ( 1 0 0 0 0 0 1 1 1 1 1 0 0 0 1 1 0 0 1 0 0 0 )

Mais dois bits de dados (D1 e D0) = ( 0 1 ) 

Os ultimos quatro bits ( 0 1 0 1 ) fazem parte do período anti-code.

Essa é a medição com a Chave D1 acionada:

O primeiro bit, para sincronismo. ( 1 ) 

Os próximos 22 bits são para endereçamento ( 1 0 0 0 0 0 1 1 1 1 1 0 0 0 1 1 0 0 1 0 0 0 )

Mais dois bits de dados (D1 e D0) = ( 1 0 )  - Veja que é diferente.

Os ultimos quatro bits ( 0 1 0 1 ) fazem parte do período anti-code.

Depois da uma olhada neste artigo http://www.pittnerovi.com/jiri/hobby/electronics/keeloq/ keelog é o chiper usado neste cara.

Rodrigo, o chip HCS201 usa essa tecnologia KEELOQ® Code Hopping.

Veja no data sheet que indiquei no post anterior.

No link que enviou, encontrei o programa para o Microcontrolador aprender o código:

(os fabricantes devem ter usado essa aplicação).

AN642 - Code Hopping Decoder using a PIC16C56

http://read.pudn.com/downloads42/sourcecode/embed/144285/keeloq/MCD...

Nesse mesmo link, o autor divulga a implementação da tecnologia Keeloq para microcontroladores Atmel (o mesmo do Arduino). Depois vou estuda-la.

Achei essa implementação dessa tecnologia usando o microcontrolador 16F84 (bem interessante).

http://ww1.microchip.com/downloads/en/AppNotes/00217a.pdf

Obrigado pelo link!

Encontrei no Google !

Um fera do Brasil fez um Sketch para Arduino que decodifica os bits do encoder HT6P20:

http://acturcato.wordpress.com/2013/12/20/decodificador-para-o-enco...

Link para baixar o código: http://goo.gl/oYKmZZ

Testei e funcionou !

Mudei o pino do Arduino para Digital 2 - para leitura dos bits.

 pinRF = 2;        //If necessary, change this for you project

Vejam os resultados com o mesmo chip HT6P20 que eu tinha postado antes.

Botão D0 pressionado :

-----------------------------------
Data: 1000001111100011001000010101
-Address: 20F8C8
-Button1: 1
-Button2: 0
-----------------------------------

Botão D1 pressionado :

-----------------------------------
Data: 1000001111100011001000100101
-Address: 20F8C8
-Button1: 0
-Button2: 1
-----------------------------------

Esse é o Sketch :

/*
TITLE: DECODER FOR HT6P20B ENCODER
CREATED BY: AFONSO CELSO TURCATO
DATE: 27/12/2013
E-MAIL: acturcato (at) gmail.com
LICENSE: GPL
REV.: 01

DESCRIPTION:
http://acturcato.wordpress.com/2014/01/04/decoder-for-ht6p20b-encod...

DESCRIÇÃO:
http://acturcato.wordpress.com/2013/12/20/decodificador-para-o-enco...

*/

byte pinRF; // Pin where RF Module is connected

boolean startbit;
boolean dataok;
boolean anticodeok;

int counter; //received bits counter: 22 of Address + 2 of Data + 4 of EndCode (Anti-Code)
int lambda; // on pulse clock width (if fosc = 2KHz than lambda = 500 us)
int dur0, dur1; // pulses durations (auxiliary)

unsigned long buffer=0; //buffer for received data storage

void setup(){
pinRF = 2; //If necessary, change this for you project - eu mudei para Digital 2
pinMode(pinRF, INPUT);
pinMode(13, OUTPUT);
Serial.begin(9600);
}

void loop()
{
digitalWrite(13, digitalRead(pinRF)); //blink de onboard LED when receive something

if (!startbit)
{// Check the PILOT CODE until START BIT;
dur0 = pulseIn(pinRF, LOW); //Check how long DOUT was "0" (ZERO) (refers to PILOT CODE)

//If time at "0" is between 9200 us (23 cycles of 400us) and 13800 us (23 cycles of 600 us).
if((dur0 > 9200) && (dur0 < 13800) && !startbit)
{
lambda = dur0 / 23; //calculate wave length - lambda

dur0 = 0;
buffer = 0;
counter = 0;

dataok = false;
startbit = true;
}
}

// If Start Bit is OK, then starts measure os how long the signal is level "1" and check is value is into acceptable range.
if (startbit && !dataok && counter < 28)
{
++counter;

dur1 = pulseIn(pinRF, HIGH);

if((dur1 > 0.5 * lambda) && (dur1 < (1.5 * lambda))) //If pulse width at "1" is between "0.5 and 1.5 lambda", means that pulse is only one lambda, so the data é "1".
{
buffer = (buffer 1) + 1; // add "1" on data buffer
}
else if((dur1 > 1.5 * lambda) && (dur1 < (2.5 * lambda))) //If pulse width at "1" is between "1.5 and 2.5 lambda", means that pulse is two lambdas, so the data é "0".
{
buffer = (buffer 1); // add "0" on data buffer
}
else
{
//Reset the loop
startbit = false;
}
}

//Check if all 28 bits were received (22 of Address + 2 of Data + 4 of Anti-Code)
if (counter==28)
{
// Check if Anti-Code is OK (last 4 bits of buffer equal "0101")
if ((bitRead(buffer, 0) == 1) && (bitRead(buffer, 1) == 0) && (bitRead(buffer, 2) == 1) && (bitRead(buffer, 3) == 0))
{
anticodeok = true;
}
else
{
//Reset the loop
startbit = false;
}

if (anticodeok)
{
dataok = true;

counter = 0;
startbit = false;
anticodeok = false;

Serial.print("Data: ");
Serial.println(buffer, BIN);

unsigned long addr = buffer >> 6;

Serial.print("-Address: ");
Serial.println(addr, HEX);

Serial.println("-Button1: " + (String)bitRead(buffer, 4));
Serial.println("-Button2: " + (String)bitRead(buffer, 5));
Serial.println("-----------------------------------");

delay(100);
}
}
}

Pessoal,

efetuei uma pequena revisão no sketch disponibilizado acima!

Confiram a versão mais nova no site:

http://acturcato.wordpress.com/2013/12/20/decodificador-para-o-encoder-ht6p20b-em-arduino/

T
em tb outros dois artigos interessantes relacionados ao uso de controles RF com encoder HT6P20B.

Vejam:

"EMULATOR FOR HT6P20B ENCODER ON ARDUINO BOARD"

http://acturcato.wordpress.com/2014/01/10/emulator-for-ht6p20b-enco...

"“CLONAGEM” DE CONTROLE REMOTO RF “Learning Code” (HT6P20B) com ARDUINO"

http://acturcato.wordpress.com/2014/01/14/clonagem-de-controle-remo...

Espero q curtam!

Obrigado Turcato!

Não sei se já participava no Lab de garagem, mas tenho me distraido bastante.

Muito interessante os seus posts, Vou dar uma olhada.

Tem uma galera aqui do Lab que estava querendo usar o HT6P20B.

E seus posts serão bem úteis.

Abraços

Gustavo

Bom dia Amigo.

O código original é meu, gostaria que o nome do autor fosse mantido.

Do modo que o pessoal vem usando, está ficando chato e sem respeito a comunidade.

Favor observar as fontes.

Atenciosamente

Jacques Moresco

Jacques,

Bom Dia!

Vc está correto!

O código original, no qual o acima foi baseado, foi feito por vc, conforme os links referenciados no site.

Veja em Referências:

http://acturcato.wordpress.com/2014/01/04/decoder-for-ht6p20b-encod...

http://acturcato.wordpress.com/2013/12/20/decodificador-para-o-enco...

Caso queira, posso reproduzir os links em mais lugares!

De forma alguma pretendo me "apossar" de algo q não é meu!

Para tanto, fiz questão de citar as Referências.

Se vc tiver um site Oficial seu, me envie para eu adicioná-lo tb nas Referências supras!

Att.,

Afonso.

Boa tarde Afonso.

Obrigado pela retorno e consideração.

A história do porque criar esse código é complicada.

Um vizinho sempre parava o carro na entrada da minha garagem, eu pedia para ele tirar e ele nem bola.

O mesmo armava o alarme e desafiava, " Abre se tu consegue', foi o erro dele.

Tirei um domingo, deixei de fazer baita churrasco Tchê, mas fiz o código do receptor e transmissor.

Na segunda de meio dia o magrão chegou estacionou e acionou o alarme , hehehe, ai já era, esperei ele subir para a casa dele.

Foi lá desarmei o alarme, coloquei o carro em ponto morto, deixei ele 4 ruas mas para baixo.

Quando o magrão voltou, imagina a cara do malandro.

Veio reto pedir se eu não tinha visto se alguém tinha mexido no carro dele.

Pois é eu não vi nada....

Até que ele descobriu que o carro dele tava algumas ruas abaixo, ai ele veio dizer que não ia mais colocar o carro na entrada, pediu desculpas e eu mudei de endereço.

Não postei o código de replicação por um motivo mais do que óbvio - para quem quiser clonar controles e sensores fazerem o código por conta e riscos próprios, sendo que hoje 99% dos controles usam o HT6P20B.

É isso pessoal, bons projetos e caso precisem de ajuda é só chamar.

Abraços..

kkkkkkkkkkk

Muito engraçada e interessante essa sua história!

Incrível como as coisas (desenvolvimento) avançam qndo somos desafiados!!!

Parabéns, mostrou pro cara quem é que "manda no terreiro"!!!

Ah, o mais legal é a parte do: "pediu desculpas e eu mudei de endereço!" rs.

Agora, o q achei mais impressionante na história é o fato do carro do seu antigo vizinho utilizar a codificação com o HT6P20. Era um carro antigo? Usava esses alarmes paralelos vagabundos?

Pq hj em dia os alarmes q saem de fábrica são na grande maioria "criptografados" por um sistema igual/muito próximo do "Hopping Code" - KEYLOQ da Microchip. Não é?

Agora, com relação as pessoas utilizarem ou não o código de "má fé", considero q o intuito não seja esse não. E sim, exatamente o oposto: alertar as pessoas q os equipamentos q utilizam a codificação do HT6P20 são mt fáceis de serem burlados e portanto, na medida do possível, deixarem de utilizá-los (principalmente em aplicações de segurança).

Veja a nota q coloquei em Vermelho no meu BLOG:

http://acturcato.wordpress.com/2014/01/14/clonagem-de-controle-remo...

Incrível como os sensores "infra sem fio" continuam assim. Eu não sabia q era toda essa proporção não!

O q deve ter de gente disparando/desativando os alarmes da vizinhança por aih! rs.

Abraço!

E junte-se a nós no projeto "PROJETO ALARME SEM FIO - ARDUINO (OPEN SOURCE)" q o Murta tá liderando.

T+

Sim Jacques, o código original é  seu.

Eu não consigo alterar o post original.

Alguem sabe como corrigir o post?

Acho que terei deletar e depois inserir de novo, não é?

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço