Pyroelectric (Passive) InfraRed motion sensor 모션센서

1. PIR 센서

PIR 센서는 적외선을 이용한 인체 움직임 감지센서입니다. 작고, 싸고, 저전력에 사용법도 쉬워서 건물에 많이 사용되곤 합니다. PIR, “Passive Infrared”, “Pyroelectric” 또는 “IR motion” 센서로 불리웁니다.

센서를 이용하기 위해서는 저항과 커패시터 등을 포함한 일련의 회로가 필요하기 때문에 보통 BISS0001 (“Micro Power PIR Motion Detector IC”) 를 이용합니다. BISS0001은 센서의 출력 값에 간단한 처리를 해서 Digital output pulse를 만들어주는 역할을 합니다. 일반적으로 건물의 특정 위치에 고정해서 많이 사용합니다.

Size: Rectangular
Output: Digital pulse high (3V, 모션 감지시), digital low when idle (모션 없을 때)
Sensitivity range: up to 20 feet (6 meters) 110° x 70° detection range
Power supply: 5V-9V input voltage,
BIS0001 Datasheet (the decoder chip used)
RE200B datasheet (most likely the PIR sensing element used)
NL11NH datasheet (equivalent lens used)

More links!

PIR 센서는 적외선에 민감한 특수 물질로 만들어진 두 개의 슬롯을 가지고 있습니다. 센서가 Idle 상태에서는 두 슬롯은 같은 IR 측정값(주의 사물이 발산하는 적외선 값)을 가지게 됩니다. 이 때 사람과 같이 따뜻한 체온을 가진 사물이 지나가면 먼저 두 개의 슬롯 중 하나의 슬롯이 이 변화를 감지합니다.(Positive differential change) 사람이 센서의 측정 영역을 벗어날 때에도 반대의 현상이 일어납니다.(Negative differential change) 이 변화가 모션측정 결과가 됩니다.

proximity_pirdiagram
PIR 센서 자체의 더 자세한 동작 원리는 링크를 참고하세요.

2. 연결방법

PIR 모듈은 제품에 따라 틀리겠지만 대부분 Ground, Power, Signal 3개의 핀을 가지고 있습니다. 파워는 3-5V DC 를 지원하는것이 일반적.

2-1. LED를 이용한 간단한 구성

PIR 센서를 테스트하는 가장 간단한 방법은 3-4개의 알카라인 건전지를 VCC, Ground 핀에 연결하고 Signal 핀에 빨간색 LED를 연결하는 것입니다.(빨간색 LED 가 푸른색, 녹색에 비해 저전압에 동작하므로 3.3V 전압에 더 잘 동작) LED 에는 220Ω 저항(100Ω ~ 1.0KΩ 사이면 OK)을 연결하고 Ground 핀으로 연결해줍니다. 연결한 모습은 아래 그림과 같습니다.

  • 배터리 (+) ==> 센서 (+)
  • 배터리 (-) ==> 센서 (-)
  • 센서 Out 핀 ==> 저항 ==> LED ==> 센서 (-)

proximity_pirtestbb

정상적으로 연결되었다면 배터리를 넣고 30-60초 가량 PIR이 안정화 될 때까지 기다려야 합니다. 이후 PIR이 모션을 감지할 때 output 핀은 3.3V – Hight 상태가 되며, LED에 불이 들어올 것입니다.

hc-sr501-300x225

LED에 불이 들어 온다면 PIR 센서 뒷면을 보고 위 사진과 같이 점퍼가 L position 에 있는지 확인하세요. 점퍼가 위와 같을 때는 동작을 감지했을 때 LED의 불이 계속 켜진 상태로 유지되지 않고 매 초 단위로 깜빡일 것입니다. 이것을 “non-retriggering” 이라고 부릅니다.

이제 점퍼를 H position으로 바꿔보세요. 이제 동작을 감지하는 동안 LED는 켜진 상태로 유지될 것입니다. 이것을 “retriggering” 이라고 합니다.

대부분의 어플리케이션에서는 “retriggering” (jumper in H position) 모드가 좀 더 쓰기 편할 것입니다.

PIR 센서는 두 가지 종류의 “타임아웃”을 제공합니다. 하나는 “Tx”  타임아웃으로 동작을 감지하고 얼마나 LED가 on 상태로 유지될 것인가를 결정합니다. 다른 하나는 “Ti” 타임아웃으로 동작이 없을 때 LED가 얼마나 오래동안 off 상태로 유지될 것인가를 결정합니다. 더 자세한 사항은 아래 링크를 참조하세요.

센서에는 2개의 가변저항 (VR1, VR2) 가 달려 있습니다. 제품에 따라 배치가 틀리기도 한데 각각 (모션이 감지됐을 때 HIGH 신호가 유지되는 시간) 그리고 (센서의 민감도)를 조절하는 역할을 합니다.

