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.
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.
Parabéns pelo seu artigo. Agora sim eu comprendi o protocolo RC5. Mais um produto com o selo de qualidade pk2lab!
ResponderExcluirGOSTEI MUITO VALEU AMIGO POR COMPARTILHAR
ResponderExcluiramigo 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?
ResponderExcluirOlá, 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!
ResponderExcluirdesculpa amigo falei muito e não falei o que realmente dava errado.
ResponderExcluirtentei 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...
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.
ResponderExcluirOlá,
ResponderExcluirUma 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
Bacana de sua parte responder, pessoas igual a vc meu amigo são poucas.
ResponderExcluirolha 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?
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.
ResponderExcluirBoa 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.
ResponderExcluirVersão MikroC
ResponderExcluirvoid 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();
Qualquer coisa envie o seu código para eu poder verificar.
ResponderExcluirok vou tentar aqui
ResponderExcluirboa noite,
ResponderExcluirestou 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.
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
ResponderExcluirboa 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?
ResponderExcluirIsto 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:
ExcluirPORTC.B1 = ~PORTC.B1;
Delay_ms(1000);
Isto faz com que o pino inverta seu estado, ou seja, o complementa.
Bom Dia
ResponderExcluirestou 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.
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
ResponderExcluirconheço sim, ele me da aula. mais nem peço ajuda para ele , ele não muita boa vontade não.
ResponderExcluiro sinal esta no RA7. vo esta de encainhando o hardware e o software por e-mail.
excelente
ResponderExcluirMuito 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?
ResponderExcluirOlá Carlos, pode ser o receptor de TV mesmo! voce pode encontrar em oficinas de conserto de televisores, a grande maioria opera em 38KHz!
ResponderExcluirSó para confirmar, posso usar então um tl1838 com o mesmo código??
Excluirou um IRM 8751??
ExcluirAcredito que dê certo, mas não tenho disponíveis aqui comigo para teste!
ExcluirAquele led receptor tem o mesmo princípio de funcionamento??
ExcluirNã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!
ExcluirObrigado!!
ExcluirMuito bom esse conteúdo, o melhor que encontrei, depois de pesquisar vairios dias sobre rc5. Parabéns a todos que o desenvolveram!!
ResponderExcluirMuito bom esse conteúdo, o melhor que encontrei, depois de pesquisar vairios dias sobre rc5. Parabéns a todos que o desenvolveram!!
ResponderExcluirObrigado Rafael, em breve voltaremos a alimentar o blog novamente e teremos bastantes novidades!
ResponderExcluirBoa 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
ResponderExcluirAtt,
Willian Cardoso.
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!
ExcluirBoa 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)
ExcluirOlá 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!
ExcluirEste comentário foi removido pelo autor.
ResponderExcluirNao 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!
ResponderExcluirAlguém pode me enviar o código do programa em mikroc, pois o download nao esta funcionando. belmirotaylor@hotmail.com
ResponderExcluirQue modificações tenho que fazer se eu utilizar o clock interno de 4Mhz do PIC?
ResponderExcluir