Decodificação de controle remoto IV da Philips

Para "abobrinhas" use o " Boteco"

Moderadores: andre_luis, 51, guest2003, Renie

Decodificação de controle remoto IV da Philips

Mensagempor MOR_AL » 19 Jun 2009 19:09

Olá pessoal.

Comecei a querer entender como funciona a comunicação entre o controle remoto e o aparelho principal. Li o básico e achava que sabia como funcionava. Como passo seguinte, tentei detectar o código enviado pelo controle remoto do “Sky”, da Philips. Sei que é o RC5. Sei criar um código de comunicação, implementar um controle remoto e fazer a detecção. O problema é que eu queria usar um desses controles já prontos. “Aí quebrei a cara”. :cry:

De início já começam os problemas. No datasheet do receptor Infravermelho (IV) 3709, que tem na TV Panasonic, os pinos estão indicados errados. Visto de frente para a lente, com os pinos para baixo, e da esquerda para a direita, consta no datasheet saída, Vcc (central) e terra. Só funcionou quando troquei o Vcc com o terra. (Renie, um técnico, meu colega, separou este receptor IV para mim. O seu fica em “stand by” até o próximo encontro. Hehe!).

Acionei a tecla “1” do controle e obtive a seguinte figura. O nível normal, antes do código é '1'.

Imagem

Desta figura, juntamente com o link http://www.sixca.com/eng/articles/remote/ pode-se concluir o seguinte:
1 – O período total é de: Número de bits x período do bit = 14 x 1,67ms = 23,38ms. Eu medi 22,75ms. Vejam na minha figura. Acontece que na figura 4 do link, ele considera a origem do trem de pulsos em menos meio ciclo de clock, o que dá 1,67ms / 2 = 0,835ms. Se somarmos o período encontrado por mim, com este meio período, tem-se: 22,75 + 0,835 = 23,585ms; quase idêntico ao que a teoria informa. Este item está ok!

2 - O período ‘0’ do primeiro start bit tem que estar entre 0,8ms e 1,02ms. Caso contrário é considerado erro.
“When the detect subroutine is called, it first waits for a start bit. The length of the low part of the first start bit is measured. If the low pulse of first start bit is longer than 1.020 ms or less then 800 uS the routine returns indicating error or no command received.”

Na foto, o primeiro mível ‘0’ tem cerca de 2,7ms. Começa aí o problema!!!!
No link http://home1.stofanet.dk/hvaba/fprc5rx/index.html aparece o formato do código RC5 e o da Sony.
Se compararmos o meu sinal com o da Sony, pode-se pensar que o meu sinal está invertido. Pelo menos neste caso os dois stars bits coincidem. O problema é que o controle é da Philips e não da Sony.

3 – Marquei, em vermelho, os períodos de um bit (1,67ms), o mais apuradamente que eu pude. Em amarelo marquei as verticais que unem os níveis altos com os baixos do sinal. Já tentei decodificar o sinal, mas nada coincide. Nem as transições e nem o número de pulsos.

Ha! O controle remoto funciona no receptor da Sky!!!

Se alguém puder ajudar a descobrir como este código funciona, seria uma boa.
Abraços.
MOR_AL
"Para o triunfo do mal só é preciso que os bons homens não façam nada." Edmund Burke.
"Nunca discutas com pessoas estúpidas. Elas irão te arrastar ao nível delas e vencê-lo por possuir mais experiência em ser ignorante". Mark Twain
Avatar do usuário
MOR_AL
Dword
 
Mensagens: 2934
Registrado em: 19 Out 2006 09:38
Localização: Mangaratiba - RJ

Mensagempor kaoalex » 19 Jun 2009 23:05

rs...
Mundinho pequeno esse...
Eu estou brincando com um controle remoto da philips da sky também, queria ler o código e reproduzir no pic.
Estou apanhando um pouco. Vou pegar meu papeis e posto aqui daqui a pouco...
Avatar do usuário
kaoalex
Byte
 
Mensagens: 237
Registrado em: 12 Out 2006 01:52

Mensagempor MOR_AL » 19 Jun 2009 23:49

Olá kaoalex.

Repeti o experimento com a tecla 1 do controle remoto do receptor Sky. Diminuí a base de tempo do osciloscópio para 1ms, e com isso, os períodos ficaram com mais precisão.
Fiz um desenho do sinal, que se encontra na figura a seguir. coloquei também o sinal invertido para facilitar. Apesar de não aparecerem os tempos, a figura está em escala.

