아두이노 우노 Q 모션 센서

이 튜토리얼은 Arduino UNO Q와 함께 HC-SR501 PIR 모션 센서를 사용하여 인간의 움직임을 감지하는 방법을 보여줍니다. 다음을 배우게 됩니다:

Arduino UNO Q 모션 센서

필요한 하드웨어

1×Arduino UNO Q 아마존
1×USB Cable for Arduino Uno Q 아마존
1×HC-SR501 모션 센서 쿠팡 | 아마존
1×점퍼케이블 쿠팡 | 아마존
1×(추천) 아두이노 우노용 스크루 터미널 블록 쉴드 쿠팡 | 아마존
1×(추천) Sensors/Servo Expansion Shield for Arduino Uno 쿠팡 | 아마존
1×(추천) 아두이노 우노용 브레드보드 쉴드 쿠팡 | 아마존
1×(추천) 아두이노 우노용 케이스 쿠팡 | 아마존
1×(추천) 아두이노 우노용 프로토타이핑 베이스 플레이트 & 브레드보드 키트 아마존
공개: 이 포스팅 에 제공된 일부 링크는 아마존 제휴 링크입니다. 이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.

HC-SR501 모션 센서 정보

hc-sr501 모션 센서

HC-SR501 PIR 센서는 인간이나 동물의 움직임을 감지합니다. 조명 자동화, 문 제어, 에스컬레이터 및 침입 감지에 일반적으로 사용됩니다.

핀아웃

HC-SR501은 세 개의 핀을 가지고 있습니다:

  • GND 핀: GND (0V)에 연결합니다.
  • VCC 핀: VCC (5V)에 연결합니다.
  • OUTPUT 핀: 움직임이 없을 때는 LOW, 움직임이 감지되면 HIGH를 보냅니다. MCU 디지털 입력 핀에 연결합니다.
hc-sr501 모션 센서 사용법 핀아웃

센서에는 감도 및 시간 지연을 조정하기 위한 한 개의 점퍼와 두 개의 포텐셔미터가 있습니다. 기본 설정으로 시작하세요 — 자세한 내용은 고급 사용법 섹션을 참조하세요.

작동 원리

HC-SR501은 적외선 복사의 변화를 감지하여 움직임을 감지합니다. 감지를 트리거하려면 대상이 다음을 충족해야 합니다:

  • 움직이고 있어야 함
  • 적외선 에너지를 방출해야 함 (인간과 동물은 자연적으로 이를 수행함)

OUTPUT 핀 동작:

  • 움직임 없음: OUTPUT은 LOW입니다.
  • 움직임 감지됨: OUTPUT이 LOW에서 HIGH로 변경됩니다.
  • 움직임 중지됨: OUTPUT이 HIGH에서 LOW로 변경됩니다.

초기 센서 설정

시간 지연 조정기나사를 완전히 반시계 방향으로 돌립니다 (최소 지연).
감지 범위 조정기나사를 완전히 시계 방향으로 돌립니다 (최대 범위).
반복 트리거 선택기점퍼를 반복 가능한 트리거 모드에 놓습니다.
아두이노 모션 센서 initial setting

배선도

Arduino UNO Q 모션 센서 연결 배선도

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

MCU 코드

Arduino UNO Q는 두 개의 프로세서를 가지고 있습니다: STM32 MCU (실시간 하드웨어 제어 처리) 및 Qualcomm MPU (Debian Linux 실행). 이 섹션에서는 STM32 MCU만 프로그래밍됩니다 — Linux 쪽은 유휴 상태입니다. 나중 섹션에서는 두 프로세서가 함께 작동하는 방법을 보여줄 것입니다.

/* * 이 Arduino UNO Q 코드는 newbiely.kr 에서 개발되었습니다 * 이 Arduino UNO Q 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/arduino-uno-q/arduino-uno-q-motion-sensor */ #define SENSOR_PIN 2 // The Arduino UNO Q pin connected to the OUTPUT pin of the motion sensor int motion_state = LOW; int prev_motion_state = LOW; void setup() { pinMode(SENSOR_PIN, INPUT); } void loop() { prev_motion_state = motion_state; motion_state = digitalRead(SENSOR_PIN); if (prev_motion_state == LOW && motion_state == HIGH) { // Motion detected — add your action here } else if (prev_motion_state == HIGH && motion_state == LOW) { // Motion stopped — add your action here } }

