O documento descreve um projeto de detector de movimento usando um laser e fotocélula conectados a um Arduino. O sistema captura fotos com uma webcam quando o laser é bloqueado, indicando movimento, e envia as fotos por email. O autor explica o funcionamento do projeto e fornece códigos, diagramas e detalhes técnicos para replicar o sistema.
1. Só mais um projeto de detector de ladrão
com laser , e algumas ideias...
2. Quem Sou ?
Antonio Costa aka “Cooler_” , desenvolvedor independente em
C,Common Lisp,Perl,PHP... Trabalho como freelancer a 4 anos no
meio de Web(e-commerce,web spiders...) e problemas em gerais
para unix like, faço parte do grupo de estudo e pesquisa BugSec,
sou um dos colaboradores e fundadores da e-zine “Cogumelo
Binario”. Estudo microcontroladores(AVR e PIC) ,eletrônica em
geral como hobby, também tento colaborar em projetos
OpenSource.
http://coolerlab.wordpress.com/
“TombPool”
simples biblioteca em Linguagem C para trabalhar com piscina de conexões.
http://code.google.com/p/tombpool/
“Hyde”
Só mais um packet injector usando spoofing
https://github.com/CoolerVoid/Hyde
“Cactoo CMS”
Só mais um CMS em PHP
http://code.google.com/p/cactoo/
“Beer”
Biblioteca com funções diversas em C , para facilitar a vida do pessoal iniciante
bem como automatizar tarefas em arquivos,strings,números etc...
https://github.com/CoolerVoid/beer/blob/master/beer.c
“BugSec”
Grupo que faço parte, no nosso google code colocamos alguns códigos e papers que
escrevemos para estudo etc...
quem faz parte:
Victor Ramos Mello aka “m0nad”, ref: “http://m0nadlabs.wordpress.com/”
Tiago Natel aka “IAK”, ref: “http://www.secplus.com.br/site/”
Felipe Pena aka “sigsegv” ref: “http://felipe.ath.cx/”
Eduardo Bellani aka “ebellani” ref: “https://github.com/ebellani”
Sergio Renan “_mlk_” . ref “http://code.google.com/p/lwv/”
http://code.google.com/p/bugsec/downloads/list
3. ...The:empire:Strikes:Back....
Já a muito tempo tinha ideia de fazer algo com laser, em
circunstâncias anteriores tive algo empírico com detector de
ladrão, usando Arduino pro Mini e um PIR (detector de
movimento), usava webcam usando api do OpenCV para
assim que tiver movimento obter uma foto, logo é enviado
como anexo para um determinado e-mail a foto, funcionou
bem entretanto não como o esperado então em uma questão de
aleatoriedade passava falsos alarmes, nem tudo é perfeito
vejamos alguns Ids como snort por exemplo.
Com o passar do tempo, lendo livros da “Evil Genius” achei
muito material interessante sobre eletrônica envolvendo
segurança, alguns deles compartilhei no meu blog como o
“detector de mentira”, algo bem simples para detectar batidas
do coração e talvez julgar se é mentira ou não, analisando
uma plotagem ou alguns inteiros, andando no meio dessa
odisseia encontrei vários sistemas “pega ladrão” entre eles o
que vamos estudar aqui sistema com “Laser”, devido a
carência de material do mesmo em PT-BR, tive ideia de
escrever este paper pois acho que seria a melhor forma de
aprender é escrevendo...
5. Por que Arduino ?
• OpenSource
• Facilidade por conta da IDE
• Podemos optar em usar
gcc-avr, programar em C,ASM...
• prototipagem
• Com Arduino podemos fazer gravação
em outros AVR como ATtiny...
7. O que é Laser ?
Um laser é um dispositivo que controla a maneira pela qual
átomos energizados liberam fótons(energia luminosa).
Etimologia:
Sua sigla de laser significa
"Light Amplification by Stimulated Emission of Radiation" ou
seja Amplificação da Luz por Emissão Estimulada de Radiação,
Albert Einstein deu o primeiro passo, dizendo que a luz é
formada por pacotes discretos e bem determinados de energia
que hoje é rotulado como fótons,Mais tarde em 1960 Charles
Townes registrou a patente do primeiro gerador de raios laser, em
Washington.
Charles Townes e Arthur Schawlow
8. Luz do laser e da lanterna
Emissão estimulada não ocorre numa lanterna
comum, pois todos os seus átomos liberam
seus fótons de forma aleatória. já no laser a
emissão de fótons é organizada.
Qual laser trabalhar ?
Lasers em geral são classificados em várias
classes, temos estes que pessoal da SWAT
usa em armas,
usam para
aumentar a
probabilidade de
acerto em um
conflito
armado,
geralmente são da
classe 3 ou seja
"IIIa" que é o que
vamos usar,
conhecido como
laser de díodo,única
contra indicação é que se aponte em olhos
pois pode causar danos embora tenha
só 5mW, digamos ai com adição de
elementos óticos pode causar danos,
como adicionar uma lente de aumento etc...
9.
10. Indo para Prática
Requerimentos:
2 Resistor de 10k , R$ 0,30 centavos
1 Fotocélula "sensor de luz" (photocell) R$ 2,00 reais
1 Arduino nano USD 20,00 dollar
1 Cabo para ftdi (para I/O) R$ 6 reais
1 Laser de 5mW R$ 3,50
1 Led qualquer cor R$ 0,15 centavos
*alguns jumpers e breadboard
11. Melhorando a visualização
O LED não esta nesta foto, LED você adiciona no pino que
quiser já que é algo opcional , lembrando que GND “negativo”
é o fio verde, 5v “positivo” seria o fio vermelho, no caso o
laranja seria o do PINO ”2”.
http://fritzing.org/
12. O que foi feito ?
A fotocélula ao ser usada com resistor de 10k vai detectar
luz, no caso podemos usar 2 pedaços de cano PVC ou lata,
deixar o circuito numa lata com um furo mirando para
a fotocélula, segunda lata o laser mirando para o buraco
da primeira lata, se alguém passar pelo laser e o laser não
chegar na fotocélula logo não mandara a luz, então o
microcontrolador irá julgar uma ação, no caso eu mandei
"1" via serial caso não tenha luz, nosso código em C ao
detectar "1" irá ativar uma função usando OpenCV para tirar
foto com webcam, logo seguido de um system() para uso do
“mutt”(cliente de e-mail para unix like) para enviar foto com
anexo para o e-mail destino...
Diagrama
13. Note na foto o sistema rodando, repare que o laser mira em
sima da fotocélula, e quando isso ocorre acende um LED,
obviamente você pode mudar isso,adicionar um buzzer para
soar alarme caso o laser não alcance a fotocélula,talvez usar
uma placa de GSM com seu SIM card e mandar um SMS por
exemplo...
14. Código do Arduino
int photocellPin = 2;
int RedLed = 3;
int photocellReading;
void setup(void)
{
pinMode(RedLed,OUTPUT);
Serial.begin(9600);
}
void loop(void)
{
photocellReading = analogRead(photocellPin);
// se entrada(fotons) maior que 900 é laser... então
if( photocellReading>=900)
{
digitalWrite(RedLed,HIGH);
delay(500);
}else {
// se o laser nao tiver apontando para fotocelula
digitalWrite(RedLed,LOW);
// manda 1 via serial assim ativa webcam etc...
Serial.println("1");
}
photocellReading = 1024 - photocellReading;
delay(100);
}
15. O Código em Linguagem C
Este código vai ser compilado e executado e vai ficar no seu
computador em esculta, código ficou grande, então não vou
mostrar tudo somente os pontos críticos...
baixe aqui !
bugsec.googlecode.com/files/ThiefGet_with_laser.c
16. Macro de DEBUG
Quase todo código que escrevo uso esta macro, uso para ajudar a
depurar o código, evita que eu abra o GDB para tomar uma surra!
setar para 1 ativa debug
#define BUGVIEW 1
#define DEBUG(x, s...) do {
if (!BUGVIEW) { break; }
time_t t = time(NULL);
char *d = ctime(&t);
fprintf(stderr, "[!] %.*s %s[%d] %s(): ",
(int)strlen(d) - 1, d, __FILE__,
__LINE__, __FUNCTION__);
fprintf(stderr, x, ## s);
} while (0);
Nos retorna tempo, nome do arquivo,linha e função.
Funções
Esta função abrimos a porta serial com a syscall open()
e ajustamos o struct do “termios.h” para comunicação padrão
int serialboot(const char* serialport, int baud);
Função para uso da syscall read() no descriptor para pegar
input...
int serialread(int fd, char* buf, char until);
Esta função tira foto da webcam usando API do OpenCV
void webcam(const char* file);
17. Parte lógica
// se receber "1"
if(strcmp(buf,"1")>0)
{
//microsegundos do sleep
usleep(500000);
puts("MOVEMENT ONLINE");
puts(buf);
counter++;
OFF=0;
}
//numero de vezes que achou movimento
if(counter==MOVES)
{
puts("cof cof thief in HOME");
// tira foto da webcam
webcam("test.jpg");
// manda e-mail com anexo a webcam :-) ,poderia ser um execl() também...
system(CMD);
break;
counter=0;
}