June 24, 2018

디바이스마트 미디어:

[43호]Guardian Angel (Babycare)

Cap 2017-10-18 13-15-49-260

 2017 

ICT 융합 프로젝트 공모전우수상

: Guardian Angel (Babycare)

글 | 단국대학교 양지현, 우경은, 박건주

심사평
칩센 육아와 관련된 IT 기술은 언제나 hot item입니다. 특히 ‘만에 하나 라도’ 라는 것에 불안해 하는 영유아를 둔 부모에게 잘 와닿을 수 있는, 즉 상품적인 가치가 있을법해 보인다는 느낌을 받았고, 작품 제작에 있어서도 전반적으로 시스템 구성이 잘 되어 있고, 각 파트별 구성 요소에 대한 이해도도 높아 여러가지 면에서 기획이 잘 되어 있는 작품이라는 생각이 듭니다. 세부적으로 각 파트에 적절한 하드웨어 선정을 고민한 흔적과 함께 신호 및 시그널 처리 부분에 대한 명확성이 눈에 띄었습니다. 밴드 부분에 있어서 무선 전파의 감쇄를 저하시키지 않는 재질을 고려하는 부분은 필요할 것으로 보이네요. 개인적으로는 실제 완성품의 가격부분 등이 문제가 아니라면, 하나쯤 구비해 놓을 수도 있겠다는 생각이 듭니다.

뉴티씨 이 작품은 완성도가 뛰어나서 당장 상품으로 만들수도 있을 것 같습니다. 매우 좋은 아이디어입니다. 다만, 디자인과 경량화 관련 고민을 해야할 것입니다.

위드로봇 유사한 상용 제품과의 차별성 부분을 추가로 설명할 수 있으면 훌륭한 작품이 될 것 같습니다.

작품 개요
한 아기의 아빠가 아기와 함께 있다가 화장실이 급해 아기를 앉혀 놓고 잠시 자리를 비운 동안 아기가 심장마비로 사망했다는 뉴스를 본 적이 있습니다. 또한 아기는 돌연사하는 경우도 많고, 부모가 제 때 알아 차리지 못해 조치를 취하지 못한 경우도 많습니다. 이를 보고 아기의 상태를 실시간으로 알려주고 확인할 수 있다면 이런 상황을 피할 수 있지 않을까? 라는 생각을 하였습니다. 그래서 아기 모니터링 밴드를 만들게 되었습니다. 이 작품을 만들 때 고려 한 점은 다음과 같습니다.
1. 아기의 사망 원인 중 가장 큰 비중을 차지하는 부분은 아기의 갑작스러운 심정지와 무호흡 상태인 돌연사입니다. 심장박동수를 통해 숨을 쉬는지 안 쉬는지를 판단할 수 있으므로 심장박동 센서를 제작하여 측정해야 합니다.
2. 아기의 저체온방지를 위해 온도 센서를 달아 체온을 측정해야 합니다.
3. 아이의 모습을 실시간으로 볼 수 있도록 아기 옆에 인형을 두고 아기를 촬영하며 서버에 넘겨주는 방식으로 부모의 스마트폰 애플리케이션으로 볼 수 있게 합니다.
4. 아기가 뒤집었을 경우 그 상태로 오래 있게 되면 폐에 무리가 가서 숨을 못 쉬게 됩니다. 이를 방지하기 위해 아기가 뒤집힌 상태인지 파악해야 합니다.
5. 아기가 울 경우, 부모가 알게 된다면 적절한 조치를 취할 수 있으므로 아기의 울음소리를 파악하여 알려줍니다.
이 5가지의 사항을 중점으로 아기 상태를 측정할 수 있는 발찌와 부모의 팔찌, 스마트폰 어플리케이션을 만들었습니다.

44 ict 양지현 (1)

작품 설명
주요 동작 및 특징
이 작품은 아기의 심박수, 체온, 울음, 상태를 모니터링 할 수 있는 웨어러블 디바이스입니다. 이 작품은 밴드형 하드웨어, 아기 인형 하드웨어, 안드로이드 어플리케이션, 서버로 나누어 살펴 볼 수 있습니다.