Imagem

Será que alguém sabe decodificar este sinal?

MOR_AL
"Para o triunfo do mal só é preciso que os bons homens não façam nada." Edmund Burke.
"Nunca discutas com pessoas estúpidas. Elas irão te arrastar ao nível delas e vencê-lo por possuir mais experiência em ser ignorante". Mark Twain
Avatar do usuário
MOR_AL
Dword
 
Mensagens: 2934
Registrado em: 19 Out 2006 09:38
Localização: Mangaratiba - RJ

Mensagempor kaoalex » 20 Jun 2009 00:03

Só pra variar deixei minhas anotações no outro apartamento...
Mas vamos ao que tenho aqui...

Para começar minha referência sobre controle remoto e seus protocolos
http://www.sbprojects.com/knowledge/ir/ir.htm

Capturei o sinal com meu quase osciloscópio (cada um se vira com o que pode né).
Imagem

Aqui tem os pontos para gerar o gráfico e analisar os pontos
http://www.4shared.com/file/112982546/a ... ecla1.html

Pelo site penso se trata de RC6 devido ao bit start.
Avatar do usuário
kaoalex
Byte
 
Mensagens: 237
Registrado em: 12 Out 2006 01:52

Mensagempor kaoalex » 20 Jun 2009 00:26

Pelo que eu vi é isso...
Imagem
Avatar do usuário
kaoalex
Byte
 
Mensagens: 237
Registrado em: 12 Out 2006 01:52

Mensagempor kaoalex » 20 Jun 2009 00:32

Mas aí que entra meu drama.
Mandei o pic reproduzir o código abaixo e o decodificador não deu a mínima. aff...
Deve ter passado algun detalhe...

Código: Selecionar todos
while(1)
   {
   delay_ms(1000);
   
   output_high(pin_b0);   delay_us(2666);
   output_low(pin_b0);   delay_us(889);
   output_high(pin_b0);   delay_us(444);
   output_low(pin_b0);   delay_us(889);
   output_high(pin_b0);   delay_us(444);
   output_low(pin_b0);   delay_us(444);
   output_high(pin_b0);   delay_us(444);
   output_low(pin_b0);   delay_us(444);
   output_high(pin_b0);   delay_us(444);
   output_low(pin_b0);   delay_us(889);
   output_high(pin_b0);   delay_us(889);
   output_low(pin_b0);   delay_us(444);
   output_high(pin_b0);   delay_us(444);
   output_low(pin_b0);   delay_us(444);
   output_high(pin_b0);   delay_us(889);
   output_low(pin_b0);   delay_us(889);
   output_high(pin_b0);   delay_us(444);
   output_low(pin_b0);   delay_us(444);
   output_high(pin_b0);   delay_us(889);
   output_low(pin_b0);   delay_us(444);
   output_high(pin_b0);   delay_us(444);
   output_low(pin_b0);   delay_us(444);
   output_high(pin_b0);   delay_us(889);
   output_low(pin_b0);   delay_us(444);
   output_high(pin_b0);   delay_us(444);
   output_low(pin_b0);   delay_us(444);
   output_high(pin_b0);   delay_us(444);
   output_low(pin_b0);   delay_us(444);
   output_high(pin_b0);   delay_us(444);
   output_low(pin_b0);   delay_us(444);
   output_high(pin_b0);   delay_us(444);
   output_low(pin_b0);   delay_us(444);
   output_high(pin_b0);   delay_us(444);
   output_low(pin_b0);   delay_us(444);
   output_high(pin_b0);   delay_us(444);
   output_low(pin_b0);   delay_us(889);
   }
}
Avatar do usuário
kaoalex
Byte
 
Mensagens: 237
Registrado em: 12 Out 2006 01:52

Mensagempor kaoalex » 20 Jun 2009 01:19

