아두이노 모션감지센서 제어하기
오늘은 아두이노 모션감지센서에 대해서 알아보겠습니다. 모션감지센서는 말 그대로 사람의 움직임에 따라 센서가 감지되는 것으로 딱 움직임만 인식을 할뿐 정확한 동작이나 어느 특정 모션을 인식 하지는 못합니다.
그리고 동작감지센서는 우리 실생활에서 생각보다 쉽게 찾아볼 수 있는데요 현관이나 복도 등에서 자신이 다가갔을 때 가동으로 불이 켜지는 것을 본적이 있을것입니다.
이 때 사용하는 센서가 동작감지센서로 이 센서는 IR(적외선)센서와 같이 분류할 수 있습니다.
위 사진은 우연히 백화점 피팅룸에서 발견한 동작감지센서입니다.
이 시스템은 사람이 피팅룸에 들어갔을 때 내부의 센서가 사람의 동작을 인식하여 자동으로 내부의 불을 켜주는 것입니다.
그리고 오늘 우리가 만들어볼 동작감지센서 프로젝트 역시 위와 다르지 않습니다.
1. 동작감지센서
동작감지센서의 정식 명칭은 Pyro-electric IR 모션센서로써 위에서 설명한것과 같이 IR(적외선)센서의 일종입니다. 적외선 센서 앞에 둥근 반사판?을 사용해서 감지범위를 높여서 직진방향의 감지범위가 아닌 좀 더 광범위한 센서의 인식이 가능해집니다.
동작감지센서라는 명칭을 가지고 있지만 사람의 특정 모션을 잡아낼 수는 없습니다. 앞서 드린 설명과 같이 적외선 센서의 특성을 가지므로 사람의 동작이 감지 되었는가? 되지않았는가? 만을 감지할 수 있습니다.
2. 아두이노 연결방법
이 센서에는 3개의 핀이 있습니다. 쓰임은 물론 전원을 위한 Vcc, GND이며 남은 한가닥은 SIG 데이터 입력핀입니다.
그 밖에 처리는 센서 내부에서 해결하기 때문에 유저가 신경쓸 부분은 없습니다.
현재 그림에서 동작감지센서는 디지털핀에 연결되어 있습니다. 이렇게 연결하고 센서값을 확인했을때 감지가 되는가 되지않는가 즉 0, 1로 결과값이 출력됩니다.
그리고 이 데이터핀을 아날로그에 연결하면 670정도의 값이 나옵니다. 결과는 감지가 되는가 되지않는가로 똑같지만 출력되는 값이 다른것을 알 수 있습니다.
그리고 기분탓인지는 모르겠으나 저는 아날로그가 더 잘 되는것 같아 아날로그에 연결하여 센서를 사용했습니다.
센서 연결이 끝났다면 이제 작은 프로젝트를 진행해 보겠습니다.
오늘 배운 동작감지센서를 포함하여 앞서 배웠던 CDS센서와, LED를 이용합니다.
CDS센서와, LED의 사용방법은 아래 주소를 참고해 주시기 바랍니다.
LED : http://jagglife.tistory.com/11
CDS : http://jagglife.tistory.com/10
3. 미니 프로젝트
만들어볼 미니 프로젝트는 내 방에서 전등 스위치 없이 자동으로 전등을 켜는 장치입니다.
방에 들어갔을 때 문앞에서 센서가 인식하여 불을 켜주고 방을 나갈 때 센서가 다시 인식되어 불이 꺼지는 방식입니다.
물론 여러가지 변수가 있어 지금 하려는 프로젝트는 한없이 부족해 보일 수 있지만, 지금은 기초단계 강좌이기때문에 다른 환경변수는 무시하고 다음에 중급단계에서 제대로 만들어 보겠습니다.
4. 프로젝트 회로도
회로도는 위와 같습니다.
LED와 CDS센서제어를 해보셨다면 지금 위의 회로는 어렵지 않게 구성이 가능하리라 생각됩니다.
확실한 이해를 돕기 위해 동작감지센서, CDS센서, LED를 나누어 배치했습니다.
5. 아두이노 센서값 확인
앞으로 아두이노를 이용한 어느 프로젝트를 하더라도 가장 중요한 작업이 지금 센서값을 확인하는 작업이 될것입니다.
센서를 이용하려면 어떤 값이 입력되는지를 알아야 프로젝트에 사용할 수 있습니다.
"만약 센서값이 50이하 일 때 LED를 켜라" 같이 센서값을 모른다면 다음의 프로그램은 짤 수가 없죠.
int Led=11; int RIP=A5; int PR=A1; int sound=7;
void setup() { Serial.begin(9600); pinMode(RIP, INPUT); pinMode(sound, INPUT); pinMode(Led, OUTPUT);
}
void loop () { int CDS = analogRead(PR); int val = analogRead(RIP);
Serial.print("motion : "); Serial.print(val); Serial.print(", cds : "); Serial.println(CDS);
delay(100); } |
위 코드가 동작감지센서, CDS센서의 값을 하이퍼터미널로 확인하는 코드입니다.
이 코드를 그대로 활용하여 센서값의 범위를 찾으시길 바랍니다.
6. 미니프로젝트 프로그램
영상에서 동작하는 모습을 확인하실 수 있습니다.
마지막으로 위에서 설명한 프로젝트의 코드입니다.
int Led=8; int RIP=A5; int PR=A1; int flag = 0;
void setup() { pinMode(RIP, INPUT); pinMode(Led, OUTPUT); pinMode(PR, INPUT);
}
void loop() {
int cds_data = analogRead(PR); int motion_data = analogRead(RIP);
if(cds_data < 60 && motion_data > 10){ if(flag ==0) flag = 1; } if(cds_data > 70 && motion_data > 10){ if(flag ==1) flag = 0; }
if(flag == 1) digitalWrite(Led, HIGH); else if(flag == 0) digitalWrite(Led, LOW);
delay(4000);
} |