4 de dez de 2011

Controle Remoto RC5

Olá pessoal, hoje iremos abordar um periférico bem bacana que é o Sensor IR encontrado na placa PK2Lab. Este sensor nos trás a possibilidade de controlarmos a placa a distância utilizando controles remotos convencionais de televisores e outros produtos de consumo a que temos acesso diariamente e que muitas vezes acabamos descartando por falta de uso. 


Funcionamento:

O sensor IR baseia se na iluminação infra vermelha que é uma luz não visível ao ser humano, pois seu comprimento de onda é muito longo para ser detectado pelo nosso sistema de visão e que é muito utilizado em comunicações sem fio entre diversos dispositivos como controles remotos, celulares e instrumentos de teste e medição.



Embora não seja vísivel, este tipo de luz é muito mais comum do que imaginamos, o sol é uma fonte inesgotável de luz infra vermelha, outra fonte de luz infra vermelha são as lampadas florescentes encontradas em muitos lares hoje em dia, mas como pode então um controle remoto de um televisor funcionar tão bem em um ambiente em que temos a presença de luz solar ou outra iluminação que gere interferência na comunicação?
Para que tenhamos uma comunicação realmente confiável, faz se o uso de uma modulação em frequência, na forma de um trem de pulsos quadrados na frequência de 36KHz, que é denominada portadora.  Cada bit 0, é composto de 889us de pulsos a frequência da portadora, seguido de 889us em nível baixo, enquanto um bit 1 é formado de 889us em nível baixo, seguido de 889us de pulsos a frequência da portadora.


                               

Protocolo RC5

O protocolo RC5 foi desenvolvido pela Philips em 1980 para ser utilizado em seus equipamentos de consumo e consiste em uma palavra de 14 bits, sendo que, os 2 primeiros bits são StartBits, servem para o receptor regular o AGC(Controle de ganho automático), o bit seguinte é chamado de Toogle, e serve como um indicador de Status informando ao receptor se a tecla está sendo continuamente pressionada ou se simplesmente foi pressionada apenas uma vez, os 5 bits seguintes são bits de endereçamento e os 6 bits restantes referem se ao comando transmitido. Neste código todos os bits têm a mesma duração de 1778us e usam a codificação Manchester, onde uma transição descendente corresponde ao bit 0 e uma transição ascendente corresponde ao bit  1. A duração de cada mensagem é de 24,889ms e a distância mínima entre mensagens é de 88,889ms, ou seja, 50x a duração de bit.


A Philips implementou um sistema completo, com endereços e comandos padronizados para cada tipo de equipamento, abaixo podemos visualizar estas informações:



Para o nosso exemplo, vamos utilizar um controle remoto de televisor Philips cujo código de endereço é zero (controle da foto abaixo), porém foram testados vários outros controles que usam o mesmo protocolo RC5 e todos eles efetuaram o controle da placa corretamente. Apenas temos que levar em consideração o fato de que nem todos os controles da Philips realmente usam a norma RC5, os mais novos já utilizam o protocolo RC6, que é a evolução do protocolo em análise.





Programa do microcontrolador:

Para decodificar este protocolo, é necessário esperar que o sensor TSOP4838 que está conectado ao pino RB0 do microcontrolador, detecte o primeiro StartBit da mensagem para ler os 13 bits restantes. Para isto, dois delays foram implementados , sendo que o primeiro de 4867us é chamado após a detecção do StartBit para aguardar o período de AGC mais o Toogle (não utilizado neste exemplo), assim quando retornar do delay, o programa  estará exatamente no ponto de efetuar a analise do primeiro bit referente ao endereço, posteriormente é chamado o delay de 1770us e é feito novamente a análise do bit, e este procedimento se repete até que obtenhamos  os próximos bits referentes à informação de endereço e por fim comando.




Usei a função de analisador lógico da placa PK2Lab para capturar dois frames do protocolo RC5. Nestes frames podemos observar que apenas houve alteração no ultimo bit da mensagem que passou de 0 para 1. Esta função de análizador é uma ferramenta muito útil na análise de protocolos pois nos permite efetuar as medições de tempo entre transições, para isto após a captura basta clicar com o botão esquerdo do mouse em cima do inicio da transição e depois clicar com o botão direito do mouse no final da transição que se deseja analizar, o tempo e a frequência serão mostrados na tela do software. 


