아두이노 - 모션 센서 | Arduino - Motion Sensor

당신이 문이 자동으로 열리거나 닫히고, 전구가 자동으로 켜지거나 꺼지거나, 에스컬레이터가 자동으로 작동하는 몇몇 장소에 다가갈 때, 당신은 이런 질문을 해본 적이 있나요: “어떻게 그런 일이 가능하지?”? 만약 그렇다면, 이 튜토리얼은 그것이 어떻게 가능한지 답변할 뿐만 아니라 어떻게 만드는지도 알려줍니다. 시작해볼까요!

이 튜토리얼에서 우리는 다음을 배울 예정입니다:

준비물

1×Arduino Uno Amazon
1×USB 2.0 cable type A/B 쿠팡 | Amazon
1×HC-SR501 Motion Sensor Amazon
1×Jumper Wires Amazon
1×(Optional) 9V Power Adapter for Arduino Amazon
1×(Recommended) Screw Terminal Block Shield for Arduino Uno 쿠팡 | Amazon
1×(Optional) Transparent Acrylic Enclosure For Arduino Uno Amazon
공개: 이 섹션에서 제공된 링크 중 일부는 제휴 링크입니다. 이 링크를 통해 구매한 경우 추가 비용없이 수수료를 받을 수 있습니다. 지원해 주셔서 감사합니다.

HC-SR501 모션 센서에 대하여

HC-SR501 Motion Sensor

HC-SR501 PIR 센서는 인간(또는 동물)의 움직임을 감지할 수 있는 센서입니다. 많은 용도에서 인간의 존재를 감지하는 데 널리 사용됩니다 (자동으로 전등을 켜거나 끄기, 문 열기/닫기, 에스컬레이터 활성화/비활성화, 침입자 감지 ...).

핀배열

HC-SR501 모션 센서에는 3개의 핀이 있습니다:

  • GND 핀: GND(0V)에 연결해야 합니다.
  • VCC 핀: VCC(5V)에 연결해야 합니다.
  • 출력 핀: 움직임이 감지되지 않을 때는 LOW, 움직임이 감지되면 HIGH인 출력 핀입니다. 이 핀은 아두이노의 입력 핀에 연결해야 합니다.

HC-SR501에는 점퍼 하나와 두 개의 가변 저항이 있으며, 이를 사용하여 센서 설정을 조정합니다. 먼저 기본 설정을 유지하십시오. 세부 사항은 고급 사용법 섹션에서 설명합니다.

HC-SR501 Motion Sensor Pinout

작동 원리

HC-SR501 센서는 움직이는 물체에서 나오는 적외선 복사의 변화를 바탕으로 움직임을 감지합니다. HC-SR501 센서에 의해 감지되기 위해서는 물체가 두 가지 조건을 충족해야 합니다:

  • 움직이거나 흔들리고 있습니다.
  • 적외선 방식을 방출하고 있습니다.

그래서:

  • 객체가 움직이고 있지만 적외선을 방출하지 않는 경우(예: 로봇이나 차량 장난감), 센서에 의해 감지되지 않습니다.
  • 객체가 적외선을 방출하지만 움직이지 않는 경우(예: 사람이 움직이지 않고 가만히 서 있는 경우), 센서에 의해 감지되지 않습니다.

인간과 동물은 자연스럽게 적외선을 방출합니다. 그러므로, 센서는 인간과 동눼의 움직임을 감지할 수 있습니다.

출력 핀의 상태:

  • 센서의 감지 범위 내에 인간(또는 동물)의 움직임이 없을 때, 센서의 OUTPUT 핀은 LOW 상태입니다.
  • 센서의 감지 범위 내로 인간(또는 동물)이 움직이면, 센서의 OUTPUT 핀은 LOW에서 HIGH로 변경됩니다 (⇒ 움직임 감지됨).
  • 센서의 감지 범위에서 인간(또는 동물)이 멀어지면, 센서의 OUTPUT 핀은 HIGH에서 LOW로 변경됩니다 (⇒ 움직임 종료됨).

위 동영상은 원리적으로 모션 센서가 어떻게 작동하는지를 보여줍니다. 실제로, 모션 센서는 설정된 센서(‘고급 사용법’ 섹션에 설명되어 있음)에 따라 조금 다르게 작동합니다.

인간의 존재 감지

