부품설명

자주 사용하는 부품들의 사용법에 대하여 알아봅니다.

적외선 인체감지 센서 모듈 사용하기

2014-08-05 15:16:54

 

개요

 

1) 적외선 인체감지 센서란 무엇인가?

 




 적외선 인체감지 센서(PIR센서, Passive Infrated Sensor)는 적외선을 통해 사람의 움직임을 감지하는 센서입니다. 

 

 일반 건물의 복도나 현관문 천장에 있는 조명 등에 설치되어 사람의 움직임이 감지되면 자동으로 조명을 켜주는데 이용되는 센서입니다.

 

 일정한 양의 적외선을 방출하는 물체가 움직이면 감지하기 때문에 움직임이 없을 경우 감지하지 못합니다.

 

 

 

2) 적외선 인체감지 센서 원리
 

pir sensor에 대한 이미지 검색결과

 

사람의 몸에서는 적은 양의 적외선을 방출합니다.

 

이 사람에 몸에서 나온 적외선이 적외선 인체감지센서의 집광렌즈 부분인 F-Lens(Fresnel Lends)를 통과하여 적외선 센서 부분에 닿게 됩니다. 적외선 센서에 닿은 적외선이 전압으로 출력되어 최종적으로 센서가 인체를 인식하게 됩니다.

 

proximity_pirlens.jpg

 

 

 

부품 목록

 

 

NO 부품명 수량 상세설명
1 오렌지 보드 (BLE) 1  
2 적외선 인체감지 센서  1  
3 케이블 7  
4 LED 1  
5 330Ω 저항 1  
부품명
  오렌지 보드 (BLE)
적외선 인체감지 센서
점퍼 케이블
LED 330Ω 저항
부품사진




적외선 인체 감지 센서

 

  • 유효 감지 거리 : 7m
  • 감지 각도 : 120도
  • 작동 전압 : 5V - 20V
  • PCB Dimension : 32mm*24mm

 

 

 

 

 

하드웨어 making

 

브레드 보드

1. 인체감지센서의 GND을 오렌지보드의 GND핀에 연결합니다.

2. 인체감지센서의 VCC핀을 오렌지보드의 5V핀에 연결합니다.

3. 인체감지센서의 OUT핀을 오렌지보드의 2번핀에 연결합니다.

4. LED를 브레드보드에 꽂습니다.

5. LED의 +극330Ω 저항의 한쪽 핀을 연결합니다. 

6. 330Ω 저항의 반대편 핀을 오렌지보드의 13번핀에 연결 합니다. 

7. LED의 -극을 오렌지보드의 GND핀에 연결합니다. 

 

 

 

 

 

소프트웨어 coding

 

/*
  제목  : 인체감지센서 사용하기
  내용  : 인체감지센서를 오렌지보드에 연결하여 사람의 움직임이 인식되면 내장LED를 켜고, 아니면 내장 LED를 꺼지도록 만들어봅시다.
*/

// 인체감지센서를 2번핀으로 설정합니다.
int motion = 2;
// 사용할 LED를 13번 핀으로 설정합니다.
int light = 13;

// 실행시 가장 먼저 호출되는 함수이며, 최초 1회만 실행됩니다.
// 변수를 선언하거나 초기화를 위한 코드를 포함합니다.
void setup() {
  // 인체감지센서의 핀을 INPUT으로 설정합니다.
  pinMode(motion, INPUT);
  // LED의 핀을 OUTPUT으로 설정합니다.
  pinMode(light, OUTPUT);
  // 시리얼 통신 속도 설정
  Serial.begin(9600);
}

// setup() 함수가 호출된 이후, loop() 함수가 호출되며,
// 블록 안의 코드를 무한히 반복 실행됩니다.
void loop() {
  // 적외선 인체감지 센서에서 값을 읽는다
  int sensor = digitalRead(motion);
  // 센서값을 시리얼 모니터에 출력
  Serial.println(sensor);

  // 센서값이 HIGH(1)일 경우 13번 LED를 한번 깜빡인다
  if (sensor == HIGH) {
    // 내장된 LED가 연결된 핀의 로직레벨을 HIGH (5V)로 설정하여, LED가 켜지도록 합니다.
    digitalWrite(light, HIGH);
    // 0.5초 동안 대기합니다.
    delay(500);

    // 내장된 LED가 연결된 핀의 로직레벨을 LOW (0V)로 설정하여, LED가 꺼지도록 합니다.
    digitalWrite(light, LOW);
    // 0.5초 동안 대기합니다.
    delay(500);
  }
}

 

 

 

 

소스코드 설명 

 

loop위에서는 핀번호의 선언과 setup()에서는 각각의 핀에 대한 Mode를 설정한다. 13번핀에서는 LED를 출력하기에 OUTPUT모드로 설정하고 적외선 센서가 연결된 2번핀에서는 센서값을 읽어야 하기 때문에 INPUT모드로 설정한다. 통신 속도는 기본9600으로 설정해준다.
 

