본문 바로가기

Study/라즈베리파이 공부

[라즈베리파이] 적외선 센서로 인체의 움직임이 감지되면 부저가 울리는 python 예제

반응형

오늘 제가 재미로 만들어본 것은 적외선 센서로 인체가 감지되면 능동 부저가 울리는 스크립트입니다. 

라즈베리파이로 가장 먼저 손쉽게 할 수 있는게 GPIO 제어입니다. 

GPI로 IR 센서 입력을 받고, 인체가 감지되면 GPO로 능동부저를 울리는 아주 간단한 구조입니다. 

 

별반 어려운 것도 없고 특별한 것도 없지만, 우리 아들이랑 도둑놀이하면서 즐거운 시간을 보냈습니다. 

그럼 어떻게 회로구성을 했고, 스크립트를 어떻게 작성했는지 설명드리겠습니다. 

[준비물]

준비물 : IR 센서, 능동 부저, 소켓케이블(F-F)

준비물은 아주 단촐합니다. 저항이나 컨덴서 같은 부품은 전혀 필요없습니다. 

  • IR 센서 : 인체감지를 위한 센서입니다. 집에서 흔히 사용하는 센서등에 널리 사용되는 인체감지 센서입니다. 
  • 능동 부저 : 전원만 입력하면 소리가 나는 active buzzer를 사용하였습니다.
  • 점퍼케이블(Female-To-Female) : 라즈베리와 부품들을 연결할 점퍼용 소켓케이블입니다. 

[회로 구성]

 

총 2개의 부품이 사용되었습니다. 

IR 센서를 통해서 인체감지 신호를 받으면, 부저를 울리는 단순한 구조입니다. 

 

핀맵은 아래와 같습니다. 

 

부품 신호 이름 라즈베리파이 핀번호 포트명 비고
IR 센서 V 1 3V3 센서에 3.3V를 공급
G 39 GND GROUND
S 11 GPIO17 인체 감지 신호
부저 + 3 GPIO2 부저 출력
- 25 GND GROUND

 

[IR 센서 동작 원리]

제가 사용한 IR센서는 keyestudio의 PYE_IR라는 부품입니다. 인체의 움직임이 감지되면 감지 신호를 출력해주는 방식입니다. 

사람의 움직임이 감지되면 감지 신호가 On되고, 움직임이 없으면 일정 시간 이후에 감지 신호가 Off가 됩니다. 

움직임을 감지하는 센서이기 때문에, 가만히 있으면 센서의 신호가 Off 됩니다. 

 

V에 3.3V를 입력하고, G에 GROUND를 연결하고, S를 GPI에 연결하면 됩니다. 

자세한 내용은 https://wiki.keyestudio.com/Ks0052_keyestudio_PIR_Motion_Sensor 를 참조하시기 바랍니다. 

[동작 스크립트]

동작 스크립트는 아주 간단합니다.

ir.py 라는 파일을 생성해서 아래와 같이 작성합니다. 

#ir.py
  
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setup(17, GPIO.IN, pull_up_down = GPIO.PUD_DOWN)
GPIO.setup(2, GPIO.OUT)

input_prev = 0

while 1:
    input = GPIO.input(17)

    if input_prev != input:
        print("input : ", input)
        input_prev = input

    if input == 1:
        GPIO.output(2,GPIO.HIGH)
    else:
        GPIO.output(2,GPIO.LOW)

 

각 구분에 대한 간단한 설명은 아래와 같습니다.

 

#ir.py

파일명을 알려주는 주석입니다.

'#'으로 시작했기 떄문에 스크립트 수행에 전혀 영향을 미치지 않는 comment 입니다.

 

import RPi.GPIO as GPIO

라즈베리파이의 GPIO를 사용하기 위함입니다. 

단순한 import 뿐만 아니라 RPi.GPIO 를 GPIO라는 별명으로 사용할 수 있도록 합니다. 

python-rpi.gpio 패키지가 필요합니다. 

 

GPIO.setmode(GPIO.BCM)

GPIO의 핀번호를 BCM(Broadcom chip-specific pin numbers) mode로 설정합니다. 

 

GPIO.setup(17, GPIO.IN, pull_up_down = GPIO.PUD_DOWN)

GPIO17번핀의 Direction을 INPUT으로 설정하고, Pull Down 시킵니다. 

IR 센서의 인체 감지 신호를 수신하는 포트로 반드시 Pull Down으로 설정하시기 바랍니다.

만약, Pull Up으로 설정할 경우 인체감지 신호가 Off 되지 않거나 오동작하는 문제를 유발할 수 있습니다. 

 

GPIO.setup(2, GPIO.OUT)

GPIO2번핀의 Direction을 OUTPUT으로 설정합니다. 