빠른 단계

  • Arduino UNO Q를 처음 사용하시나요? 진행하기 전에 아두이노 우노 Q 시작하기 튜토리얼을 따라 개발 환경을 준비하세요.
  • 구성 요소 배선: VCC → 5V, GNDGND, OUTPUT → 핀 2에 연결합니다.
  • 연결: USB-C 케이블을 사용하여 Arduino UNO Q를 컴퓨터에 연결합니다.
  • Arduino App Lab 열기: Arduino App Lab을 시작하고 Arduino UNO Q를 감지할 때까지 기다립니다.
  • 새 앱 만들기: 새 앱 만들기 버튼을 클릭합니다.
create new app in 아두이노 app lab on Arduino UNO Q
  • 앱에 이름을 지정합니다 (예: DIYables_MotionSensor).
  • 만들기를 클릭하여 확인합니다.
  • 새 앱 내부에 생성된 일련의 폴더와 파일이 표시됩니다.
아두이노 app lab app folders and files on Arduino UNO Q
  • sketch/sketch.ino 파일을 찾습니다 — 이것이 MCU 스케치를 붙여넣을 위치입니다.
  • 스케치 붙여넣기: 위의 MCU 코드를 복사하여 스케치 파일에 붙여넣습니다. 다른 파일은 기본값으로 유지합니다.
    • Install the library: Click the Add sketch library button (the open book icon with a + sign) in the left sidebar.
    add sketch 라이브러리 in 아두이노 app lab on Arduino UNO Q
    • Search for Arduino_RouterBridge created by Arduino and click the Install button.
    My Apps / DIYables Apps
    Run
    Bricks
    No bricks added...
    Sketch Libraries
    No sketch libra...
    Files
    python
    sketch
    .gitignore
    README.md
    app.yaml
    sketch.ino
    Add sketch library
    Arduino_RouterBridge Arduino

    This library provides a simple RPC bridge for Arduino UNO Q boards, allowing communication between the board and other devices using MsgPack serialization.

    0.4.1
    Install
    More Info
    • 업로드: Arduino App Lab의 Run 버튼을 클릭하여 STM32에 컴파일하고 업로드합니다.
    click run 버튼 in 아두이노 app lab on Arduino UNO Q
    • 테스트: 센서 앞에서 걸어봅니다. 아래 Bridge 섹션을 사용하여 Monitor에서 움직임 이벤트를 확인합니다.

    Linux + MCU Bridge 프로그래밍

    Arduino UNO Q는 함께 작동하는 두 개의 프로세서를 가지고 있습니다: MPU (Qualcomm, Debian Linux 실행) 및 MCU (STM32, Zephyr OS 실행). 이들은 Arduino_RouterBridge 라이브러리를 통해 RPC를 사용하여 통신합니다 — 절대 raw 시리얼 포트를 통해서가 아닙니다.

    • 모션 센서는 MCU (STM32)에 연결됩니다 — OUTPUT 핀이 핀 2에 있습니다.
    • MPU는 센서를 직접 읽을 수 없습니다 — MCU에서 Bridge.call("check_motion")을 호출하고, MCU는 센서를 읽고 모든 움직임 전환을 Monitor에 보고합니다.
    • MPU에는 Wi-Fi가 있습니다 — MPU는 Wi-Fi를 갖춘 전체 Debian Linux를 실행하므로 움직임 알림을 Telegram으로 전달할 수 있습니다.
    • 통신: Linux 쪽의 Bridge.call()이 MCU 쪽의 Bridge.provide()를 호출합니다 (digitalRead()만 사용되므로 — 하드웨어 출력 쓰기 없음).
    • ⚠️ 예약됨: /dev/ttyHS1 (Linux) 및 Serial1 (MCU)은 Arduino Router에서 사용됩니다 — 절대로 직접 열지 마세요.

    요약하면: MPU는 센서를 폴링합니다 → MCU는 핀을 읽고 전환을 보고합니다 → Monitor는 움직임 이벤트를 표시합니다.

    MCU 스케치 — Bridge를 사용한 모션 센서 감지:

    /* * 이 Arduino UNO Q 코드는 newbiely.kr 에서 개발되었습니다 * 이 Arduino UNO Q 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/arduino-uno-q/arduino-uno-q-motion-sensor */ #include "Arduino_RouterBridge.h" #define SENSOR_PIN 2 int motion_state = LOW; int prev_motion_state = LOW; void check_motion() { prev_motion_state = motion_state; motion_state = digitalRead(SENSOR_PIN); if (prev_motion_state == LOW && motion_state == HIGH) { Monitor.println("Motion detected!"); } else if (prev_motion_state == HIGH && motion_state == LOW) { Monitor.println("Motion stopped!"); } else { Monitor.println(motion_state == HIGH ? "Motion: ACTIVE" : "Motion: none"); } } void setup() { Bridge.begin(); Monitor.begin(); pinMode(SENSOR_PIN, INPUT); Bridge.provide("check_motion", check_motion); Monitor.println("Motion Sensor Bridge ready"); } void loop() {}

    Python 스크립트 (Arduino App Lab) — 0.5초마다 움직임 이벤트 폴링:

    /* * 이 Arduino UNO Q 코드는 newbiely.kr 에서 개발되었습니다 * 이 Arduino UNO Q 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/arduino-uno-q/arduino-uno-q-motion-sensor */ from arduino.app_utils import * import time def loop(): Bridge.call("check_motion") time.sleep(0.5) App.run(user_loop=loop)
    • 참고: MCU 스케치에서 Bridge.begin()이 호출되었는지 확인하고 Linux 쪽에서 Python 스크립트를 실행하기 전에 스케치가 업로드되었는지 확인하세요.
    • ⚠️ 경고: /dev/ttyHS1 (Linux에서) 또는 Serial1 (MCU에서)을 코드에서 직접 열지 마세요 — 이들은 Arduino Router에서 예약되어 있으며 접근하면 Bridge가 손상됩니다.

    빠른 단계

    • MCU 스케치 업로드: Arduino App Lab을 열고, 새 앱을 만들고, Bridge MCU 스케치를 sketch/sketch.ino에 붙여넣고, Arduino_RouterBridge 라이브러리를 설치하고, Run을 클릭합니다.
    • Python 스크립트 추가: 위의 Python 코드를 같은 앱의 Python 탭에 붙여넣습니다.
    • 앱 실행: Run을 클릭합니다 — Python은 0.5초마다 모션 센서를 폴링합니다.
    • 콘솔 확인: Console 탭을 열고 → MCU Monitor 하위 탭으로 이동하여 센서 앞에서 걸어봅니다.

    App Lab 콘솔 출력

    DIYables_Apps
    Stop
    sketch.ino
    1#include "Arduino_RouterBridge.h"
    Serial Monitor
    Python
    Message (Enter to send a message to "Newbiely" on usb(2820070321))
    New Line
    9600 baud
    Motion Sensor Bridge ready Motion detected! Motion stopped! Motion detected! Motion stopped!

    Telegram 통합

    Telegram을 통해 움직임 알림을 받습니다.

    아직 Telegram 봇이 없다면 계속하기 전에 아두이노 우노 Q - 텔레그램 봇을 보고 봇 토큰을 얻으세요.

    MCU 스케치: 이전 Bridge 섹션의 동일한 MCU 스케치를 유지합니다 — 변경할 필요가 없습니다. STM32에서 이미 업로드되어 실행 중인지 확인하세요.

    Python 스크립트 (Arduino App Lab) — 움직임 감지를 위한 Telegram 봇:

    /* * 이 Arduino UNO Q 코드는 newbiely.kr 에서 개발되었습니다 * 이 Arduino UNO Q 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/arduino-uno-q/arduino-uno-q-motion-sensor */ from arduino.app_utils import * import requests import time BOT_TOKEN = "YOUR_BOT_TOKEN" API_URL = f"https://api.telegram.org/bot{BOT_TOKEN}" last_update_id = 0 def send_message(chat_id, text): requests.post(f"{API_URL}/sendMessage", json={"chat_id": chat_id, "text": text}) def get_updates(): global last_update_id resp = requests.get(f"{API_URL}/getUpdates", params={"offset": last_update_id + 1, "timeout": 5}) return resp.json().get("result", []) def loop(): global last_update_id updates = get_updates() for update in updates: last_update_id = update["update_id"] msg = update.get("message", {}) chat_id = msg.get("chat", {}).get("id") text = msg.get("text", "").strip() if text == "/status": status = Bridge.call("check_motion") send_message(chat_id, status if status else "No motion state change since last check.") else: send_message(chat_id, "Commands:\n/status — check current motion sensor state") time.sleep(0.5) App.run(user_loop=loop)
    • 참고: YOUR_BOT_TOKEN을 Telegram의 @BotFather에서 얻은 토큰으로 바꾸세요.
    • /status를 전송하여 모션 센서 상태의 수동 확인을 트리거합니다.

    빠른 단계

    • MCU 스케치 업로드: 이전 섹션에서 Bridge MCU 스케치를 사용합니다 (아직 수행하지 않았다면 먼저 업로드하세요).
    • Telegram 스크립트 붙여넣기: 위의 Python 코드를 Arduino App Lab의 앱의 Python 탭에 복사합니다.
    • 토큰 설정: 스크립트의 YOUR_BOT_TOKEN을 실제 봇 토큰으로 바꾸세요.
    • 앱 실행: Run을 클릭합니다 — 봇이 Telegram 메시지를 수신 대기하기 시작합니다.
    • 테스트: /status를 전송합니다 — 봇이 현재 움직임 상태로 회신합니다.

    App Lab 콘솔 출력

    DIYables_Apps
    Stop
    sketch.ino
    1#include "Arduino_RouterBridge.h"
    Serial Monitor
    Python
    [2026-04-29 12:00:01] Telegram: /status [2026-04-29 12:00:01] Motion: none [2026-04-29 12:01:30] Telegram: /status [2026-04-29 12:01:30] Motion detected!
    Telegram
    Telegram 12:45
    Welcome to Telegram!
    ArduinoBot 10:19
    Chatting with Arduino...
    telegram-botfather
    BotFather Yesterday
    Your bot has been created.

    ArduinoBot

    bot
    Today
    /status
    10:15 AM ✓✓
    Motion: none
    10:16 AM
    /status
    10:17 AM ✓✓
    Motion detected!
    10:18 AM

    OpenClaw 통합

    아두이노 우노 Q - OpenClaw 튜토리얼의 지침을 참고하여 OpenClaw를 이 튜토리얼에 맞춰 조정할 수 있습니다.

    고급 사용법

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

    감지 범위 조정기

    감지 거리를 조정합니다 (약 3–7미터):

    • 완전히 시계 방향으로 — ~3미터.
    • 완전히 반시계 방향으로 — ~7미터.
    모션 센서 detection range

    시간 지연 조정기

    움직임 중지 후 보유 시간을 조정합니다:

    • 완전히 시계 방향으로 — ~5분.
    • 완전히 반시계 방향으로 — ~3초.
    모션 센서 adjust time delay

    반복 트리거 선택기

    모션 센서 trigger selection
    • 단일 트리거 모드: OUTPUT이 time_delay 동안 HIGH가 되었다가 3초 동안 LOW로 가서, 움직임이 계속되는 동안 반복됩니다.
    • 반복 가능한 트리거 모드: OUTPUT이 움직임의 전체 기간과 time_delay 동안 HIGH로 유지됩니다. 대부분의 응용 프로그램에 권장됩니다.

    ※ 주의:

    대부분의 응용 프로그램에서 반복 가능한 트리거 모드를 사용하세요. 실제 사용에서:

    • 사람이 감지되면 장치가 켜집니다.
    • 사람이 떠난 후 지연 시간이 지나면 장치가 꺼집니다.

    응용 프로그램/프로젝트 아이디어

    • 스마트 조명: 누군가가 방에 들어올 때 조명을 켜고, 떠날 때 끕니다.
    • 보안 알림: 움직임이 감지될 때마다 Telegram 메시지를 보냅니다.
    • 점유 카운터: 시간당 움직임이 시작되는 횟수를 세십시오.
    • 에너지 절약기: 움직임이 감지되지 않은 지 몇 분이 지난 후 기기를 종료합니다.

    도전 과제

    • 쉬움: 움직임이 감지될 때마다 LED가 3번 깜박이도록 만듭니다.
    • 중간: 움직임 이벤트를 타임스탬프와 함께 MPU의 파일에 기록합니다.
    • (고급: /status를 필요로 하지 않고) 움직임이 감지될 때마다 자동으로 Telegram 알림을 보냅니다.

    함수 참고 자료