void loop() {
  digitalWrite(light,LOW); // 13번 LED off
  
  delay(1000);
  
  int sensor = digitalRead(motion); //적외선 인체감지 센서에서 값을 읽는다
  Serial.println(sensor); //센서값을 시리얼 모니터에 출력
  
  if(sensor == HIGH) { //센서값이 HIGH(1)일 경우 13번 LED를 한번 깜빡인다
    digitalWrite(light, HIGH); 
    delay(500);
    digitalWrite(light,LOW);
    delay(500);
  }
}


loop에서는 센서값에 따라 13번 LED를 깜빡이게 되는데 센서값을 읽어 1이 출력될 경우에는 if문을 통해 13번 LED를 한번 깜빡이게 되고 센서값이 0일 경우에는 if문을 무시한채 loop문을 반복하게 된다. 

 

 

 

kocoafabeditor

항상 진취적이고, 새로운 것을 추구하는 코코아팹 에디터입니다!

적외선 센서, 아두이노, 오렌지보드

김원석 2015-05-14 00:32:57

안녕하세요. 글 잘읽었습니다 ㅎㅎ
다름이 아니라 제가 지금 공학설계과목 시간에 만들고 있는것이 딱 이 글에 나와있는 것인데요
제가 만들 것은 led가 브레드보드에 여러개(10개 가량) 연결되어있는 것이라
코드를 어떻게 사용해야 할지 막막해서요... 여러개일 경우 코드를 어떻게 쓰면 좋을까요?
물론 적외선센서가 10개 모두를 깜빡이도록 값이 설정되도록요..
답변 부탁드립니다.

김원석 2015-05-14 00:37:32

그리고 추가로 한번 인식될 때 15초 가량 led가 켜져있는 것으로 세팅하려는데
어떤 코드를 사용해야하는지 알려주시면 감사하겠습니다ㅎㅎ

수박쨈 2015-05-15 11:08:06

@김원석 LED를 어떻게 연결하느냐에 따라 방법은 달라집니다.
LED하나를 각각 아두이노 핀에 연결하는 경우에는(예를 들어 디지털 2번부터 10번까지 연결했을 경우)
for(int i = 2; i<=10; i++) {
digitalWrite(i, HIGH);
}
이런식으로 나타 낼 수 있고

아두이노 핀 하나에 여러개의 LED를 연결하는 경우에는 그 핀에 HIGH값을 넣어주면 됩니다. digital(핀번호, HIGH)

수박쨈 2015-05-15 11:12:24

LED를 15초간 켜져 있게 하려면 제일 간단한 방법은 delay(15000)을 주어서 15초간 HIGH상태를 유지하다가
LOW로 바꾸는 방법이 있습니다. 코드로 구현한다면

digitalWrite(LED핀번호, HIGH);
delay(15000);
digitalWrite(LED핀번호, LOW);

위와 같은 방법으로 구성이 가능합니다. 위와 같은 방법의 단점은 딜레이를 15초를 줌으로써 delay(15000)에서 코드는 15초간 멈춰있게 됩니다. 그렇기 때문에 LED가 켜져 있는 동안에는 센서에서는 아무런 감지를 할 수 없습니다.

아니면 타이머 인터럽트를 사용하여 인식될 경우에는 인터럽트 함수를 호출하여 LED를 15초간 켤 수 있습니다. 인터럽트함수의 경우에는 mstimer2.h를 보시면 될 듯 합니다.
인터럽트 함수는 delay(15000)과는 다르게 동시에 돌아갈 수 있기 때문에 delay()보다는 유연한 프로그래밍이 가능합니다. 링크 아래에 걸어드립니다.

http://kocoafab.cc/tutorial/view/460

김원석 2015-05-17 21:30:08

답변감사합니다!!
다른게 궁금해서 다시 여쭙습니다 ㅜㅜ
제가 지금 조도센서를 이용해서 어두울때 켜지고 밝을 때 켜지는 led를 만들었는데
코드 소스가
#define LED11 11
#define LED10 10
#define LED9 9
#define LED8 8
#define LED7 7
#define LED6 6
#define LED5 5
#define LED4 4
#define LED3 3
#define LED2 2
int val = 0;


void setup() {

pinMode(LED11, OUTPUT); pinMode(LED10, OUTPUT);
pinMode(LED9, OUTPUT); pinMode(LED8, OUTPUT); pinMode(LED7, OUTPUT); pinMode(LED6, OUTPUT);
pinMode(LED5, OUTPUT); pinMode(LED4, OUTPUT); pinMode(LED3, OUTPUT); pinMode(LED2, OUTPUT);



}

void loop() {

val = analogRead(0);

analogWrite(LED10, val/9); analogWrite(LED11, val/9);
analogWrite(LED9, val/9); analogWrite(LED8, val/4); analogWrite(LED7, val/4); analogWrite(LED6, val/9);
analogWrite(LED5, val/9); analogWrite(LED4, val/4); analogWrite(LED3, val/9); analogWrite(LED2, val/4);

delay(10);
}
이렇게 됩니다.
이상태에서 적외선센서를 사용해서 어두울 때 적외선센서가 사람을 인지하고 불이 켜지도록 만들려면
코드를 어떤식으로 바꿔야하나요?? if가 어디쯤에 들어가야하는지도 모르겠고 코드를 보시면 각각의 led를 하나씩 다 지정을 해주었는데 이 방법말고 어떤식하는게 좋을까요??
적외선센서가 배송이 안와서 시도를 못해보고 있는데 코드를 어떻게 사용하면 좋을지 알려주시면 정말 감사하겠습니다.

