아두이노 레시피 : PIR센서 사용하기 - 기초편
# Recipe 3. PIR센서(인체감지센서) 기초 편

다들 학교에서 이런 거 한 번쯤 본 적 있지 않나요?
안녕하세요~ 아두이노 셰프입니다. 학교에 보면 교실문 천장에 CCTV도 아닌 것이 하나 달려있는데요. 평소에는 작동하지 않다가 밤에 누군가 침입했을 경우 이를 감지하는 인체감지 경보기예요. 또한 당장 건물 현관만 봐도, 사람이 지나들 때 자동으로 불을 켜주는 전조등을 쉽게 찾을 수 있어요. 이렇듯, 우리 삶에서 흔하게 볼 수 있는 이러한 ‘인체감지’ 기능은 사실 하나의 센서를 사용해요. 바로 PIR센서! 오늘은 이 PIR센서로 간단하게 LED를 켜고 끌 거예요~ 그럼 시작해 볼까요?

오늘의 재료 Ingredient
<메인 재료>
PIR센서 (모델명 : HC-SR501)

<그 외 재료>
아두이노 우노
암-수 점퍼 케이블(3개)
메이킹 방법 Steps
Step 1. 선 연결하기 Wiring


a. 센서의 GND는 아두이노의 GND에,
b. 센서의 VCC는 아두이노의 5V에,
c. 센서의 DigitalOut은 아두이노의 7번에 연결해 주세요.
- - - - - - - - - -
Step 2. 아두이노 코드 Code review
여러분의 요리가 훨씬 간편해질 수 있도록, 숙성이 필요한 코드는 언제나 제가 준비할게요ㅎㅎ
#define pir 7
//앞으로 D7핀을 ‘pir’이라 부르겠습니다. 선언합니다.
void setup() { //여기 안에 있는 코드는 딱 한번만 실행됩니다.
pinMode(pir,INPUT);
//아두이노의 D7핀을 INPUT 모드로 설정합니다. 이제 이 핀으로 값을 읽어들일 수 있습니다.
pinMode(LED_BUILTIN, OUTPUT);
//아두이노의 내장된 LED를 OUTPUT모드로 설정합니다. 이제 켜고 끌 수 있습니다.
}
void loop() { //위의 Setup() 실행 이후, 여기 안에 있는 코드는 무한히 반복실행됩니다.
int data = digitalRead(pir);
//여기 loop안에서만, ‘pir’에서 읽히는 정보를 ‘data’라 부르겠습니다.
if(data == 1){ //만약 읽은 data값이 1이라면,
digitalWrite(LED_BUILTIN, HIGH); //내장된 LED를 켭니다.
delay(1000); // 1초동안 켭니다.
}else{ //그게 아니라면,
digitalWrite(LED_BUILTIN, LOW); //내장된 LED를 끕니다.
}
Step 3. 동작시키기 Working
● 코드를 아두이노 우노에 업로드해 주세요.
● PIR센서에 손을 가까이 가져가보세요.
● LED가 켜지고 꺼지는 것이 보이나요?
Question. 원하는 대로 동작하지 않나요?
만약 센서가 잘 동작하지 않는다면 센서의 설정문제일 수 있습니다.
지금부터 어떻게 설정하면 될지를 알려드릴게요.
우리가 사용하는 HC-SR501은
지연시간, 민감도, (반복, 미반복) 모드를 지정해 줄 수 있어요.
지연시간 : 센서가 한번 감지를 했을 때
DigitalOut 핀으로 신호를 보내주는데,
이때의 지연시간을 조정할 수 있습니다.
만약 지연시간이 1초라면
신호가 1초 동안 (HIGH) 유지돼요.
민감도 : 민감도는 센서가 인체를
감지하는 거리범위를 설정하는 거예요.
만약 동작시켰는데, 계속 LED가 들어온다면
민감도가 커서 옆에 있는 여러분을 감지하고 있을 수도 있어요ㅎ
(지연시간과 민감도 모두
시계방향으로 돌리면 커지고
반시계방향으로 돌리며 작아진답니다.)
반복, 미반복 모드 : 센서 한쪽을 보면
핀 3개가 올라와 있고 거기에
점퍼캡이 써져 있을 거예요.
H는 반복 모드, L은 미반복 모드를 의미하는데요.
반복모드는 범위 안에 사람이 움직일 경우,
계속 HIGH신호를 내보내는 모드예요.
한번 감지된 사람도, 범위 안에서 지속적으로 움직이면
이를 감지하고 계속 신호를 보내요.
미반복모 드는 범위 안에서 사람이 한번 감지되면,
지연시간만큼만 신호를 보내고,
그 이후로는 신호를 내보내지 않아요.
때문에 한번 감지된 사람이
계속 움직여도 반응하지 않는답니다.
(점퍼캡을 H에 끼우면 반복모드로, L에 끼우면 미반복 모드로 동작합니다.)
뭔가 문제를 찾은 것 같나요? 원하는 세팅을 해주세요~
저는 간단하게, 점퍼캡을 H에 끼워서 반복모드로 하고, 지연시간과 민감도는 중간정도로 맞춰주었어요.
오늘의 레시피는 여기까지입니다~ 더 깊은 맛을 원하시는 분은 아래 과학시즈닝을 참고해 주세요!
“과학으로 양념하기” Seasoning
센서에 대한 과학적 원리와 세부내용으로 레시피에 더 깊은 맛을 넣어봅시다.
- - - - - - - - - -
센서에 대하여
과학원리
우리 몸이 열을 계속 방출한다는 사실을 아시나요?
절대영도(0 Kelvin / -273.15 °C) 이상인 물체는
모두 적외선의 형태로 열을 방출합니다.
PIR센서는 P'IR(적외선)'이라는 이름에서
알 수 있듯이 적외선을 감지하는 센서인데요.
이 적외선의 양을 감지해서
사람이 있는지 없는지를 확인한답니다.
당연히 사람이 있다면 그 사람의 열 때문에
더 많은 적외선이 감지되겠죠?
동작원리
이 센서는 스위치처럼 작동합니다.
그래서 어떤 감지되는 적외선의 양을 데이터로 받아볼 순 없고,
사람이 있을 때 전기신호를 보내고(HIGH),
아닐 때는 끌(LOW) 뿐이에요.
간단하죠?
그래서 아두이노가 아니어도
그 자체로 동작하기 때문에, DigitalOut 핀에
직접 LED등을 연결해서 회로를 꾸며도 된답니다.
그리고 센서를 보면,
둥그런 하얀 돔이 덮여 있는데요. 렌즈예요.
이 렌즈가 사방에서 오는 적외선을 센서에게 모아줘요.
그래서 범위 안에서는, 방향에 상관없이 감지할 수 있답니다.
- - - - - - - - - -
코드의 동작 알고리즘
알고리즘은 쉬운 말로 ‘진행절차’라고 할 수 있습니다.
코드가 어떻게 동작되는지 알아볼까요?
오늘 코드의 진행절차는 간단합니다.
"읽는다."→ "조건과 비교한다." →"조건을 실행한다."
지금까지의 센서와는 다르게
디지털신호(1,0)를 읽습니다.
그래서 들어오는 신호가 1이면 LED를 켜고,
아니라면 끕니다. 참 간단하죠?
digitalWrite함수로
디지털 신호(전기가 들어오는지 아닌지)를 읽고
if문과 else문으로
"만약 디지털 신호가 1이라면 LED를 1초간 켜고,
아니라면 꺼라"는 코드를 작성했어요.
- - - - - - - - - -
센서요약 카드
이름 : PIR센서
설명 : 인체감지 센서이다. 신체에서 방출되는 적외선을 감지하여 사람이 있으면 HIGH 신호를, 아니라면 LOW 신호를 내보낸다.
지연시간, 민감도(범위), 감지모드를 설정할 수 있다.
센서의 구성 : 연결핀으로는 GND, VCC, DigitalOut으로 구성되며, 지연시간과 민감도를 조절할 수 있는 가변저항과 감지모드(L/H)를 지정할 수 있는 핀과 점퍼캡이 있다.