• Welcome to LusoRobótica - Robótica em Português.
 

Tutorial Como fazer um comando de TV com Arduino + IR

Started by tr3s, 08 de December de 2009, 04:44

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

tr3s

Olá a todos!

Pois é, depois de muito tempo na escuridão... Finalmente estou de volta!  :D :D

Hoje trago-vos um projecto óptimo para deixarem os vossos familiares boquiabertos este Natal!
Ora bem, vou-vos mostrar como podem usar o vosso Arduino para controlarem a vossa Televisão, DVD, Box, portátil, enfim tudo o que seja controlado por um comando de Infra-Vermelhos! 8)



Vamos precisar de:

Podem ainda ver o tutorial de como Construir um Sensor de próximidade de Infravermelhos por 0€ para verem como é feita a ligação do sensor IR.

Uma breve introdução:
Enquanto estudava e arquitecturava como irá ser feita a comunicação entre os LRSwarmBots, decidi começar a fazer testes. Comecei então a estudar os vários códigos existentes para Infra-Vermelhos. Os mais utilizados hoje em dia são o Sony e o Philips RC5.
O código da Sony é um código bastante fácil de entender. Muito resumidamente consiste num conjunto de 12 bits onde um bit 1 tem um "espaço" a LOW durante 600 microsegundos e um periodo a HIGH durante 1200 microsegundos. O espaço mínimo entre dois códigos sony é de 40 milisegundos e cada mensagem dura 45 milisegundos. A frequência da portadora é 40Khz.


Para este código IR seria muito simples fazer programar algo de modo a receber e enviar mensagens, tanto que projectos para fazer receptores de códigos Sony é o que não falta para aí. Mas atenção é so receptores, não entendendo bem porquê mas as pessoas fogem a sete pés quando vêm que têm de modular sinais... De qualquer maneira, se quiserem fazer algo com estes códigos e precisarem de ajuda é só perguntar!  :)

Tendo em mente que queria fazer algo para os LRSwarmBots decidi escolher os códigos da Philips, RC5. Os motivos foram, cada bit tem a mesma duração, contém mais informação, zonas definidas para endereço e para comando, usa uma portadora numa frequência mais "simpática" (36Khz), é o mais usado mundialmente e não há praticamente nada feito em Arduino com estes códigos, nada como um bom desafio!

O código IR RC5 da Philips consiste em 14 bits por mensagem. Os 2 primeiros bits são StartBits, servem para o receptor regular o Gain (Automatic Gain Control), o bit seguinte é um indicador de Status e serve para o aparelho receptor saber se a tecla está a ser continuamente pressionada ou se simplesmente foi pressionada uma vez. Se a tecla ficar pressionada por algum tempo o bit passa a 0, se a tecla for apenas pressionada rapidamente o bit é 1. Os 5 bits seguintes são bits de endereçamento e desta forma é possível controlar a TV e não ligar o vídeo :p! As TVs por norma têm o endereço 0, os VCR têm o endereço 5 e por aí fora! Os 6 bits restantes são o comando a ser transmitido, desta forma temos 2048 instruções possíveis (32 endereços com 64 comandos cada). Neste código todos os bits têm a mesma duração (1778 microsegundos) e é por isto que quase ninguém faz alguma coisa com o Arduino e este código, não dá para usar a bela funçao pulseIn() :P! No código RC5 um 0 é representado por uma transição descendente e um 1 é representado por uma transição ascendente. A duração de cada mensagem é de 24,889  milisegundos e a distância mínima entre mensagens é de 88,889ms (50x a duração de bit, ou BitTimes).


A teoria para receber estes sinais é simples. Resumidamente é esperar que o sensor detecte o primeiro StartBit da mensagem e ler os 13 bits restantes. Agora para enviar os códigos a história já é outra. Não é só enviar os bits pela mesma ordem que os recebemos fazendo digitalWrite(High e Low). É necessário modular o sinal numa portadora a 36Khz.


Esta foi a solução que os engenheiros da Philips encontraram para evitar o ruído existente por todo lado, até mesmo aquele que os nossos corpos libertam. Ao colocar o sinal nesta frequência, o receptor vai só olhar para esta frequência e ignorar tudo aquilo que não esteja neste ritmo.
Como fazê-lo?
Uma maneira simples é como fiz:
Sabemos que se tivermos de enviar HIGH durante um segundo temos de fazer o LED piscar 36000 vezes. Cada bit dura 1778 microsegundos e um segundo tem 1000000 (milhão) de microsegundos, então o LED terá de piscar 64 vezes se quisermos enviar HIGH durante 1778 microsegundos. 1778*36000/1000000.

Sabendo que cada bit está 50% do tempo a LOW e 50% a HIGH só queremos que o LED pisque 32 vezes em 889 microsegundos! 1778/2 --- 64/2

Simples hein!?  ;)

Sendo assim, 32x em 889 uSegundos dá que cada ciclo LED ON/OFF tem de durar aprox. 28 uSegundos. 889/32
E para acabar, o LED terá de estar 14 uSegundos a HIGH e outros 14 uSegundos a LOW. 28/2

No código irão perceber que não uso os 14 microsegundos directamente, isto deve-se ao facto da função DigitalWrite da biblioteca Arduino demorar aproximadamente 4 microsegundos e sendo assim, quando colocamos um LED a HIGH ou a LOW já gastámos 4 uSeg., portanto já só podemos esperar 10 uSeg. .

