โครงงานวันหยุดตอนนี้จะทำระบบบันทึกภาพด้วยกล้อง Web Camera ครับ โครงงานแบบนี้มีการทำกันมาแล้วหลายต่อหลายโครงงาน แต่โครงงานนี้จะเพิ่มเติมการดักจับการเคลื่อนไหวแบบ Passive Inferred(PIR) เข้าไปด้วยครับ ตามภาพ
ทักษะที่ต้องการ
1. การเขียนโปรแกรมคอมพิวเตอร์ โดยเฉพาะภาษา python2. ความรู้เบื้องต้นเรื่องข่ายงานคอมพิวเตอร์
3. ความรู้เบื้องต้นเกี่ยวกับ Raspberry Pi board
อุปกรณ์
1. Raspberry Pi Model B2. PIR motion sensor
3. Web Camera ที่มีหัวต่อแบบ USB
4. สายต่อ USB, Jumper Wires
ประโยชน์ที่จะได้รับ
ขอบเขตของโครงงานนี้คือการสร้างระบบที่สามารถถ่ายภาพนิ่งเมื่อระบบตรวจจับการเคลื่อนไหวแบบต่อเนื่องในระยะห่างไม่เกิน 7 เมตร ซึ่งสามารถนำไปประยุกต์ใช้งานได้หลายด้าน เช่น- การเก็บข้อมูลภาพในระบบรักษาความปลอดภัย
- การเก็บภาพนิ่งเพื่อการศึกษาทางวิทยาศาสตร์
- การตรวจสอบสินค้า
- ฯล
ข้อจำกัด
เนื่องจากโครงงานนี้ใช้กล้อง Web Camera เป็นอุปกรณ์จับภาพ ซึ่ง Web Camera นั้นมีระยะโฟกัสภาพที่สั้น มุมกล้องแคบ ไม่สามารถถ่ายย้อนแสงได้ ไม่สามารถใช้งานภายนอกอาคารได้
สร้างระบบบันทึกภาพนิ่ง
การบันทึกภาพด้วย Web Camera ที่ใช้งานกับ Raspberry Pi สามารถทำได้หลายวิธีครับ ในโครงงานนี้จะใช้ Pygame ซึ่งเป็น Python Module ที่ติดตั้งมาพร้อมกับ Rasbianเป้าหมายหลักของ Pygame คือการนำไปใช้ในการสร้าง Computer Game แต่ก็มีความสามารถด้านการประมวลภาพที่ดีด้วย ท่านที่สนใจศึกษาสามารถเข้าไปดูที่ [8]
ขั้นตอน
1. ติดตั้ง Web Camera กับ Raspberry Pi ผ่าน USB Port
2. สร้าง Python code สำหรับการจับภาพ ImageCapture .py
#################################
### Author : Somchai Somphadung ###
### Date : 2014-09-13 ###
### N3A Media ###
#################################
import pygame
import pygame.camera
import pygame.image
import time
class ImageCapture:
def __init__(self,imgsize=(320,240),pic_format="RGB",loc="/home/pi/"):
# pic_format could be RGB, YUV, HSV
pygame.init()
pygame.camera.init()
cameras = pygame.camera.list_cameras()
if not cameras :
raise ValueError("There is not camera attached")
self.camera=None
self.camera=pygame.camera.Camera(cameras[0],imgsize,pic_format)
self.is_end=False
self.img_loc=loc
def create_img_name(self):
exp="%Y_%m_%d-%H_%M_%S"
return "snap_"+time.strftime(exp)+".jpeg"
def capture(self):self.create_img_name())
if self.camera is not None :
self.camera.start()
snapshot = self.camera.get_image()
pygame.image.save(snapshot,self.img_loc+"/"+self.create_img_name())
self.camera.stop()
def lapse_capture(self,dur=10):
# dur contains duration of operation in seconds
if self.camera is not None :
self.end_time = time.time()+dur
self.current_time = time.time()
while self.current_time < self.end_time :
self.camera.start()
snapshot = self.camera.get_image()
pygame.image.save(snapshot,self.img_loc+"/"+
self.camera.stop()
time.sleep(self.time_interval)
self.current_time = time.time()
self.quit()
def quit(self):
pygame.quit()
Class ImageCapture ทำหน้าที่ในการจับภาพจากกล้อง Web Camera แล้วนำมาเขียนไว้ในรูปแบบของ jpeg image file โดยสามารถเลือกได้ว่าจะทำการจับภาพแบบครั้งเดียวหรือแบบต่อเนื่องได้
ติดตั้ง PIR Sensor
รายละเอียดของ Passive Infrared Sensor จะไม่กล่าวถึงครับ แต่ท่านสามารถศึกษาได้จาก [6,7] และเนื่องจาก PIR Sensor ต้องรับ-ส่งข้อมูลไปยัง Raspberry Pi ผ่าน GPIO (General Perpose Input Output) [9,10,11] ซึ่งเราต้องเขียนโปรแกรมขึ้นมาเพื่อทำงานตรงนี้ต้องมีการติดตั้งซอฟต์แวร์เพิ่มเติม ในโครงงานนี้ผมเลื่อกใช้ RPi.GPIO เพราะมีคนใช้กันเยอะ เอกสารประกอบก็หาง่าย
การติดตั้ง RPi.GPIO Python module
สามารถทำได้สองทางทางแรก : ติดตั้งผ่านคำสั่ง apt-get
sudo apt-get update
sudo apt-get dist-upgrade
sudo apt-get install python-rpi.gpio python3-rpi.gpio
ทางทีสอง : การคอมไพล์ source code
1. ติดตั้ง python header
sudo apt-get install python-dev python3-dev2. ดาวน์โหลดชุดติดตั้งล่าสุดจาก [4] มาไว้บน Raspberry Pi แล้วทำการแตกไฟล์ออก จะได้ Folder ที่มีชื่อ RPi.GPIO-x.x.x
3. เข้าไปใน Folder ตามข้อ 1 แล้วใช้คำสั่ง
sudo python setup.py install หรือ
sudo python3 setup.py install (กรณีใช้ python3 ในการทำงาน)
หมายเหตุ โดยส่วนตัวแล้วชอบทางที่สองมากกว่า
PIR Sensor [6,7]
ท่านสามารถหาซื้อ PIR sensor ได้จากร้านค้าอุปกรณ์อิเล็คทรอนิกส์ได้หลายแห่ง มีหลายรุ่น หลายราคาให้เลือกซื้่อ ผมเลือกใช้ model HC-SR501 รูปร่างตามรูป
- 5V สำหรับกระแสไฟฟ้าขาเข้าให้พลังงานกับ Sensor
- Signal หรือไฟฟ้าขาออกขนาด 3V และ
- Ground
หลักการทำงานของ PIR คือ เมื่อมีการเคลื่อนไหวที่ต่อเนื่องในระยะที่ Sensor สามารถตรวจสอบได้ (~ 7 เมตร) ตัว Sensor จะส่งกระแสไฟฟ้าออกมาที่ Signal Pin ด้วยแรงดัน 3 Volt ซึ่งเราเรียกสถานะนี้เป็น 1 หรือ High และเมื่อการเคลือนไหวหยุดลง แรงดันที่ปล่อยออกมาจะน้อยลง เราเรียกสถานะนี้เป็น 0 หรือ Low
จากภาพนี้จะเห็นสิ่งที่คล้ายกับสกรูสีส้มสองอัน ตัวทางซ้ายมือใช้สำหรับการหมุนเพื่อปรับความไวในการตรวจจับการเคลื่อนไหว ค่าที่ตั้งมาจากผู้ผลิตคือ 50 % ส่วนตัวทางขวามือ (สังเกตุดูดี ๆ จะมีคำว่า time กำกับไว้) เอาไว้ตั้งเวลาในการรักษาค่า High หลังจากตรวจจับว่ามีการเคลื่อนไหว ค่านี้สามารถตั้งได้นานสุด 200 seconds เลยทีเดียว
การต่อสายสัญญาณเข้ากับ Raspberry Pi
ตำแหน่งการต่อสายสัญญาณเป็นตามแสดงในภาพและตารางข้างล่างนี้ ครับPIR Raspberry PI
-----------------------------------------
+5V 2
Signal 7 (GPIO 7)
Ground 6
หมายเหตุ ตำแหน่งของ GPIO 7 อาจต่างออกไป ตรวจสอบ GPIO Pin diagram ของ Raspberry Pi ของท่าน
Code : MotionDetector.py
##################################
### Author : Somchai Somphadung ###
### Date : 2014-09-13 ###
### N3A Media ###
#################################
import RPi.GPIO as GPIO
class MotionDetector :
def __init__(self,pir_pin=7,gpio_mode="board"):
self.pir_pin=pir_pin
if gpio_mode == "board" :
GPIO.setmode(GPIO.BOARD)
else :
GPIO.setmode(GPIO.BCM)
GPIO.setup(pir_pin,GPIO.IN)
def get_state(self):
return GPIO.input(self.pir_pin)
def cleanup(self):
GPIO.cleanup()
นำทุกส่วนมาประกอบกัน
มาถึงตรงนี้การประกอบส่วนของ Hardware จะได้ดังภาพ และการทำงานทางด้านซอฟต์แวร์นั้น
มีขั้นตอนดังนี้
main.py
#!/usr/bin/python
##################################
### Author : Somchai Somphadung ###
### Date : 2014-09-13 ###
### N3A Media ###
#################################
from ImageCapture import ImageCapture
from MotionDetector import MotionDetector
import time
if __name__ == "__main__" :
cap = ImageCapture((480,360),"RGB","/home/pi/gdrive/")
md = MotionDetector()
c_state=0
p_state=0
try:
print "Wait for initiate."
while md.get_state() == 1:
c_state=0
print "Ready"
while True:
c_state=md.get_state()
if c_state==1 and p_state==0:
print "Motion detected"
cap.capture()
elif c_state==0 and p_state==1:
print "Ready"
p_state=c_state
time.sleep(1)
cap.quit()
except KeyboardInterrupt:
print "Exit"
md.cleanup()
cap.quit()
[ภาคสอง][ภาคสาม]
-------------------
เอกสารอ้างอิง
1. http://shadowbadger.wordpress.com/2012/04/11/uploading-deleting-bypassing-the-bin-and-searching-for-documents-on-google-docs-with-python-gdata/2. https://developers.google.com/gdata/articles/python_client_lib#example
3. http://www.stuffaboutcode.com/2013/03/raspberry-pi-google-drive-grive.html
4. https://pypi.python.org/pypi/RPi.GPIO
5. https://www.modmypi.com/blog/raspberry-pi-gpio-sensing-motion-detection
6.http://learninginventions.org/2013/09/25/%E0%B9%80%E0%B8%8B%E0%B9%87%E0%B8%99%E0%B9%80%E0%B8%8B%E0%B8%AD%E0%B8%A3%E0%B9%8C%E0%B8%95%E0%B8%A3%E0%B8%A7%E0%B8%88%E0%B8%88%E0%B8%B1%E0%B8%9A%E0%B8%84%E0%B8%A7%E0%B8%B2%E0%B8%A1%E0%B9%80%E0%B8%84/
7. http://www.solar-self.com/14441245/pir-motion-sensor-%E0%B8%84%E0%B8%B7%E0%B8%AD%E0%B8%AD%E0%B8%B0%E0%B9%84%E0%B8%A3
8. http://www.pygame.org
9. http://en.wikipedia.org/wiki/General-purpose_input/output
10. http://www.inex.co.th/store/manual/R-Pi_IO.pdf
11. http://www.ee.kmutnb.ac.th/eerobot/esl/learning/index.php?article=rpi-gpio&start=50
ความคิดเห็น
แสดงความคิดเห็น