Raspberry Pi Cảm Biến Chuyển Động

Bạn đã bao giờ tự hỏi, "Làm thế nào nó có thể làm được điều đó?" khi bạn gặp những nơi có cửa tự động, đèn và thang cuốn tự động? Nếu có, hướng dẫn này sẽ không chỉ trả lời câu hỏi của bạn, mà còn chỉ cho bạn cách thực hiện điều đó bằng cách sử dụng Raspberry Pi và cảm biến chuyển động. Hãy bắt đầu thôi!

Hướng dẫn này sẽ chỉ bạn cách sử dụng Raspberry Pi với cảm biến chuyển động. Cụ thể, chúng ta sẽ học:

Phần Cứng Cần Thiết

1×Raspberry Pi 5
1×HC-SR501 Motion Sensor
1×Alternatively, AM312 Mini Motion Sensor
1×dây jumper
1×(Khuyến nghị) Screw Terminal Block Shield for Raspberry Pi
1×(Khuyến nghị) Raspberry Pi Prototyping Base Plate & Breadboard Kit
1×(Khuyến nghị) HDMI Touch Screen Monitor for Raspberry Pi

Or you can buy the following kits:

1×DIYables Sensor Kit (30 sensors/displays)
1×DIYables Sensor Kit (18 sensors/displays)

Về Cảm Biến Chuyển Động HC-SR501

hc-sr501 cảm biến chuyển động

Cảm biến PIR HC-SR501 có khả năng phát hiện chuyển động của con người (hoặc động vật). Nó được sử dụng rộng rãi trong nhiều ứng dụng khác nhau, chẳng hạn như tự động bật/tắt bóng đèn, mở/đóng cửa, kích hoạt/vô hiệu hóa thang cuốn và phát hiện kẻ xâm nhập.

Sơ Đồ Chân Cảm Biến Chuyển Động

Cảm biến chuyển động HC-SR501 có 3 chân:

  • Chân GND: phải được kết nối với GND (0V)
  • Chân VCC: phải được kết nối với VCC (5V)
  • Chân OUTPUT: là chân đầu ra ở mức LOW khi không phát hiện chuyển động và ở mức HIGH khi phát hiện chuyển động. Chân này nên được kết nối với chân input của Raspberry Pi.

HC-SR501 có một jumper và hai potentiometer. Chúng được sử dụng để điều chỉnh cài đặt của cảm biến.

hc-sr501 cảm biến chuyển động sơ đồ chân

Cách Hoạt Động

Cảm biến HC-SR501 có thể nhận biết chuyển động dựa trên sự thay đổi trong bức xạ hồng ngoại phát ra từ một vật thể di chuyển. Để được nhận dạng bởi cảm biến HC-SR501, vật thể phải thỏa mãn hai tiêu chí:

  • Nó phải đang chuyển động hoặc rung động.
  • Nó phải phát ra tia hồng ngoại.

Do đó:

  • Nếu một vật thể đang chuyển động nhưng không phát ra tia hồng ngoại (ví dụ: robot hoặc đồ chơi xe), nó sẽ không được cảm biến phát hiện.
  • Nếu một vật thể đang phát ra tia hồng ngoại nhưng không chuyển động (ví dụ: một người đứng yên), nó sẽ không được cảm biến phát hiện.

Con người và động vật là nguồn phát bức xạ hồng ngoại. Do đó, cảm biến có thể nhận biết chuyển động của chúng.

Trạng thái của chân OUTPUT:

  • Khi không có con người (hoặc động vật) trong phạm vi phát hiện của cảm biến, chân OUTPUT ở mức LOW.
  • Nếu một con người (hoặc động vật) vào phạm vi phát hiện của cảm biến, chân OUTPUT thay đổi từ LOW sang HIGH, cho biết đã phát hiện chuyển động.
  • Nếu con người (hoặc động vật) rời khỏi phạm vi phát hiện của cảm biến, chân OUTPUT thay đổi từ HIGH sang LOW, cho biết chuyển động đã kết thúc.

Video trên cho thấy cách cảm biến chuyển động hoạt động về mặt lý thuyết. Trong thực tế, cảm biến chuyển động hoạt động hơi khác một chút, tùy thuộc vào cài đặt của cảm biến (được thảo luận trong phần Sử Dụng Nâng Cao).

