Olá a todos!
Pois é, depois de muito tempo na escuridão... Finalmente estou de volta!
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!
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() ! 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/2Simples hein!?
Sendo assim, 32x em 889 uSegundos dá que cada ciclo LED ON/OFF tem de durar aprox. 28 uSegundos.
889/32E para acabar, o LED terá de estar 14 uSegundos a HIGH e outros 14 uSegundos a LOW.
28/2No 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
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?
).
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
).