Olá a todos!
Bem com certeza que já todos conhecem os famosos sensores de proximidade por infravermelhos da SHARP que custam entre os 20 e os 30 euros em Portugal:
Bom, eu fiz o meu por 0€, é verdade zero euros, e vou ensinar-vos como!
Primeiro recolher o material necessário:
- Sensor IR
- LED IR
- Transistor NPN (usei o BC547)
- Caneta velha
Como gosto de reciclar, fui até à garagem do meu tio e perguntei-lhe se tinha para lá algum video ou TV velha... Yap tinha e meteu-me logo 2 vídeos velhos à frente. Encontrei logo 2 receptores de infravermelhos e alguns transístores. Os receptores são assim:
Estes vão ser os que vocês vão encontrar certamente, mas eles funcionam de maneira diferente. O Maior coloca "0 / LOW" em "out" enquanto não detecta infravermelhos mas assim que os detecta coloca "1 / HIGH". O mais Pequeno funciona ao contrário. Decidi usar o mais pequeno pois é o que se adaptava melhor
ao que queria fazer.
Perguntei ainda ao meu tio se tinha por ali comandos estragados ou que já não precisasse para poder tirar um LED, ele deu-me logo uns quantos e então foi so tirar os LED IR! OH YEAH!
(Eu fui à garagem do meu tio, mas vocês podem ir à loja do Electricista local ou o senhor que arranja electrodomésticos da vossa zona, certamente que ele vos deixa fazer o mesmo! Isto se vocês não tiverem assim material velho.)
Quando cheguei a casa fui à procura de uma caneta velha, uma que já não escrevesse. Encontrei uma com o tubo preto e bastante opaco, "Era mesmo isto que procurava!". Cortei o tubo da caneta em duas partes com 5cm cada uma:
Com a pistola de cola quente já "quente", colei o Sensor IR a um lado dos tubos:
Fiz o mesmo com o outro tubo para o LED e de seguida colei os tubos um ao lado do outro:
Okay, a "pistola" está pronta! Com os tubos de 5cm consegui detectar objectos a 30cm de distância até 10cm de distância (10cm é o mais perto que quero estar dos obstáculos). Para aumentar a sensibilidade e por sua vez detectar objectos ainda mais perto, basta cortar os tubos! Podem cortá-los até a "face" do LED e do Sensor e assim conseguem detectar objectos mesmo em cima destes!
Vamos agora às ligações. As ligações são bastante simples, o sensor tem 3 pinos, 2 para alimentação e o outro e um pin que ou tem o valor lógico 1 ou 0.
O sensor tem uma maneira engraçada de funcionar. O que estes sensores fazem é detectar variações de luz, por exemplo, quando carregamos num botão do comando LED dele pisca com uma determinada frequência (+- 33KHz) e o que o sensor da TV ou video detecta é esta variação. Estes sensores não detectam apenas, única e exclusivamente, luz infravermelha, eles "apanham" tudo (são um pouco mais sensiveis ao IR claro)! Se nós acendermos um LED IR em frente a este sensor veremos ele detectar qualquer coisa por um breve momento e a estabilizar logo de seguida, isto porque ele internamente "satura" a esse comprimento de onda. É por isso que quando estamos em casa, de luzes ligadas, conseguimos mudar de canal com o nosso comando. O sensor da TV está a "saturar" a toda a luz envolvente e por isso a desprezá-la, como não está a saturar ao IV ao carregarmos num botão do comando o sensor vai "senti-lo" e como o LED do comando apenas pisca, o sensor não chega a "saturar" o IV e então não o despreza.
Para ligar o LED há um pequeno senão, como o valor no pino varia tão rápido, se ligarmos la o LED, este parece que nem acende e sim desta forma nem precisamos de uma resitência. É aqui que entra o transístor, com ele conseguimos ter o LED a brilhar a todo o seu explendor (ehe) à frequência desejada!
Fica tudo mais ou menos assim:
É isto que temos de fazer então, meter o LED IV a piscar (a qualquer valor na frequência dos KHz) e ver se o sensor detecta qualquer coisa!
Para meter o LED a piscar decidi criar uma interrupção com um timer, de modo a que de cada vez que esta ocorresse acendia ou apagava o LED. Na função
loop fico à espera que o sensor detecte alguma coisa. Simples não é?
Um pequeno exemplo:
#include <MsTimer2.h>
#define irx 2 // Sensor IR no pin digital 2
static boolean output = HIGH; // Variável para defenir o estado do LED de infravermelhos, é estática para ser usada durante a interrupção
void setup(){
pinMode(irx, INPUT); // Pin onde está o LED infravermelhos é pin output
Serial.begin(9600); // Iniciar comunicação Serial com o computador...
MsTimer2::set(5, flash); // Defenir intrrupções de 5 em 5 ms e durante a interrupção é chamada a função flash
MsTimer2::start(); // Iniciar interrupções
}
void loop(){
while(digitalRead(irx)); // Enquanto não houver nada no Sensor não sai daqui, o sensor coloca 1 quando n detecta nada e passa a 0 qd detecta algo
Serial.println("ICEBERG!"); // Oi.. Apanhou qualquer coisa... OH NÂO É UM ICEBERG... OH GOD, THE PAIN, CAN YOU FEEL THE PAIN?
// MAYDAY MAYDAY!
// - Alô diz iz German Cost Guard, can we help you? (Sotaque alemão)
// YES, YES! We're SINKING!
// - Okay so what are you sinking (thinking) about? (ahha XD)
}
void flash() { // Função chamda durante a interrupção
digitalWrite(12, output); // Anceder ou apagar o LED IR
output = !output; // Alterar o output...
}
Para fazer as interrupções uso a biblioteca MSTimer2, deixo-a em anexo para quem ainda não a tem (colocá-la na pasta "hardware\libraries" da pasta do Arduino).
Bem simples hun?
Com alguma "ginástica" no código consegue-se medir distâncias, mas isso deixo voces descobrirem como!
E tudo a custo zero, se não conseguem encontrar este material gratuitamente (custa-me a crer), se o forem comprar não gastam mais de 1,5 euros! É bem mais barato que os 25 a 30 euros das lojas...
(tip: quanto mais perto está o objecto, maior é a frequência com que o sensor varia de 1 para 0)