'motion'에 해당되는 글 2건

  1. 2018.03.01 Hardware | HC-SR501 PIR motion sensor - 2 2
  2. 2017.05.07 Hardware | HC-SR501 PIR motion sensor

Hardware | HC-SR501 PIR motion sensor - 2

|

1. 시작


HC-SR501 을 가지고 움직임이 있을 시 반응하는 센서를 가지고 놀아 봤더랬습니다.


* Hardware | HC-SR501 PIR motion sensor

http://chocoball.tistory.com/entry/Hardware-HCSR501-PIR-motion-sensor


그러던 중, Photoresistor 단자를 발견합니다.



아래는 HC-SR501 회로도 입니다.



제조사의 사이트에 올라와 있는 회로도와 실제 기판을 봐도 이미 R3 (1MΩ) 이 실장되어 있어서,

제대로 된 값의 photoresistor 만 달면 기능하게 되어 있네요.


좀더 찾아 보니, 아예 세트로 파는 업자도 있습니다.



요는 photoresistor 를 이용하여, 항상 모션 탐지를 하는 것이 아니라,

어두워졌을 때에만 작동하도록 하는 것 입니다.


흠흠, 그럼 photoresistor 를 구입해야 겠죠?





2. Photoresistor 가지고 놀기


HC-SR501 에 photoresistor 를 붙여서 구동하기 위해, 우선 photoresistor 를 가지고 놀아봅니다.


* Hardware | Arduino 로 Photoresister 가지고 놀기 - 1

http://chocoball.tistory.com/entry/Hardware-Arduino-Photoresister-1


이때 구입한 제품이 GL5528.

간단한 동작을 확인 했으니, 본격적으로 HC-SR501 에 붙여 봅니다.





3. HC-SR501 에 납땜하기


Photoresistor 는 RL 이라는 자리에 납땜하면 됩니다.

+/- 전극 구분이 없어서 그냥 두 다리 고정하고 납땜하면 됩니다.



높이 잘 계산해서 올려주고요.



장착되면 위와 같은 모습이 됩니다.



다리를 옆으로 벌려서 흔들리지 않게 하고 납땜합니다.



짜잔 !!!




4. Layout 및 Sketch


구성은 예전 글에서 사용했던 구성과 sketch 와 완벽히 동일합니다.


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


회로 구성입니다.



Sketch 입니다.


/*******************************************************
 
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);
  }
}





5. 흠...


손으로 photoresistor 를 가리면 동작은 하는데, 기민하게 동작하지 않았습니다.


원래 회로는 short 된 회로인데,

photoresistor 를 연결하면 광원이 있는 곳에서 close 상태로 만들어 주어 모션 감지를 하지 않게 (disable) 됩니다.


주위가 어두워 지면 photoresistor 의 dark resistance 가 올라가

원래 회로가 가지고 있던 short 상태를 만들어 주는 것인데,

어정쩡하게 저항이 발생하면 제대로 short 된 상태로 넘어가지 못하는 것이었습니다.


뭔가 Photoresistor 가 망가졌나? 생각하고 다른 GL5528 센서로 교환하다, 옆에 있던 캐패시터 옆구리를 지져버렸습니다.

아놔...


다행히 기존에 구입해 놨던 capacitor 가 있어서 교체합니다.


* Hardware | AliExpress 에서 condenser 를 구입해 보자

http://chocoball.tistory.com/entry/Hardware-AliExpress-condenser-buy



기존의 capacitor 보다는 굵은 소자라 뭔가 신뢰가 가네요.






6. 다른 Photoresistor


Capacitor 를 교환했고, photoresistor 도 교환했음에도 불구하고 여전히 기민하게 동작하지 않습니다.

Photoresistor 를 가리고 한참 기다리고 있어도 운 좋으면 detecting 하고, 그렇지 않으면 아무 반응이 오지 않았습니다.


결국 구입한 photoresistor 의 수치적인 한계라고 확신하고, 다른 photoresistor 를 구입해서 테스트 해보기로 합니다.


처음 구입할때는 보이지 않았던, 5가지 묶음 세트가 있네요.

바로 구입합니다. (아니 왜 저 세트로 처음부터 안파냐고...)


* Photoresistor Kit 5Kindsx10pcs 5506 5516 5528 5537 5539 Light Dependent Resistor LDR Pack Photoresistor Package for Arduino

- https://ko.aliexpress.com/item/Photoresistor-Kit-5Kindsx10pcs-5506-5516-5528-5537-5539-Light-Dependent-Resistor-LDR-Pack-Photoresistor-Package-for/32812625860.html



각 소자 번호에 따라 어떤 값을 보이는지 테스트 해봤습니다.


* Hardware | Arduino 로 Photoresister 가지고 놀기 - 2

http://chocoball.tistory.com/entry/Hardware-Arduino-Photoresister-2


수치를 그래프화 해본 결과, 처음 구입한 GL5528 (녹색) 은 가장 어둡게 해도

dark resistance 가 조금 높게 나옵니다. (스펙상으로는 1MΩ 이긴 한데...)



확인 결과 새로 구입한 세트에 있는 5539 (하늘색) 이 더 높은 dark resistance 를 보여 줬습니다.

어둡게 하면 거의 short 상태를 만들어 줄 수 있을 것 같습니다.



수치적으로도 5MΩ 정도면 short 상황을 만들 수 있겠네요. 





7. 구동 확인


기존 GL5528을 제거하고 새로 구입한 5539 를 납땜해 주었습니다.

이제 대망의 마지막 확인 입니다.



5539 photoresistor 는 센서의 구불구불이 더 촘촘하네요.



어둡게 하면 의도대로 잘 동작합니다.



Photoresistor 에 샤프심 캡을 씌워, 어두운 상황을 만들어 동작 시키니 예상대로 반응합니다.




FIN


작년 7월에 처음 photoresistor 를 구매하여 실패의 실패를 거듭하여 겨우 확인 했습니다.

HC-SR501 센서는 이제 서랍으로 들어갈 수 있게 되었습니다.


Photoresistor 는 종류와 가용 범위가 많아서 잘 선택하고 사용해야겠습니다.


이제야 마음 편하게 다른 센서들 공부를 할 수 있겠네요.


And

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
prev | 1 | next