Post não vai ser sobre o carrinho de controle remoto com infravermelho
sim já terminei o protótipo dele já funciona, mas quero corroer a
placa fazer algo bem mais decente, invés de ficar usando breadboard.
como eu sou bem NOOB em tudo e em eletrônica este post vai demorar.
Olhe meu vídeo que você vai entender por que quero usar IR no carrinho
strikes back
Já algum tempo que comprei sensor de movimento para fazer um sistema
detector de “ladrão”, até pensei em usar um buzzer e tudo mais,
mas detector de ladrão com buzzer é muito manjado. Como eu gosto de trazer o que é
meio incomum para o blog então tive uma ideia…
Missão comunicação serial para quando for detectar o
movimento tirar uma foto da webcam e mandar e-mail com anexo a foto.
já tem soluções com o “motion” ou mesmo com opencv detectando movimentos
da webcam reconhecimento e tudo mais, mas a ideia do feito foi treinar
desenvolvimento com “arduino pro mini” em conjunto com “FTDI“…
material usado:
Arduino pro mini – $18.95 USD sparkfun (anda meio salgado o preço prefiro o diavolino )
Resistor 10k Ohm – $0.15 santa efigenia
Pir motion sensor – $9.95 USD sparkfun
Machine Pin headers – $2.00 santa efigenia (muito chato soldar isso no arduino)
FTDI Basic Breakout 5V – $12.00 USD sparkfun
vendo como fica
seguindo a dica de
http://bildr.org/2011/06/pir_arduino/
código do arduino
int pirPin = 9; void setup(){ Serial.begin(9600); pinMode(pirPin, INPUT); } void loop(){ int pirVal = digitalRead(pirPin); // achou movimento if(pirVal == LOW) { //pausa em milesegundos equivalente ao usleep do ansi C delay(500); Serial.println("1"); } //sem movimento else { Serial.println("0"); } }
Lembra da nossa Missão ?
Se o arduino detectar valor com sensor de movimento
ira mandar um OUTPUT para a porta serial,nosso programa em C
irá ficar na esculta se ele julgar movimento do conjunto de
OUTPUT ele ira tirar uma SHOOT da WEBCAM e ira mandar e-mail
com anexo a foto…
Vamos resolver o problema do E-mail,bom fazer um cliente de e-mail do zero
em C é trabalhoso e leva tempo, então vamos instalar cliente de e-mail
instalamos o “mutt”
//use o gerenciador do seu OS,se for BSD use ports...
$ sudo apt-get install mutt
$ vi ~/.muttrc
set realname="seunome"
set from="exemplo@gmail.com;"
set my_user=exemplo@gmail.com
set my_pass='sua senha'
set smtp_url=smtps://$my_user:$my_pass@smtp.gmail.com
set ssl_force_tls = yes
:wq!
vamos testar
echo 'conteúdo do e-mail' | mutt -s 'assunto do e-mail' exemplo@gmail.com
e vá ver sua caixa de corrêio verificar…
como enviar nosso anexo ?
echo 'LogLog!!!' | mutt -s 'THief Get LOg' -a c/arduino/test.jpg -- exemplo@gmail.com
quer aprender mais sobre o mutt ? “man mutt”
agora podemos partir para o código
não fique triste por eu ter usado o OpenCV para tirar foto da webcam
/* contato: c00f3r@gmail.com autor: Antonio Costa aka Cooler_ coolerlab.wordpress.com Simples detector de ladrão usando Arduino+sensor de movimento apt-get install libhighgui-dev libcv gcc -o thiefget thiefget.c -lcv -lhighgui -lcxcore; ./thiefget usei o OpenCV para tirar shoot da webcam pois não conheço outra API que faça o mesmo... só para enviar e-mail que usei programa de terceiro... parece gambi até xD executando: como argumento o seu dispositivo onde esta o arduino ./thiefget /dev/ttyUSB0 */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <termios.h> #include <fcntl.h> #include "opencv/cv.h" #include "opencv/highgui.h" // quantas vezes o sensor retornara 1 para mandar e-mail ? #define MOVES 16 // numero que tolera erros #define FAIL 16 // sempre concatene com 'B' a taxa de transmissão ,"9600" padrão do AVR #define BAUDRATE B9600 int serialboot(const char* serialport, int baud); int serialread(int fd, char* buf, char until); void webcam(const char* file); void banner() { printf("\nFollow patern: ./PegaLadrao <SerialPort>\n" "Just Another geek Cool THing With ArduinO!!!\n" "Simple THief Get\n" "Coded By Cooler_\n" "coolerlab.wordpress.com\n" "\n"); } int main(int argc, char *argv[]) { int baudrate = BAUDRATE,fd=0,counter=0,OFF=0; char *buf=malloc(sizeof(char)*16); char *serialport=malloc(sizeof(char)*512); if(argc<2) { banner(); exit(EXIT_SUCCESS); } printf("Serial:%s\n",argv[1]); //conection strncpy(serialport,argv[1],512); fd=serialboot(serialport, baudrate); if(fd<=0) { puts("veja se o dispositivo esta conectado!!"); printf("%d\n",fd); exit(EXIT_SUCCESS); } while(1) { // tempo em milesegundos, altere como for necessário serialread(fd, buf, '\n'); printf("====================\nread: %s\ncounter: %d\n===================\n",buf,counter); // se ler "1" contador é atribuido if(strcmp(buf,"1")>0) { 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"); webcam("test.jpg"); system("echo 'LogLog!!!' | mutt -s 'THief Get LOg' -a /home/nick/c/arduino/test.jpg -- exemplo@gmail.com"); break; counter=0; } if(!strlen(buf)) OFF--; if(OFF==FAIL) break; } puts("Simple THief Get ,set to OFF"); close(fd); free(buf); free(serialport); exit(EXIT_SUCCESS); } int serialread(int fd, char* buf, char until) { char b[1]; int i=0; do { int n=read(fd, b, 1); if(n==-1) return -1; if(!n) { usleep(16000); continue; } buf[i] = b[0]; i++; } while(b[0]!=until); buf[i]=0; return 0; } int serialboot(const char* serialport, int baud) { struct termios toptions; int fd; fd = open(serialport, O_RDWR | O_NOCTTY | O_NDELAY); if(fd == -1) { puts("serialboot: não foi possivel abrir a porta "); return -1; } if(tcgetattr(fd, &toptions) < 0) { puts("serialboot: nao foi possivel pegar atributos do terminal"); return -1; } speed_t brate = baud; cfsetispeed(&toptions, brate); cfsetospeed(&toptions, brate); // para default recv com termios.h // 8N1 toptions.c_cflag &= ~PARENB; toptions.c_cflag &= ~CSTOPB; toptions.c_cflag &= ~CSIZE; toptions.c_cflag |= CS8; // no flow control toptions.c_cflag &= ~CRTSCTS; toptions.c_cflag |= CREAD | CLOCAL; // turn on READ & ignore ctrl lines toptions.c_iflag &= ~(IXON | IXOFF | IXANY); // turn off s/w flow ctrl toptions.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); // make raw toptions.c_oflag &= ~OPOST; // make raw // olhe http://unixwiz.net/techtips/termios-vmin-vtime.html toptions.c_cc[VMIN] = 0; toptions.c_cc[VTIME] = 20; if(tcsetattr(fd, TCSANOW, &toptions) < 0) { puts("serialboot: nao foi possivel adicionar atributos no term erro 1"); return -1; } return fd; } /*tira foto usando opencv não queria usar opencv, mas unica API que ja tinha usado com a webcam... */ void webcam(const char* file) { CvCapture *capture = cvCreateCameraCapture(0); if(capture==NULL) puts( "nao he possivel pegar foto!\n"); IplImage* frame = cvQueryFrame( capture ); if(!frame) puts( "erro na foto!\n"); int imageParams[3] = {CV_IMWRITE_JPEG_QUALITY, 100, 0}; cvSaveImage(file , frame,imageParams); cvReleaseCapture( &capture ); }
veja o e-mail que chegou quando cheguei proximo do sensor
muito divertido…
bom é isso ai,
escrevi o código meio que na correria mas acho
que deu para explanar a ideia…
fique avontade para melhorar o código 😉
i4k (Tiago Natel de Moura)
dezembro 4, 2011 at 12:02 pm
Nossaaaa!!!
Ta muito irado brother!
Parabéns!!!
1337
renan
dezembro 4, 2011 at 1:43 pm
ficou mto bom esse tutorial ai se eu tivesse os materiais td eu ia tentar ^^
to Manjando
dezembro 6, 2011 at 9:04 pm
Cara muito foda … parabens aee pela dedicação .. deve ter dado um belo trampo.. hehe
b0tluk
janeiro 17, 2012 at 8:58 pm
MASSA EM…
caraio q loko kkk
viajei agora… massa….
Alisson Menezes
julho 5, 2012 at 2:52 pm
Muito Massa hein, não é atoa que tu é mestre xD
R2-D2
setembro 10, 2012 at 4:23 am
Muito obrigado cara! Estava há tempos tentando descobrir como manipular a webcam através do Arduino.
Consegui fazer a integração com um leitor biométrico. Caso alguém não autorizado tente abrir a porta, ele faz uma foto e armazena num SD.
Bruno
maio 20, 2013 at 12:03 pm
Estou tendo muitos erros com a biblioteca “termios.h”, estou usando o code::Blocks 12.11 para manipular o seu codigo. O que pode ser isso?
cooler51
julho 28, 2013 at 9:39 pm
use linux ou um bsd,
e tente rodar 😉