센서 자체는 사람의 존재를 감지하지 않습니다. 센서는 단지 움직임을 감지할 뿐입니다. 우리는 센서에서의 움직임 감지를 바탕으로 다음 규칙에 따라 사람의 존재를 추론하기 위해 아두이노(또는 MCU)를 사용합니다:

  • 움직임이 감지되면, 사람이 있습니다.
  • 움직임이 감지되지 않으면, 사람이 없습니다.

이 규칙은 실제 사례에서 옳지 않습니다: 인간은 센서 범위 내에 존재하지만 움직이지 않습니다. 움직임이 감지되지 않습니다. 아두이노(또는 MCU)는 인간이 존재하지 않는다고 판단합니다.

예를 들어, 회의실에서는 사람들이 방에 들어오면 자동으로 불이 켜지는 움직임 감지 센서를 사용하여 불을 자동으로 켜고 끕니다. 회의 시간 동안 모두가 움직이지 않고 가만히 앉아 있으면, 움직임이 감지되지 않습니다 ⇒ 사람이 없는 것으로 간주됩니다 ⇒ 불이 자동으로 꺼집니다. 불을 켜려면 누군가가 움직여야 합니다.

그러나 이 문제는 심각하지 않으며 센서는 저렴합니다. 따라서 이 센서는 많은 응용 프로그램에서 사람을 감지하는 데 널리 사용됩니다.

아두이노 - HC-SR501 동작 센서

아두이노의 핀이 디지털 입력으로 설정되어 있으면, 연결된 모든 것의 상태(LOW 또는 HIGH)를 읽을 수 있습니다.

아두이노의 핀을 HC-SR501 센서의 OUTPUT 핀과 연결함으로써, 아두이노 코드를 사용하여 OUTPUT 핀의 값을 확인하여 움직임을 감지할 수 있습니다.

선연결

Arduino Motion Sensor Wiring Diagram

이 이미지는 Fritzing을 사용하여 만들어졌습니다. 이미지를 확대하려면 클릭하세요.

초기 설정

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.
arduino motion sensor initial setting

움직임 센서를 위한 프로그래밍 방법

아두이노의 핀을 디지털 입력 모드로 설정하기 위해 pinMode() 함수를 사용하세요.

pinMode(PIN_TO_SENSOR, INPUT);

digitalRead() 함수를 사용하여 센서의 OUTPUT 핀 상태를 읽습니다.

pinStateCurrent = digitalRead(PIN_TO_SENSOR);

모션 시작 감지 (핀의 상태가 LOW에서 HIGH로 변경)

pinStatePrevious = pinStateCurrent; // 이전 상태 저장 pinStateCurrent = digitalRead(PIN_TO_SENSOR); // 새 상태 읽기 if (pinStatePrevious == LOW && pinStateCurrent == HIGH) { // 핀 상태 변경: LOW -> HIGH Serial.println("Motion detected!"); }

움직임 정지 감지 (핀의 상태가 HIGH에서 LOW로 변경됨)

pinStatePrevious = pinStateCurrent; // 이전 상태를 저장 pinStateCurrent = digitalRead(PIN_TO_SENSOR); // 새 상태를 읽음 if (pinStatePrevious == HIGH && pinStateCurrent == LOW) { // 핀 상태 변경: HIGH -> LOW Serial.println("Motion stopped!"); }

아두이노 코드

/* * 이 Arduino 코드는 newbiely.kr 에서 개발되었습니다 * 이 Arduino 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/arduino/arduino-motion-sensor */ const int PIN_TO_SENSOR = 2; // 센서의 OUTPUT 핀이 연결된 핀 int pinStateCurrent = LOW; // 핀의 현재 상태 int pinStatePrevious = LOW; // 핀의 이전 상태 void setup() { Serial.begin(9600); // 시리얼 초기화 pinMode(PIN_TO_SENSOR, INPUT); // 센서의 OUTPUT 핀에서 값을 읽기 위해 아두이노 핀을 입력 모드로 설정 } void loop() { pinStatePrevious = pinStateCurrent; // 이전 상태 저장 pinStateCurrent = digitalRead(PIN_TO_SENSOR); // 새로운 상태 읽기 if (pinStatePrevious == LOW && pinStateCurrent == HIGH) { // 핀 상태 변경: LOW -> HIGH Serial.println("Motion detected!"); // 할 일: 여기에서 알람, 라이트 켜기 또는 장치 활성화 ... } else if (pinStatePrevious == HIGH && pinStateCurrent == LOW) { // 핀 상태 변경: HIGH -> LOW Serial.println("Motion stopped!"); // 할 일: 여기에서 알람, 라이트 끄기 또는 장치 비활성화 ... } }

