Mozgásérzékelős webkamera Bananapi-vel

Ennek a projektnek az elkészítésébe azért vágtam bele, mert az itthoni bananapi-s webkamerás kis megfigyelő rendszeremet szeretném leváltani. A motion nevű alkalmazás is egész jó, de nem fedi az én igényeimet. Nem mondom, hogy többet vagy jobbat készítettem, de az én igényeimet ez jobban lefedi. Itt azért megemlíteném, hogy a bemutatott python program nem az én teljes vagy kész programom, mert azt fölösleges lenne felrakni. Ez csak egy működő alap lesz, amit tovább lehet gondolni, ki lehet egészíteni, vagy akár ebben a formában is lehet már használni.

Szokásosan először lássuk a kapcsolást:

piranno-500x500Ez az első eszközünk vagyis egy HC-SR501-es mozgásérzékelő. Senkit se zavarjon, meg ez a google-ről kukázott angol feliratos kép, mert ez a szenzor pofon egyszerű. 3 bekötési pont és két állítási lehetőség van rajta. A képen látható “Retrigger Jumper”-t a szorgos kis kínaiak le is szokták hagyni, mert valójában nincs jelentősége. Bár azért a csatlakozási pontot meghagyták, de nem kell triggerelni, mert nem hagytak neki tüskét. Az alapüzemmód a “NON-Repeat” ez annyit tesz, hogy mozgás esetén a kimenet átmegy 1-be és ha lejárt a késleltetés, akkor visszavált 0-ba. Ebben az estben a késleltetési idő alatt nem érzékeli a szenzor az újabb mozgásokat. A másik üzemmód, a “Repeat”, ahol minden új mozgásérzékelés pillanatában a beállított késleltetési periódus újraindul.

Na, de ha ezt kiveséztük akkor lássuk mit érdemes beállítani még. Első lépésben a késleltetést érdemes levenni a legkissebb szintre, ami állítólag alig 2 másodperc, de a tapasztalat azt mondatja velem, hogy ezt azért érdemes a pythonban egy “time.sleep”-el tesztelni és próbálgatni, hogy nehogy egy ciklus alatt 2-szer számoljunk egy Sensing-et. Az érzékenységgel kapcsolatban az a véleményem, hogy mindenki állítsa saját belátása szerint olyanra, amilyen távolságra van szüksége.

Végül de nem utolsó sorban a bonyolult bekötés:

Szenzor GND – Bananapi GND

Szenzor VCC – Bananapi 5V

Szenzor DOUT – Bananpi GPIO”x”

Ha ezzel megvagyunk, akkor már csak a webkamera beállítás van hátra.

webcamWebkamerának a teszteléshez mindig ezt az olcsó kínai cuccot használom, mert ha valami ezzel működik, akkor egy Logitech-el is fog.  Itt ugyebár az első lépés az, hogy csatlakoztassuk a webkamerát. Ezután ellenőrizzük, le hogy a linux látja-e a kameránkat.

dmesg|tail

video inputItt láthatjuk, ha a Bananapi felismerte az eszközt. Ezután telepítsük fel képkészítő szoftvert. Én erre a célra az “fswebcam” alkalmazást használom.

sudo apt-get install fswebcam

Miután a telepítéssel végeztünk teszteljük le az alkalmazást.

fswebcam -r 640x480 ../"tetszőleges elérési út"/"xyz".jpg

Ha ezzel megvagyunk, és a képünk is elkészült, akkor lássuk program a forráskódjait. Itt azért írtam többes számban hogy forráskódjait, mert két részre bontottam a programot. Az egyik része, ami érzékeli a mozgást, és elkészíti a képeket, a másik része pedig amelyik ezt elküldi nekünk e-mail-ben.

Az első program a “motion.py”:

GPIO.setmode(GPIO.BCM)
Pir = 17
GPIO.setup(Pir, GPIO.IN)
print datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
print "Delay 1 minute"
time.sleep(60) 
i = 0
try: 
 print "PIR Calibrating... (CTRL+C to exit)"
 time.sleep(2)
 print "Ready to start"
 while True:
       if i == 0:
          starttime = datetime.datetime.now()
       endtime = datetime.datetime.now()
       timedif = endtime.minute - starttime.minute
       if GPIO.input(Pir):
          i = i+1
          imgcount = str(i)
          print "Motion detected and Taking a picture"
          bashCommand = "fswebcam -r 640x480 ../motion-"+imgcount+".jpg"  
          os.system(bashCommand)
          print "The Picture was taken and named: motion-"+imgcount+".jpg"
          starttime = datetime.datetime.now()
          print "Wait five seconds to restart sensing..."
          if i == 5:
             subprocess.call("../mail.py "+imgcount,shell=True)
             i = 0
             os.system('clear')
       if timedif > 1:
          print "timedif process called" 
          subprocess.call("../mail.py "+imgcount,shell=True)
          i = 0
          os.system('clear')
       time.sleep(5)
