Làm camera giám sát đơn giản với Raspberry Pi

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

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

Kích hoạt tính năng Camera trên Raspbian

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

Thay đổi kích thước hiển thị khung video

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

Xoay Camera để có chiều quan sát phù hợp

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.

Thay đổi cổng truy cập vào camera giám sát

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