#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...
}
tu és brutal, daniel.. sim sr.. os teus posts são autenticas preciosidades..
Sim senhor, excelente artigo ;)
Adicionado à primeira página!
Só tenho uma sugestão a fazer... Se variares a frequência do LED IR, vais ter reflexos a distancias diferentes, podes então alterar a frequência para mudar a sensibilidade do sensor sem ter que cortar o plástico... Tenta, eu fazia isso quando utilizava o BasicStamp2 com LED e receptor como fazes aqui, mas sem o transístor. ;)
Oi.. Apanhou qualquer coisa... OH NÂO É UM ICEBERG... OH GOD, THE PAIN, CAN YOU FEEL THE PAIN?genial!
// 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)
Pelos coments do código dá para ver a que horas foi feito :PCitarOi.. Apanhou qualquer coisa... OH NÂO É UM ICEBERG... OH GOD, THE PAIN, CAN YOU FEEL THE PAIN?genial!
// 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)
mt bom tutu ;)
Em vez do teu esquema que ocupa 2 portas digitais no arduino posso utilizar estes equemas ?
Imagem 1 (http://www.2mhi.com/icar/arduino/esquemas/ir-sensor.png)
Imagem 2 (http://www.2mhi.com/icar/arduino/esquemas/0J630.jpg)
Só ocupam uma porta analógica.
Achas que funciona ?
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.
#include <MsTimer2.h>
static boolean output = HIGH;
int val = 0;
void setup(){
pinMode(12, OUTPUT);
Serial.begin(9600);
MsTimer2::set(5, flash); // Intrrupções de 5 em 5 ms no LED IV
MsTimer2::start();
}
void loop(){ // Unica diferença do codigo original
Serial.println(analogRead(0)); // Envia valores lidos no pin analogico 0
}
void flash() {
digitalWrite(12, output);
output = !output;
}
FREQOUT 8, 1, 38500
irDetectLeft = IN9
IF (irDetectLeft = 0) THEN
Obrigado TigPT ;)Quem me dera poder dizer isso mas eu vou começar o próximo semestre ainda a entregar trabalhos e fazer defesas do anterior :S
Entretanto arranjei um PDF ("Robotics With Boe-Bot - Student Guide)
Dedicam um capítulo inteiro a sensores infra-vermelho..vou por alguma leitura em dia...
Bolas, nestas "férias" entre semestres estou que nem vampiro, sempre a dormir de manha... =D
[]
E agora finalmente a minha questão: o que se passa com este sensor? ???
Os outputs gerados fazem sentido?
Com variações de apenas algumas unidade não consigo aproveitar o sensor IV para sensor de proximidade =(
Vai ser o tubo feito com a caneta preta que vai ajudar na leitura de IV's?
Desde já muito obrigado ;)
quack
Não uso o indicador da mao esquerda pq o cortei Lingua!Não percebi, o teu indicador pareceu estar em boas condições!! :P
Usando a entrada analógica porque não?
Usando a entrada analógica porque não?
tenho de tentar, parece mais fixe do que gastar 35 € e sem poder receber o que compro xD
Usando a entrada analógica porque não?
tenho de tentar, parece mais fixe do que gastar 35 € e sem poder receber o que compro xD
É isso mesmo! Era mesmo essa a ideia que queria transmitir! ;D ;D ;D ;D
Se mantiveres a distancia fixa da superfície, podes utiliza-lo para detectar cores, mal mas dá para teres uma ideia. ;)Usando a entrada analógica porque não?
tenho de tentar, parece mais fixe do que gastar 35 € e sem poder receber o que compro xD
É isso mesmo! Era mesmo essa a ideia que queria transmitir! ;D ;D ;D ;D
consegui fazer um ;D ;D só que não é IR é uma LED de alto brilho ::) mas funciona! liguei ao arduino de forma a receber os dados da entrada, e deu-me 100 quando não apontava nada, e quando estava a 10cm da mesa dava-me 650, logo +650=-10cm :) e depois quando passava isso a LED do pino 13 acende :)
mas depende um bocado da cor da superficie :S numa folha de papel branco 650 equivale a 15 cm, numa papel preto equivale a 5... :S
mas já deve dar para alguma coisa ;D
Se mantiveres a distancia fixa da superfície, podes utiliza-lo para detectar cores, mal mas dá para teres uma ideia. ;)Usando a entrada analógica porque não?
tenho de tentar, parece mais fixe do que gastar 35 € e sem poder receber o que compro xD
É isso mesmo! Era mesmo essa a ideia que queria transmitir! ;D ;D ;D ;D
consegui fazer um ;D ;D só que não é IR é uma LED de alto brilho ::) mas funciona! liguei ao arduino de forma a receber os dados da entrada, e deu-me 100 quando não apontava nada, e quando estava a 10cm da mesa dava-me 650, logo +650=-10cm :) e depois quando passava isso a LED do pino 13 acende :)
mas depende um bocado da cor da superficie :S numa folha de papel branco 650 equivale a 15 cm, numa papel preto equivale a 5... :S
mas já deve dar para alguma coisa ;D
Podes sempre impedir luz exterior de entrar, com uma "saia" à volta desse bloco até ao chão, tipo escova, ou até mesmo pano caso não arranjes melhor... utiliza sempre cor preta para n influenciar o resultado medido ;)
Eeheh é esse o principio dos sensores para os "segue-linhas! :D:D
:O tenho de fazer um! eu tenho um LDR mas com um filtro que só deixa passar luz IR
daria para fazer um com um LDR?
:O tenho de fazer um! eu tenho um LDR mas com um filtro que só deixa passar luz IR
daria para fazer um com um LDR?
Depende de se o LDR é ou não sensível à luz infra-vermelha... não sei. Mas tens fotodíodos que o são.
e outra coisa... o transistor é mesmo necessário? :S não me dou com transistores :(
O transistor aquece muito porque o LED não tem resistência. O transistor aquece, e o LED vai acabar por pifar. O LED tem que ter resistência (180 a 220ohms).
|
AVR +----+----------* pino 13
| |
| +----/\/\/\---->|---- 0V
| \\
:o :o :oRealmente também tinha a ideia que a resistência estava em serie com o pin out, será que já estava assim desde do duecimila?
então se se ligar uma LED ao pino 13 sem resistencia ela queima??? isto no site não está mt bem explicado... bem, cá vão 1000 ohms...
talvez mas o esquema que mostras-te dizia arduino 2009... bem só em caso pus 700ohms...Fizeste bem ;)
talvez mas o esquema que mostras-te dizia arduino 2009... bem só em caso pus 700ohms...Fizeste bem ;)
220 chega mas n faz mal mais que garantes que não queima ;)
Então já sabes como regular a sensibilidade, metes um potenciómetro digital a ser controlado pelo arduino.talvez mas o esquema que mostras-te dizia arduino 2009... bem só em caso pus 700ohms...Fizeste bem ;)
220 chega mas n faz mal mais que garantes que não queima ;)
bem fui agora ver e, conforme a resistencia que por, é preciso mais, ou menos distancia para ele se desviar :) com 220 dá 60 cm ;D
lol xD mas deve dar para usar PWM para controlar a distancia a que detecta?Sim com um PWM maior deve de detectar mais longe... testa..
e perciso mesmo o arduino?Não é preciso o arduino, o arduino aqui só está a fazer a tarefa de mediante um valor processar de certa forma, mas pode fazer o mesmo com qualquer microcontrolador, ou apenas com circuitos lógicos.
#include <MsTimer2.h>
#define ledPin 12
#define alertPin 13
#define irx 2
int val = 0;
int counter = 0;
void setup(){
pinMode(irx, INPUT); //pino data do Sensor IV
pinMode(ledPin, OUTPUT);
Serial.begin(9600);
MsTimer2::set(100, flash); //timer do flash, são emitidos pulsos da onda quadrada na frequencia de ~38KHz acada 100ms
MsTimer2::start();
}
void loop()
{
val = digitalRead(irx);
if(!val){
counter++;
digitalWrite(alertPin, HIGH);
delay(50);
digitalWrite(alertPin, LOW);
Serial.print("Debug: ");
Serial.println(counter);
}
}
void flash() { //Onda quadrada, 10µs bom deveria ser 12µs mas em 12 a frequencia nao casa (seria o tempo de execução?)
digitalWrite(ledPin, HIGH);
delayMicroseconds(10);
digitalWrite(ledPin, LOW);
delayMicroseconds(10);
digitalWrite(ledPin, HIGH);
delayMicroseconds(10);
digitalWrite(ledPin, LOW);
delayMicroseconds(10);
}
e perciso mesmo o arduino?Não é preciso o arduino, o arduino aqui só está a fazer a tarefa de mediante um valor processar de certa forma, mas pode fazer o mesmo com qualquer microcontrolador, ou apenas com circuitos lógicos.
Com OPAMP, acho que consegue gerar o sinal no led, mas como vais calcular uma distancia?
Com OPAMP, acho que consegue gerar o sinal no led, mas como vais calcular uma distancia?
eu quero para detectar a presença de luz IV a piscar a 33Hz, nao para detectar distancias :)
NOTES:
1. Measurements made with Kodak R-27 Gray Card, using the white side, (90% reflectivity).
2. L = Distance to reflective object.
fonte: http://www.superrobotica.com/download/sharp/gp2d120.pdf (http://www.superrobotica.com/download/sharp/gp2d120.pdf)
Bem consegui arranjar o led, receptor ,que tirei de um dvd, o transistor nao consegui arranjar o 547 e disseram-me que 548 era igual. Então peguei no 548 e exprimentei mas nao funciona.
Revi as ligação 3 vezes, e está ligado como nas imagens, e reparei que o receptor aquece bue.
Quando digo "bem mais caro" é tendo em conta que comprar um sensor pronto-a-usar me custaria pouco mais de 10€... já vou para além dos 5€... mas caso resulte, nem que no fim tiver gasto um pouco mais, me daria por contente, pois o conhecimento adquirido ninguém me tira.Eu fui na conversa do pessoal da Dimofel e comprei o fotodiodo e não funciona por nada.
Já vi que a ajuda aqui no fórum é instantânea =)
Espero evoluir depressa para também poder assim ajudar quem precise ;)
Posto também as imagens dos componentes que uso... mas ainda tenho uma noitada pela frente para fazer mais uns testes ao sensor até saber mesmo postar a minha pergunta..se nem eu me entendo quanto mais voçês.. nao sei ainda formular a pergunta. Sei que não percebo o que o sensor faz (ou neste caso não faz)
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fweb.ist.utl.pt%2F%7Epedro.ganco%2FLR%2Fimgs%2FsensorIV.jpg&hash=58562224d401bfa432f88e29a95710e1550e5037)
Não usei esse foto diodo, mas foi o que me aconselharam na Dimofel, mas cedo percebi que o foto diodo "sente" tudo o que é radiação =P
[]obrigado
[EDIT] novidades
Fazendo o upload do codigo do tutorial o arduino envia sempre a frase "ICEBERG!" para o PC
Para tentar perceber porquê, simplifiquei o meu circuito para algo mais simples e ver o output desta vez:Código: [Seleccione]#include <MsTimer2.h>
static boolean output = HIGH;
int val = 0;
void setup(){
pinMode(12, OUTPUT);
Serial.begin(9600);
MsTimer2::set(5, flash); // Intrrupções de 5 em 5 ms no LED IV
MsTimer2::start();
}
void loop(){ // Unica diferença do codigo original
Serial.println(analogRead(0)); // Envia valores lidos no pin analogico 0
}
void flash() {
digitalWrite(12, output);
output = !output;
}
Codigo cores cabos:
Preto- GND
Vermelho- 5V
Amarelo- Pin analogico 0
Verde- GND
Azul- Pin digital 12
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fweb.ist.utl.pt%2Fpedro.ganco%2FLR%2Fimgs%2FsensorIV2.jpg&hash=405a904f6d83122c4d850a1631dba8a584591ae7)(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fweb.ist.utl.pt%2Fpedro.ganco%2FLR%2Fimgs%2FsensorIV3.jpg&hash=5a0bdd9b55dec6481f418c53a3fe8c0c2cff6863)
---------------------------------(no início...)---------------------------------
Sensor IV:
Leg1: OUT (pin analogico 0)
Leg2: GND
Leg3: 5V
LED IV:
pin digital 12 (com frequência de 5ms tal como o código original, usando o timer)
usei um switch para so ligar o LED IV quando quisesse, para ver alterações no sensor
RESULTADOS do Serial Monitor:
Com LED IV desligado o valor lido é de 1023
Com LED IV ligado o valor lido continua constante a 1023
Daí ter concluído que o output do sensor deveria ser a leg2 em vez da leg1, pois não reagia ao LED IV
----------------------------(Mudando a leg1 com a leg2)----------------------------------------
Sensor IV:
Leg1: GND
Leg2: OUT (pin analogico 0)
Leg3: 5V
LED IV:
igual ao anterior
RESULTADOS do Serial Monitor:
Com LED IV desligado o valor lido é de 190
Com LED IV ligado os valores lidos vão crescendo a um ritmo certo começando por variar entre [193 e 196], [196 e 199], [199 e 202] ...sempre a crecer sequencialmente o limite do intervalo.
Após desligar o LED IV o valor lido estabiliza novamente desta vez num valor mais alto que o 190 inicial
Não me serve de muito, mas confirma (penso eu) a minha teoria de a leg2 ser a leg do sinal
---------------------------------------(fazendo asneira da grossa lol)---------------------------------------
Sensor IV:
Leg1: OUT (pin analogico 0)
Leg2: 5V (uups!) :o
Leg3: GND (uups!) :o
RESULTADO:
Por engano troquei na bread board a leg2 com a leg3 do sensor IV, o resultado, não cheirou nada bem!!! em segundos percebo que algo de errado se passa, pois começo a sentir um cheiro a queimado!!!!
Aqui sim fiquei preocupado! desliguei de imediato a USB do arduino, mas menos aflito "vejo" que o cheiro não vem da placa mas sim do sensor que estava quente!
Depois de alguns testes os resultados do sensor continuam iguais, penso que não tive tempo de o danificar =)
------------------//----------------------
E agora finalmente a minha questão: o que se passa com este sensor? ???
Os outputs gerados fazem sentido?
Com variações de apenas algumas unidade não consigo aproveitar o sensor IV para sensor de proximidade =(
Vai ser o tubo feito com a caneta preta que vai ajudar na leitura de IV's?
Desde já muito obrigado ;)
quack
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
#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
if (output == HIGH) {
Serial.println("ICEBERG!");
} else { // Oi.. Apanhou qualquer coisa... OH NÂO É UM ICEBERG... OH GOD, THE PAIN, CAN YOU FEEL THE PAIN?
Serial.println("detect!");
}
// 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...
}
#define sensorIR 0
void setup(){
Serial.begin(9600); //Para podermos ver o valor na consola
}
void loop(){
Serial.println(analogRead(sensorIR));
delay(50);
}