오늘 제가 재미로 만들어본 것은 적외선 센서로 인체가 감지되면 능동 부저가 울리는 스크립트입니다.
라즈베리파이로 가장 먼저 손쉽게 할 수 있는게 GPIO 제어입니다.
GPI로 IR 센서 입력을 받고, 인체가 감지되면 GPO로 능동부저를 울리는 아주 간단한 구조입니다.
별반 어려운 것도 없고 특별한 것도 없지만, 우리 아들이랑 도둑놀이하면서 즐거운 시간을 보냈습니다.
그럼 어떻게 회로구성을 했고, 스크립트를 어떻게 작성했는지 설명드리겠습니다.
[준비물]
준비물은 아주 단촐합니다. 저항이나 컨덴서 같은 부품은 전혀 필요없습니다.
- 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에 의해서 스크립트가 종료됩니다.
[끝 맺음말]
좀 더 응용하면, 인체의 움직임이 감지되었을때 카메라를 촬영하여 메일을 자동으로 전송하는 방법도 가능하겠습니다.
<더보기>
'Study > 라즈베리파이 공부' 카테고리의 다른 글
[라즈베리파이] LED 4번 깜빡이는 부팅불량 발생시 조치방법 (0) | 2021.01.25 |
---|---|
[라즈베리파이] 현재 GPIO 출력값을 읽어와 토글 시키는 방법 (0) | 2021.01.24 |
라즈베리파이로 active buzzer 제어하는 방법 (0) | 2021.01.23 |
[라즈베리파이] GPO 포트로 LED 제어하기 (0) | 2021.01.22 |
[라즈베리파이] sudo: python: command not found 에러 발생시 조치방법 (0) | 2021.01.21 |