[54호]고독사 예방을 위한 연동형 알림기
2018 ICT 융합 프로젝트 공모전 참가상
고독사 예방을 위한 연동형 알림기
글 | 한국폴리텍대학 김영철
1. 심사평
칩센 사회적 관심이 필요한 부분에 대한 작품으로 좋은 아이템 선정 같습니다. 실제 관련 개발 프로젝트 수행 과제가 몇차례 진행되었던 것으로 알고 있습니다. 다만, 주변 사람에게 433Mhz RF 로 알린다는 컨셉이 조금 부족한 것 같습니다. 고독사는 실제 소통이 안되는 독거 노인층에서 많이 발생하기 때문에 관공서와 연계되는 시스템이 필요해 보입니다.
뉴티씨 고독사가 현대의 문제점으로 떠오르고, 안타까운 상황들이 종종 연출되고 있는데, 이를 미리 알수 있도록 하는 시스템을 아이디어를 내고, 구현한 점에 박수를 쳐주고 싶습니다. 또한, 작품 구현중에 여러가지 기술적인 어려움들을 스스로 잘 헤쳐나간듯하여 좋은 점수를 드립니다. 다만, 조금 더 아이디어를 내서, 실용적으로 쓸 수 있도록 만든다면 좋을 것 같습니다.
위드로봇 인체 감지용으로 PIR 센서를 사용하는 경우, 움직이는 경우와 가만히 있는 경우에 대한 좀 더 면밀한 프로그래밍이 필요합니다.
2. 작품 개요
홀로 살다 아무도 모르게 죽음을 맞는 고독사가 잇따르고 있다. 1인 가구의 지속적인 증가와 함께 가족이나 이웃과의 단절, 경제적 궁핍 때문이다. 고독사를 예방하기 위해 일부 지차제에서 문안 순찰을 강화하고 있지만, 여전히 미약한 상황이다.
전문가들의 말에 따르면 주변에서 불이 켜졌는지 꺼져있는지 확인하고, 문을 열고 밖을 나오는지 아닌지 주변에서 관찰만 해도 고독사를 예방할 수 있다고 한다. 그래서 몸에 부착하지 않고, 인터넷, 블루투스 등처럼 비싸지 않는 RF 통신을 이용해 주변사람들에게 알려줄 수 있는 연동형 알림기를 제작하게 되었다.
3. 작품 설명
3.1. 주요 동작 및 특징
1. PIR 센서(인체적외선 센서)
PIR(Passive InfraRed sensor)센서는 적외선(빛)을 통해 움직임을 감지한다. 인체의 온도는 36.5℃이며, 이 온도는 적외선 범위이다. 그래서 적외선을 띈 물체가 움직이면 HIGH(1)의 신호를 출력하고, 변화가 없을 경우 LOW(0)의 신호를 출력한다. 내부에는 위의 사진처럼 사각형 모양의 센서가 내장되어 있고, 외부 렌즈는 감도 각도를 넓혀주는 역할을 한다.
2. 통신모듈
왼쪽부터 433㎒ 수신기, 송신기 모듈이다. 송신기에서는 수신기가 충분히 신호를 받을 수 있도록 적절한 전력으로 내보낸다. 수신기에서는 많은 잡음들 중 송신기에서 날아온 신호를 증폭해서 받아들인다.
3. LED(지시등)
다른 보드에서 RF 송신기에서 날아온 데이터를 수신하거나 인체적외선 센서에서 일정한 시간동안 LOW인 경우 위험 상태를 알리는 빨강색 불이 켜지도록 하였다.
3.2. 전체 시스템 구성
1. 전체 구성도
Arduino UNO를 3개(A, B, C)를 사용하여 각 보드마다 인체적외선 센서와 RF 송수신기를 연결하였다.
예를 들면 A보드에서 인체 움직임이 일정한 시간동안 없으면 소문자 a를 송신한다. B보드에서는 소문자 a를 수신하면, C보드한테 소문자 b를 송신한다. 또 C보드에서 소문자 b를 수신하면 A보드한테 a를 송신한다. 모든 보드에서 위험 상태를 알리는 불이 들어오면서 연동이 된다.
2. 보드 구성도
하나의 보드에 대한 그림이다. 해당하는 문자가 RF 수신기에 들어오면, RF 송신기에서 다른 보드에 문자를 전송하면서 위험 상태를 알리는 불이 켜진다. 또 인체적외선 센서에 일정한 시간동안 움직임이 없을 경우 RF 송신기를 통해 문자를 전송하면서 위험 상태를 알리는 불이 켜지도록 제작하였다.
3. 순서도
3.3 개발 환경
개발 언어 : C++
Tool : Arduino IDE
사용 시스템 : Arduino UNO
3.4. 테스트 및 디버깅
1. PIR 센서 테스트
노란색 선과 파랑색 선에 5V와 GND로 연결을 하고, 초록색 선에 디지털 7번 핀을 인가한 상태이다.
평상시 인체 적외선 센서는 시리얼 모니터에 0을 출력하다가, 입력이 없으면 5초 동안 카운트를 한다. 위의 사진은 1초 동안 움직임이 없어서 시리얼 모니터에 1을 출력하고 있다.
int sensor = 7;
const int ledPin = LED_BUILTIN;
const long interval = 1000;
unsigned long previousMillis = 0;
unsigned int cnt = 0;
void setup() {
Serial.begin(9600);
pinMode(sensor, INPUT);
pinMode(ledPin, OUTPUT);
}
void loop() {
unsigned long currentMillis = millis();
long state = digitalRead(sensor);
if(state == LOW){
if(cnt > 5)
Serial.println(“SEND”);
else if(currentMillis – previousMillis >= interval){
previousMillis = currentMillis;
cnt++;
}
}else{
cnt = 0;
}
Serial.println(cnt);
}
위의 소스의 기준으로 PIR 센서에 움직임이 없는 시간이 5초가 되면 SEND라는 메시지를 출력하도록 테스트를 했다.
2. 통신 모듈 테스트
인체 적외선 센서가 HIGH의 값일 때 초록색 LED는 켜진다. 위의 그림은 사람의 움직임을 감지하고, 인체 적외선 센서가 모두 켜진 상황이다.
A보드의 인체 적외선 센서가 LOW일 때 초록색 LED는 꺼지고, 일정한 시간이 지났다. 그래서 A보드는 B보드에 소문자 a를 송신하므로 위험 상태를 알리는 빨간색 LED가 켜진 상황이다.
3. 케이스 제작
점멸등 모형 감시카메라를 구입하여 케이스를 제작하였다. 보드, RF 송수신기 모듈 그리고 인체 적외선 센서를 케이스와 결합하였다.
3.5. 부품리스트
4. 회로도
#include <RCSwitch.h> void loop() { if(mySwitch.available()){ if(digitalRead(pirPin) == LOW){ // PIR센서의 입력이 없을때
const int pirPin = 7; // PIRsensor 선언
const int ledPin = LED_BUILTIN; // LED 선언
const long interval = 1000; // 1초로 일정 시간 선언
unsigned long previousMillis = 0; // 이전 시간 선언
unsigned int cnt = 0; // 카운트 변수 선언
RCSwitch mySwitch = RCSwitch();
void setup() {
Serial.begin(9600);
pinMode(ledPin,OUTPUT);
pinMode(pirPin, INPUT);
mySwitch.enableTransmit(8); // FS1000A에 8번핀을 할당한다.
mySwitch.enableReceive(0); // XY-MK-5V, 인터럽트 0번핀이 디지털 2번이다.
}
unsigned long currentMillis = millis(); // 현재 시간을 저장
int value = mySwitch.getReceivedValue();
if(value == 0)
Serial.println(“Unknown encoding!”);
else{
if(mySwitch.getReceivedValue() == ‘c’){ // 소문자 c를 수신했을때
mySwitch.send(‘a’, 24); // 소문자 a를 송신한다.
digitalWrite(ledPin, HIGH);
delay(300);
digitalWrite(ledPin, LOW);
delay(300);
}
}
}
if(cnt > 10){ // interval * cnt 값만큼 시간이 지나면 소문자 a를 송신한다.
mySwitch.send(‘a’, 24);
cnt = 0;
delay(500);
}else if(currentMillis – previousMillis >= interval){
previousMillis = currentMillis;
cnt++;
}
}else{ // PIR 센서가 HIGH일 때 카운트는 0이 된다.
cnt = 0;
}
}
2. 아두이노 우노 B보드
#include <RCSwitch.h>
const int pirPin = 7;
const int ledPin = LED_BUILTIN;
const long interval = 1000;
unsigned long previousMillis = 0;
unsigned int cnt = 0;
RCSwitch mySwitch = RCSwitch();
void setup() {
Serial.begin(9600);
pinMode(ledPin,OUTPUT);
pinMode(pirPin, INPUT);
mySwitch.enableTransmit(8);
mySwitch.enableReceive(0);
}
void loop() {
unsigned long currentMillis = millis();
if(mySwitch.available()){
int value = mySwitch.getReceivedValue();
if(value == 0)
Serial.println(“Unknown encoding!”);
else{
if(mySwitch.getReceivedValue() == ‘a’){ // 소문자 a를 수신했을때
mySwitch.send(‘b’, 24); // 소문자 b를 송신한다.
digitalWrite(ledPin, HIGH);
delay(300);
digitalWrite(ledPin, LOW);
delay(300);
}
}
}
if(digitalRead(pirPin) == LOW){
if(cnt > 10){
mySwitch.send(‘b’, 24);
cnt = 0;
delay(500);
}else if(currentMillis – previousMillis >= interval){
previousMillis = currentMillis;
cnt++;
}
}else{
cnt = 0;
}
}
3. 아두이노 우노 C보드
#include <RCSwitch.h>
const int pirPin = 7;
const int ledPin = LED_BUILTIN;
const long interval = 1000;
unsigned long previousMillis = 0;
unsigned int cnt = 0;
RCSwitch mySwitch = RCSwitch();
void setup() {
Serial.begin(9600);
pinMode(ledPin,OUTPUT);
pinMode(pirPin, INPUT);
mySwitch.enableTransmit(8);
mySwitch.enableReceive(0);
}
void loop() {
unsigned long currentMillis = millis();
if(mySwitch.available()){
int value = mySwitch.getReceivedValue();
if(value == 0)
Serial.println(“Unknown encoding!”);
else{
if(mySwitch.getReceivedValue() == ‘b’){ // 소문자 b를 수신했을때
mySwitch.send(‘c’, 24); // 소문자 a를 송신한다.
digitalWrite(ledPin, HIGH);
delay(300);
digitalWrite(ledPin, LOW);
delay(300);
}
}
}
· RF Link Datasheet
· 서영배, 대화하는 사물을 만드는 아두이노 통신프로젝트, 디지털북스
· 서영배, 아두이노 101, 한빛미디어