Código: Selecionar todos
   output_high(pin_b0);   delay_us(2666);
   output_low(pin_b0);   delay_us(889);
   output_high(pin_b0);   delay_us(444);
   output_low(pin_b0);   delay_us(889);
   output_high(pin_b0);   delay_us(444);
   output_low(pin_b0);   delay_us(444);
   output_high(pin_b0);   delay_us(444);
   output_low(pin_b0);   delay_us(444);
   output_high(pin_b0);   delay_us(444);
   output_low(pin_b0);   delay_us(889);
   output_high(pin_b0);   delay_us(889);
   output_low(pin_b0);   delay_us(444);
   output_high(pin_b0);   delay_us(444);
   output_low(pin_b0);   delay_us(444);
   output_high(pin_b0);   delay_us(889);
   output_low(pin_b0);   delay_us(889);
   output_high(pin_b0);   delay_us(444);
   output_low(pin_b0);   delay_us(444);
   output_high(pin_b0);   delay_us(889);
   output_low(pin_b0);   delay_us(444);
   output_high(pin_b0);   delay_us(444);
   output_low(pin_b0);   delay_us(444);
   output_high(pin_b0);   delay_us(444);
   output_low(pin_b0);   delay_us(889);
   output_high(pin_b0);   delay_us(444);
   output_low(pin_b0);   delay_us(444);
   output_high(pin_b0);   delay_us(444);
   output_low(pin_b0);   delay_us(444);
   output_high(pin_b0);   delay_us(444);
   output_low(pin_b0);   delay_us(444);
   output_high(pin_b0);   delay_us(444);
   output_low(pin_b0);   delay_us(444);
   output_high(pin_b0);   delay_us(444);
   output_low(pin_b0);   delay_us(444);
   output_high(pin_b0);   delay_us(444);
   output_low(pin_b0);   delay_us(444);
   output_high(pin_b0);   delay_us(889);
   output_low(pin_b0);   delay_us(444); 


Tinha um erro no último bit do CONTROL, amanhã testo no pic...
Boa noite!
Avatar do usuário
kaoalex
Byte
 
Mensagens: 237
Registrado em: 12 Out 2006 01:52

Mensagempor MOR_AL » 20 Jun 2009 02:32

Olá kaoalex.
Eu cheguei no mesmo código que você. Acho que encontramos o mesmo site.
Campo 1: Header Field: Tem o Leader com 2,666ms em '1' e 889ms em '0'. Tem o Start bit com 444us em '1' e 444us em '0'). Tem o Mode bit. São três bits com 444us em '1' e 444us em '0'. Finalmente tem o Trailer bit, ou o Toggle bit com 889us em '1' (ou '0') e 889us em '0' (ou '1').
Campo 2: São 8 bits de controle com 889us para cada bit.
Campo 3: São também 8 bits de Informação com 889us para cada bit.

Dá um total de 0,444 + 2,666 + 0,889 + 0,889 + 3 * 0,889 + 2 * 0,889 + 8 * 0,889 + 8 * 0,889 = 23,557ms.
Minha medição deu 22,76 + 0,889 = 23,649. Isso dá um erro relativo de 0,39%. O que está ótimo.

Você tem que modular o nível '1' com 36kc/s (ou 38kc/s. Ainda não gravei o valor correto). Caso contrário o seu receptor IV não deteta. Ele deteta somente uma pequena faixa de frequência. Perto de 37kc/s. Eu também coloquei um gerador de sinais com onda quadrada em 38kc/s e não ví os pulsos na saída do receptor IV. É claro! Ele demodula e dava um nível '0', e eu querendo ver os 38kc/s. :lol:

Bom. O próximo passo é medir o sinal de cada tecla. Acho que vou parar nas numéricas. Dá muito trabalho.
É mais fácil fazer uma transmissão com um código qualquer, caso seja descartado o uso do controle remoto comercial.
Se você testar novamente poste os resultados. Ok?!
[]'s
MOR_AL
"Para o triunfo do mal só é preciso que os bons homens não façam nada." Edmund Burke.
"Nunca discutas com pessoas estúpidas. Elas irão te arrastar ao nível delas e vencê-lo por possuir mais experiência em ser ignorante". Mark Twain
Avatar do usuário
MOR_AL
Dword
 
Mensagens: 2934
Registrado em: 19 Out 2006 09:38
Localização: Mangaratiba - RJ

Mensagempor kaoalex » 20 Jun 2009 09:33

MOR_AL,

http://www.sbprojects.com/knowledge/ir/rc6.htm
RC-6 signals are modulated on a 36 kHz Infra Red carrier. The duty cycle of this carrier has to be between 25% and 50%.
Agora entendi...

Imagem

Vou ver como implementar pwm no pic e retorno os resultados...
Avatar do usuário
kaoalex
Byte
 
