Arduino Cảm biến chuyển động
Khi bạn tiếp cận một số nơi mà cửa tự động mở/đóng, bóng đèn tự động bật/tắt hoặc thang cuốn tự động hoạt động, bạn đã từng tự hỏi: “Làm sao nó có thể làm được điều đó?” chưa? Nếu có, bài hướng dẫn này không chỉ trả lời mà còn chỉ cho bạn cách làm điều đó. Hãy bắt đầu nào!
Trong hướng dẫn này, chúng ta sẽ học:
- Cách cảm biến chuyển động HC-SR501 hoạt động
- Cách kết nối cảm biến chuyển động HC-SR501 với Arduino
- Cách lập trình Arduino để đọc trạng thái từ cảm biến HC-SR501
- Cách sử dụng Arduino và cảm biến HC-SR501 để phát hiện sự có mặt của người và thực hiện hành động dựa trên đó
Phần cứng cần chuẩn bị
| 1 | × | Arduino Uno R3 | ||
| 1 | × | USB 2.0 cable type A/B (for USB-A PC) | ||
| 1 | × | USB 2.0 cable type C/B (for USB-C PC) | ||
| 1 | × | HC-SR501 Motion Sensor | ||
| 1 | × | Alternatively, AM312 Mini Motion Sensor | ||
| 1 | × | dây jumper | ||
| 1 | × | (Khuyến nghị) Screw Terminal Block Shield for Arduino Uno | ||
| 1 | × | (Khuyến nghị) Breadboard Shield for Arduino Uno | ||
| 1 | × | (Khuyến nghị) Enclosure for Arduino Uno | ||
| 1 | × | (Khuyến nghị) Prototyping Base Plate & Breadboard Kit for Arduino UNO |
Or you can buy the following kits:
| 1 | × | DIYables STEM V3 Starter Kit (Arduino included) | ||
| 1 | × | DIYables Sensor Kit (30 sensors/displays) | ||
| 1 | × | DIYables Sensor Kit (18 sensors/displays) |
Về cảm biến chuyển động HC-SR501

Cảm biến HC-SR501 PIR là một cảm biến có thể 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 để phát hiện sự có mặt của con người trong nhiều ứng dụng (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, phát hiện kẻ xâm nhập ...)
Bản đồ chân
Cảm biến chuyển động HC-SR501 có 3 chân:
- Chân GND: cần được kết nối với GND (0V)
- Chân VCC: cần được kết nối với VCC (5V)
- Chân OUTPUT: là một chân OUTPUT: LOW khi không có chuyển động được phát hiện, HIGH khi có chuyển động được phát hiện. Chân này cần được kết nối với chân đầu vào của Arduino.
HC-SR501 cũng có một jumper và hai biến trở, được dùng để điều chỉnh cài đặt của cảm biến. Đầu tiên, giữ nguyên cài đặt mặc định. Chi tiết được mô tả trong phần Các ứng dụng nâng cao.

