Trong bài viết này, Raspberry Pi Việt Nam sẽ hướng dẫn các bạn cách biến Raspberry Pi thành một camera giám sát đơn giản với tính năng quan sát và truyền video trực tuyến (livestream) trên mạng thông qua trình duyệt web.
Bạn cần những gì
Đây là danh sách những thiết bị cơ bản nhất để làm camera giám sát với Raspberry Pi
- Một chiếc Raspberry Pi, trong bài viết này tôi sử dụng Raspberry Pi 4 – phiên bản 4GB. Hệ điều hành được sử dụng là Raspbian.
- Nguồn điện 5V – 3A dành cho Raspberry Pi 4
- Thẻ nhớ. Tôi sử dụng thẻ 16GB vì không có nhu cầu lưu trữ
- Camera cho Raspberry Pi. Trong bài viết tôi sử dụng Camera 5Mpx cũ được tận dụng lại, các bạn có thể sử dụng Camera V2 8Mpx hoặc Camera V2 8Mpx NoIR nếu có nhu cầu quan sát ban đêm.
Trong bài viết này, tôi không hướng dẫn cách cài đặt hệ điều hành vì đã nói đến khá nhiều. Nếu bạn chưa biết cài hệ điều hành xin vui lòng đọc lại bài viết Hướng dẫn chọn và cài đặt hệ điều hành. Còn sau khi đã có đủ thiết bị rồi, mời các bạn làm theo từng bước hướng dẫn dưới đây.
Kích hoạt Camera trên Raspbian
Mặc định, sau khi cài Raspbian thì tính năng Camera sẽ bị tắt đi. Bạn cần thao tác bật nó lên bằng cách:
Với môi trường Desktop, bạn bấm Start Menu, chọn Preferences rồi chọn Raspberry Pi Configuration. Cửa sổ mở ra, bạn chọn tab Interfaces và tick Enable vào Camera như hình dưới đây
Với môi trường Console (Raspbian Lite), bạn gõ lệnh sau:
pi@raspberry:~ $ sudo raspi-config
Tại đây, bạn chọn menu Interfaces Option
Sau đó chọn tiếp menu Camera ở đầu tiên rồi thiết lập Enable lên là được.
Tìm địa chỉ IP của Raspbian
Để quan sát được camera, bạn sẽ cần biết địa chỉ IP của Raspberry Pi vì bạn sẽ cần sử dụng trình duyệt để truy cập. Chúng tôi đã có nhiều bài viết hướng dẫn cách tìm kiếm địa chỉ IP, bạn có thể xem bài viết này hoặc bài viết này. Trong ví dụ này, IP của tôi là 192.168.0.123.
Gắn camera vào Raspberry Pi
Bạn tắt bo mạch, thực hiện gắn camera vào Raspberry Pi. Bước này cần lưu ý gắn cáp đúng chiều, nếu không sẽ không nhận được tín hiệu
Viết script chạy camera giám sát
Bước này, bạn chỉ cần tạo một file có tên camera-giam-sat.py qua lệnh dưới
pi@raspberrypi:~ $ nano camera-giam-sat.py
Sau đó, bạn copy lệnh dưới đây (được viết bằng Python) và paste vào file
# Web streaming example
# Source code from the official PiCamera package
# http://picamera.readthedocs.io/en/latest/recipes2.html#web-streaming
import io
import picamera
import logging
import socketserver
from threading import Condition
from http import server
PAGE="""\
<html>
<head>
<title>Camera Giám Sát</title>
</head>
<body>
<center><h1>Camera Giám Sát</h1></center>
<center><img src="stream.mjpg" width="640" height="480"></center>
</body>
</html>
"""
class StreamingOutput(object):
def __init__(self):
self.frame = None
self.buffer = io.BytesIO()
self.condition = Condition()
def write(self, buf):
if buf.startswith(b'\xff\xd8'):
# New frame, copy the existing buffer's content and notify all
# clients it's available
self.buffer.truncate()
with self.condition:
self.frame = self.buffer.getvalue()
self.condition.notify_all()
self.buffer.seek(0)
return self.buffer.write(buf)
class StreamingHandler(server.BaseHTTPRequestHandler):
def do_GET(self):
if self.path == '/':
self.send_response(301)
self.send_header('Location', '/index.html')
self.end_headers()
elif self.path == '/index.html':
content = PAGE.encode('utf-8')
self.send_response(200)
self.send_header('Content-Type', 'text/html')
self.send_header('Content-Length', len(content))
self.end_headers()
self.wfile.write(content)
elif self.path == '/stream.mjpg':
self.send_response(200)
self.send_header('Age', 0)
self.send_header('Cache-Control', 'no-cache, private')
self.send_header('Pragma', 'no-cache')
self.send_header('Content-Type', 'multipart/x-mixed-replace; boundary=FRAME')
self.end_headers()
try:
while True:
with output.condition:
output.condition.wait()
frame = output.frame
self.wfile.write(b'--FRAME\r\n')
self.send_header('Content-Type', 'image/jpeg')
self.send_header('Content-Length', len(frame))
self.end_headers()
self.wfile.write(frame)
self.wfile.write(b'\r\n')
except Exception as e:
logging.warning(
'Removed streaming client %s: %s',
self.client_address, str(e))
else:
self.send_error(404)
self.end_headers()
class StreamingServer(socketserver.ThreadingMixIn, server.HTTPServer):
allow_reuse_address = True
daemon_threads = True
with picamera.PiCamera(resolution='640x480', framerate=24) as camera:
output = StreamingOutput()
#Uncomment the next line to change your Pi's Camera rotation (in degrees)
#camera.rotation = 90
camera.start_recording(output, format='mjpeg')
try:
address = ('', 8686)
server = StreamingServer(address, StreamingHandler)
server.serve_forever()
finally:
camera.stop_recording()
Sau đó, bạn chỉ cần sử dụng máy tính khác, mở trình duyệt lên và gõ địa chỉ theo dạng sau: http://địa-chỉ-ip-của-bạn:8686. Trong bài hướng dẫn này, địa chỉ của tôi sẽ là http://192.168.0.123:8686 và bạn sẽ thấy hình như minh họa ở phía trên đầu bài viết.
Một số tùy chỉnh thông số camera.
Thay đổi kích thước hiển thị camera trên trình duyệt
Ở dòng lệnh thứ 19, bạn thay đổi width và height là được
Xoay camera giám sát
Nếu vì lý do gì đó, camera của bạn bị cắm ngược thì có thể sử dụng lệnh ở dòng thứ 87 để đảo chiều. Bạn chỉ cần uncomment (xóa đấu #) để dòng lệnh này có hiệu lực
Thay đổi cổng truy cập camera
Vì một số lý do, bạn có thể cần đổi cổng hiển thị để bảo mật hơn hoặc tránh xung đột với cổng đang chạy dịch vụ khác trong mạng của bạn. Khi đó, chỉ cần thay đổi số ở dòng thứ 90 là bạn có thể truy cập vào được theo cổng khác.
Như vậy là bạn đã biến Raspberry Pi và camera của mình thành một bộ camera giám sát cơ bản. Bạn có thể kết hợp với việc Cài đặt Dynamic DNS cho Raspberry Pi để public camera ra ngoài Internet, giúp bạn quan sát được camera ở bất cứ nơi nào có mạng.
Tuy nhiên, với hướng dẫn này bạn chưa thể lưu trữ video lại trên thẻ nhớ hoặc thiết bị lưu trữ ngoài. Chúng tôi sẽ có các bài hướng dẫn tiếp theo giúp bạn phát hiện chuyển động và gửi cảnh báo, đồng thời lưu trữ lại video để xem lại khi cần.
Chúc các bạn thành công.
Raspberry Pi Việt Nam
- Địa chỉ: Tầng 2, số 23, ngách 8, ngõ 30 Nguyễn Thị Định, Trung Hòa, Cầu Giấy, Hà Nội.
- Email: info@raspberrypi.vn – Hotline: 092.707.8688
- Fanpage: http://raspberrypi.vn/s/fb
- Group: http://raspberrypi.vn/s/groupfb