Mensagens: 237
Registrado em: 12 Out 2006 01:52

Mensagempor MOR_AL » 20 Jun 2009 13:27

Ok!
Bom. Fotografei os sinais na saída do receptor. Cada sinal é constituído por três trechos com o osciloscópio em 1ms/div. Fotografei as teclas de "0" ao "9", a "liga" e os quatro sentidos. São 42 sinais para analisar (a tecla um já foi analisada). Cada foto tem mais de 1Mbyte, só armazenar elas no RapidShare levaria muito tempo, e compactá-las daria muito trabalho. Foi o máximo que eu cheguei. "Tô de saco cheio!". Talvez haja algum site com os códigos das teclas. Eu procurei mas não achei para o RC6.
Caso eu decida fazer algum projeto com isso, eu continuo.
Só faltou fazer duas medidas.
1 - Quando a gente pressiona a mesma tecla duas vezes seguidas. Como digitar 11. O que acontece com o sinal. Sei que o bit "toggle" altera o estado lógico, mas como ficam os bits adjacentes?
2 - E se a mesma tecla ficar precionada por algum tempo? Deve haver algum período mínimo de "espera", para que o aparelho identifique que se deseja incluir o mesmo código mais vezes. Por exemplo, é o caso do controle de volume.
[]'s
MOR_AL
"Para o triunfo do mal só é preciso que os bons homens não façam nada." Edmund Burke.
"Nunca discutas com pessoas estúpidas. Elas irão te arrastar ao nível delas e vencê-lo por possuir mais experiência em ser ignorante". Mark Twain
Avatar do usuário
MOR_AL
Dword
 
Mensagens: 2934
Registrado em: 19 Out 2006 09:38
Localização: Mangaratiba - RJ

Mensagempor kaoalex » 20 Jun 2009 14:40

MOR_AL,

Signal Free Time

The Signal Free time is a period in which no data may be transmitted (by any device). It is important for the receiver to detect the signal free time at the end of a message to avoid incorrect reception.
The signal free time is set to 6t, which is 2.666ms.
Avatar do usuário
kaoalex
Byte
 
Mensagens: 237
Registrado em: 12 Out 2006 01:52

Mensagempor kaoalex » 20 Jun 2009 17:58

Funcionou!!!
Apesar eu de não mudar o TR...

Segue o código
Código: Selecionar todos
#include <16F628A.h>
#fuses intrc,NOWDT,PUT,BROWNOUT,NOLVP,NOMCLR
#use delay(clock=4000000)

void main()
{

//   The cycle time will be (1/clock)*4*t2div*(period+1)
setup_timer_2(T2_DIV_BY_1,27,1);
setup_ccp1(CCP_PWM);

//112 = 100%
set_pwm1_duty(50);

while(1)
   {
   delay_ms(1000);


   output_high(pin_b0);   delay_us(2666);
   output_low(pin_b0);   delay_us(889);
   output_high(pin_b0);   delay_us(444);
   output_low(pin_b0);   delay_us(889);
   output_high(pin_b0);   delay_us(444);
   output_low(pin_b0);   delay_us(444);
   output_high(pin_b0);   delay_us(444);
   output_low(pin_b0);   delay_us(444);
   output_high(pin_b0);   delay_us(444);
   output_low(pin_b0);   delay_us(889);
   output_high(pin_b0);   delay_us(889);
   output_low(pin_b0);   delay_us(444);
   output_high(pin_b0);   delay_us(444);
   output_low(pin_b0);   delay_us(444);
   output_high(pin_b0);   delay_us(889);
   output_low(pin_b0);   delay_us(889);
   output_high(pin_b0);   delay_us(444);
   output_low(pin_b0);   delay_us(444);
   output_high(pin_b0);   delay_us(889);
   output_low(pin_b0);   delay_us(444);
   output_high(pin_b0);   delay_us(444);
   output_low(pin_b0);   delay_us(444);
   output_high(pin_b0);   delay_us(444);
   output_low(pin_b0);   delay_us(889);
   output_high(pin_b0);   delay_us(444);
   output_low(pin_b0);   delay_us(444);
   output_high(pin_b0);   delay_us(444);
   output_low(pin_b0);   delay_us(444);
   output_high(pin_b0);   delay_us(444);
   output_low(pin_b0);   delay_us(444);
   output_high(pin_b0);   delay_us(444);
   output_low(pin_b0);   delay_us(444);
   output_high(pin_b0);   delay_us(444);
   output_low(pin_b0);   delay_us(444);
   output_high(pin_b0);   delay_us(444);
   output_low(pin_b0);   delay_us(444);
   output_high(pin_b0);   delay_us(889);
   output_low(pin_b0);   delay_us(444);

   }
}
Avatar do usuário
kaoalex
Byte
 