Cách hoạt động
Cảm biến HC-SR501 phát hiện chuyển động dựa trên sự thay đổi của bức xạ hồng ngoại từ vật thể đang di chuyển. Để được cảm biến HC-SR501 phát hiện, vật thể phải đáp ứng hai điều kiện:
- đang di chuyển hoặc rung lắc
- đang phát ra tia hồng ngoại
Vậy:
- Nếu một vật thể đang chuyển động nhưng không phát tia hồng ngoại (ví dụ, robot hoặc xe ô tô đồ chơi), nó sẽ không bị cảm biến phát hiện.
- Nếu một vật thể đang phát tia hồng ngoại nhưng không chuyển động (ví dụ, một người đứng yên mà không di chuyển), nó sẽ không bị cảm biến phát hiện.
Con người và động vật tự nhiên phát ra tia hồng ngoại. Do đó, cảm biến có thể phát hiện sự chuyển động của con người và động vật.
Trạng thái chân OUTPUT:
- Khi không có người (hoặc động vật) nào đang di chuyển trong phạm vi phát hiện của cảm biến, đầu ra của cảm biến ở mức THẤP.
- Khi có người (hoặc động vật) di chuyển vào phạm vi phát hiện của cảm biến, đầu ra của cảm biến được đổi từ THẤP sang CAO (⇒ phát hiện chuyển động).
- Khi có người (hoặc động vật) rời khỏi phạm vi phát hiện của cảm biến, đầu ra của cảm biến được đổi từ CAO sang THẤP (⇒ kết thúc chuyển động).
Đoạn video ở trên minh họa cách cảm biến chuyển động hoạt động theo nguyên lý. Trên 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 thiết lập cảm biến (được mô tả trong phần Các Ứng dụng Nâng Cao).
Phát hiện sự có mặt của con người
Cảm biến tự nó không phát hiện sự hiện diện của con người, cảm biến chỉ phát hiện chuyển động. Chúng tôi sử dụng Arduino (hoặc MCU) để suy ra sự hiện diện của con người dựa trên việc phát hiện chuyển động từ cảm biến, theo quy tắc sau:
- Nếu phát hiện được chuyển động, những người có mặt
- Nếu không phát hiện được chuyển động, những người không có mặt
Quy tắc này không đúng trong một trường hợp thực tế: những người ở trong phạm vi cảm biến nhưng không di chuyển. Chuyển động không được phát hiện. Arduino (hoặc MCU) suy ra rằng người không có mặt.
Ví dụ, phòng họp của bạn sử dụng cảm biến chuyển động để tự động bật/tắt đèn; đèn sẽ được bật tự động khi có người di chuyển vào phòng. Trong thời gian họp, nếu tất cả mọi người đều ngồi yên và không di chuyển, cảm biến sẽ không phát hiện chuyển động ⇒ không có ai có mặt ⇒ đèn tự động tắt. Để bật đèn, người nào đó cần di chuyển.
Tuy nhiên, vấn đề này không nghiêm trọng và cảm biến rẻ. Do đó, cảm biến được sử dụng rộng rãi để phát hiện con người trong nhiều ứng dụng.
Arduino - Cảm biến chuyển động HC-SR501
Khi một chân của Arduino được cấu hình làm đầu vào kỹ thuật số, nó có thể đọc trạng thái (THẤP hoặc CAO) của bất cứ thứ gì nó được kết nối tới.
Bằng cách kết nối chân của Arduino với chân OUTPUT của cảm biến HC-SR501, chúng ta có thể sử dụng mã Arduino để kiểm tra giá trị của chân OUTPUT nhằm phát hiệ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 Adjuster | Screw it in anti-clockwise direction fully. |
| Detection Range Adjuster | Screw it in clockwise direction fully. |
| Repeat Trigger Selector | Put jumper as shown on the image. |

Cách lập trình cho cảm biến chuyển động
- Cấu hình chân của Arduino ở chế độ đầu vào kỹ thuật số bằng cách sử dụng hàm pinMode()
- đọc trạng thái chân OUTPUT của cảm biến bằng cách sử dụng hàm digitalRead().
- Phát hiện sự bắt đầu của chuyển động (trạng thái chân thay đổi từ LOW sang HIGH)
- Phát hiện khi chuyển động dừng (thay đổi trạng thái của chân từ HIGH sang LOW)
Mã Arduino
Hướng dẫn từng bước
- Sao chép mã ở trên và mở bằng Arduino IDE
- Nhấn nút Tải lên trên Arduino IDE để tải mã lên Arduino
- Mở Serial Monitor
- Đưa tay trước phạm vi cảm biến
- Xem đầu ra trong Serial Monitor
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.
Cách sử dụng nâng cao
Như đã đề cập ở trên, chúng ta có thể điều chỉnh cài đặt của cảm biến bằng một jumper và hai biến trở.
Bộ điều chỉnh phạm vi phát hiện
Biến trở này được dùng để điều chỉnh phạm vi phát hiện (khoảng từ 3 mét đến 7 mét).
- Nếu nó được vặn hoàn toàn theo chiều kim đồng hồ, phạm vi phát hiện là khoảng 3 mét.
- Nếu nó được vặn hoàn toàn theo ngược chiều kim đồng hồ, phạm vi phát hiện là khoảng 7 mét.

Chúng ta có thể điều chỉnh biến trở để đạt được phạm vi mong muốn (một giá trị nằm giữa 3m và 7m)
Bộ điều chỉnh độ trễ thời gian
Biến trở này được dùng để điều chỉnh độ trễ thời gian.
- Nếu nó được vặn hết theo chiều kim đồng hồ, thời gian trễ khoảng 5 phút.
- Nếu nó được vặn hết theo chiều ngược kim đồng hồ, thời gian trễ khoảng 3 giây.
Ý nghĩa của độ trễ thời gian được giải thích kết hợp với Repeat Trigger ở phần tiếp theo.

Bộ chọn kích hoạt lặp lại
Có một jumper được sử dụng để chọn chế độ kích hoạt: kích hoạt một lần hoặc kích hoạt lặp lại.