Phát Hiện Sự Hiện Diện Của Con Người

Cảm biến không nhận biết sự hiện diện của con người. Nó chỉ phát hiện chuyển động. Chúng ta sử dụng Raspberry Pi để suy luận sự hiện diện của con người dựa trên chuyển động được phát hiện bởi cảm biến, theo nguyên tắc sau:

  • Nếu quan sát thấy chuyển động, thì có người hiện diện.
  • Nếu không phát hiện chuyển động, thì không có người hiện diện.

Quy tắc này không hoàn hảo trong tình huống thực tế: khi con người ở trong phạm vi của cảm biến nhưng không di chuyển, sẽ không có chuyển động nào được phát hiện. Do đó, Raspberry Pi kết luận rằng con người không có mặt.

Ví dụ, trong phòng họp của bạn, cảm biến chuyển động được sử dụng để bật và tắt đèn. Khi mọi người vào phòng, đèn sẽ được kích hoạt tự động. Nếu mọi người đều ngồi im trong cuộc họp, sẽ không có chuyển động nào được phát hiện, cho thấy không có ai hiện diện, do đó đèn sẽ được tắt. Để bật đèn lại, ai đó cần phải di chuyển.

Tuy nhiên, vấn đề này KHÔNG nghiêm trọng và cảm biến có giá rẻ. Do đó, nó được sử dụng rộng rãi để phát hiện con người trong nhiều ứng dụng.

Raspberry Pi - Cảm Biến Chuyển Động HC-SR501

Kết nối chân digital input của Raspberry Pi với chân OUTPUT của cảm biến HC-SR501. Sử dụng code Raspberry Pi, chúng ta có thể kiểm tra giá trị của chân OUTPUT để phát hiện chuyển động.

Sơ Đồ Đấu Nối

Raspberry Pi cảm biến chuyển động sơ đồ đấu dây

This image is created using Fritzing. Click to enlarge image

Thiết Lập Ban Đầu

Time Delay AdjusterVặn ngược chiều kim đồng hồ hoàn toàn.
Detection Range AdjusterVặn theo chiều kim đồng hồ hoàn toàn.
Repeat Trigger SelectorĐặt jumper như hiển thị trong hình.
Arduino cảm biến chuyển động initial setting

Cách Lập Trình Cho Cảm Biến Chuyển Động

  • Thiết lập digital input trên chân Raspberry Pi bằng cách sử dụng hàm GPIO.setup().
GPIO.setup(PIR_PIN, GPIO.IN)
  • Truy cập chân OUTPUT của cảm biến bằng cách sử dụng hàm GPIO.input().
pir_value = GPIO.input(PIR_PIN)

Code Raspberry Pi - In Trạng Thái Chuyển Động

Các Bước Nhanh

  • Đảm bảo bạn đã cài đặt Raspbian hoặc bất kỳ hệ điều hành tương thích Raspberry Pi nào khác trên Pi của bạn.
  • Đảm bảo Raspberry Pi của bạn được kết nối với cùng mạng local với PC của bạn.
  • Đảm bảo Raspberry Pi của bạn được kết nối internet nếu bạn cần cài đặt một số thư viện.
  • Nếu đây là lần đầu tiên bạn sử dụng Raspberry Pi, xem Raspberry Pi - Cài Đặt Phần Mềm
  • Kết nối PC của bạn với Raspberry Pi qua SSH sử dụng SSH client tích hợp sẵn trên Linux và macOS hoặc PuTTY trên Windows. Xem cách kết nối PC với Raspberry Pi qua SSH.
  • Đảm bảo bạn đã cài đặt thư viện RPi.GPIO. Nếu chưa, hãy cài đặt bằng lệnh sau:
sudo apt-get update sudo apt-get install python3-rpi.gpio
  • Tạo file script Python motion_sensor.py và thêm code sau:
