A comunicação utilizando a radiação infravermelha possibilita uma série de aplicações interessantes, conforme já vimos aqui no site. Dessa forma, vamos aprender sobre os dois principais elementos que envolvem esse tipo de comunicação: o transmissor e o receptor.
Informações básicas
A radiação infravermelha é um tipo de onda eletromagnética que não se encontra dentro do espectro eletromagnético visível aos olhos do ser humano. A imagem abaixo mostra sua localização dentro do espectro eletromagnético.
Algumas vezes ela é chamada de luz infravermelha, embora a definição de luz, normalmente, englobe apenas as ondas visíveis aos olhos humanos. Entretanto, em alguns casos, ela é chamada de luz invisível. E até mesmo na língua inglesa, ela é comumente chamada de “Infrared Light” (luz infravermelha).
De qualquer forma, utilizarei o termo “luz infravermelha”, já que, normalmente, temos uma ideia melhor de luz do que temos de radiação. Sendo assim, espero que isso facilite o aprendizado.
Enfim, a luz infravermelha é um tipo de onda associada ao calor, pois qualquer objeto com uma temperatura, por menor que seja, emite radiação infravermelha. E, quanto maior a temperatura, maior a radiação emitida. O sol, por exemplo, emite muita luz infravermelha, que é uma das responsáveis por aquecer a terra.
Por ser um tipo de onda não ionizante (ao contrário da ionizante, não causa mutações nas células), ela pode ser utilizada em diversas tecnologias sem problemas. Abaixo estão dois exemplos mais comuns do uso desse tipo de luz.
Câmera térmica
Devido a radiação infravermelha emitida pelos objetos, existem câmeras que captam a luz infravermelha para analisar a temperatura dos objetivos. A imagem abaixo mostra uma imagem de uma câmera térmica que usa esse princípio:
Com esse tipo de câmera, é possível verificar a temperatura de objetos sem a necessidade de ter um sensor em contato com ele. Além disso, é possível fazer a fácil detecção de animais com esse tipo de câmera, já que a maioria emite mais radiação infravermelha que o ambiente.
Óculos de visão noturna
Como o ser humano não enxerga a luz infravermelha, ela pode ser usada para “iluminar” o ambiente. Com o ambiente iluminado de luz infravermelha, é possível utilizar óculos com lentes especiais que convertem a luz infravermelha em luz visível.
Esse é o princípio de funcionamento dos óculos de visão noturna. Logo, apenas quem os utiliza pode enxergar a luz infravermelha que está sendo emitida. A imagem abaixo mostra como é a visão em um tipo de óculos de visão noturna.
Sem mais delongas, vamos aos dois principais componentes que permitem criar aplicações básicas com a luz infravermelha:
Receptor infravermelho
Fotodiodo comum
O receptor de luz infravermelha é apenas um fotodiodo. Ou seja, é um componente que transforma a luz em corrente elétrica. E, neste caso, a luz transformada é a infravermelha. Portanto, quanto mais radiação infravermelha estiver sendo recebida, maior será a corrente que passa pelo componente.
O receptor, em alguns casos, é idêntico ao transmissor. Mas, em outros casos, ele possui uma única diferença visual, que é a cor. Pois ele é preto e o transmissor é transparente. Veja a imagem abaixo de um receptor:
Para medirmos essa intensidade de luz, podemos colocar um resistor em série com o fotodiodo. Dessa forma, quanto maior a corrente, maior será a queda de tensão no resistor. Com isso, basta ler essa tensão e executar os procedimentos necessários.
Circuito de leitura da intensidade luminosa
Para exemplificar, vou criar um simples circuito para ler a intensidade de luz infravermelha no receptor. A ideia é fazer igual foi descrito anteriormente e utilizar um resistor em série com o receptor. Quanto maior o valor da resistência, melhor. Utilizarei um resistor de 180kΩ.
Basta ligar o receptor, de um lado, no 5v, e, do outro, no resistor. Uma ponta do resistor vai no GND e a outra no pino analógico A0.
Programação
A programação é extremamente simples, consiste apenas em ler a tensão do pino A0 e imprimi-la no monitor serial. Leia os comentários para entender.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | void setup() { pinMode(A0, INPUT); // Define A0 como entrada Serial.begin(9600); // Inicia a comunicação serial } void loop() { int leitura = analogRead(A0); // Lê a tensão em cima do resistor if(leitura > 15){ // Só imprime se estiver acima de um valor mínimo Serial.println(leitura); // Imprime o valor da leitura delay(1000); // Cria um pequeno atraso } } |
Para testar, use um controle remoto, ou ligue um LED infravermelho apontado para o receptor.
Um exemplo bem legal que usa esta lógica de programação, é este tutorial.
Circuito de exemplo sem microcontrolador
Para dispensar o uso de um microcontrolador, é possível utilizar um comparador para indicar se a intensidade do receptor ultrapassou um certo limite. Veja como no circuito abaixo.
Esse circuito já foi mostrado no post do sensor de obstáculo. A tensão em cima do resistor do receptor está sendo comparada com a tensão de um potenciômetro. Sendo assim, é possível ajustar o limite para que a saída do comparador fique em nível alto apenas sob certa intensidade.
Sensor VS1838
Além do fotodiodo comum mostrado anteriormente, existe um sensor chamado VS1838. Este sensor, além de possuir um fotodiodo infravermelho, contém alguns componentes internos para fazer a correta leitura de pulsos de 38kHz. Ele é útil em aplicações de transmissão de dados via luz infravermelha, mais especificamente para ler controles remotos de televisão. A imagem abaixo mostra o sensor:
Antes de entender o porquê dos 38kHz, vamos focar apenas no sensor. Internamente, ele possui um circuito que filtra o sinal de 38kHz e o transforma em uma saída digital (0 ou 1). Por padrão a saída deste sensor é 1, e quando ocorrem os pulsos, ele vai para 0 até os pulsos pararem. Veja aqui como é a ideia por trás do circuito.
Além disso, ele possui um invólucro metálico, que serve para filtrar certo ruídos do ambiente. E os seus pinos são, na ordem da esquerda pra direita de acordo com a imagem acima: Sinal; GND e Vcc (5v).
Certo, agora vamos entender rapidamente a razão dos 38kHz.
Protocolo de comunicação
Existe um problema na transmissão de dados via luz infravermelha, que é a interferência da luz infravermelha do ambiente. Para contornar esse obstáculo, surgiram diversos protocolos para padronizar a comunicação da luz infravermelha de forma que o ambiente não fizesse interferência.
Por padrão, os protocolos definem que a comunicação é feita com pulsos em uma frequência de 38kHz. E é a partir destes pulsos que uma televisão pode diferenciar a luz que vem de um controle remoto e a que vem do sol ou de algum objeto. Além disso, os protocolos possuem uma série de regras, assim como na comunicação serial e seus vários tipos.
A Samsung, por exemplo, possui a seguinte definição para considerar se o sinal recebido é um 0 ou um 1:
Portanto, para enviar nível lógico 0, o transmissor deve enviar um pulso de 38kHz (aproximadamente) por 0.56ms e depois não deve enviar nada por 0.56ms. No caso de enviar nível lógico 1, o transmissor deve alterar o tempo que ele não envia nada para 1.69ms.
Existem outras definições do protocolo da Samsung que devem ser seguidas para realizar a comunicação. Caso tenha interesse, dê uma lida neste documento. Ademais, existem outros protocolos como o NEC, SIRCS, RC5, JAPAN…
Enfim, com estes protocolos, é possível transmitir dados pela luz infravermelha de forma segura e confiável. Para entender mais sobre, veja este vídeo.
Circuito de leitura de controle remoto
Vamos criar um programa para receber os sinais de um controle remoto e mostrar o código associado ao botão pressionado. O circuito da proposta está mostrado abaixo:
Basta ligar os pinos de alimentação do sensor no 5v e no GND. E o pino de sinal deve ser ligado no pino digital 2 do Arduino.
Programação
Para a parte da programação, iremos precisar da biblioteca IRremote. Ela pode ser baixada aqui. Com a biblioteca já instalada, abra o Arduino e vá em Arquivo->Exemplos->IRremote->IRrecvDemo. Com o exemplo aberto, altere o “RECV_PIN” para 2. Com tudo pronto, faça upload do código para a placa.
Depois de ter feito upload, abra o monitor serial e aponte seu controle remoto para o receptor. Por fim, basta apertar os botões do controle remoto e observar os códigos sendo exibidos no monitor serial. Para controlar sua televisão com o transmissor, anote esses valores, pois iremos precisar deles.
Utilizando o controle da Samsung que tenho, apertei o botão de liga/desliga e obtive o seguinte comando: 0xE0E040BF.
Programação para leitura sem biblioteca
No desenvolver deste post, acabei descobrindo muita coisa sobre o protocolo da Samsung e resolvi tentar fazer o código de leitura por conta própria. Com a ajuda deste site e do documento do protocolo que mencionei anteriormente, pude criar a lógica de leitura sem muitos problemas. Fiz isso mais para aprendizado, pois a biblioteca IRremote funciona sem problemas.
Para quem tiver interessado, segue o código que desenvolvi:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 | // Pino do receptor #define receptor 2 // Variavel para armazenar o tempo entre os pulsos unsigned long tempo; // Variaveis para saber em qual estado o programa está bool estado1 = false; bool estado2 = false; bool inicio = false; int tempoAlta; int contagem = 0; // 32 bits de dados que são enviados pelo controle remoto unsigned long bitLido = 0b0; void setup() { pinMode(receptor, INPUT); Serial.begin(9600); } void loop() { // Lê o sensor (0 = sinal recebido - 1 = sem sinal) bool leitura = digitalRead(receptor); if(!leitura && !estado1){ // Detecta a borda HIGH to LOW estado1 = true; } if(leitura && estado1){ // Detecta a borda LOW to HIGH tempo = micros(); estado2 = true; } if(!leitura && estado2){ // Detecta a 2ª borda HIGH to LOW tempoAlta = micros()-tempo; // Reseta os valores e habilita o início da leitura dos 32 bits de dados estado1 = false; estado2 = false; inicio = true; } if(inicio){ // Só entra quando for a hora de ler os 32 bits // Começa a leitura dos 32 bits de dados while(contagem < 32){ leitura = digitalRead(receptor); if(leitura && !estado1){ // Detecta a borda LOW to HIGH tempo = micros(); estado1 = true; } if(!leitura && estado1){ //Detecta a borda HIGH to LOW tempoAlta = micros()-tempo; estado1 = false; // Verifica se o tempo em alta foi maior que 1.5ms (o tempo correto é 1.69ms, usei 1.5ms para ter uma margem de erro) // Como o sensor lê os valores contrários (o que é 0 é 1, e o que é 1 é 0), o tempo em alta aqui na verdade é o tempo em baixa do controle remoto if(tempoAlta > 1500){ bitLido = (bitLido << 1) + 1; // Desloca os bits à esquerda e soma 1 }else{ bitLido = bitLido << 1; // Apenas desloca os bits à esquerda, logo, o MSB será 0 } contagem++; } } // Ao final da leitura dos 32 bits, printa o valor em hexadecimal e binário Serial.println(bitLido, BIN); Serial.println(bitLido, HEX); // Reseta os valores bitLido = 0b0; inicio = false; contagem = 0; } } |
Transmissor infravermelho (LED)
O transmissor nada mais é do que um LED que emite luz infravermelha. Logo, não há muito mistério em usá-lo.
Circuito de controle remoto
Vamos usar o transmissor como controle remoto com a ajuda da biblioteca IRremote. O circuito para este caso está mostrado abaixo:
O circuito é bem simples, é só ligar o LED infravermelho em série com um resistor. E, o positivo do LED vai no pino digital 3 do Arduino. A outra ponta do resistor, vai no GND.
Programação
A programação vai depender muito da sua televisão. No meu caso, fiz o teste em um televisão da Samsung, e o comando para enviar dados que utilizei foi:
irsend.sendSAMSUNG(dados, nºbitsDosDados);
Os ‘dados’ podem ser obtidos no tópico em que mostrei como ler o controle remoto usando o sensor VS1838. Enquanto o número de bits dos dados é um número fixo do próprio protocolo da Samsung, que é 32.
E é claro que, além do comando sendSamsung, existem outros:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | sendRC5 (unsigned long data, int nbits); endRC6 (unsigned long data, int nbits); sendNEC (unsigned long data, int nbits); sendSony (unsigned long data, int nbits); sendPanasonic (unsigned int address, unsigned long data); sendJVC (unsigned long data, int nbits, bool repeat); sendWhynter (unsigned long data, int nbits); sendAiwaRCT501 (int code); sendLG (unsigned long data, int nbits); sendDISH (unsigned long data, int nbits); sendSharpRaw (unsigned long data, int nbits); sendSharp (unsigned int address, unsigned int command); sendDenon (unsigned long data, int nbits) ; sendPronto (char* code, bool repeat, bool fallback); sendLegoPowerFunctions (uint16_t data, bool repeat = true); |
Com o comando certo e o os dados, podemos criar um código simples para comandar a televisão:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | #include <IRremote.h> #define ligar 0xE0E040BF //Codigo do botao power da tv samsung #define volume 0xE0E0E01F //Codigo do botao volume+ da tv samsung IRsend irsend; void setup() { } void loop() { irsend.sendSAMSUNG(ligar, 32); // Envia o comando de ligar/desligar delay (5000); // Cria um atraso entre cada envio } |
Infelizmente, não consegui encontrar uma forma fácil de mudar o pino do transmissor infravermelho. Mas você pode abrir o arquivo boarddefs.h dentro da pasta da biblioteca e alterar a linha ‘define SEND_PIN 3’ para o pino desejado.
Tentei fazer a transmissão dos dados sem biblioteca, mas não obtive sucesso. Pelo que vi na internet, talvez tenha algo a ver com as funções de delay do Arduino. De qualquer forma, a biblioteca IRremote funciona muito bem.
https://mundoprojetado.com.br/sensor-de-obstaculo/