본문 바로가기

라즈베리파이

HC-SR501 적외선 모션감지센서 Python, C 소스코드

반응형

 

HC-SR501 적외선 모션감지센서 Python, C 소스코드

 

*적외선 감지 센서 모듈 내부에는 센서인 LHI778을 사용한다. 인체감지센서는 Pyroelectric ("Passive") InfraRed sensors 라고도 하며 일정한 적외선을 띤 물체가 움직이는 것을 감지하는 센서이며 주로 인체감지에 쓰인다. 적외선을 띤 물체가 감지되어 일정한 양의 적외선을 감지하게 되면, 출력을 내 보내고 적외선을 띤 물체가 없을 때는 출력을 내보내지 않는다. 돔 형태의 창(window)는 외부의 환경으로부터 센서 내부의 회로 및 감지부를 보호하고 원하는 파장대의 적외선만 통과시키는 광학 필터의 기능을 한다. 보통은 사람을 감지하여 일정시간 불을 켜는 용도로 사용한다.

돔 형태의 창(window)는 외부의 환경으로부터 센서 내부의 회로 및 감지부를 보호하고 원하는 파장대의 적외선만 통과시키는 광학 필터의 기능을 한다. 보통은 사람을 감지하여 일정시간 불을 켜는 용도로 사용한다.

아래는 인체감지 센서의 외관과 Pin 기능을 보여준다.

앞장에 설명한 사운드 센서와 거의 같은 방법으로 인체감지 센서를 테스트 한다. 전등에 사용되는 인체감지 센서는 감지가 된 후 약 5초 정도 전등을 키고 OFF 하는 방식인데 여기에서 사용한 인체 감지 센서도 같은 방식으로 동작한다. 그 외 필요한 설정은 아래 설정을 보고 시험해야 한다.

Calibration- 센서보정

감지 센서를 사용하기 전에 두 가지 컬리브레이션을 진행해야 한다. 아래[그림 8]을 보면 Sensitivity  Adjust 와 Time Delay Adjust 가 있다. Sensitivity  Adjust는 인체감지 센서의 민감도를 조절하는 가변저항이고, Time Delay Adjust 인체가 감지되어 출력핀이 하이가 유지되는 시간을 조절하는 가변저항이다. 

Sensitivity  Adjust 가변저항을 왼쪽 끝까지 돌리면 민감도가 가장 약하고, 오른쪽으로 돌리면 민감도가 증가한다. 실습시에는 왼쪽 끝으로 돌려서 민감도를 제일 약하게 하는 것이 편할 것이다. Time Delay Adjust 가변저항은 오른 쪽으로 돌리면 하이가 출력되는 시간이 길어지고, 왼쪽으로 돌리면 약 4초 후에 로우로 떨어지게 된다. 실습에서는 가장 왼쪽으로 돌려 일찍 로우상태(대기상태)로 되도록 하는 것이 결과를 확인하기 쉽다.

인체감지 센서 연결을 그림처럼 연결한다. 중요한 것은 어느 GPIO 핀에 연결되었는 지가 중요하고 프로그램 소스코드에서 맟춰준다.

 

센서의 자세한 스펙은 아래 링크에서 다운로드 한다. http://www.mpja.com/download/31227sc.pdf 에서 데이터 쉬트를 다운 받을 수 있다. 인체감지 센서를 시험하는 소스코드를 파이선과 C 코드로 올린다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#!/usr/bin/env python
#-*- coding: utf-8 -*-
 
import RPi.GPIO as GPIO   
import time  
 
#GPIO 핀 17,27을 사용한다.
GPIOIN = 17 
GPIOOUT = 27
 
#핀 넘버링을 BCM 방식을 사용한다.
GPIO.setmode(GPIO.BCM)   
print "HC-SR501 motion detection start"
#17번 핀을 입력용, 27번 핀을 출력용으로 설정한다.
#출력용 핀은 LED 상태를 확인하기 위해 사용하는 핀으로 실제 동작과는 무관하다.
GPIO.setup(GPIOIN, GPIO.IN)   
GPIO.setup(GPIOOUT, GPIO.OUT)   
try
    while True:  
        #HC-SR501센서의 출력 값을 읽는다.
        state =  GPIO.input(GPIOIN)
        if(state == True):
            print "state: Motion detected"
        else:
            print "state: No Motion"
        #HC-SR501센서의 출력 값을 LED로 보낸다.
        GPIO.output(GPIOOUT, state)  
        time.sleep(0.1)  
except KeyboardInterrupt:   
    GPIO.cleanup()       
print "HC-SR501 motion detection end"
 

C 로 구현한 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <wiringPi.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
 
#define GPIOIN         0
#define GPIOOUT         22
 
void read_sr501_dat()
{
    uint8_t State;
    int i = 0;
    pinMode( GPIOIN, INPUT );
    pinMode( GPIOOUT, OUTPUT );
    printf("Sensor start\n");
    /* detect change and read data */
    while (1){
        delay( 1000 );
        State = digitalRead( GPIOIN);
        printf("state = %d\n", State);
        digitalWrite( GPIOOUT, State);
    }
}
 
int main( void )
{
    //wiringPiSetup :: initialize wiringPi
    if ( wiringPiSetupGpio() == -1 )
        exit( 1 );
 
    read_sr501_dat();
    return(0);
}
 

 

 

 

 

반응형