2-2. Micro-controller를 이용한 구성

PIR 센서를 micro-controller에 연결하는 것은 간단합니다. PIR은 모션이 감지됐을 때 OUT 핀으로 HIGH(5V) 신호를 줍니다. 따라서 아두이노 digital 핀에 연결해서 값이 HIGH 또는 LOW 인지 읽기만 하면 됩니다.

  • 아두이노 5V ==> 센서 (+)
  • 아두이노 GND ==> 센서 (-)
  • 아두이노 D2 ==> 센서 Out 핀

proximity_pirardbb

digital 핀에 high가 입력된다면 동작을 감지한 상태이며, low 는 동작이 없는 상태입니다. 물론 retriggering 상태로 동작하기 위해서는 점퍼를 H position에 맞춰줘야 합니다.

3. 예제 코드 (스케치)

여기서는 digital 2번 핀을 사용했으며 동작상태에 따라 serial 모니터로 메시지를 출력합니다.

/*
 * PIR sensor tester
 */
 
int ledPin = 13;                // choose the pin for the LED
int inputPin = 2;               // choose the input pin (for PIR sensor)
int pirState = LOW;             // we start, assuming no motion detected
int val = 0;                    // variable for reading the pin status
 
void setup() {
  pinMode(ledPin, OUTPUT);      // declare LED as output
  pinMode(inputPin, INPUT);     // declare sensor as input
 
  Serial.begin(9600);
}
 
void loop(){
  val = digitalRead(inputPin);  // read input value
  if (val == HIGH) {            // check if the input is HIGH
    digitalWrite(ledPin, HIGH);  // turn LED ON
    if (pirState == LOW) {
      // we have just turned on
      Serial.println("Motion detected!");
      // We only want to print on the output change, not state
      pirState = HIGH;
    }
  } else {
    digitalWrite(ledPin, LOW); // turn LED OFF
    if (pirState == HIGH){
      // we have just turned of
      Serial.println("Motion ended!");
      // We only want to print on the output change, not state
      pirState = LOW;
    }
  }
}