구성
① Band (bracelet)
· CPU
· 센서부(심박동 센서, 적외선 온도 센서, 가속도 센서)
· 통신부(bluetooth)
· 배터리
· 프레임

② 아기 인형
· CPU
· 센서부(마이크센서)
· 통신부(bluetooth)
· 배터리

③ 안드로이드 어플리케이션

④ 서버

하드웨어-소프트웨어
① 밴드 – 심박동센서

44 ict 양지현 (2)
심장박동 센서의 기본원리는 PPG 측정과 같습니다. 아래 사진과 같이 LED를 사용하여 빛을 발산하면 손가락에 흐르는 혈류량에 따라 반사되는 양이 다릅니다. 적혈구가 많을수록 빛이 흡수되므로 반사되는 빛의 양이 감소합니다. Photo diode가 반사되는 빛을 전기신호로 바꾸어 줍니다. Photo diode로부터 출력되는 전기신호의 세기를 증폭시켜 ADC를 이용해서 디지털 값으로 변화시킵니다. 이를 심장박동수로 계산하면 됩니다. OPAMP와 2.34Hz를 cuf off 주파수로 가지는 low pass filter를 2개 구현하여 직렬로 연결하였습니다. 2.34Hz를 cuf off 주파수로 결정한 것은 최대 심장박동수를 150bpm(beat per minute)를 고려한 것입니다. 2.5Hz= 150beat/60sec이기 때문입니다.

44 ict 양지현 (3)
다음은 소스 부분 설명입니다. 위 그림에서 보듯이, 60초에서 x를 나누면 심장박동수입니다. 따라서 이를 구하는 소스로는 pulse의 상승 부를 파악하기 위해 pulse의 부분을 나눕니다. pulse 값이 30 ~ 1000 사이의 값일 경우, 상승 시점으로 간주합니다. 그때의 시간을 알아 nowtime이라는 변수에 저장합니다. 정확도를 위해 sampling을 하는데 상승 시점일 때 총 아홉 번으로 나누어 샘플링을 합니다. 샘플링 할 때의 시간을 lasttime 변수에 저장합니다. 아홉 번 샘플링 한 값들의 평균을 구하고 60초로 이를 나누면 심박 수를 구하게 됩니다.

② 아기 인형 – 마이크 센서
인터럽트를 써서 센서 ADC 값을 받아들이고, FIR 필터를 사용하여 주변 소리를 제거하여 아기 울음소리만 추출합니다. Filtering은 신호처리의 핵심적인 과정으로 어떤 신호에 대한 스펙트럼을 원하는 주파수 대역만큼 제한시키는 주파수 선택 회로입니다. 여기서 원하는 주파수 대역은 통과 대역(passband)이 되고 원치 않는 대역은 차단 대역(stopband)이 됩니다. FIR 필터 소스는 ‘디지털 신호 처리 공학’이라는 수업에서 배운 이론을 바탕으로 짰습니다. FIR 필터는 입력신호의 유한한(Finite) 값들만을 가지고 필터를 하는 디지털 필터입니다.