Mensagens: 237
Registrado em: 12 Out 2006 01:52

Mensagempor MOR_AL » 20 Jun 2009 20:13

Kaoalex.

Signal Free Time É. Eu imaginava qualquer coisa assim mesmo. Agora falta só esclarecer o outro ítem. Valeu.

Me esclarece alguma coisa eu não entendi da sua postagem:
1 -
Apesar eu de não mudar o TR...

Que TR... é esse que você está se referindo?

2 - Com relação ao PWM.

a) A saída do PWM no PIC16F628A não é no pino RB3? Porque então você está saíndo com os períodos no pino RB0? Não teria que sair via pino RB3?
b) Neste caso os períodos em que houver oscilação em 37kc/s deveriam habilitar o PWM e nos períodos em que não houver oscilação, deveriam desabilitar o PWM.
c)
The cycle time will be (1/clock)*4*t2div*(period+1)

Ao invés de "clock" é "Fosc".
d) Não uso a linguagem "c", então talvez eu esteja errado, mas acompanhe a figura....
Imagem
//112 = 100%
set_pwm1_duty(50);


100% equivale a 26 e não 112! E deveria ser "set_pwm1_duty(13)". Este valor não é percentual e sim absoluto (CCPR1H = 13).

Me esclarece se eu estiver errado! :?:
[]'s
MOR_AL
"Para o triunfo do mal só é preciso que os bons homens não façam nada." Edmund Burke.
"Nunca discutas com pessoas estúpidas. Elas irão te arrastar ao nível delas e vencê-lo por possuir mais experiência em ser ignorante". Mark Twain
Avatar do usuário
MOR_AL
Dword
 
Mensagens: 2934
Registrado em: 19 Out 2006 09:38
Localização: Mangaratiba - RJ

Mensagempor kaoalex » 20 Jun 2009 22:51

1)
Imagem
TR - Finally the header is terminated by the trailer bit TR. Please note that the bit time of this symbol is twice as long as normal bits! This bit also serves as the traditional toggle bit, which will be inverted whenever a key is released. This allows the receiver to distinguish between a new key or a repeated key.

No caso meu código sempre usa o valor "0". E o codificador reconheceu as teclas repetidas.

2)
Eu nunca trabalhei com PWM então escolhi o caminho mais rápido.
O WIZARD do ccs. :oops: Ele me deu 3 opções para chegar no tão sonhado 36KHz.
Imagem

Como também não sabia ativar e desativar o PWM deixei ele ativo e usei o pino B0 acionando um BC337 e um BC327.

Não foi uma solução simples mas foi uma solução.
De qualquer forma vou estudar os seus cálculos.
Avatar do usuário
kaoalex
Byte
 
Mensagens: 237
Registrado em: 12 Out 2006 01:52

Mensagempor MOR_AL » 21 Jun 2009 00:09

Ok Kaoalex.

1 - TR... Me preocupando com os períodos acabei deixando de lado os nomes dos mesmos. É isso aí.
2 - Agora entendi o que você fez. O PWM está sempre ativo, e você usa o pino RB0 para controlar o fluxo do PWM para o led IV. O que importa é que você achou um modo de testar e está funcionando. Mas dê uma olhada, sim, nos cálculos. Vale a pena.
Qualquer hora eu avanço com as formas de onda e faço uma tabela das teclas com os tempos discriminados.
MOR_AL
"Para o triunfo do mal só é preciso que os bons homens não façam nada." Edmund Burke.
"Nunca discutas com pessoas estúpidas. Elas irão te arrastar ao nível delas e vencê-lo por possuir mais experiência em ser ignorante". Mark Twain
Avatar do usuário
MOR_AL
Dword
 
Mensagens: 2934
Registrado em: 19 Out 2006 09:38
Localização: Mangaratiba - RJ

Próximo

Voltar para Assuntos Gerais

Quem está online

Usuários navegando neste fórum: Google [Bot] e 1 visitante

x