Alarme de interrupção laser

É incrível o mundo do cinema. Descer por uma corda para roubar uma jóia protegida por uma caixa de vidro a prova de balas, com toda a sala cercada por alarmes de interrupção laser. Não podemos reproduzir todo esse universo em casa, mas que tal fazer um desses alarmes laser? É fácil!

Lista de materiais

Para esse projeto vamos utilizar alguns ítens simples:

O objetivo é bastante simples. Apontaremos o laser para o LDR a uma certa distância. O laser irá saturar o LDR e então disparará o buzzer, que tocará o som de uma sirene. Sobre o som da sirene, escrevi um artigo explicando em detalhes como é feito com o buzzer, basta clicar nesse link.

O laser não ficará conectado à microcontroladora dessa vez. Na verdade, deixaremos o laser ligado continuamente e focaremos no LDR.

Como funciona o LDR



Primeiramente, LDR é o acrônimo de “Light Dependent Resistor” ou, “Resistor dependente de luz”, também conhecido como fotoresistência. A leitura é analógica e será executada no pino A0 do Arduino. Tiraremos 3 amostragens e se o valor estiver saturado, disparamos o buzzer.

A leitura do pino analógico do Arduino tem 10bits, que dá um total de 1024 valores (entre 0 e 1023). O resistor de 10K será utilizado para ajudar amenizar ruídos.

Acionamento do laser

Nesse outro artigo escrevi sobre o laser, acionado digitalmente por um Arduino. Dessa vez, para facilitar, o acionamento será feito diretamente por 5V fora da MCU pois o laser será passivo nesse projeto. Isto é, ele apenas se manterá aceso e depois será necessário alinhá-lo com o LDR – este, já conectado ao Arduino e devidamente funcional.

Wiring

O wiring é bastante simples. Como não encontrei uma imagem ideal no google images, tive que fazer no Fritzing:

Wiring buzzer + LDR
Wiring buzzer + LDR

Código

O código para esse projeto também é curto, mas interessante. Primeiro testei a lógica inversa, que é tocar a sirene somente com alta incidência de luz. Depois basta mudar o threshould para algo acima de 500. Vejamos:

float sinVal       = 0;
int toneVal        = 0;
int buzzerPin      = 8;
int counter        = 0;
int toneAdjustment = 2000;
int LDRread        = 0;
int LDRpin         = A0;
int threshould     = 30;

void sirene(){
  //tocar 5 ciclos
  for (int j=0; j<5; j++){
    //1 ciclo = seno de 0 a 180
    for (int x=0;x<180;x++){
        //converte graus em radianos
        sinVal = (sin(x*(3.1412/180)));
        //agora gera uma frequencia
        toneVal = toneAdjustment+(int(sinVal*100));
        //toca o valor no buzzer
        tone(buzzerPin,toneVal);
        //atraso de 2ms e gera novo tom
        delay(2);
    }
  }
}

void setup(){
  pinMode(buzzerPin,OUTPUT);
  Serial.begin(9600);
}

void loop(){
  LDRread += analogRead(LDRpin);
  if (counter > 3){
    LDRread = LDRread/4;
    Serial.println(LDRread);
    if (LDRread < threshould){
      pinMode(buzzerPin,OUTPUT);
      sirene();
    }
    digitalWrite(buzzerPin,LOW);
    pinMode(buzzerPin,INPUT);
  }
  counter  = counter >3 ? 0 : counter+1;
}

Então fiz um teste com uma lanterna, como você pode ver no video.

Agora com o conceito provado, resta a última fase, que é saber o quanto de influência o laser tem sobre o LDR para então definir o threshould e inverter a lógica. Esse processo é simples. Como esse código imprime o valor da média, basta abrir o terminal serial, fazer a leitura e definir o threshould, simples assim! Código completo para o laser:

float sinVal       = 0;
int toneVal        = 0;
int buzzerPin      = 8;
int counter        = 0;
int toneAdjustment = 2000;
int LDRread        = 0;
int LDRpin         = A0;
int threshould     = 350;

void sirene(){
  //tocar 5 ciclos
  for (int j=0; j<5; j++){
    //1 ciclo = seno de 0 a 180
    for (int x=0;x<180;x++){
        //converte graus em radianos
        sinVal = (sin(x*(3.1412/180)));
        //agora gera uma frequencia
        toneVal = toneAdjustment+(int(sinVal*100));
        //toca o valor no buzzer
        tone(buzzerPin,toneVal);
        //atraso de 2ms e gera novo tom
        delay(2);
    }
  }
}

void setup(){
  pinMode(buzzerPin,OUTPUT);
  Serial.begin(9600);
}

void loop(){
  LDRread += analogRead(LDRpin);
  if (counter > 3){
    LDRread = LDRread/4;
    Serial.println(LDRread);
    if (LDRread > threshould){
      pinMode(buzzerPin,OUTPUT);
      sirene();
    }
    digitalWrite(buzzerPin,LOW);
    pinMode(buzzerPin,INPUT);
  }
  counter  = counter >3 ? 0 : counter+1;
}

Hoje fiz o video com o áudio original, sem nenhum tratamento, nem introdução. Desculpem a preguiça, mas estamos por terminar o ano e preguiça não está me faltando.

E eis aí seu alarme com interrupção laser!

Inscreva-se no nosso newsletter, alí em cima à direita e receba novos posts por email.

Siga-nos no Do bit Ao Byte no Facebook.

Prefere twitter? @DobitAoByte.

Inscreva-se no nosso canal Do bit Ao Byte Brasil no YouTube.

Nossos grupos:

Arduino BR – https://www.facebook.com/groups/microcontroladorarduinobr/
Raspberry Pi BR – https://www.facebook.com/groups/raspberrybr/
Orange Pi BR – https://www.facebook.com/groups/OrangePiBR/
Odroid BR – https://www.facebook.com/groups/odroidBR/
Sistemas Embarcados BR – https://www.facebook.com/groups/SistemasEmbarcadosBR/
MIPS BR – https://www.facebook.com/groups/MIPSBR/
Do Bit ao Byte – https://www.facebook.com/groups/dobitaobyte/

Projetos Arduino e Eletrônica – https://www.facebook.com/groups/projetosarduinoeletronica/

ESP8266 BR – https://www.facebook.com/groups/ESP8266BR/

Próximo post a caminho!

Djames Suhanko

Djames Suhanko é Perito Forense Digital. Já atuou com deployer em sistemas de missão critica em diversos países pelo mundão. Programador Shell, Python, C, C++ e Qt, tendo contato com embarcados ( ora profissionalmente, ora por lazer ) desde 2009.

Deixe uma resposta