먼저 Matlab을 이용하여 소스를 구현했습니다. 몇 개의 아기 울음소리파일을 Matlab으로 분석해 본 결과, 잡음을 제거하기 위해서는 저주파 영역을 통과시키고 고주파를 차단하는 Low Pass Filter를 설계해야 한다는 것을 알 수 있었습니다. 주파수 spectrum을 확대해 본 결과, 0.12π까지 거의 90%의 음성신호가 분포되어 있다는 것을 알 수 있었습니다. 따라서 Pass band = 0.12π 로 설계했습니다. 마찬가지로 0.54π~0.6π 사이에 진폭이 큰 잡음이 시작되는 것을 보아 stop band는 0.54π로 설계했습니다. 필터의 차수를 결정하여 주파수 대역폭을 설정해 주어야 하는데, pass band(0.12π)에서 통과되는 음성신호 90% 제외한 나머지 10%가 주파수 대역폭 안으로 포함될 수 있도록 설계합니다. 따라서 약 0.3π로 주파수 대역폭을 설정했습니다. FIR 필터 중 창 함수 법을 사용했습니다. Non-causal infinite impulse response의 특성을 가진 적당한 이상적 주파수 선택적 필터를 고르고 선형 위상 인과적 FIR 필터를 얻기 위해, 임펄스 응답을 잘라내는 방식입니다. 이 방식을 이용하여 잡신호를 제거하고 원래 음성신호를 복원해 아기 울음소리를 구분하였습니다.
전체적인 신호처리 과정은 다음과 같습니다. MIC 센서를 사용하여 아날로그 값을 받습니다. 그다음, ADC 변환 소자를 사용하여 디지털 값으로 변환시킵니다. 변환된 값을 FIR 필터 처리를 하여 주변 잡음을 잡아내어 아기 울음소리인지 판단합니다. 아기 울음소리라면 부모에게 알리게 됩니다.
아직 모든 상황에서의 완벽한 잡음처리는 되지 않지만, 제가 여태 테스트해 본 음성들은 아기 울음소리만 파악할 수 있었습니다. 그래서 현재, 여러 상황에서 테스트하고 있습니다.

소프트웨어
안드로이드 APP
BPM , Temperature, Camera/album 총 세부분으로 나눌 수 있습니다.
■ BPM : 먼저 서버에서 심박 수를 받아와야 하기 때문에 JSON parsing을 합니다. 파싱이란, 컴퓨터에서 컴파일러 또는 번역기가 원시 부호를 기계어로 번역하는 과정의 한 단계로, 즉 원시 프로그램에서 나타난 토큰(token)의 열을 받아들여 이를 그 언어의 문법에 맞게 구문 분석 트리(parse tree)로 구성해 내는 일입니다. 그 중 저는 JSON이라는 파싱을 사용하였습니다. 전달받은 데이터가 없다면, 정보조회를 진행할 필요가 없으므로 doinBackground 함수를 사용하여 정보조회를 진행할 데이터가 넘어왔는지 검증했습니다. JSON 형태로 받은 데이터를 보관할 String을 선언해주고, JSON Format의 정보를 받아서 모바일 앱에서 필요한 정보만 꺼내옵니다. 생성자가 JSON String을 받아들여서 우리가 처리하기 쉽게 Object hierarchy에 넣어 주어 설정해 놓은 변수에서 불러오면 됩니다.

44 ict 양지현 (7)

44 ict 양지현 (4)

시각적으로 표현하기 위하여 progress bar를 구현하여 최대 150bpm에서 몇을 차지하였는지 보여 주었습니다. 또한, 막대 그래프와 꺾은선 그래프를 이용하여 현재까지 측정했던 데이터들과 평균을 보여줬습니다.
현재까지의 측정 기록을 볼 수 있도록 DB를 구축했습니다.

44 ict 양지현 (6)

SQL을 사용하여 table을 생성하고 날짜, bpm를 저장하여 보여줍니다. 이 db를 사용하여 list array로 보여주며, graph를 보여줄 때도 사용됩니다.

■ Temperature : 체온을 온도계 그림으로 애니메이션 효과를 주기 위하여 Canvas 함수를 이용하여 온도계를 그려주었습니다. 체온도 bpm과 마찬가지로 서버에서 JSON parsing을 해와서 정보를 보여줬습니다.
위의 소스는 tem(Json 파싱해온 값)의 값을 온도계의 전체 범위로부터 빼서 온도가 올라가는 애니메이션 부분 알고리즘입니다.

44 ict 양지현 (5)

서버
라즈베리파이를 이용하여 서버 구축을 하였습니다. mysql을 이용하여 db를 구축하였고 php언어를 사용해 html 홈서버를 구축하였습니다.
안드로이드에서 json 파싱을 해주어야 하기 때문에 json 언어로 바꾸어 주었습니다. 아기가 울 때, 뒤집었을 때 부모의 핸드폰에 카카오톡 같은 알림 메시지가 보내지게 하기 위하여 FCM을 구축하여 사용했습니다.