Hãy gọi thiết lập độ trễ thời gian (được thiết lập thông qua Time Delay Adjuster) là time_delay. Giả sử bạn tiếp tục di chuyển trong vùng quét của cảm biến trong một thời gian dài được gọi là motion_time (nhiều lần dài hơn time_delay).
- Chế độ kích hoạt một lần: trạng thái của chân OUTPUT được chuyển đổi giữa LOW và HIGH nhiều lần. Thời gian HIGH bằng với time_delay. Thời gian LOW cố định ở 3 giây.

- Chế độ kích hoạt lặp lại: trạng thái của chân OUTPUT sẽ giữ ở mức HIGH trong suốt (motion_time + time_delay).

Kiểm tra
Để xem các chế độ kích hoạt hoạt động như thế nào, hãy tiến hành thử nghiệm. Quay bộ điều chỉnh độ trễ thời gian hoàn toàn ngược chiều kim đồng hồ cho đến khi thời gian trễ là 3 giây.
- Chế độ kích hoạt đơn:
- Đặt jumper để chọn chế độ kích hoạt đơn
- Giữ tay của bạn trước cảm biến trong khoảng 10 giây.
- Đưa tay ra khỏi phạm vi cảm biến
- Chờ 3 giây, bạn sẽ thấy đầu ra trên màn hình Serial Monitor như sau:
- Chế độ kích hoạt lặp lại:
- Đặt jumper để chọn chế độ kích hoạt lặp lại
- Tiếp tục di chuyển tay trước cảm biến trong khoảng 10 giây.
- Đưa tay ra khỏi phạm vi cảm biến
- Chờ 3 giây, bạn sẽ thấy đầu ra trên Serial Monitor như sau:
- Chúng ta bật hoặc kích hoạt các thiết bị/máy móc ngay sau khi có sự xuất hiện của con người
- Chúng ta KHÔNG tắt hoặc vô hiệu hóa các thiết bị/máy móc ngay sau khi con người KHÔNG còn có mặt. Chúng ta tắt hoặc vô hiệu hóa các thiết bị/máy móc sau một khoảng thời gian chờ.
- Trên cảm biến chuyển động: tối thiểu 3 giây và tối đa 5 phút. Được thực hiện thông qua Bộ điều chỉnh độ trễ thời gian
- Trong mã Arduino: bất kỳ giá trị nào, được thực hiện bằng cách lập trình
Như chúng ta thấy, ở chế độ kích hoạt đơn, cảm biến kích hoạt hai hoặc ba lần. Trong chế độ kích hoạt lặp lại, cảm biến kích hoạt chỉ một lần.
※ Lưu ý:
Trong cả hai trường hợp, trong thời gian LOW (3 giây) (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, cảm biến bị khóa trong khoảng thời gian này. Trên thực tế, nó KHÔNG gây ra bất kỳ vấn đề gì.
Người ta khuyến nghị sử dụng chế độ kích hoạt lặp lại.
Trong nhiều ứng dụng thực tế:
Cách Sử Dụng Độ Trễ Thời Gian
Khi không có con người được phát hiện, hệ thống tự động sẽ thực hiện hành động sau một khoảng thời gian trễ.
Độ trễ thời gian có thể được thiết lập trên cảm biến chuyển động và mã Arduino:
Nếu chúng ta không đặt thời gian chờ trong mã Arduino, thời gian chờ sẽ bằng độ trễ được cài đặt trong thiết lập của cảm biến.
Nếu chúng ta thiết lập thời gian chờ trong mã Arduino, thời gian chờ sẽ là tổng của độ trễ trong thiết lập của cảm biến và độ trễ trong mã Arduino.
Thiết lập độ trễ thời gian trong mã Arduino
Giả sử chế độ kích hoạt lặp lại đã được thiết lập. Độ trễ trong mã này được đặt là 30 giây. Điều đó có nghĩa thời gian trễ bằng 30 giây cộng với time_delay, được thiết lập trong cài đặt của cảm biến (qua Bộ hiệu chỉnh Độ trễ Thời gian).
Thách thức bản thân
Sử dụng cảm biến chuyển động để thực hiện một trong các dự án sau:
- Tự động bật sáng đèn khi bạn vào phòng và tắt đèn sau khi bạn rời đi 30 giây. Gợi ý: Tham khảo Arduino - rơ-le.
- Tự động phát chuông cảnh báo khi có người tiến gần đồ có giá trị của bạn. Gợi ý: Tham khảo Arduino - Chuông Piezo.