# Mã Raspberry Pi này được phát triển bởi newbiely.vn # Mã Raspberry Pi này được cung cấp để sử dụng công khai, không có ràng buộc. # Để xem hướng dẫn chi tiết và sơ đồ kết nối, vui lòng truy cập: # https://newbiely.vn/tutorials/raspberry-pi/raspberry-pi-motion-sensor import RPi.GPIO as GPIO import time # Set the GPIO mode and HC-SR501 PIR motion sensor pin GPIO.setmode(GPIO.BCM) PIR_PIN = 12 GPIO.setup(PIR_PIN, GPIO.IN) try: while True: # Read the HC-SR501 PIR motion sensor value pir_value = GPIO.input(PIR_PIN) # PIR output is high when motion is detected if pir_value == GPIO.HIGH: print("Motion detected!") else: print("No motion detected.") time.sleep(0.1) except KeyboardInterrupt: print("Exiting...") GPIO.cleanup()
  • Lưu file và chạy script Python bằng cách thực thi lệnh sau trong terminal:
python3 motion_sensor.py
  • Di chuyển tay của bạn trước phạm vi của cảm biến.
  • Kiểm tra kết quả trong Terminal.
PuTTY - Raspberry Pi
No motion detected. No motion detected. No motion detected. Motion detected! Motion detected! Motion detected! Motion detected!

Script chạy trong vòng lặp vô hạn liên tục cho đến khi bạn nhấn Ctrl + C trong terminal.

Code trên liên tục kiểm tra trạng thái chuyển động và in ra. Trong một số trường hợp, bạn có thể muốn in hoặc thực hiện hành động khi phát hiện sự thay đổi trong trạng thái chuyển động. Nếu gặp tình huống như vậy, hãy xem phần tiếp theo.

Code Raspberry Pi - Phát Hiện Sự Thay Đổi Trạng Thái Chuyển Động

  • Tạo file script Python motion_sensor_events.py và thêm code sau:
# Mã Raspberry Pi này được phát triển bởi newbiely.vn # Mã Raspberry Pi này được cung cấp để sử dụng công khai, không có ràng buộc. # Để xem hướng dẫn chi tiết và sơ đồ kết nối, vui lòng truy cập: # https://newbiely.vn/tutorials/raspberry-pi/raspberry-pi-motion-sensor import RPi.GPIO as GPIO import time # Set the GPIO mode and HC-SR501 PIR motion sensor pin GPIO.setmode(GPIO.BCM) PIR_PIN = 12 GPIO.setup(PIR_PIN, GPIO.IN) # Initialize variables to keep track of previous and current states prev_pir_value = GPIO.LOW pir_value = GPIO.LOW try: while True: # Read the HC-SR501 PIR motion sensor value pir_value = GPIO.input(PIR_PIN) # Check for change event (motion started or stopped) if pir_value != prev_pir_value: if pir_value == GPIO.HIGH: print("Motion started!") else: print("Motion stopped!") # Update the previous value with the current value prev_pir_value = pir_value time.sleep(0.1) except KeyboardInterrupt: print("Exiting...") GPIO.cleanup()
  • Lưu file và chạy script Python bằng cách thực thi lệnh sau trong terminal:
python3 motion_sensor_events.py
  • Di chuyển tay của bạn trước phạm vi của cảm biến.
  • Kiểm tra kết quả trong Terminal.
PuTTY - Raspberry Pi
Motion started! Motion stopped!

Video Tutorial

Việc sản xuất video tốn rất nhiều thời gian. Nếu video hướng dẫn hữu ích cho việc học của bạn, hãy đăng ký kênh YouTube để ủng hộ. Nếu nhu cầu đủ cao, chúng tôi sẽ cố gắng làm thêm nhiều video.

Sử Dụng Nâng Cao

Phần này chứa thông tin nâng cao có thể gây quá tải. Nếu bạn chưa chắc về nội dung, hãy bỏ qua và chuyển sang phần tiếp theo.

Như đã nói trước đó, một jumper và hai potentiometer có thể được sử dụng để thay đổi cấu hình của cảm biến.

Bộ Điều Chỉnh Phạm Vi Phát Hiện

Potentiometer này được sử dụng để thay đổi khoảng cách có thể phát hiện (khoảng 3 đến 7 mét).

  • Vặn hoàn toàn về bên phải làm cho nó phát hiện vật thể cách xa khoảng 3 mét.
  • Vặn hoàn toàn về bên trái làm cho nó phát hiện vật thể cách xa khoảng 7 mét.
