티스토리 뷰

 

아두이노로 움직임을 감지
아두이노로 움직임을 감지

 

저희 집 뒷마당에는 닭 세 마리가 살고 있는 닭장이 있습니다. 아이들이 강아지를 사 달라고 하도 떼를 써서 강아지 대신에 병아리로 합의를 보고 데려온 것이 지금은 매일 알을 2-3개씩 낳아주는 닭으로 컸습니다. 일주일에 두세 번은 사슴 가족들과 친분을 쌓는 시간도 가지고 있네요.

 

아두이노로 움직임을 감지
닭순이 세자매
아두이노로 움직임을 감지
동물 친목회

 

하지만 가끔씩 불청객들도 찾아오곤 합니다. 닭들의 천적인 여우, 너구리, 고양이들이 호시탐탐 노리고 있어서 뒤 뜰에는 움직임을 감지하면 자동으로 켜지는 등을 달아 놓았습니다. 닭들은 닭장 안에 있기 때문에 공격당할 일이 없지만 그래도 침입자들이 놀라서 도망가도록 아주 밝은 LED 등이 켜지도록 해두었습니다. 오늘은 아이들과 아두이노로 움직임을 감지했을 때 LED가 켜지는 프로젝트를 해볼까 합니다. 실생활에서 쓰이는 물건들을 직접 만들어 보는 것이 아이들의 창의력 향상에 도움이 될 거라 믿습니다.

 

목차

    1. 회로 구성

    모션센서 핀맵
    모션센서 핀맵

    이번 프로젝트에는 PIR 모션 센서와 LED 하나를 사용할 예정입니다. 우선 핀 구조는 그라운드, 시그널, 전원으로 구성되어 있습니다. 전원은 5V에 연결하시면 되고 시그널은 아두이노 시그널 핀에 연결하면 됩니다. 그리고 센서 옆쪽을 보면 감지 거리와 감지후 다음 감지까지 시간을 조절하는 다이얼이 있습니다. 용도에 따라 변경하면서 사용하시면 됩니다.

     

    Trigger mode select
    Trigger mode select
    Trigger pin map
    Trigger pin map

    모션 센서의 아래 부분을 보면 감지 모드를 선택하는 노란색 핀이 있습니다. 아주 간단히 설명하겠습니다.

    여기서 시간 다이얼은 3초로 세팅해 놨다고 가정하겠습니다.

    Single trigger mode : 물체를 한번 감지하면 3초 이후에 다시 감지 시작. 센서 앞에서 손을 계속 움직여도 센서에서는
    한번만 감지된 것으로 인식. 3초 이후에 다시 인식 가능.

    Repeatable trigger mode : 물체를 감지 후 3초 이내에 다시 물체가 감지되면 계속 감지하는 것으로 인식. 센서 앞에서 손을 계속 움직이면 계속 인식하고 있음. 마지막으로 감지된 후 3초가 지나야 감지되지 않은 것으로 판단함.

    센서 동작의 이해가 완료되었으니 회로를 구성해 보겠습니다.

    모션 센서의 시그널을 3번 핀에, LED 핀을 2번에 연결하였습니다.

    회로 구성
    회로 구성

    2. 소스 코드

     

    int LED = 2; // LED를 2번 핀에 연결
    int SENSOR = 3; // 모션 센서를 3번 핀에 연결
    int state = LOW; // 초기에는 움직임 감지 하지 않음
    int val = 0; // 센서의 값을 저장. 초기값 0


    void setup() {
    pinMode(LED, OUTPUT); // LED 핀을 출력으로 설정
    pinMode(SENSOR, INPUT); // 센서 핀을 입력으로 설정
    Serial.begin(9600); &// 시리얼 통신 시작 :
    }


    void loop(){
    int i;
    val = digitalRead(SENSOR); // 센서 값을 읽음

    if (val == HIGH) { // 센서에 물체가 감지되었을때
    digitalWrite(LED, HIGH); // LED가 켜짐
    delay(100); // 100ms 딜레이


    if (state == LOW) {
    Serial.println("Motion detected!"); // 움직임이 감지되었다는 메세지 출력
    for(i=0; i <=10; i++){
    Serial.println(state); // 감지되어있는 동안 상태를 10번 출력
    }
    state = HIGH; // 센서의 상태를 high로 변경
    }
    }
    else {
    digitalWrite(LED, LOW); // 물체가 감지되지 않은 경우 LED off
    delay(200); // 200ms 딜레이


    if (state == HIGH){
    Serial.println("Motion stopped!"); // 움직임이 없다는 메세지 출력
    for(i=0; i <=10; i++){
    Serial.println(state); // 감가 없는 동안 상태를 10번 출력
    }
    state = LOW; // 센서의 상태를 low 로 변경
    }
    }
    }

     

     

    3. 데모

     

    아두이노 움직임 감지 데모

     

    닭장 앞에 침입자들이 나타났을 때 아두이노로 움직임을 감지하여 우리 삼총사가 알 수 있게 닭장 안에 설지하자고 하네요.... 난감합니다.