HIGH가 출력되면 부저가 울리고, LOW가 출력되면 부저가 꺼집니다. 

 

input_prev = 0

이전 센서 입력 신호를 저장하는 변수입니다. 

센서 입력이 변경되었을 때만 센서의 상태를 출력하기 위함입니다. 

 

while 1:

무한루프를 돌립니다. 

지속적으로 센서 입력을 받고 처리하기 위함으로, Ctrl + C 입력을 통해서 스크립트를 종료시킬 수 있습니다. 

스크립트 종료하더라도 GPIO 레지스터에 마지막으로 설정한 값이 그대로 유지되므로, 부저가 On된 시점에서 Ctrl+C로 종료할 경우 부저가 계속 울릴 수 있으므로, 부저가 Off된 시점에서 Ctrl + C로 종료하시기 바랍니다. 

 

input = GPIO.input(17)

GPIO17번 포트의 신호를 읽어와서 input이라는 변수에 저장합니다. 

 

if input_prev != input:

    print("input : ", input)

센서값일 변경되었을때, 센서 신호를 표준출력에 출력합니다. 

인체가 감지되면 input : 1이 출력되고, 움직임이 감지되지 않으면 input : 0이 출력됩니다. 

 

if input == 1:

    GPIO.output(2, GPIO.HIGH)

else:

    GPIO.output(2, GPIO.LOW)

움직임이 감지되었을 때, 부저를 켜고, 그렇지 않으면 부저를 끕니다. 

 

[실행 방법]

$ sudo python ir.py

sudo 권한으로 ir.py라는 python 스크립트를 수행합니다. 

만약 제대로 설치되지 않을 경우 python과 python-rpi.gpio 패키지를 설치하시기 바랍니다. 

 

 

[실행 결과]

ubuntu@ubuntu:~/project/ir$ sudo python ir.py
ir.py:6: RuntimeWarning: This channel is already in use, continuing anyway.  Use GPIO.setwarnings(False) to disable warnings.
  GPIO.setup(2, GPIO.OUT)
('input : ', 1)
('input : ', 0)
^CTraceback (most recent call last):
  File "ir.py", line 11, in <module>
    input = GPIO.input(17)
KeyboardInterrupt

움직임이 감지되면, 표준출력에 1이 출력되면서 부저가 울립니다. 

 

움직임이 해제되면, 표준출력에 0이 출력되면서 부저가 꺼집니다. 

 

Ctrl + C를 누르면 KeyboardInterrupt에 의해서 스크립트가 종료됩니다. 

 

 

[끝 맺음말]

 

좀 더 응용하면, 인체의 움직임이 감지되었을때 카메라를 촬영하여 메일을 자동으로 전송하는 방법도 가능하겠습니다. 

 

<더보기>

 

라즈베리파이 Ubuntu Linux 초기 비밀번호

많은 사람들이 라즈베리파이를 시작할때 Raspberry Pi OS를 사용합니다. 반면, 저는 현업에서 Ubuntu Linux를 사용하던 개발자라서, 자연스럽게 라즈베리파이에 Ubuntu Linux를 설치하게 되었습니다. 저는

frankler.tistory.com

 

[라즈베리파이] 현재 시간 정보를 자동으로 가져와서 유지하는 방법

라즈베리파이는 현재 시간 정보를 유지하지 못합니다. 작고 저렴하지만 파워풀한 라즈베리파이에 RTC(Real Time Clock) 블록은 포함되어 있지 않습니다. 다시 말하면 라즈베리파이에는 현재 시간 정

frankler.tistory.com

 

[라즈베리파이] 발열 테스트 및 CPU 온도 확인 방법

라즈베리파이를 구입해서 며칠째 이것저것 살펴보는 중입니다. Idle 상태에서도 CPU 발열이 상당히 심하다고 했는데, 역시나 상당합니다. 방열판은 기본으로 장책해야 하는 것 같고, 가급적이면

frankler.tistory.com

 

라즈베리파이 SD카드 최소용량은 4GB면 가능합니다. (Ubuntu Linux Server 기준)

라즈베리파이를 구동하기 위한 SD카드 최소용량은 얼마면 될까요? 집안에 굴러다니는 4GB짜리 micro SD 카드로도 가능할까요? 정답지를 미리 공개하자면 '가능하다'입니다! 하지만 가급적 8GB 이상

frankler.tistory.com

 

인터넷 느림 문제점의 의외의 간단한 해결 방법 (불량 랜선 교체)

오늘 아침부터 갑자기 살인적인 인터넷 느림 증상을 경험했습니다. 인터넷이 느린 이유는 여러 가지가 있겠지만 이번의 경우는 어이없게도 잘못 만든 랜선의 문제였네요. 저는 상용 랜선도 사

frankler.tistory.com

 

반응형