44 ict 양지현 (8)

카메라 (라즈베리파이)
라즈베리파이 카메라를 사용하여 스트리밍을 통해 어플에서 보여줍니다. mjpg-streamer를 이용하여 url을 통하여 어플에서 불러와서 보여줍니다.

44 ict 양지현 (9)

44 ict 양지현 (1)

44 ict 양지현 (2)

44 ict 양지현 (10)

44 ict 양지현 (11)

44 ict 양지현 (12)

44 ict 양지현 (13)

44 ict 양지현 (14)

44 ict 양지현 (3)

전체 시스템 구성

44 ict 양지현 (15)

개발 환경(개발언어, Tool, 사용시스템 등)
개발언어 – C언어 /java
개발 Tool에서 쓰이는 언어가 C언어이기 때문에 자연스레 C언어를 이용하여 코딩 및 소스구현을 하게 되었습니다.
안드로이드 스튜디오에서 쓰이는 언어는 java이기 때문에 java 공부를 하고 이용했습니다.

개발 Tool – 아두이노 개발툴(IDE), 안드로이드 스튜디오, 라즈베리파이 Linux
아두이노 프로미니를 사용하였기 때문에 아두이노 개발툴을 사용했고, 안드로이드 어플을 만들기위해 안드로이드 스튜디오를 사용했습니다. 또한 서버와 인형 하드웨어에 라즈베리파이를 사용하여 Linux 개발 tool을 사용했습니다.

사용 시스템 – Arduino pro mini
아두이노 프로 미니를 선정하게 된 이유는 첫째, 가능한 작은 mcu를 찾고 있었기 때문입니다. 또한 처리속도에 고속이 필요하지 않기 때문입니다. 아두이노는 알고리즘 코딩만 하면 쉽게 사용할 수 있으므로 여러 mcu 중 가장 적합하다고 생각하여 메인 mcu로 사용하였습니다.

사용 시스템 – 라즈베리파이3
라즈베리파이를 선정하게 된 이유는 서버를 구축하기 위해서입니다. 리눅스 환경의 OS를 가지고 있고 MYSQL 등 db 구축도 쉽기 때문에 선택하게 되었습니다. 또한, 인형 하드웨어에서 쓰인 라즈베리파이를 선택한 이유는 900MHz의 빠른 속도와 1GB의 넉넉한 램 용량, 저렴한 가격 및 많은 GPIO 핀을 보유하고 있어서입니다. ADC 핀이 따로 존재하지 않다는 불편한 점이 있지만, 신호처리도 유용하고 아두이노와 블루투스 통신을 통해 데이터를 주고받아야 했기 때문에 라즈베리파이를 선택했습니다.

44 ict 양지현 (16)

단계별 제작 과정
계획 세우기 및 사전조사(2017.01.02 ~ 2017.01.09)
프로젝트 주제를 정하고 그에 대한 사전조사를 인터넷 및 관련 사람들을 대상으로 조사하여 문제점, 주요특징, 앞으로의 전망 등을 충분히 조사를 하였습니다.

해당 작품 공부 및 제작 준비(2017.01.10 ~ 2017.01.30)
안드로이드 어플을 만들기 위해 사용한 언어는 java였습니다. 이를 위해 java 공부를 하였고, 리눅스 용어 공부도 하였습니다.
심장박동 센서 회로설계 공부를 하고 mic 센서를 통한 fir 필터 처리를 위해 matlab 문법 공부와 fir 필터에 대해 다시 공부했습니다.

하드웨어 제작(2017.01.31. ~ 2017.02.06)
심장박동센서 회로를 토대로 하드웨어를 제작하였고, 3D프린터와 아크릴 제작등을 이용하여 팔찌의 형태를 갖췄습니다. 또한 인형부분 마이크 센서와 카메라 부분도 제작하였습니다.