수박쨈 2015-05-18 19:31:47

변수 val이 조도센서의 값을 나타낸다면 그 아래쪽에 if문이 위치해야 겠죠
if(val <= 조도센서의 값) {
int IR = digitalRead(2);
if(IR == 1) {
LED모든 불 ON
}
}
위와 같은 방법으로 작성하시면 될 듯 합니다.

수박쨈 2015-05-18 19:34:25

코드를 하나하나 다 알려줄 수는 없는 점은 양해 부탁드립니다.

다만 알고리즘 자체는 설명해 드릴 수 있습니다.

조건문을 통해 조도센서의 값이 일정값 미만일 경우(어두울 경우) -> 적외선 인체 감지 센서로 값을 측정 -> 측정한 값이 사람을 측정한 값이 나올 경우 -> LED의 모든값을 digitalWrite(핀번호, HIGH)로 변경하여 LED를 켠다

위와 같은 방법으로 코드를 수정해 나가시면 됩니다. 가장 기초적인 방법인 만큼 어려운 부분이 아니니 쉽게 이해할 수 있을거라 생각합니다.

수박쨈 2015-05-18 19:35:32

그리고 코드를
for(int i = 2; i <=11; i++) {
 pinMode(i, OUTPUT)
}

이렇게 for문을 통해 묶어서 사용하시면 코드가 더 간결해지지 않을까 생각합니다^^;

김원석 2015-05-28 21:13:49

다시 물어서 죄송합니다.. 다름이 아니라 도서관에서 책을 빌려서 코드를 사용하려고 해봤는데 잘안되서 질문드립니다 ㅜㅜ 적외선센서가 인식을 하고 불이 켜져야 하는데 지금 만들어진것이 어두울때 조도센서가 인식이 되어 불이 10초간 켜지는 것까지 만들어졌습니다. 코드는 아래와 같습니다.
int val=0,i=0,timer=0;

float f;

//

void setup(){

for(i=2;i<=11;i++)pinMode(i, OUTPUT);

}

//

void loop(){

val=analogRead(0);

f=(float)val*5.0/1023.0; // 전압으로 변경


if(f>2.5){

for(i=2;i<=11;i++)digitalWrite(i,HIGH);
delay(10000);
}

else{

for(i=2;i<=11;i++)digitalWrite(i,LOW);

}

}

물어볼 것이 적외선센서가 인식을 하고 불빛이 켜지는 것으로 만들어야 하는데 (물론 어두울 때 조도센서가 인식을 하면) 코드의 시작을 어떻게 넣어햐할지 감이 안와서 질문드립니다. if를 사용해야 하는데 지금 조도센서는 아날로그로 들어가있고 적외선센서는 디지털로 들어가 있습니다.. int로 적외선센서를 잡는 부분부터 막히네요;; int로 센서잡고 void setup에서 pinmode input을 잡아준다고 해도 void loop에서 if라든가 어떻게 사용해야 할지 모르겠습니다 하나하나는 아니라도 어떤 코드로 시작하면 좋을지라도 부탁드립니다 ㅠㅠ 적외선센서 구매 링크는 http://www.daduino.co.kr/product/detail.html?product_no=197&cate_no=66&display_group=1 이곳입니다. 혹시 참고가 될지 몰라 링크겁니다..

김범수 2017-05-08 17:27:47

pir 센서를 가지고 sleep시킬 수 있을까요? 예를 들면 벨을 누르면(trigger) 동작을 한다던지...
보통 pir이 ready상태 후 인식을 시키는데 특정 상황을 만족했을때만 pir이 동작할 수 있을지 궁금하여 여기 적습니다.
배터리 타입으로 pir 센서를 계속 켜두면 너무 배터리가 너무 많이 소모해서요.

HR 2018-08-27 19:07:44

움직임이 감지하였을때 서보모터를 사용하여 작동할수있는 코드는 어떻게 더 추가해야 할까요??잘 모르겠어서 질문드려요!!!!

kocoafab 2019-01-07 11:48:55

@김범수
PIR 센서에 따로 Sleep하는 명령어는 없습니다. 슬라이드 스위치 같은 것을 이용해서 전원을 제어해줘야 합니다.

@HR
Sensor가 HIGH일 때 LED를 제어하는 부분에서 LED 대신 서보모터를 제어하는 부분을 넣어주시면 됩니다.
서보모터는 https://kocoafab.cc/tutorial/view/354 여기를 참고하세요

지영 2019-05-13 09:04:21

적외선 인체 감지 센서를 수중에서도 사용가능한가요??
그리고 수중생물도 감지 되나요??