Agora, já sabemos ler mensagens RC5 com o nosso Arduino e já sabemos como modulá-las e fazer o LED piscar esse sinal... Portanto... agora é só fazer código, as ligações e apontar o nosso Arduino para a TV!

Como eu sei que muitos de vocês querem o código já feito :P eu vou fazer o favor de colocar aqui um código muito muito simples que faz isto tudo que acabei de explicar. Basicamente o que o programa faz é aprender o código de um comando e quando carregam no botão ele faz um LED piscar a mensagem que aprendeu. Mais simples, apontem o comando da vossa TV para o receptor, carreguem no botão para mudar de canal por exemplo, apontem o Arduino para a vossa TV e carreguem no botão do Arduino, et voilá a vossa TV acabou de mudar de canal!

Para este exemplo, liguei o sensor IR como no tópico Construir um Sensor de próximidade de Infravermelhos por 0€, liguei um LED IR no pino 13 aproveitando o GND ao lado e um botão no Pin 3 (não é necessário explicar este pois não? :P).

Fica aqui um vídeo que fiz onde mostro o meu Arduino a fazer isto mesmo:


Sendo isto trabalho de investigação para os LRSwarmBots é óbvio que numa aplicação mais a sério nunca iria usar as funções da biblioteca Arduino pois tornaria todo o projecto ineficiente. Por isso, recomendo que se quiserem usar este raciocínio evitem usar funções como digitalWrite e usem antes sintaxe específica AVR (evitam ter de andar a ver quanto tempo dura a funçao digitalWrite :P).


Tr3s
Daniel Gonçalves

Pauleta

Muitos parabéns, é um tutorial muito interessante. Está aqui informação muito boa para quem quer começar a desenvolver aplicações deste tipo em robots e controlos remotos.
Cumprimentos,
Tiago Oliveira

metRo_

Estou a fazer o mesmo para a disciplina de microcontroladores na faculdade, tenho que controlar uma persiana :p

tr3s

Obrigado Pauleta! :D

Quote from: metRo_ on 08 de December de 2009, 11:18
Estou a fazer o mesmo para a disciplina de microcontroladores na faculdade, tenho que controlar uma persiana :p

Eehehe! Grande coincidência M3Tr0_ (hahahha), não sabia!  :)
Tr3s
Daniel Gonçalves

amando96

altamente, há uns tempos tentei fazer isto, resultava, mas nem sempre...
por acaso agora queria fazer um comando wireless, mas os modulos RF foram uma dor de cabeça, e em vez de gastar um balurdio em xbees, poderia usar IV :P  que alcance tem? eu estou a pensar em usar a meia esfera que as lanternas tem, para reflectir a luz para a frente, e várias leds IV, em principio indoor...

TigPT

Muito bom tr3s, gostei de ver a tua documentação.

Agora é fazer um protocolo de comunicação simples utilizando a vantagem dos endereços. Muito curioso a Philips ter colocado endereços no protocolo IR. Só conhecia o da Sony.

(A trabalhar assim, qualquer dia apresentas-me a conta... estou para ver  8))

tr3s

Eehhe obrigado a todos :D

Mais uma nota, há mais códigos IR. Deixo alguns como exemplo:

  • Panasonic - Imaginem o Sony completamente invertido (muito mais longo);
  • Daewoo - Também muito parecido ao da Sony;
  • JVC - É praticamente o código da Daewoo (apenas mudam os timings).
Tr3s
Daniel Gonçalves

tr3s

Quote from: amando96 on 08 de December de 2009, 11:48
altamente, há uns tempos tentei fazer isto, resultava, mas nem sempre...
por acaso agora queria fazer um comando wireless, mas os modulos RF foram uma dor de cabeça, e em vez de gastar um balurdio em xbees, poderia usar IV :P  que alcance tem? eu estou a pensar em usar a meia esfera que as lanternas tem, para reflectir a luz para a frente, e várias leds IV, em principio indoor...

O alcance... A1qui em minha casa a 5 metros funcionava bem. Mas o Alcance é relativo, depende de vários factores, ruído externo, brilho dos leds, etc. .
Tr3s
Daniel Gonçalves

microbyte

Bom... Muito bem. Grande tutorial.

Confesso que ainda não o li na totalidade, mas vou ler certamente. ;) Obrigado mais uma vez pela partilha de informação tão preciosa.  ;D

Tyran

Hehe muito fixe :)

Agora é fazer uma plaquita pequena para ires para o café e mudares de canal quando tiver a jogar o benfica :)

metRo_

Assim uma placa com um attiny smd e uns emissores smd, assim muito muito pequeno :D

ricardo-reis

nada a dizer.. este homem é um senhor.. :D  mt bom tutu, sr daniel, mt bom!

Fifas

muito bom tr3s! :) gostei mesmo :D

Agora era só conseguires meter isso a controlar a Powerbox da tvcabo já que nao consigo controla-la com nenhum comando universal...nem com o telemovel que tem tudo e mais alguma coisa :D

Tyran

Deve ter um protocolo feito por eles :P assim quem quer mudar de canal tem de comprar os comandos deles lol

Fifas