마이크센서와 라즈베리파이의 신호처리(2017.02.07. ~ 2017.02.15)
소리의 값을 받아와 라즈베리파이의 adc핀(adc변환소자 이용)에 연결 및 디지털 데이터를 뽑아내어 FIR 필터 알고리즘을 거친 변환 데이터를 걸러낸 후 안드로이드 FCM을 구축하여 안드로이드에 알림메시지를 띄웠습니다.

안드로이드 제작 , 서버제작 (2017.02.15. ~ 2017.03.25)
라즈베리파이를 이용하여 서버를 구축하고, db table을 만들어 아두이노와 라즈베리파이로부터 센서 값을 받아와 저장합니다. 안드로이드의 UI와 서버로부터 Json parsing을 통해 값을 받아와 보여줍니다. FCM 테스트를 통해서 안드로이드에 값이 전달되는 것을 확인할 수 있었습니다.

전체적인 연동 및 테스트 (2017.03.25. ~ 2017.04.30)
아두이노 + 라즈베리파이 + 서버(라즈베리파이) + 안드로이드를 연동시켜서 테스트를 하고 있습니다. 아직 아기에게 직접 착용하여 테스트는 하지 못하였지만, 많은 사람들에게 테스트를 해본 결과, 잘 작동하고 있습니다. 앞으로 아기들에게도 테스트하여 계속해서 디버깅하고 좋은 착용감을 위해 하드웨어 부분도 다시 고려하려 합니다.

기타(회로도, 소스코드, 참고문헌 등)
회로도

44 ict 양지현 (4)

44 ict 양지현 (17)

소스코드
심장박동센서 코드

#include “Heartrate.h”

int num[sample_num] = { 0 };

int getnum(int pin)
{
numcnt++;
if (numcnt >= sample_num){
numcnt = 0
}
num[numcnt] = analogRead(pin);
return(num[numcnt]);

}

int getCnt(void)
{
return(numcnt);
}

int GetRate(void)
{

static int flag
static unsigned long sampleTime[10];
unsigned long numTime_
int cnt

if (numcnt){
cnt = numcnt – 1
}
else{
cnt = sample_num – 1
}
if ((num[numcnt]>1000) && (num[cnt]<70)){
nowTim = millis();
int time = nowTim – lastTim
lastTim = nowTim

if (time>300 && time<2000){
sampleTime[flag++] = time
if (flag > 9)flag = 0
}
int array[10] = { 0 };
for (int i = 0 i<10 i++){
array[i] = sampleTime[i];
}
int array_ = 0
for (int i = 9 i>0 i–){
for (int j = 0 j<i j++){
if (array[j] > array[j + 1]){
array_ = array[j];
array[j] = array[j + 1];
array[j + 1] = array_
}
}
}

array_ = 0
for (int i =3 i <= 7 i++){
array_ += array[i];
}

numTime_ = 300000 / array_///<60*1000*
return((int)numTime_);
}
return(0);

}
int getRate(void)
{
return(GetRate());

}

안드로이드 코드

43 ict 양지현 40 43 ict 양지현 41

43 ict 양지현 42

43 ict 양지현 43

43 ict 양지현 44

 

FIR필터 소스

voice_noise1(rectangular)

% 음성 파일 불러오기
[y,Fs]=wavread(‘C:\Users\jihyunyang\Desktop\voice\voice_noise1′);

% t 설정
t=(0:length(y)-1)/Fs;
figure(1)
subplot(5,1,1),plot(t,y);
xlabel(‘t’),ylabel(‘x’),title(‘Voice’);