사용 방법

  • 위의 코드를 복사하고 Arduino IDE로 열기
  • Arduino IDE에서 Upload 버튼을 클릭하여 코드를 Arduino에 업로드하기
  • 시리얼 모니터 열기
  • 센서 범위 앞에서 손을 움직이기
  • 시리얼 모니터에서 출력 확인하기
COM6
Send
Motion detected! Motion stopped!
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

동영상

비디오 제작은 시간이 많이 걸리는 작업입니다. 비디오 튜토리얼이 학습에 도움이 되었다면, YouTube 채널 을 구독하여 알려 주시기 바랍니다. 비디오에 대한 높은 수요가 있다면, 비디오를 만들기 위해 노력하겠습니다.

고급 사용법

이 섹션에는 압도될 수 있는 고급 정보가 포함되어 있습니다. 내용에 대해 확신이 없다면 건너뛰어 다음 섹션으로 이동하십시오.

위에서 언급한 것처럼, 점퍼 하나와 두 개의 가변저항을 이용해서 센서의 설정을 조정할 수 있습니다.

탐지 범위 조정기

이 포텐쇼미터는 감지 범위를 조정하는데 사용됩니다(약 3미터에서 7미터까지).

  • 시계 방향으로 완전히 조여졌을 경우, 탐지 범위는 대략 3미터입니다.
  • 반시계 방향으로 완전히 조여졌을 경우, 탐지 범위는 대략 7미터입니다.
Motion Sensor Detection Range

우리는 원하는 범위(3m와 7m 사이의 값)를 달성하기 위해 가변저항을 조정할 수 있습니다.

시간 지연 조절기

이 포텐쇼미터는 시간 지연을 조절하는 데 사용됩니다.

  • 시계 방향으로 완전히 조여지면 시간 지연은 약 5분입니다.
  • 반시계 방향으로 완전히 조여지면 시간 지연은 약 3초입니다.

시간 지연의 의미는 다음 부분에서 반복 트리거와 결합하여 설명됩니다.

motion sensor adjust time delay

반복 트리거 선택기

트리거 모드를 선택하는 데 사용되는 점퍼가 있습니다: 단일 트리거 또는 반복 트리거.

motion sensor trigger selection

시간 지연 설정을 time_delay라고 하겠습니다(시간 지연 조절기를 통해 설정됩니다). 센서 범위 내에서 오랫동안(time_delay보다 몇 배 더 긴 시간) 이동한다고 가정할 때 (이를 motion_time이라고 합니다)

단일 트리거 모드: OUTPUT 핀의 상태가 여러 번 LOWHIGH 사이로 전환됩니다. HIGH 지속 시간은 time_delay와 같습니다. LOW 지속 시간은 3초로 고정됩니다.

motion sensor single trigger mode

반복 가능한 트리거 모드: 출력 핀의 상태는 (운동 시간 + 지연 시간) 동안 계속 높음을 유지합니다.

motion sensor repeatable trigger mode

테스팅

트리거 모드가 어떻게 작동하는지 보려면, 테스트를 해봅시다. 타임 딜레이 조정기를 완전히 반시계 방향으로 설정하여 시간 지연을 3초로 설정하세요.

단일 트리거 모드:

  • 점퍼를 설정하여 단일 트리거 모드를 선택하세요.
  • 센서 앞에서 손을 약 10초간 움직이세요.
  • 센서의 범위 밖으로 손을 이동하세요.
  • 3초를 기다리세요, 시리얼 모니터에서 다음과 같은 출력을 볼 수 있습니다:
COM6
Send
Motion detected! Motion stopped! Motion detected! Motion stopped! Motion detected! Motion stopped!
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  
  • 반복 가능한 트리거 모드:
    • 점퍼를 설정하여 반복 가능한 트리거 모드를 선택합니다
    • 센서 앞에서 약 10초 동안 손을 계속 움직입니다.
    • 손을 센서의 범위 밖으로 옮깁니다
    • 3초 기다린 후, 다음과 같이 시리얼 모니터에서 출력을 볼 수 있습니다:
    COM6
    Send
    Motion detected! Motion stopped!
    Autoscroll Show timestamp
    Clear output
    9600 baud  
    Newline  

    우리가 볼 수 있듯이, 단일 트리거 모드에서는 센서가 두 번 또는 세 번 트리거됩니다. 반복 가능한 트리거 모드에서는 센서가 단 한 번만 트리거됩니다.

    ※ NOTE THAT:

    두 경우 모두, LOW(3초) 시간 동안(고정되고 조절할 수 없는 값), 센서는 어떠한 움직임도 감지할 수 없습니다. 다시 말해, 이 기간 동안 센서는 차단됩니다. 실제로, 이것은 아무런 문제를 일으키지 않습니다.

    반복 트리거 모드 사용을 권장합니다.

    많은 실제 응용에서:

    • 사람이 존재하는 직후에 장치/기계를 켜거나 활성화합니다.
    • 사람이 없어진 직후에 장치/기계를 바로 끄거나 비활성화하지 않습니다. 우리는 타임아웃 후에 장치/기계를 끄거나 비활성화합니다.

    시간 지연 사용법

    인간이 존재하지 않는 것으로 감지되면, 자동화 시스템은 시간 지연 후에 조치를 취할 것입니다.

    모션 센서와 아두이노 코드에서 시간 지연을 설정할 수 있습니다:

    • 모션 센서에: 최소 3초, 최대 5분입니다. 시간 지연 조정기를 통해 설정됩니다.
    • 아두이노 코드에서: 아무 값이나, 코딩을 통해 설정됩니다.

    우리가 아두이노 코드에서 타임아웃을 설정하지 않으면, 타임아웃은 센서 설정의 시간 지연과 같습니다.

    아두이노 코드에서 타임아웃을 설정하면, 타임아웃은 센서 설정의 시간 지연과 아두이노 코드의 시간 지연의 합입니다.

    아두이노 코드에서 시간 지연 설정하기

    /* * 이 Arduino 코드는 newbiely.kr 에서 개발되었습니다 * 이 Arduino 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/arduino/arduino-motion-sensor */ const int PIN_TO_SENSOR = 2; // 센서의 OUTPUT 핀이 연결된 핀 int pinStateCurrent = LOW; // 핀의 현재 상태 int pinStatePrevious = LOW; // 핀의 이전 상태 const unsigned long DELAY_TIME_MS = 30000; // 30000 밀리초 ~ 30초 bool delayEnabled = false; unsigned long delayStartTime; void setup() { Serial.begin(9600); // 시리얼 초기화 pinMode(PIN_TO_SENSOR, INPUT); // 센서의 OUTPUT 핀에서 값을 읽기 위해 아두이노 핀을 입력 모드로 설정 } void loop() { pinStatePrevious = pinStateCurrent; // 상태 저장 pinStateCurrent = digitalRead(PIN_TO_SENSOR); // 새로운 상태 읽기 if (pinStatePrevious == LOW && pinStateCurrent == HIGH) { // 핀 상태 변경: LOW -> HIGH Serial.println("Motion detected!"); Serial.println("Turning on / activating"); delayEnabled = false; // 딜레이 비활성화 // 할 일: 여기서 알람, 불빛을 켜거나 장치를 활성화... } else if (pinStatePrevious == HIGH && pinStateCurrent == LOW) { // 핀 상태 변경: HIGH -> LOW Serial.println("Motion stopped!"); delayEnabled = true; // 딜레이 활성화 delayStartTime = millis(); // 시작 시간 설정 } if (delayEnabled == true && (millis() - delayStartTime) >= DELAY_TIME_MS) { Serial.println("Turning off / deactivating"); delayEnabled = false; // 딜레이 비활성화 // 할 일: 여기서 알람, 불빛을 끄거나 장치를 비활성화... } }

    반복 트리거 모드가 설정되어 있다고 가정합니다. 이 코드에서의 지연시간은 30초로 설정되어 있습니다. 이는 지연 시간이 30초 플러스 센서 설정(시간 지연 조정기를 통해)에서 설정된 time_delay와 동일함을 의미합니다.

도전해보세요

모션 센서를 사용하여 다음 프로젝트 중 하나를 수행하십시오:

  • 방에 들어왔을 때 자동으로 불을 켜고 나간 후 30초 후에 불을 끕니다. 힌트: Arduino - Relay를 참고하세요.
  • 귀중한 물건에 누군가 다가오면 자동으로 알람이 울립니다. 힌트: Arduino - Piezo Buzzer를 참고하세요.

※ OUR MESSAGES

  • Please feel free to share the link of this tutorial. However, Please do not use our content on any other websites. We invested a lot of effort and time to create the content, please respect our work!