except KeyboardInterrupt: 
 print "Quit"
 GPIO.cleanup()

Itt figyeljünk arra, hogy az itt feltüntetett kódban a “../” jelölés mindig az általunk választott tetszőleges helyet jelöli. Amit a program működéséről tudni kell az az, hogy a program mozgás esetén képet készít majd vár 5mp-et. Amennyiben újra mozgást érzékel, akkor akkor egy újabb képet készít. Összesen 5 db képet. Ha elkészült az 5 db kép akkor meghívja “mail.py” alkalmazást, ami elküldi nekünk e-mailben az elkészült 5 db képet. Abban az esetben ha elkészült egy kép, de nincs több mozgás, akkor a program figyeli azt, hogy mennyi idő telt el az utoljára elkészült képhez képest. Ezután ha 2 percen belül nem következik be újabb mozgásérzékelés, akkor az addig elkészült képeket, legyen az 1-2-3-4 db, az utolsó kép elkészülési időpontjához mért 2 perces késleltetéssel küldi el. A program elején van egy 1 perces késleltetés, hogy miután elindítottuk a programot legyen időnk elhagyni a megfigyelt területet.

Úgy gondolom a python program ismertetésével kapcsolatban elég ennyit leírni. A program letölthető: — Innen —

Ezután nézzük meg az e-mail küldő programot:

#!/usr/bin/env python
import sys
import os
import smtplib

called_arg = sys.argv[1]
picpcs = int(called_arg)

from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.image import MIMEImage 

# Küldő e-mail cím
me = "yourname@gmail.com" 
# Címzett e-mail cím-ek 
you = "akármi@gmail.com"
you2 = "akármi@gmail.com"
passwd = "alkalmazás jelszó"
msg = MIMEMultipart()
msg['Subject'] = "Az üzenet tárgya"
msg['From'] = me
msg['To']= you

print "Taken picture counter: "+called_arg

for i in range(0,picpcs):
  i = i+1
  imgcounter= str(i)
  imgattach = '../motion-'+imgcounter+'.jpg'
  with open(imgattach,'rb') as mimage:
    motion_image = MIMEImage(mimage.read(), name = 'motion-'+imgcounter)
    motion_image.add_header('Content-ID','')  
    msg.attach(motion_image)

text = "A szöveges leírás amit e-mailbe el akarok küldeni "
html = """\
<html>
 <head></head>
 <body>
  <p>A HTML leírás amit el akarok küldeni</p>
 </body>
</html>
"""
part1 = MIMEText (text, 'plain')
part2 = MIMEText (html, 'html')

msg.attach(part1)
msg.attach(part2)


try: 
  server=smtplib.SMTP('smtp.gmail.com:587')
except smtplib.socket.gaierror:
  print "Connection Refused"
  sys.exit(1)
try:
  server.ehlo()
  server.starttls()
  server.login(me,passwd)
  server.set_debuglevel(1)
  server.sendmail(me, you, msg.as_string())
  server.sendmail(me, you2, msg.as_string())
  os.system('clear')
except smtplib.SMTPException:
  print "Login Error! Invalid Name or password"
server.quit()

Itt amit érdemes tudni az az, hogy ha gmail fiókot akarunk használni a leveleink továbbküldéséhez, akkor létre kell hozni az adott gmail fiókhoz egy alkalmazás jelszót. Segítség: –ITT–

Továbbá azt kell még tudni, hogy a “me” változóban a küldő e-mail címnek kell szerepelnie. A “you” és “you2” változóban pedig azoknak az e-mail címeknek, akiknek küldeni szeretnénk. Ezzel kapcsolatban szerintem minden más egyértelmű. A kódnak az alapját a python reference oldalról gyűjtöttem be, ott angol nyelven van részletesebb leírás is. A program letölthető: –INNEN–

Amiben még esetleg érdemes a programot továbbfejleszteni, az az hogy az elkészült képeket a “www” mappába mentjük el az arra elkülönített helyre, és az e-mailbe az szerveren lévő képeknek csak az URL-jét illesztem be. Így nincs terhelve a küldő és a fogadó fiók sem. A képeket az emailből közvetlenül vagy authentikáció után a weblapon is meg lehet tekinteni. Így garantálva azt, hogy csak az illetékesek férjenek hozzá. (Nálam ez a végleges verzió fut)

Remélem még ha nem is teljes részleteiben magyaráztam el a kód működését, de ennek ellenére is érthető volt és mindenki más meg tudja majd ezt valósítani sikeresen.

 

(Statisztika: 10 megtekintés)

Vélemény, hozzászólás?

Az email címet nem tesszük közzé.