% 음성파일의 fft
f=Fs*t;
y2= fft(y);
S_n=fft(y2,512);
w=(0:255)/256*(Fs/2);
subplot(5,1,2),plot(w,abs([S_n(1:256)'])),xlabel(‘Voice fft’);
% Rectangular filter의 특성결정
fp=100;
fs=500;
wp=2*fp/Fs;
ws=2*fs/Fs;
o_pass=2*pi*fp/Fs;
o_stop=2*pi*fs/Fs;
o_total=o_stop-o_pass;
n=8*pi/o_total
n=256;
n1=257;

% Rectangular filter 사용
y1=rectwin(n1);
wn=[wp ws];
[b,a]=fir1(n,wn,y1);
[H,w]= freqz(b,a,512);
% Rectangular Filter 그래프 출력
subplot(5,1,3),plot(w,abs(H)),xlabel(‘Lowpass Filter’);
grid

% 필터링 후 신호출력
sf = filter(b,a,y);
sound(sf,Fs)
subplot(5,1,4)
plot(f,abs(sf)),xlabel(‘FILTERLING 후 신호’);
title(‘Soundfile(Freq)’);
grid

% 필터링 후 wave 파일 저장
wavwrite(sf,Fs,’C:\Users\son ju young\Desktop\FIR\voice_noise1_LPF(rectangular).wav’);
% 필터링 후 신호 fft 변환 후 출력
y3 = fft(sf);
subplot(5,1,5)
plot(f,abs(y3));
xlabel(‘FILTERLING WAVE fft 변환’);
grid

% 필터링 후 fft변환 wave 파일 저장
bits=16;
wavwrite(sf,Fs,bits,’C:\Users\jihyunyang\Desktop\FIR\voice_noise1_fft(rectangular).wav’);
voice_noise1(blackman window)

% 음성 파일 불러오기
[y,Fs]=wavread(‘C:\Users\jihyunyang\Desktop\voice\voice_noise1′);

% t 설정
t=(0:length(y)-1)/Fs;
figure(1)
subplot(5,1,1),plot(t,y);
xlabel(‘t’),ylabel(‘x’),title(‘Voice’);

% 음성파일의 fft
f=Fs*t;
y2= fft(y);
S_n=fft(y2,512);
w=(0:255)/256*(Fs/2);
subplot(5,1,2),plot(w,abs([S_n(1:256)'])),xlabel(‘Voice fft’);
% blackman filter의 특성결정
fp=100;
fs=500;
wp=2*fp/Fs;
ws=2*fs/Fs;
o_pass=2*pi*fp/Fs;
o_stop=2*pi*fs/Fs;
o_total=o_stop-o_pass;
n=8*pi/o_total
n=256;
n1=257;

% blackman filter 사용
y1=blackman(n1);
wn=[wp ws];
[b,a]=fir1(n,wn,y1);
[H,w]= freqz(b,a,512);

% blackman Filter 그래프 출력
subplot(5,1,3),plot(w,abs(H)),xlabel(‘Lowpass Filter’);
grid

% 필터링 후 신호출력
sf = filter(b,a,y);
sound(sf,Fs)
subplot(5,1,4)
plot(f,abs(sf)),xlabel(‘FILTERLING 후 신호’);
title(‘Soundfile(Freq)’);
grid

% 필터링 후 wave 파일 저장
wavwrite(sf,Fs,’C:\Users\jihyunyang\Desktop\FIR\voice_noise1_LPF(blackman).wav’);

% 필터링 후 신호 fft 변환 후 출력
y3 = fft(sf);
subplot(5,1,5)
plot(f,abs(y3));
xlabel(‘FILTERLING WAVE fft 변환’);
grid

% 필터링 후 fft변환 wave 파일 저장
bits=16;
wavwrite(sf,Fs,bits,’C:\Users\jihyunyang\Desktop\FIR\voice_noise1_fft(blackman).wav’);

참고문헌 등
· 프로젝트로 배우는 라즈베리파이, 도날드 노리스 지음, 한빛미디어
· 200개의 단계별 예제로 배우는 안드로이드, 한동호, 제이펍
· 안드로이드 UI & GUI 디자인, 박수레, 에이콘 출판
· http://paulbourke.net/miscellaneous//dft/, written by paul bourke
· 네이버 지식인, 네이버 카페 “당근이의 AVR 갖구 놀기”, “전자공작소”, “임베디드공작소”

 

 

 

 

 

Leave A Comment

*