cảm biến chuyển động detection range

Bộ Điều Chỉnh Độ Trễ Thời Gian

Potentiometer này được sử dụng để thay đổi độ trễ thời gian:

  • Khi vặn hoàn toàn theo chiều kim đồng hồ, độ trễ thời gian là khoảng 5 phút.
  • Khi vặn hoàn toàn ngược chiều kim đồng hồ, độ trễ thời gian là khoảng 3 giây.

Phần tiếp theo giải thích khái niệm độ trễ thời gian liên quan đến Repeat Trigger.

cảm biến chuyển động adjust time delay

Bộ Chọn Repeat Trigger

Có một jumper được sử dụng để chọn chế độ trigger: single trigger hoặc repeatable trigger.

cảm biến chuyển động trigger selection

Hãy gọi cài đặt độ trễ thời gian, được thiết lập qua Time Delay Adjuster, là time_delay. Nếu bạn tiếp tục di chuyển trong phạm vi của cảm biến trong thời gian dài (gọi là motion_time, dài gấp nhiều lần time_delay), thì trong Single Trigger Mode, trạng thái của chân OUTPUT sẽ chuyển đổi giữa LOW HIGH nhiều lần. Thời gian HIGH sẽ bằng time_delay, trong khi thời gian LOW sẽ được cố định ở 3 giây.

cảm biến chuyển động single trigger mode
  • Chế độ repeatable trigger: Trạng thái của chân OUTPUT sẽ giữ ở mức HIGH trong khoảng thời gian (motion_time + time_delay).
cảm biến chuyển động repeatable trigger mode

Thử Nghiệm

  • Chế độ single trigger:
    • Đặt jumper để chọn chế độ single trigger
    • Vẫy tay trước cảm biến trong khoảng 10 giây
    • Di chuyển tay ra khỏi cảm biến
    • Đợi 3 giây và bạn sẽ thấy kết quả trong serial monitor như sau:
    PuTTY - Raspberry Pi
    Motion started! Motion stopped! Motion started! Motion stopped! Motion started! Motion stopped!

    Chế độ repeatable trigger:

    • Đặt jumper để chọn chế độ Repeatable trigger
    • Di chuyển tay trước cảm biến trong khoảng 10 giây
    • Di chuyển tay ra khỏi phạm vi cảm biến
    • Đợi 3 giây và bạn sẽ thấy kết quả trong serial monitor như sau:
    PuTTY - Raspberry Pi
    Motion started! Motion stopped!

    Chúng ta có thể thấy rằng khi ở chế độ single trigger, cảm biến kích hoạt hai hoặc ba lần. Trong khi đó, khi ở chế độ repeatable trigger, cảm biến chỉ kích hoạt một lần.

    ※ Lưu ý:

    Trong thời gian LOW (3 giây), đây là giá trị cố định và không thể điều chỉnh, cảm biến không thể phát hiện bất kỳ chuyển động nào. Nói cách khác, nó bị chặn trong khoảng thời gian này, nhưng điều này không gây ra bất kỳ vấn đề nào.

    Được khuyến nghị sử dụng chế độ repeatable trigger.

    Đối với nhiều ứng dụng thực tế:

    • Chúng ta bật hoặc kích hoạt máy/thiết bị khi có người hiện diện
    • Chúng ta không tắt hoặc vô hiệu hóa máy/thiết bị ngay lập tức khi không còn người hiện diện. Chúng ta tắt chúng sau một khoảng timeout.

    Cách Sử Dụng Time Delay

    Nếu không phát hiện con người, hệ thống tự động hóa sẽ đợi một khoảng thời gian trước khi thực hiện hành động.

    Cảm biến chuyển động có Time Delay Adjuster có thể được thiết lập tối thiểu 3 giây và tối đa 5 phút. Ngoài ra, bất kỳ giá trị nào cũng có thể được thiết lập trong code Raspberry Pi bằng cách lập trình.

    Nếu chúng ta không chỉ định timeout trong code Raspberry Pi, timeout sẽ tương đương với time delay được thiết lập trong cảm biến.