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

당신이 자동 문, 조명, 에스컬레이터가 있는 장소를 마주쳤을 때 “어떻게 그런 일이 가능한 거지?”라고 궁금해한 적이 있나요? 만약 그렇다면, 이 튜토리얼은 당신의 질문에 답할 뿐만 아니라 아두이노 나노와 모션 센서를 사용하여 그것을 실현하는 방법을 보여줄 것입니다. 시작해볼까요!

이 튜토리얼은 모션 센서와 함께 아두이노 나노를 사용하는 방법을 안내합니다. 자세히는, 우리는 배울 것입니다:

준비물

1×Arduino Nano Amazon
1×USB A to Mini-B USB cable 쿠팡 | Amazon
1×HC-SR501 Motion Sensor Amazon
1×Jumper Wires Amazon
1×(Optional) 9V Power Adapter for Arduino Nano Amazon
1×(Recommended) Screw Terminal Adapter for Arduino Nano 쿠팡 | 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 센서가 물체를 감지하려면 두 가지 기준이 충족되어야 합니다:

  • 객체는 움직이거나 흔들려야 합니다.
  • 객체는 적외선을 방출해야 합니다.

따라서:

  • 물체가 이동 중이지만 적외선을 방출하지 않는 경우(예: 로봇이나 자동차 장난감 등), 센서에 의해 감지되지 않을 것입니다.
  • 물체가 적외선을 방출하지만 이동하지 않는 경우(예: 가만히 서 있는 사람 등), 센서에 의해 감지되지 않을 것입니다.

인간과 동물은 적외선 방사의 원천입니다. 따라서 센서는 그들의 움직임을 감지할 수 있습니다.

출력 핀의 상태:

  • 센서의 감지 범위에 인간(또는 동물)이 없을 때, 센서의 출력 핀은 LOW 상태입니다.
  • 인간(또는 동물)이 센서의 감지 범위에 들어오면, 출력 핀은 LOW에서 HIGH로 전환되어 움직임이 감지되었음을 나타냅니다.
  • 인간(또는 동물)이 센서의 감지 범위를 벗어나면, 출력 핀은 HIGH에서 LOW로 전환되어 움직임이 종료되었음을 의미합니다.

위의 비디오는 모션 센서의 기본 작동 방식을 보여줍니다. 실제로 모션 센서는 구성에 따라 다르게 작동할 수 있습니다(이는 고급 사용법 섹션에서 설명되어 있습니다).

인간의 존재를 감지하세요

센서 자체는 사람의 존재를 인식하지 않습니다. 단지 움직임만 감지합니다. 우리는 센서가 감지한 움직임을 바탕으로 아두이노 나노를 사용하여 다음 규칙에 따라 사람의 존재를 추론합니다:

  • 만약 움직임이 감지된다면, 사람이 있는 것이다.
  • 만약 움직임이 감지되지 않는다면, 사람이 없는 것이다.

이 규칙은 실제 상황에서 완벽하게 작동하지 않습니다: 사람들이 센서의 범위 안에 있지만 움직이지 않을 때는 움직임이 감지되지 않습니다. 따라서 아두이노 나노는 사람이 없다고 결론지을 것입니다.

예를 들어, 회의실의 모션 센서는 사람이 있을 때 불을 켜도록 설정되어 있습니다. 회의가 진행 중이고 아무도 움직이지 않으면 모션을 감지하지 못하여 사람의 존재를 인식하지 못하고, 결과적으로 불이 꺼집니다. 불을 다시 켜려면 누군가 움직여야 합니다.

그러나 이 문제는 심각하지 않으며 센서가 저렴합니다. 따라서 많은 애플리케이션에서 인간을 감지하는 데 널리 사용됩니다.

아두이노 나노 - HC-SR501 모션 센서

아두이노의 디지털 입력 핀을 HC-SR501 센서의 출력 핀에 연결하세요. 아두이노 나노 코드를 사용하여 출력 핀의 값이 변화하는 것을 확인함으로써 움직임을 감지할 수 있습니다.

선연결

Arduino Nano 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

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

Arduino의 핀을 디지털 입력으로 설정하려면 pinMode() 함수를 사용하세요.

pinMode(MOTION_SENSOR_PIN, INPUT);

센서의 OUTPUT 핀 상태를 digitalRead() 함수로 확인하세요.

motion_state = digitalRead(MOTION_SENSOR_PIN); // 센서 핀에서 모션 상태 읽기

움직임이 시작되는 시점을 확인하십시오 (핀의 상태가 LOW에서 HIGH로 변경됩니다).

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

핀의 상태가 HIGH에서 LOW로 변하여 움직임이 멈췄음을 알아내십시오.

prev_motion_state = motion_state; // 이전 상태 저장 motion_state = digitalRead(MOTION_SENSOR_PIN); // 새로운 상태 읽기 if (prev_motion_state == HIGH && motion_state == LOW) { // 핀 상태 변경: HIGH -> LOW Serial.println("Motion stopped!"); }

아두이노 나노 코드

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

사용 방법

  • 위의 코드를 복사하고 Arduino IDE에서 열어보세요.
  • Arduino IDE에서 Upload 버튼을 클릭하여 코드를 컴파일하고 Arduino Nano에 업로드하세요.
  • 시리얼 모니터를 엽니다.
  • 센서의 범위 안에서 손을 움직이세요.
  • 시리얼 모니터에서 출력을 확인하세요.
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

반복 트리거 모드: OUTPUT 핀의 상태는 (motion_time + time_delay)의 기간 동안 HIGH 상태를 유지합니다.

motion sensor repeatable trigger mode

테스팅

단일 트리거 모드:

  • 점퍼를 옮겨 단일 트리거 모드를 선택하세요.
  • 센서 앞에서 손을 약 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:

낮은 시간 동안(3초, 고정되어 조절할 수 없는 값) 센서는 어떠한 움직임도 감지할 수 없습니다. 이것은 실제로 문제를 일으키지 않습니다.

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

많은 실제 상황에서:

  • 인간이 존재하자마자 장치/기계를 켜거나 활성화합니다
  • 인간이 더 이상 존재하지 않은 바로 후에 장치/기계를 끄거나 비활성화하지 않습니다. 우리는 일정 시간이 지난 후에 장치/기계를 끄거나 비활성화합니다.

시간 지연 사용 방법

인간이 감지되지 않으면, 자동화 시스템은 조치를 취하기 전에 일정 기간 동안 대기할 것입니다.

모션 센서는 3초의 최소값부터 5분의 최대값까지 시간 지연을 설정할 수 있는 시간 지연 조절기를 가지고 있습니다. 추가적으로, 아두이노 나노 코드를 사용하여 시간 지연에 대한 어떤 값이든 설정할 수 있습니다.

아두이노 나노 코드에서 타임아웃을 지정하지 않으면, 타임아웃은 센서에 설정된 시간 지연과 동일하게 됩니다.

아두이노 나노 코드에서 타임아웃이 설정되면 센서 구성의 시간 지연과 아두이노 나노 코드의 시간 지연의 합계가 됩니다.

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

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

반복 가능한 트리거 모드가 활성화되면 코드의 지연 시간은 시간 지연 조절기를 통해 센서의 설정에서 설정된 time_delay에 30초가 더해진 값이 됩니다.

도전하세요

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

※ 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!