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:

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 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.

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

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

sơ đồ nối dây của cảm biến chuyển động Arduino

This image is created using Fritzing. Click to enlarge image

Thiết lập ban đầu

Time Delay AdjusterScrew it in anti-clockwise direction fully.
Detection Range AdjusterScrew it in clockwise direction fully.
Repeat Trigger SelectorPut jumper as shown on the image.
thiết lập ban đầu cho cảm biến chuyển động Arduino

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()
pinMode(PIN_TO_SENSOR, INPUT);
  • đọc trạng thái chân OUTPUT của cảm biến bằng cách sử dụng hàm digitalRead().
pinStateCurrent = digitalRead(PIN_TO_SENSOR);
  • 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)
pinStatePrevious = pinStateCurrent; // store old state pinStateCurrent = digitalRead(PIN_TO_SENSOR); // read new state if (pinStatePrevious == LOW && pinStateCurrent == HIGH) { // pin state change: LOW -> HIGH Serial.println("Motion detected!"); }
  • Phát hiện khi chuyển động dừng (thay đổi trạng thái của chân từ HIGH sang LOW)
pinStatePrevious = pinStateCurrent; // store old state pinStateCurrent = digitalRead(PIN_TO_SENSOR); // read new state if (pinStatePrevious == HIGH && pinStateCurrent == LOW) { // pin state change: HIGH -> LOW Serial.println("Motion stopped!"); }

Mã Arduino

/* * Mã Arduino này được phát triển bởi newbiely.vn * Mã Arduino 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/arduino/arduino-motion-sensor */ const int PIN_TO_SENSOR = 2; // the pin that OUTPUT pin of sensor is connected to int pinStateCurrent = LOW; // current state of pin int pinStatePrevious = LOW; // previous state of pin void setup() { Serial.begin(9600); // initialize serial pinMode(PIN_TO_SENSOR, INPUT); // set arduino pin to input mode to read value from OUTPUT pin of sensor } void loop() { pinStatePrevious = pinStateCurrent; // store old state pinStateCurrent = digitalRead(PIN_TO_SENSOR); // read new state if (pinStatePrevious == LOW && pinStateCurrent == HIGH) { // pin state change: LOW -> HIGH Serial.println("Motion detected!"); // TODO: turn on alarm, light or activate a device ... here } else if (pinStatePrevious == HIGH && pinStateCurrent == LOW) { // pin state change: HIGH -> LOW Serial.println("Motion stopped!"); // TODO: turn off alarm, light or deactivate a device ... here } }

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
COM6
Send
Motion detected! Motion stopped!
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

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

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ư đã đề 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.
phạm vi phát hiện của cảm biến chuyển động

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.

cảm biến chuyển động điều chỉnh thời gian trễ

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.

lựa chọn kích hoạt cảm biến chuyển động

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 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 một lần cho cảm biến chuyển động
  • 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).
chế độ kích hoạt lặp lại của cảm biến chuyển động

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:
    COM6
    Send
    Motion detected! Motion stopped! Motion detected! Motion stopped! Motion detected! Motion stopped!
    Autoscroll Show timestamp
    Clear output
    9600 baud  
    Newline  
    • 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:
      COM6
      Send
      Motion detected! Motion stopped!
      Autoscroll Show timestamp
      Clear output
      9600 baud  
      Newline  

      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ế:

      • 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ờ.

      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:

      • 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

      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

      /* * Mã Arduino này được phát triển bởi newbiely.vn * Mã Arduino 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/arduino/arduino-motion-sensor */ const int PIN_TO_SENSOR = 2; // the pin that OUTPUT pin of sensor is connected to int pinStateCurrent = LOW; // current state of pin int pinStatePrevious = LOW; // previous state of pin const unsigned long DELAY_TIME_MS = 30000; // 30000 miliseconds ~ 30 seconds bool delayEnabled = false; unsigned long delayStartTime; void setup() { Serial.begin(9600); // initialize serial pinMode(PIN_TO_SENSOR, INPUT); // set arduino pin to input mode to read value from OUTPUT pin of sensor } void loop() { pinStatePrevious = pinStateCurrent; // store state pinStateCurrent = digitalRead(PIN_TO_SENSOR); // read new state if (pinStatePrevious == LOW && pinStateCurrent == HIGH) { // pin state change: LOW -> HIGH Serial.println("Motion detected!"); Serial.println("Turning on / activating"); delayEnabled = false; // disable delay // TODO: turn on alarm, light or activate a device ... here } else if (pinStatePrevious == HIGH && pinStateCurrent == LOW) { // pin state change: HIGH -> LOW Serial.println("Motion stopped!"); delayEnabled = true; // enable delay delayStartTime = millis(); // set start time } if (delayEnabled == true && (millis() - delayStartTime) >= DELAY_TIME_MS) { Serial.println("Turning off / deactivating"); delayEnabled = false; // disable delay // TODO: turn off alarm, light or deactivate a device ... here } }

      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.

Tham khảo hàm