Hardware | HC-SR501 PIR motion sensor

|

1. 시작하기

Motion sensor 를 이용하여, 사람을 감지하는 모듈을 만들어 보고싶었습니다.

오늘은 기본 구동 확인만 해 봅니다.


역시 구입은 AliExpress 죠!

이게 어떻게 1000원정도로 구입할 수 있는지, 감사할 따름입니다.



원리는 이렇다고 합니다.



Datasheet 입니다.

HC-SR501-PIR-Sensor-Datasheet.pdf



2. 외관

도착한 센서를 찍어 봤습니다.



커버 안에 센서가 보입니다.

커버를 통하여 넓은 범위를 커버하기 위함이라 합니다.





뒷면




3. 참고

보드를 보면 부품 실장이 되지 않은 부분이 있습니다.



바로 Photoresistor socket 과 Thermistor socket 입니다.

Photoresistor 를 실장하면, 동작하는 조건을 낮/밤 구분해서도 할 수 있을것 같습니다.


좀더 찾아보니, Photoresistor 를 같이 파는 사이트도 있는걸 보니, 실 구동도 가능해 보입니다.



Photoresistor 는 GL5528 이라는 규격을 사용하면 되겠네요.

다른 규격들을 살펴 보면, Ligth Resistance 와 Dark Resistance 가 다르네요.

나중에 기회되면 Photoresistor 를 추가하여 구축해보겠습니다.



Photoresistor 의 datasheet 입니다.

GL55 Series Photoresistor.pdf


Thermistor 에 대한 정보는 찾을 수가 없었습니다.

뭔가 알게되면 update 할께요.


또한, jumper 를 이용하여 모드를 변경할 수 있습니다.

여러 회사에서 제조되는 관계로 이 jumber 부분에 pin 이 실장되지 않는 제품들도 있더군요.

다행히 제가 구매한 제품은 점퍼가 살장되어 있었습니다.



Sensitivity 와 Time Delay 조정은 다음과 같이 합니다.






4. Sketch

회로 구성 및 정보는 아래 사이트를 참고하였습니다.

http://henrysbench.capnfatz.com/henrys-bench/arduino-sensors-and-input/arduino-hc-sr501-motion-sensor-tutorial/


Pin 배열 정보 입니다.

HC-SR501 PIR sensor | Arduino Nano
----------------------------------
         S          |     D8
         +          |     5V
         -          |     GND
----------------------------------

    Piezo busser    | Arduino Nano
----------------------------------
         S          |     D11
         +          |     5V
         -          |     GND
----------------------------------

Sketch 정보입니다. 여기저기 source 보고 짜집기 했습니다.

/*******************************************************

Uses a PIR sensor to detect movement, sounds a buzzer

*******************************************************/
//the time we give the sensor to calibrate (10-60 secs according to the datasheet)
int calibrationTime = 30;

int ledPin = 13; // choose the pin for the LED
int inputPin = 8; // 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
int pinSpeaker = 11; //Set up a speaker on a PWM pin (digital 9, 10, or 11)

void setup() {
pinMode(ledPin, OUTPUT); // declare LED as output
pinMode(inputPin, INPUT); // declare sensor as input
pinMode(pinSpeaker, OUTPUT);

//give the sensor some time to calibrate
Serial.begin(9600);
Serial.print("Calibrating sensor ");
  for(int i = 0; i < calibrationTime; i++) {
    Serial.print(".");
    delay(1000);
  }
  Serial.println(" Done!");
  Serial.println("SENSOR is ACTIVE now");
  delay(50);
}

void loop() {
  val = digitalRead(inputPin); // read input value
  if (val == HIGH) { // check if the input is HIGH
    blinky(); // blink LED when motion haas been detected
    // digitalWrite(ledPin, HIGH); // turn LED ON
    playTone(300, 160);
    delay(150);
    
    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
    playTone(0, 0);
    delay(300);

    if (pirState == HIGH){
    // we have just turned off
      Serial.println("Motion ended!");
      // We only want to print on the output change, not state
      pirState = LOW;
    }
  }
}

void playTone(long duration, int freq) {
  // duration in mSecs, frequency in hertz
  duration *= 1000;
  int period = (1.0 / freq) * 1000000;
  long elapsed_time = 0;

  while (elapsed_time < duration) {
    digitalWrite(pinSpeaker,HIGH);
    delayMicroseconds(period / 2);
    digitalWrite(pinSpeaker, LOW);
    delayMicroseconds(period / 2);
    elapsed_time += (period);
  }
}

void blinky() {
  for(int i=0; i<3; i++) {
    digitalWrite(13, HIGH);
    delay(200);
    digitalWrite(13, LOW);
    delay(200);
  }
}

빵판 구성입니다.



실제 구동하면서 Serial Monitor 입니다.



잘 동작합니다. 소리도 잘 나네요.



5. 실제 구성

실제 구성샷 입니다.




구동 동영상 입니다.





FIN

이제 뭘하지?


And