참고가 될만한 다른 소스 하나 더 올려드립니다. (출처 : http://www.arduino.info.pl/pir-hc-sr501-czujnik-ruchu/)

/* 
 * //////////////////////////////////////////////////
 * //making sense of the Parallax PIR sensor's output
 * //////////////////////////////////////////////////
 *
 * Switches a LED according to the state of the sensors output pin.
 * Determines the beginning and end of continuous motion sequences.
 *
 * @author: Kristian Gohlke / krigoo (_) gmail (_) com / http://krx.at
 * @date:   3. September 2006 
 *
 * kr1 (cleft) 2006 
 * released under a creative commons "Attribution-NonCommercial-ShareAlike 2.0" license
 * http://creativecommons.org/licenses/by-nc-sa/2.0/de/
 *
 *
 * The Parallax PIR Sensor is an easy to use digital infrared motion sensor module. 
 * (http://www.parallax.com/detail.asp?product_id=555-28027)
 *
 * The sensor's output pin goes to HIGH if motion is present.
 * However, even if motion is present it goes to LOW from time to time, 
 * which might give the impression no motion is present. 
 * This program deals with this issue by ignoring LOW-phases shorter than a given time, 
 * assuming continuous motion is present during these phases.
 *  
 */

// 5V left
// out midle
// gnd right
// connectors on bottom
/*
--------------------
|                  |
|                  |
|                  |
|       o o o      |
|      5V o GND    |
--------------------
*/
/////////////////////////////
// voltage 4,5-20V
//
//VARS
//the time we give the sensor to calibrate (10-60 secs according to the datasheet)
int calibrationTime = 15;        

//the time when the sensor outputs a low impulse
long unsigned int lowIn;         

//the amount of milliseconds the sensor has to be low 
//before we assume all motion has stopped
long unsigned int pause = 5000;  

boolean lockLow = true;
boolean takeLowTime;  

int pirPin = 3;    //the digital pin connected to the PIR sensor's output
int ledPin = 13;

/////////////////////////////
//SETUP
void setup(){
  Serial.begin(9600);
  pinMode(pirPin, INPUT);
  pinMode(ledPin, OUTPUT);
  digitalWrite(pirPin, LOW);

  //give the sensor some time to calibrate
  Serial.print("calibrating sensor ");
    for(int i = 0; i < calibrationTime; i++){
      Serial.print(".");
      delay(1000);
      }
    Serial.println(" done");
    Serial.println("SENSOR ACTIVE");
    delay(50);
  }

////////////////////////////
//LOOP
void loop(){

     if(digitalRead(pirPin) == HIGH){
       digitalWrite(ledPin, HIGH);   //the led visualizes the sensors output pin state
       if(lockLow){  
         //makes sure we wait for a transition to LOW before any further output is made:
         lockLow = false;            
         Serial.println("---");
         Serial.print("motion detected at ");
         Serial.print(millis()/1000);
         Serial.println(" sec"); 
         delay(50);
         }         
         takeLowTime = true;
       }

     if(digitalRead(pirPin) == LOW){       
       digitalWrite(ledPin, LOW);  //the led visualizes the sensors output pin state

       if(takeLowTime){
        lowIn = millis();          //save the time of the transition from high to LOW
        takeLowTime = false;       //make sure this is only done at the start of a LOW phase
        }
       //if the sensor is low for more than the given pause, 
       //we assume that no more motion is going to happen
       if(!lockLow && millis() - lowIn > pause){  
           //makes sure this block of code is only executed again after 
           //a new motion sequence has been detected
           lockLow = true;                        
           Serial.print("motion ended at ");      //output
           Serial.print((millis() - pause)/1000);
           Serial.println(" sec");
           delay(50);
           }
       }
  }

참고가 될만한 다른 소스 하나 더 올려드립니다. (출처 : http://www.arduino.info.pl/pir-hc-sr501-czujnik-ruchu/)

/* 
 * //////////////////////////////////////////////////
 * //making sense of the Parallax PIR sensor's output
 * //////////////////////////////////////////////////
 *
 * Switches a LED according to the state of the sensors output pin.
 * Determines the beginning and end of continuous motion sequences.
 *
 * @author: Kristian Gohlke / krigoo (_) gmail (_) com / http://krx.at
 * @date:   3. September 2006 
 *
 * kr1 (cleft) 2006 
 * released under a creative commons "Attribution-NonCommercial-ShareAlike 2.0" license
 * http://creativecommons.org/licenses/by-nc-sa/2.0/de/
 *
 *
 * The Parallax PIR Sensor is an easy to use digital infrared motion sensor module. 
 * (http://www.parallax.com/detail.asp?product_id=555-28027)
 *
 * The sensor's output pin goes to HIGH if motion is present.
 * However, even if motion is present it goes to LOW from time to time, 
 * which might give the impression no motion is present. 
 * This program deals with this issue by ignoring LOW-phases shorter than a given time, 
 * assuming continuous motion is present during these phases.
 *  
 */

// 5V left
// out midle
// gnd right
// connectors on bottom
/*
--------------------
|                  |
|                  |
|                  |
|       o o o      |
|      5V o GND    |
--------------------
*/
/////////////////////////////
// voltage 4,5-20V
//
//VARS
//the time we give the sensor to calibrate (10-60 secs according to the datasheet)
int calibrationTime = 15;        

//the time when the sensor outputs a low impulse
long unsigned int lowIn;         

//the amount of milliseconds the sensor has to be low 
//before we assume all motion has stopped
long unsigned int pause = 5000;  

boolean lockLow = true;
boolean takeLowTime;  

int pirPin = 3;    //the digital pin connected to the PIR sensor's output
int ledPin = 13;

/////////////////////////////
//SETUP
void setup(){
  Serial.begin(9600);
  pinMode(pirPin, INPUT);
  pinMode(ledPin, OUTPUT);
  digitalWrite(pirPin, LOW);

  //give the sensor some time to calibrate
  Serial.print("calibrating sensor ");
    for(int i = 0; i < calibrationTime; i++){
      Serial.print(".");
      delay(1000);
      }
    Serial.println(" done");
    Serial.println("SENSOR ACTIVE");
    delay(50);
  }

////////////////////////////
//LOOP
void loop(){

     if(digitalRead(pirPin) == HIGH){
       digitalWrite(ledPin, HIGH);   //the led visualizes the sensors output pin state
       if(lockLow){  
         //makes sure we wait for a transition to LOW before any further output is made:
         lockLow = false;            
         Serial.println("---");
         Serial.print("motion detected at ");
         Serial.print(millis()/1000);
         Serial.println(" sec"); 
         delay(50);
         }         
         takeLowTime = true;
       }

     if(digitalRead(pirPin) == LOW){       
       digitalWrite(ledPin, LOW);  //the led visualizes the sensors output pin state

       if(takeLowTime){
        lowIn = millis();          //save the time of the transition from high to LOW
        takeLowTime = false;       //make sure this is only done at the start of a LOW phase
        }
       //if the sensor is low for more than the given pause, 
       //we assume that no more motion is going to happen
       if(!lockLow && millis() - lowIn > pause){  
           //makes sure this block of code is only executed again after 
           //a new motion sequence has been detected
           lockLow = true;                        
           Serial.print("motion ended at ");      //output
           Serial.print((millis() - pause)/1000);
           Serial.println(" sec");
           delay(50);
           }
       }
  }

You may also like...