Frame tecla 0

Frame tecla 1


O programa foi desenvolvido em duas versões, uma em assembly, desenvolvida por Marcos Guilherme Cunha e outra em C desenvolvida por Jean Carlos da Silva. As duas versões seguem a mesma idéia, porém, vale ressaltar que o programa escrito em assembly teve uma complexidade muito maior no que diz respeito aos delays.

Vídeo demonstrando o funcionamento do programa na placa PK2Lab.



 Arquivos para download:


Código fonte do programa C (MikroC)
Código fonte do programa Assembly (MPLAB) 

Agradecimento especial ao colaborador Marcos Guilherme Cunha que gentilmente desenvolveu a versão em assembly para este post.




39 comentários:

  1. Parabéns pelo seu artigo. Agora sim eu comprendi o protocolo RC5. Mais um produto com o selo de qualidade pk2lab!

    ResponderExcluir
  2. GOSTEI MUITO VALEU AMIGO POR COMPARTILHAR

    ResponderExcluir
  3. amigo tentei fazer a simulação no micro c mais não gera o arquivo hex, vc não teria esse mesmo codigo para ccs e se puder mim dar uma dica de como copilar?

    ResponderExcluir
  4. Olá, esse código foi gerado no compilador MikroC 8.40, eu seja na versão antiga do MikroC, mais você pode compilar novamente em outras versões ou até mesmo em outros compiladores, através do arquivo .C que está dentro do pacote zipado disponível para download no post, quanto a simular... creio que seja um pouco mais complicado, mas talvez no Proteus você consiga obter êxito, grande abraço!

    ResponderExcluir
  5. desculpa amigo falei muito e não falei o que realmente dava errado.
    tentei copilar no mikroc pro v4.15 e não gera o arquivo hex da erro nessa linha:

    Lcd_Config(&PORTB,2,3,1,7,6,5,4); // Configuração PK2Lab V.1.0


    poderia mim dizer o que estou fazendo errado, agradeço...

    ResponderExcluir
  6. OK AMIGO DESCOBRI O QUE ERA. O PROBLEMA ERA QUE ESTAVA USANDO O COPILADOR MIKROC PRO E ELE FOI FEITO EM VERSÃO ANTERIOR, BAIXEI A VERSÃO MICROC 8.1 E FUNCIONOU BLZA. AGORA FICA A PERGUNTA POR QUE DAR ESSE ERRO NEQUELA LINHA COM VERSÃO MAIS NOVA. O IMPORTANTE É FUNCIONAR.

    ResponderExcluir
  7. Olá,

    Uma das maiores diferenças entre a versão PRO e Standart do MicroC é em relação a designação de pinos de IO em algumas funções, vejamos, na linha abaixo você especifica o LCD no PORTB e indica os pinos de conexão, como estás utilizando a versão PRO, exclua esta linha e adicione as linhas abaixo:


    *******************************************************************************/
    // Inicializações do programa

    // Configuração do LCD da placa PK2Lab V.1.1

    sbit LCD_RS at RB2_bit;
    sbit LCD_EN at RB3_bit;
    sbit LCD_D4 at RB4_bit;
    sbit LCD_D5 at RB5_bit;
    sbit LCD_D6 at RB6_bit;
    sbit LCD_D7 at RB7_bit;

    sbit LCD_RS_Direction at TRISB2_bit;
    sbit LCD_EN_Direction at TRISB3_bit;
    sbit LCD_D4_Direction at TRISB4_bit;
    sbit LCD_D5_Direction at TRISB5_bit;
    sbit LCD_D6_Direction at TRISB6_bit;
    sbit LCD_D7_Direction at TRISB7_bit;

    //******************************************************************************
    // Variáveis Globais

    //******************************************************************************
    // Rotinas Auxiliares

    //******************************************************************************
    //Rotina Principal

    void main()
    {
    TRISA = 0b00000000;
    PORTA = 0b00000000;
    TRISB = 0b00000000;
    PORTB = 0b00000000;
    TRISC = 0b00000000;
    PORTC = 0b00000000;
    TRISD = 0b11000000;
    PORTD = 0b00000000;
    TRISE = 0b00000000;
    PORTE = 0b00000000;
    ADCON1 = 0X0F; // Entradas digitais.

    Lcd_Init();
    Lcd_Cmd(_Lcd_Cursor_Off);
    Lcd_Cmd(_LCD_CLEAR);
    Lcd_Out(1,1,"*** PK2Lab ***");
    Delay_ms(1000);


    while(1)
    {


    }//while(1)
    }//main

    Grande abraço!

    Jean Carlos
    JL Audio
    esquemas.org

    ResponderExcluir
  8. Bacana de sua parte responder, pessoas igual a vc meu amigo são poucas.
    olha amigo gostaria de saber uma coisa não vou te pertubar mais...
    eu poderia migrar esse projeto para o pic16f877a, pois eu tenho 2 e o pic18f4550 não achei em minha cidade nem na cidade vizinha.
    como sabe eles tem a mesma quantidade de pinos, sei que ele é mais fraquinho, mais pode dar certo não é. Posso refazer e no lugar do 18f colocar o 16f o que vc acha?

    ResponderExcluir
  9. Olá, pode sim são pino a pino compatíveis, apenas entre nas propriedades de projeto e altere o microcontrolador para o PIC16F877A e a frequência do cristal, pois o PIC16F não tem PLL interno.

    ResponderExcluir
  10. Boa tarde amigo. Primeiro quero agradecer pois todas as mudanças que sugeriu funcinou beleza, só esto ucom dificuldade de achar os pinos para ligar um lcd, poderia mim dizer qual são os pinos, pois já estou a quase 3 dias tentando ligar o lcd mas sem sucesso. só falta isso gostaria de ligar esse lcd no programa.

    ResponderExcluir
  11. Versão MikroC

    void Lcd_Config(&*port, RS, EN, WR, D7, D6, D5, D4);

    Versão MikroC PRO

    // Lcd Ajustes dos pinos
    sbit LCD_RS at RB4_bit;
    sbit LCD_EN at RB5_bit;
    sbit LCD_D7 at RB3_bit;
    sbit LCD_D6 at RB2_bit;
    sbit LCD_D5 at RB1_bit;
    sbit LCD_D4 at RB0_bit;

    // Direção dos pinos(IN/OUT)
    sbit LCD_RS_Direction at TRISB4_bit;
    sbit LCD_EN_Direction at TRISB5_bit;
    sbit LCD_D7_Direction at TRISB3_bit;
    sbit LCD_D6_Direction at TRISB2_bit;
    sbit LCD_D5_Direction at TRISB1_bit;
    sbit LCD_D4_Direction at TRISB0_bit;
    ...

    Lcd_Init();

    ResponderExcluir
  12. Qualquer coisa envie o seu código para eu poder verificar.

    ResponderExcluir
  13. boa noite,
    estou fazendo um projeto de formatura utilizando controle remoto com protocolo RC5, porem esta dificil encontrar um, esse que você esta utilizando é RC5 certo?, poderia me passar o modelo dele para compra um aqui na minha cidade.

    ResponderExcluir
  14. Olá Gilson, este é RC5, procure em sua cidade pela assistência autorizada Philips pelo controle das linhas PT,PD ou PW que operam em RC5. Outra opção http://produto.mercadolivre.com.br/MLB-434222996-controle-remoto-philips-linha-pt-pd-pw-_JM

    ResponderExcluir
  15. boa noite amigo, o software funciona blza, mais fiquei pesando, em luga de liga em vol+ e desligar em vol- como poderiamos ligar e desligar na mesma tecla? ficaria legal assim das quatro teclas poderia ligar 4 reles em vez de 2, tem como modificar para ficar desse jeito?

    ResponderExcluir
    Respostas
    1. Isto pode ser facilmente implementado alternando o estado de um bit a cada vez que o código do volume +, por exemplo for verificado, para isto você pode usar o operador de complemento (~), por exemplo, para alterar o estado do pino 1 do port C, podemos fazer o seguinte:

      PORTC.B1 = ~PORTC.B1;
      Delay_ms(1000);

      Isto faz com que o pino inverta seu estado, ou seja, o complementa.

      Excluir
  16. Bom Dia

    estou fazendo meu tcc com no seu projeto, so que infelismente não esta funcionando,ele recebe o sinal porem não executa o comando conforme tabela rc5. ja tentei de tudo, estou usando o pic 16f628a, com clock interno de 4mhz, ja ate pedi ajuda para meu orientador, e ate ele não consegue intender porque não responde correto, pois o codigo ele falou que esta correto.

    poderia me dar uma dica do que pode esta acontecendo.

    desde ja agradeço.

    ResponderExcluir
  17. Olá Gilson, para que eu possa te ajudar preciso de algumas informações, por exemplo qual a configuração de hardware você está utilizando, temos que lembrar do pino RA4 que é coletor aberto, as vezes pode ser isto, é possível você encaminhar o software para eu dar uma olhada? você está simulando no Proteus, ou usando o harware físico? por acaso você conhece o professor Bruno??? vi que você é de Blumenau SC, grande abraço! tossupper@gmail.com

    ResponderExcluir
  18. conheço sim, ele me da aula. mais nem peço ajuda para ele , ele não muita boa vontade não.
    o sinal esta no RA7. vo esta de encainhando o hardware e o software por e-mail.

    ResponderExcluir
  19. Muito legal Jean Carlos sempre quis fazer um destes,só estou com uma duvida o receptor IR para comprar pode ser qualquer um ou tem que ser especifico?

    ResponderExcluir
  20. Olá Carlos, pode ser o receptor de TV mesmo! voce pode encontrar em oficinas de conserto de televisores, a grande maioria opera em 38KHz!

    ResponderExcluir
    Respostas
    1. Só para confirmar, posso usar então um tl1838 com o mesmo código??

      Excluir
    2. Acredito que dê certo, mas não tenho disponíveis aqui comigo para teste!

      Excluir
    3. Aquele led receptor tem o mesmo princípio de funcionamento??

      Excluir
    4. Não, o led receptor não possui o circuito interno de modulação em 38KHz, o correto é utilizar o receptor próprio para esta frequencia!

      Excluir
  21. Muito bom esse conteúdo, o melhor que encontrei, depois de pesquisar vairios dias sobre rc5. Parabéns a todos que o desenvolveram!!

    ResponderExcluir
  22. Muito bom esse conteúdo, o melhor que encontrei, depois de pesquisar vairios dias sobre rc5. Parabéns a todos que o desenvolveram!!

    ResponderExcluir
  23. Obrigado Rafael, em breve voltaremos a alimentar o blog novamente e teremos bastantes novidades!

    ResponderExcluir
  24. Boa noite amigo. Estou criando um projetinho com emissor e receptor IR, porém estou com problemas com interferências da luz do sol e das lâmpadas do ambiente. Preciso apenas acionar um relé/transistor, mas preciso codificar uma pequena informação pro PIC ignorar/eliminar as interferências. Você tem o código do emissor RC5? Se puder me dar uma ideia de como posso fazer, ficarei muito grato. Já fiz com pulsos, funcionou belezinha, porém facilmente o sistema se aciona sozinho. Obrigado pela atenção. Meu e-mail é: willian_bc_@hotmail.com

    Att,
    Willian Cardoso.

    ResponderExcluir
    Respostas
    1. Olá Willian, para montar o emissor infravermelho você pode utilizar a mesma codificação RC5 porém ao invés de ler você deverá criar o frame dentro do padrão RC5 apresentado acima e isto pode ser implementado facilmente com o uso de delays ou instruções NOP do Assembly ou mesmo utilizando sub rotinas para envio dos bits, acredito que se você montar o receptor acima e testar com um controle padrão RC5 terás uma ótima plataforma para montar e testar o seu emissor!

      Excluir
    2. Boa noite Jean, passei dias tentando terminar essa pequena aplicação. Com delays fica bem fácil e simples, porém não consigo uma sincronia entre o emissor e o receptor. Você saberia me dizer se é possível criar um emissor e um receptor usando apenas um microcontrolador? (no caso um pic 16f877a) Tô achando que é esse meu problema, porque enquanto ele envia o trem de pulsos, nenhuma outra função é acionada (por conta dos delays)

      Excluir
    3. Olá Willian, Na verdade seria interessante o uso de dois microcontroladores um para cada função! Acho que por isto você não está obtendo êxito no experimento!

      Excluir
  25. Reproduzi para o microcontrolador 8051. Espero que funcione.
    Agradeço a explicação.



    // --- Desenvolvimento do Programa ---

    #include
    #include

    sbit RC5=P2^0; //define entrada de dados pelo sensor receptor IR no pino P2.0
    sbit RELE=P2^1; //define saída para acionamento da carga


    //--- protótipo da função de leitura de cada bit recebido ---
    void leitura_rxbit();

    //--- protótipos das rotinas de delay ---
    void delay_4867us(); //delay para receber Start/AGC e Toogle
    void delay_1770us(); //delay da leitura de cada bit recebido

    //--- declaração de variáveis globais ---
    char endereco; //variável relativa ao endereço recebido
    char comando; //variável relativa à tecla pressionada
    char rx_bit; //variável relativa à cada bit recebido

    //-------------------------------------------------------------------

    //--- função principal---//
    void main(){
    //configurações iniciais
    RELE=0; // inicia com RELE desligado
    comando=0; // comando inicia em zero
    endereco=0; //endereco inicia em zero


    //loop
    while(1){
    if(!RC5){ //Se detectar rampa de descida quer dizer que se iniciou a recepção dos dados

    delay_4867us(); // Tempo para receber o Start/AGC e Toogle

    //leitura do endereço (5 bits)
    leitura_rxbit();
    if(rx_bit)endereco|=16;
    leitura_rxbit();
    if(rx_bit)endereco|=8;
    leitura_rxbit();
    if(rx_bit)endereco|=4;
    leitura_rxbit();
    if(rx_bit)endereco|=2;
    leitura_rxbit();
    if(rx_bit)endereco|=1;


    //leitura do comando (6 bits)
    leitura_rxbit();
    if(rx_bit)comando|=32;
    leitura_rxbit();
    if(rx_bit)comando|=16;
    leitura_rxbit();
    if(rx_bit)comando|=8;
    leitura_rxbit();
    if(rx_bit)comando|=4;
    leitura_rxbit();
    if(rx_bit)comando|=2;
    leitura_rxbit();
    if(rx_bit)comando|=1;

    //Tratamento do comando recebido
    switch(comando){
    case 0: RELE=0; break; //Tecla 0 desliga RELE
    case 1: RELE=1; break; //Tecla 1 liga RELE
    default: break;
    }//end switch


    }//end if
    }//end while
    }//end main


    //--- desenvolvimento da função de leitura dos bits recebidos ---

    void leitura_rxbit(void){
    rx_bit=0;
    if (RC5) rx_bit=1;
    delay_1770us(); // Tempo para leitura do próximo bit
    }


    //--- desenvolvimento das funções de delay ---

    void delay_4867us(){
    int x=557; //4866 us
    while(x) x--;
    }

    void delay_1770us(){
    int x=171; //1,773 us
    while(x) x--;
    }



    //-------------------------------------------------------------------- end

    ResponderExcluir
  26. Nao estou conseguindo baixar o codigo em mikroc para estudo. Poderia me enviar? Este programa é valido para RC5 da Philips, como procedo para decodificar as teclas de um controle remoto qualquer? Sou inciciante em programacao e gostaria de aprender a utilizar um controle remoto para enviar comandos. Obrigado!

    ResponderExcluir
  27. Alguém pode me enviar o código do programa em mikroc, pois o download nao esta funcionando. belmirotaylor@hotmail.com

    ResponderExcluir