<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>NTREXGO - 디바이스마트, 엔티렉스 컨텐츠 통합 사이트 &#187; featrue</title>
	<atom:link href="http://www.ntrexgo.com/archives/tag/featrue/feed" rel="self" type="application/rss+xml" />
	<link>http://www.ntrexgo.com</link>
	<description>엔티렉스, 디바이스마트 컨텐츠 통합 사이트</description>
	<lastBuildDate>Thu, 03 Mar 2022 06:47:11 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.5.1</generator>
		<item>
		<title>[43호]Guardian Angel (Babycare)</title>
		<link>http://www.ntrexgo.com/archives/33820</link>
		<comments>http://www.ntrexgo.com/archives/33820#comments</comments>
		<pubDate>Tue, 25 Jul 2017 00:00:42 +0000</pubDate>
		<dc:creator>디바이스마트 매거진</dc:creator>
				<category><![CDATA[디바이스마트 매거진]]></category>
		<category><![CDATA[특집]]></category>
		<category><![CDATA[43호]]></category>
		<category><![CDATA[featrue]]></category>
		<category><![CDATA[ict]]></category>
		<category><![CDATA[공모전]]></category>
		<category><![CDATA[디바이스마트]]></category>
		<category><![CDATA[매거진]]></category>
		<category><![CDATA[융합]]></category>
		<category><![CDATA[프로젝트]]></category>

		<guid isPermaLink="false">http://www.ntrexgo.com/?p=33820</guid>
		<description><![CDATA[디바이스마트 매거진 43호  &#124; 이 작품은 아기의 심박수, 체온, 울음, 상태를 모니터링 할 수 있는 웨어러블 디바이스입니다. 이 작품은 밴드형 하드웨어, 아기 인형 하드웨어, 안드로이드 어플리케이션, 서버로 나누어 살펴 볼 수 있습니다.]]></description>
				<content:encoded><![CDATA[<p><a href="http://www.ntrexgo.com/wp-content/uploads/2017/07/Cap-2017-10-18-13-15-49-260.png" rel="lightbox[33820]"><img class="alignnone size-large wp-image-34236" alt="Cap 2017-10-18 13-15-49-260" src="http://www.ntrexgo.com/wp-content/uploads/2017/07/Cap-2017-10-18-13-15-49-260-620x137.png" width="620" height="137" /></a></p>
<p><span style="font-size: large;background-color: #ffff00"><strong> 2017 </strong></span></p>
<p><span style="font-size: x-large"><strong>ICT 융합 프로젝트 공모전</strong></span><span style="font-size: x-large"><strong>우수상</strong></span></p>
<p><span style="font-size: x-large"><strong>: Guardian Angel (Babycare)</strong></span></p>
<p style="text-align: right">글 | 단국대학교 양지현, 우경은, 박건주</p>
<p style="text-align: right">
<p><span style="color: #000080"><strong>심사평</strong></span><br />
<strong>칩센</strong> 육아와 관련된 IT 기술은 언제나 hot item입니다. 특히 ‘만에 하나 라도’ 라는 것에 불안해 하는 영유아를 둔 부모에게 잘 와닿을 수 있는, 즉 상품적인 가치가 있을법해 보인다는 느낌을 받았고, 작품 제작에 있어서도 전반적으로 시스템 구성이 잘 되어 있고, 각 파트별 구성 요소에 대한 이해도도 높아 여러가지 면에서 기획이 잘 되어 있는 작품이라는 생각이 듭니다. 세부적으로 각 파트에 적절한 하드웨어 선정을 고민한 흔적과 함께 신호 및 시그널 처리 부분에 대한 명확성이 눈에 띄었습니다. 밴드 부분에 있어서 무선 전파의 감쇄를 저하시키지 않는 재질을 고려하는 부분은 필요할 것으로 보이네요. 개인적으로는 실제 완성품의 가격부분 등이 문제가 아니라면, 하나쯤 구비해 놓을 수도 있겠다는 생각이 듭니다.</p>
<p><strong>뉴티씨</strong> 이 작품은 완성도가 뛰어나서 당장 상품으로 만들수도 있을 것 같습니다. 매우 좋은 아이디어입니다. 다만, 디자인과 경량화 관련 고민을 해야할 것입니다.</p>
<p><strong>위드로봇</strong> 유사한 상용 제품과의 차별성 부분을 추가로 설명할 수 있으면 훌륭한 작품이 될 것 같습니다.</p>
<p><span style="color: #000080"><strong>작품 개요</strong></span><br />
한 아기의 아빠가 아기와 함께 있다가 화장실이 급해 아기를 앉혀 놓고 잠시 자리를 비운 동안 아기가 심장마비로 사망했다는 뉴스를 본 적이 있습니다. 또한 아기는 돌연사하는 경우도 많고, 부모가 제 때 알아 차리지 못해 조치를 취하지 못한 경우도 많습니다. 이를 보고 아기의 상태를 실시간으로 알려주고 확인할 수 있다면 이런 상황을 피할 수 있지 않을까? 라는 생각을 하였습니다. 그래서 아기 모니터링 밴드를 만들게 되었습니다. 이 작품을 만들 때 고려 한 점은 다음과 같습니다.<br />
1. 아기의 사망 원인 중 가장 큰 비중을 차지하는 부분은 아기의 갑작스러운 심정지와 무호흡 상태인 돌연사입니다. 심장박동수를 통해 숨을 쉬는지 안 쉬는지를 판단할 수 있으므로 심장박동 센서를 제작하여 측정해야 합니다.<br />
2. 아기의 저체온방지를 위해 온도 센서를 달아 체온을 측정해야 합니다.<br />
3. 아이의 모습을 실시간으로 볼 수 있도록 아기 옆에 인형을 두고 아기를 촬영하며 서버에 넘겨주는 방식으로 부모의 스마트폰 애플리케이션으로 볼 수 있게 합니다.<br />
4. 아기가 뒤집었을 경우 그 상태로 오래 있게 되면 폐에 무리가 가서 숨을 못 쉬게 됩니다. 이를 방지하기 위해 아기가 뒤집힌 상태인지 파악해야 합니다.<br />
5. 아기가 울 경우, 부모가 알게 된다면 적절한 조치를 취할 수 있으므로 아기의 울음소리를 파악하여 알려줍니다.<br />
이 5가지의 사항을 중점으로 아기 상태를 측정할 수 있는 발찌와 부모의 팔찌, 스마트폰 어플리케이션을 만들었습니다.</p>
<p><a href="http://www.koreadaily.com/news/read.asp?art_id=4716420"><img class="alignnone size-full wp-image-34241" alt="44 ict 양지현 (1)" src="http://www.ntrexgo.com/wp-content/uploads/2017/07/44-ict-양지현-1.png" width="607" height="343" /></a></p>
<p><span style="color: #000080"><strong>작품 설명</strong></span><br />
<span style="color: #3366ff"><strong>주요 동작 및 특징</strong></span><br />
이 작품은 아기의 심박수, 체온, 울음, 상태를 모니터링 할 수 있는 웨어러블 디바이스입니다. 이 작품은 밴드형 하드웨어, 아기 인형 하드웨어, 안드로이드 어플리케이션, 서버로 나누어 살펴 볼 수 있습니다.</p>
<p><span style="color: #00ccff"><strong>구성</strong></span><br />
① Band (bracelet)<br />
· CPU<br />
· 센서부(심박동 센서, 적외선 온도 센서, 가속도 센서)<br />
· 통신부(bluetooth)<br />
· 배터리<br />
· 프레임</p>
<p>② 아기 인형<br />
· CPU<br />
· 센서부(마이크센서)<br />
· 통신부(bluetooth)<br />
· 배터리</p>
<p>③ 안드로이드 어플리케이션</p>
<p>④ 서버</p>
<p><span style="color: #00ccff"><strong>하드웨어-소프트웨어</strong></span><br />
<strong>① 밴드 &#8211; 심박동센서</strong></p>
<p><img class="alignnone size-full wp-image-34243" alt="44 ict 양지현 (2)" src="http://www.ntrexgo.com/wp-content/uploads/2017/07/44-ict-양지현-2.png" width="383" height="210" /><br />
심장박동 센서의 기본원리는 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이기 때문입니다.</p>
<p><img class="alignnone size-full wp-image-34245" alt="44 ict 양지현 (3)" src="http://www.ntrexgo.com/wp-content/uploads/2017/07/44-ict-양지현-3.png" width="607" height="259" /><br />
다음은 소스 부분 설명입니다. 위 그림에서 보듯이, 60초에서 x를 나누면 심장박동수입니다. 따라서 이를 구하는 소스로는 pulse의 상승 부를 파악하기 위해 pulse의 부분을 나눕니다. pulse 값이 30 ~ 1000 사이의 값일 경우, 상승 시점으로 간주합니다. 그때의 시간을 알아 nowtime이라는 변수에 저장합니다. 정확도를 위해 sampling을 하는데 상승 시점일 때 총 아홉 번으로 나누어 샘플링을 합니다. 샘플링 할 때의 시간을 lasttime 변수에 저장합니다. 아홉 번 샘플링 한 값들의 평균을 구하고 60초로 이를 나누면 심박 수를 구하게 됩니다.</p>
<p><strong>② 아기 인형 &#8211; 마이크 센서</strong><br />
인터럽트를 써서 센서 ADC 값을 받아들이고, FIR 필터를 사용하여 주변 소리를 제거하여 아기 울음소리만 추출합니다. Filtering은 신호처리의 핵심적인 과정으로 어떤 신호에 대한 스펙트럼을 원하는 주파수 대역만큼 제한시키는 주파수 선택 회로입니다. 여기서 원하는 주파수 대역은 통과 대역(passband)이 되고 원치 않는 대역은 차단 대역(stopband)이 됩니다. FIR 필터 소스는 ‘디지털 신호 처리 공학’이라는 수업에서 배운 이론을 바탕으로 짰습니다. FIR 필터는 입력신호의 유한한(Finite) 값들만을 가지고 필터를 하는 디지털 필터입니다.</p>
<p>먼저 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 필터를 얻기 위해, 임펄스 응답을 잘라내는 방식입니다. 이 방식을 이용하여 잡신호를 제거하고 원래 음성신호를 복원해 아기 울음소리를 구분하였습니다.<br />
전체적인 신호처리 과정은 다음과 같습니다. MIC 센서를 사용하여 아날로그 값을 받습니다. 그다음, ADC 변환 소자를 사용하여 디지털 값으로 변환시킵니다. 변환된 값을 FIR 필터 처리를 하여 주변 잡음을 잡아내어 아기 울음소리인지 판단합니다. 아기 울음소리라면 부모에게 알리게 됩니다.<br />
아직 모든 상황에서의 완벽한 잡음처리는 되지 않지만, 제가 여태 테스트해 본 음성들은 아기 울음소리만 파악할 수 있었습니다. 그래서 현재, 여러 상황에서 테스트하고 있습니다.</p>
<p><span style="color: #00ccff"><strong>소프트웨어</strong></span><br />
<strong>안드로이드 APP</strong><br />
BPM , Temperature, Camera/album 총 세부분으로 나눌 수 있습니다.<br />
■ BPM : 먼저 서버에서 심박 수를 받아와야 하기 때문에 JSON parsing을 합니다. 파싱이란, 컴퓨터에서 컴파일러 또는 번역기가 원시 부호를 기계어로 번역하는 과정의 한 단계로, 즉 원시 프로그램에서 나타난 토큰(token)의 열을 받아들여 이를 그 언어의 문법에 맞게 구문 분석 트리(parse tree)로 구성해 내는 일입니다. 그 중 저는 JSON이라는 파싱을 사용하였습니다. 전달받은 데이터가 없다면, 정보조회를 진행할 필요가 없으므로 doinBackground 함수를 사용하여 정보조회를 진행할 데이터가 넘어왔는지 검증했습니다. JSON 형태로 받은 데이터를 보관할 String을 선언해주고, JSON Format의 정보를 받아서 모바일 앱에서 필요한 정보만 꺼내옵니다. 생성자가 JSON String을 받아들여서 우리가 처리하기 쉽게 Object hierarchy에 넣어 주어 설정해 놓은 변수에서 불러오면 됩니다.</p>
<p><img class="alignnone size-full wp-image-34250" alt="44 ict 양지현 (7)" src="http://www.ntrexgo.com/wp-content/uploads/2017/07/44-ict-양지현-7.png" width="611" height="440" /></p>
<p><img class="alignnone size-full wp-image-34247" alt="44 ict 양지현 (4)" src="http://www.ntrexgo.com/wp-content/uploads/2017/07/44-ict-양지현-4.png" width="607" height="523" /></p>
<p>시각적으로 표현하기 위하여 progress bar를 구현하여 최대 150bpm에서 몇을 차지하였는지 보여 주었습니다. 또한, 막대 그래프와 꺾은선 그래프를 이용하여 현재까지 측정했던 데이터들과 평균을 보여줬습니다.<br />
현재까지의 측정 기록을 볼 수 있도록 DB를 구축했습니다.</p>
<p><img class="alignnone size-full wp-image-34249" alt="44 ict 양지현 (6)" src="http://www.ntrexgo.com/wp-content/uploads/2017/07/44-ict-양지현-6.png" width="611" height="218" /></p>
<p>SQL을 사용하여 table을 생성하고 날짜, bpm를 저장하여 보여줍니다. 이 db를 사용하여 list array로 보여주며, graph를 보여줄 때도 사용됩니다.</p>
<p>■ Temperature : 체온을 온도계 그림으로 애니메이션 효과를 주기 위하여 Canvas 함수를 이용하여 온도계를 그려주었습니다. 체온도 bpm과 마찬가지로 서버에서 JSON parsing을 해와서 정보를 보여줬습니다.<br />
위의 소스는 tem(Json 파싱해온 값)의 값을 온도계의 전체 범위로부터 빼서 온도가 올라가는 애니메이션 부분 알고리즘입니다.</p>
<p><img class="alignnone size-full wp-image-34248" alt="44 ict 양지현 (5)" src="http://www.ntrexgo.com/wp-content/uploads/2017/07/44-ict-양지현-5.png" width="607" height="253" /></p>
<p><strong>서버</strong><br />
라즈베리파이를 이용하여 서버 구축을 하였습니다. mysql을 이용하여 db를 구축하였고 php언어를 사용해 html 홈서버를 구축하였습니다.<br />
안드로이드에서 json 파싱을 해주어야 하기 때문에 json 언어로 바꾸어 주었습니다. 아기가 울 때, 뒤집었을 때 부모의 핸드폰에 카카오톡 같은 알림 메시지가 보내지게 하기 위하여 FCM을 구축하여 사용했습니다.</p>
<p><img class="alignnone size-full wp-image-34251" alt="44 ict 양지현 (8)" src="http://www.ntrexgo.com/wp-content/uploads/2017/07/44-ict-양지현-8.png" width="611" height="283" /></p>
<p><strong>카메라 (라즈베리파이)</strong><br />
라즈베리파이 카메라를 사용하여 스트리밍을 통해 어플에서 보여줍니다. mjpg-streamer를 이용하여 url을 통하여 어플에서 불러와서 보여줍니다.</p>
<p><img class="alignnone size-full wp-image-34252" alt="44 ict 양지현 (9)" src="http://www.ntrexgo.com/wp-content/uploads/2017/07/44-ict-양지현-9.png" width="611" height="552" /></p>
<p><img class="alignnone size-full wp-image-34240" alt="44 ict 양지현 (1)" src="http://www.ntrexgo.com/wp-content/uploads/2017/07/44-ict-양지현-1.jpg" width="611" height="418" /></p>
<p><img class="alignnone size-full wp-image-34242" alt="44 ict 양지현 (2)" src="http://www.ntrexgo.com/wp-content/uploads/2017/07/44-ict-양지현-2.jpg" width="611" height="293" /></p>
<p><img class="alignnone size-full wp-image-34253" alt="44 ict 양지현 (10)" src="http://www.ntrexgo.com/wp-content/uploads/2017/07/44-ict-양지현-10.png" width="611" height="365" /></p>
<p><img class="alignnone size-full wp-image-34254" alt="44 ict 양지현 (11)" src="http://www.ntrexgo.com/wp-content/uploads/2017/07/44-ict-양지현-11.png" width="611" height="365" /></p>
<p><img class="alignnone size-full wp-image-34255" alt="44 ict 양지현 (12)" src="http://www.ntrexgo.com/wp-content/uploads/2017/07/44-ict-양지현-12.png" width="611" height="359" /></p>
<p><img class="alignnone size-full wp-image-34256" alt="44 ict 양지현 (13)" src="http://www.ntrexgo.com/wp-content/uploads/2017/07/44-ict-양지현-13.png" width="611" height="356" /></p>
<p><img class="alignnone size-full wp-image-34257" alt="44 ict 양지현 (14)" src="http://www.ntrexgo.com/wp-content/uploads/2017/07/44-ict-양지현-14.png" width="611" height="343" /></p>
<p><img class="alignnone size-full wp-image-34244" alt="44 ict 양지현 (3)" src="http://www.ntrexgo.com/wp-content/uploads/2017/07/44-ict-양지현-3.jpg" width="611" height="426" /></p>
<p><span style="color: #3366ff"><strong>전체 시스템 구성</strong></span></p>
<p><img class="size-large wp-image-34258 aligncenter" alt="44 ict 양지현 (15)" src="http://www.ntrexgo.com/wp-content/uploads/2017/07/44-ict-양지현-15-581x620.png" width="581" height="620" /></p>
<p><span style="color: #3366ff"><strong>개발 환경(개발언어, Tool, 사용시스템 등)</strong></span><br />
<strong>개발언어 &#8211; C언어 /java</strong><br />
개발 Tool에서 쓰이는 언어가 C언어이기 때문에 자연스레 C언어를 이용하여 코딩 및 소스구현을 하게 되었습니다.<br />
안드로이드 스튜디오에서 쓰이는 언어는 java이기 때문에 java 공부를 하고 이용했습니다.</p>
<p><strong>개발 Tool &#8211; 아두이노 개발툴(IDE), 안드로이드 스튜디오, 라즈베리파이 Linux</strong><br />
아두이노 프로미니를 사용하였기 때문에 아두이노 개발툴을 사용했고, 안드로이드 어플을 만들기위해 안드로이드 스튜디오를 사용했습니다. 또한 서버와 인형 하드웨어에 라즈베리파이를 사용하여 Linux 개발 tool을 사용했습니다.</p>
<p><strong>사용 시스템 &#8211; Arduino pro mini</strong><br />
아두이노 프로 미니를 선정하게 된 이유는 첫째, 가능한 작은 mcu를 찾고 있었기 때문입니다. 또한 처리속도에 고속이 필요하지 않기 때문입니다. 아두이노는 알고리즘 코딩만 하면 쉽게 사용할 수 있으므로 여러 mcu 중 가장 적합하다고 생각하여 메인 mcu로 사용하였습니다.</p>
<p><strong>사용 시스템 &#8211; 라즈베리파이3</strong><br />
라즈베리파이를 선정하게 된 이유는 서버를 구축하기 위해서입니다. 리눅스 환경의 OS를 가지고 있고 MYSQL 등 db 구축도 쉽기 때문에 선택하게 되었습니다. 또한, 인형 하드웨어에서 쓰인 라즈베리파이를 선택한 이유는 900MHz의 빠른 속도와 1GB의 넉넉한 램 용량, 저렴한 가격 및 많은 GPIO 핀을 보유하고 있어서입니다. ADC 핀이 따로 존재하지 않다는 불편한 점이 있지만, 신호처리도 유용하고 아두이노와 블루투스 통신을 통해 데이터를 주고받아야 했기 때문에 라즈베리파이를 선택했습니다.</p>
<p><img class="alignnone size-large wp-image-34259" alt="44 ict 양지현 (16)" src="http://www.ntrexgo.com/wp-content/uploads/2017/07/44-ict-양지현-16-554x620.png" width="554" height="620" /></p>
<p><span style="color: #000080"><strong>단계별 제작 과정</strong></span><br />
<span style="color: #3366ff"><strong>계획 세우기 및 사전조사(2017.01.02 ~ 2017.01.09)</strong></span><br />
프로젝트 주제를 정하고 그에 대한 사전조사를 인터넷 및 관련 사람들을 대상으로 조사하여 문제점, 주요특징, 앞으로의 전망 등을 충분히 조사를 하였습니다.</p>
<p><span style="color: #3366ff"><strong>해당 작품 공부 및 제작 준비(2017.01.10 ~ 2017.01.30)</strong></span><br />
안드로이드 어플을 만들기 위해 사용한 언어는 java였습니다. 이를 위해 java 공부를 하였고, 리눅스 용어 공부도 하였습니다.<br />
심장박동 센서 회로설계 공부를 하고 mic 센서를 통한 fir 필터 처리를 위해 matlab 문법 공부와 fir 필터에 대해 다시 공부했습니다.</p>
<p><span style="color: #3366ff"><strong>하드웨어 제작(2017.01.31. ~ 2017.02.06)</strong></span><br />
심장박동센서 회로를 토대로 하드웨어를 제작하였고, 3D프린터와 아크릴 제작등을 이용하여 팔찌의 형태를 갖췄습니다. 또한 인형부분 마이크 센서와 카메라 부분도 제작하였습니다.</p>
<p>마이크센서와 라즈베리파이의 신호처리(2017.02.07. ~ 2017.02.15)<br />
소리의 값을 받아와 라즈베리파이의 adc핀(adc변환소자 이용)에 연결 및 디지털 데이터를 뽑아내어 FIR 필터 알고리즘을 거친 변환 데이터를 걸러낸 후 안드로이드 FCM을 구축하여 안드로이드에 알림메시지를 띄웠습니다.</p>
<p><span style="color: #3366ff"><strong>안드로이드 제작 , 서버제작 (2017.02.15. ~ 2017.03.25)</strong></span><br />
라즈베리파이를 이용하여 서버를 구축하고, db table을 만들어 아두이노와 라즈베리파이로부터 센서 값을 받아와 저장합니다. 안드로이드의 UI와 서버로부터 Json parsing을 통해 값을 받아와 보여줍니다. FCM 테스트를 통해서 안드로이드에 값이 전달되는 것을 확인할 수 있었습니다.</p>
<p><span style="color: #3366ff"><strong>전체적인 연동 및 테스트 (2017.03.25. ~ 2017.04.30)</strong></span><br />
아두이노 + 라즈베리파이 + 서버(라즈베리파이) + 안드로이드를 연동시켜서 테스트를 하고 있습니다. 아직 아기에게 직접 착용하여 테스트는 하지 못하였지만, 많은 사람들에게 테스트를 해본 결과, 잘 작동하고 있습니다. 앞으로 아기들에게도 테스트하여 계속해서 디버깅하고 좋은 착용감을 위해 하드웨어 부분도 다시 고려하려 합니다.</p>
<p><strong>기타(회로도, 소스코드, 참고문헌 등)</strong><br />
<span style="color: #3366ff"><strong>회로도</strong></span></p>
<p><img class="alignnone size-large wp-image-34246" alt="44 ict 양지현 (4)" src="http://www.ntrexgo.com/wp-content/uploads/2017/07/44-ict-양지현-4-541x620.jpg" width="541" height="620" /></p>
<p><img class="alignnone size-full wp-image-34260" alt="44 ict 양지현 (17)" src="http://www.ntrexgo.com/wp-content/uploads/2017/07/44-ict-양지현-17.png" width="611" height="253" /></p>
<p><span style="color: #3366ff"><strong>소스코드</strong></span><br />
<span style="color: #00ccff"><strong>심장박동센서 코드</strong></span></p>
<div class="symple-box gray none" style="text-align:left; width:100%;"> 
<p>#include &#8220;Heartrate.h&#8221;</p>
<p>int num[sample_num] = { 0 };</p>
<p>int getnum(int pin)<br />
{<br />
numcnt++;<br />
if (numcnt &gt;= sample_num){<br />
numcnt = 0<br />
}<br />
num[numcnt] = analogRead(pin);<br />
return(num[numcnt]);</p>
<p>}</p>
<p>int getCnt(void)<br />
{<br />
return(numcnt);<br />
}</p>
<p>int GetRate(void)<br />
{</p>
<p>static int flag<br />
static unsigned long sampleTime[10];<br />
unsigned long numTime_<br />
int cnt</p>
<p>if (numcnt){<br />
cnt = numcnt &#8211; 1<br />
}<br />
else{<br />
cnt = sample_num &#8211; 1<br />
}<br />
if ((num[numcnt]&gt;1000) &amp;&amp; (num[cnt]&lt;70)){<br />
nowTim = millis();<br />
int time = nowTim &#8211; lastTim<br />
lastTim = nowTim</p>
<p>if (time&gt;300 &amp;&amp; time&lt;2000){<br />
sampleTime[flag++] = time<br />
if (flag &gt; 9)flag = 0<br />
}<br />
int array[10] = { 0 };<br />
for (int i = 0 i&lt;10 i++){<br />
array[i] = sampleTime[i];<br />
}<br />
int array_ = 0<br />
for (int i = 9 i&gt;0 i&#8211;){<br />
for (int j = 0 j&lt;i j++){<br />
if (array[j] &gt; array[j + 1]){<br />
array_ = array[j];<br />
array[j] = array[j + 1];<br />
array[j + 1] = array_<br />
}<br />
}<br />
}</p>
<p>array_ = 0<br />
for (int i =3 i &lt;= 7 i++){<br />
array_ += array[i];<br />
}</p>
<p>numTime_ = 300000 / array_///&lt;60*1000*<br />
return((int)numTime_);<br />
}<br />
return(0);</p>
<p>}<br />
int getRate(void)<br />
{<br />
return(GetRate());</p>
<p>}<br />
</div>
<p><span style="color: #00ccff"><strong>안드로이드 코드</strong></span></p>
<p><img class="alignnone size-large wp-image-34262" alt="43 ict 양지현 40" src="http://www.ntrexgo.com/wp-content/uploads/2017/07/43-ict-양지현-40-620x538.jpg" width="620" height="538" /> <img class="alignnone size-large wp-image-34263" alt="43 ict 양지현 41" src="http://www.ntrexgo.com/wp-content/uploads/2017/07/43-ict-양지현-41-620x364.jpg" width="620" height="364" /></p>
<p><img class="alignnone size-large wp-image-34264" alt="43 ict 양지현 42" src="http://www.ntrexgo.com/wp-content/uploads/2017/07/43-ict-양지현-42-581x620.jpg" width="581" height="620" /></p>
<p><img class="alignnone size-large wp-image-34265" alt="43 ict 양지현 43" src="http://www.ntrexgo.com/wp-content/uploads/2017/07/43-ict-양지현-43-594x620.jpg" width="594" height="620" /></p>
<p><img class="alignnone size-large wp-image-34266" alt="43 ict 양지현 44" src="http://www.ntrexgo.com/wp-content/uploads/2017/07/43-ict-양지현-44-620x620.jpg" width="620" height="620" /></p>
<p>&nbsp;</p>
<p><span style="color: #00ccff"><strong>FIR필터 소스</strong></span></p>
<div class="symple-box gray none" style="text-align:left; width:100%;"> 
<p>voice_noise1(rectangular)</p>
<p>% 음성 파일 불러오기<br />
[y,Fs]=wavread(&#8216;C:\Users\jihyunyang\Desktop\voice\voice_noise1&#8242;);</p>
<p>% t 설정<br />
t=(0:length(y)-1)/Fs;<br />
figure(1)<br />
subplot(5,1,1),plot(t,y);<br />
xlabel(&#8216;t&#8217;),ylabel(&#8216;x&#8217;),title(&#8216;Voice&#8217;);</p>
<p>% 음성파일의 fft<br />
f=Fs*t;<br />
y2= fft(y);<br />
S_n=fft(y2,512);<br />
w=(0:255)/256*(Fs/2);<br />
subplot(5,1,2),plot(w,abs([S_n(1:256)'])),xlabel(&#8216;Voice fft&#8217;);<br />
% Rectangular filter의 특성결정<br />
fp=100;<br />
fs=500;<br />
wp=2*fp/Fs;<br />
ws=2*fs/Fs;<br />
o_pass=2*pi*fp/Fs;<br />
o_stop=2*pi*fs/Fs;<br />
o_total=o_stop-o_pass;<br />
n=8*pi/o_total<br />
n=256;<br />
n1=257;</p>
<p>% Rectangular filter 사용<br />
y1=rectwin(n1);<br />
wn=[wp ws];<br />
[b,a]=fir1(n,wn,y1);<br />
[H,w]= freqz(b,a,512);<br />
% Rectangular Filter 그래프 출력<br />
subplot(5,1,3),plot(w,abs(H)),xlabel(&#8216;Lowpass Filter&#8217;);<br />
grid</p>
<p>% 필터링 후 신호출력<br />
sf = filter(b,a,y);<br />
sound(sf,Fs)<br />
subplot(5,1,4)<br />
plot(f,abs(sf)),xlabel(&#8216;FILTERLING 후 신호&#8217;);<br />
title(&#8216;Soundfile(Freq)&#8217;);<br />
grid</p>
<p>% 필터링 후 wave 파일 저장<br />
wavwrite(sf,Fs,&#8217;C:\Users\son ju young\Desktop\FIR\voice_noise1_LPF(rectangular).wav&#8217;);<br />
% 필터링 후 신호 fft 변환 후 출력<br />
y3 = fft(sf);<br />
subplot(5,1,5)<br />
plot(f,abs(y3));<br />
xlabel(&#8216;FILTERLING WAVE fft 변환&#8217;);<br />
grid</p>
<p>% 필터링 후 fft변환 wave 파일 저장<br />
bits=16;<br />
wavwrite(sf,Fs,bits,&#8217;C:\Users\jihyunyang\Desktop\FIR\voice_noise1_fft(rectangular).wav&#8217;);<br />
voice_noise1(blackman window)</p>
<p>% 음성 파일 불러오기<br />
[y,Fs]=wavread(&#8216;C:\Users\jihyunyang\Desktop\voice\voice_noise1&#8242;);</p>
<p>% t 설정<br />
t=(0:length(y)-1)/Fs;<br />
figure(1)<br />
subplot(5,1,1),plot(t,y);<br />
xlabel(&#8216;t&#8217;),ylabel(&#8216;x&#8217;),title(&#8216;Voice&#8217;);</p>
<p>% 음성파일의 fft<br />
f=Fs*t;<br />
y2= fft(y);<br />
S_n=fft(y2,512);<br />
w=(0:255)/256*(Fs/2);<br />
subplot(5,1,2),plot(w,abs([S_n(1:256)'])),xlabel(&#8216;Voice fft&#8217;);<br />
% blackman filter의 특성결정<br />
fp=100;<br />
fs=500;<br />
wp=2*fp/Fs;<br />
ws=2*fs/Fs;<br />
o_pass=2*pi*fp/Fs;<br />
o_stop=2*pi*fs/Fs;<br />
o_total=o_stop-o_pass;<br />
n=8*pi/o_total<br />
n=256;<br />
n1=257;</p>
<p>% blackman filter 사용<br />
y1=blackman(n1);<br />
wn=[wp ws];<br />
[b,a]=fir1(n,wn,y1);<br />
[H,w]= freqz(b,a,512);</p>
<p>% blackman Filter 그래프 출력<br />
subplot(5,1,3),plot(w,abs(H)),xlabel(&#8216;Lowpass Filter&#8217;);<br />
grid</p>
<p>% 필터링 후 신호출력<br />
sf = filter(b,a,y);<br />
sound(sf,Fs)<br />
subplot(5,1,4)<br />
plot(f,abs(sf)),xlabel(&#8216;FILTERLING 후 신호&#8217;);<br />
title(&#8216;Soundfile(Freq)&#8217;);<br />
grid</p>
<p>% 필터링 후 wave 파일 저장<br />
wavwrite(sf,Fs,&#8217;C:\Users\jihyunyang\Desktop\FIR\voice_noise1_LPF(blackman).wav&#8217;);</p>
<p>% 필터링 후 신호 fft 변환 후 출력<br />
y3 = fft(sf);<br />
subplot(5,1,5)<br />
plot(f,abs(y3));<br />
xlabel(&#8216;FILTERLING WAVE fft 변환&#8217;);<br />
grid</p>
<p>% 필터링 후 fft변환 wave 파일 저장<br />
bits=16;<br />
wavwrite(sf,Fs,bits,&#8217;C:\Users\jihyunyang\Desktop\FIR\voice_noise1_fft(blackman).wav&#8217;);<br />
</div>
<p><span style="color: #3366ff"><strong>참고문헌 등</strong></span><br />
· 프로젝트로 배우는 라즈베리파이, 도날드 노리스 지음, 한빛미디어<br />
· 200개의 단계별 예제로 배우는 안드로이드, 한동호, 제이펍<br />
· 안드로이드 UI &amp; GUI 디자인, 박수레, 에이콘 출판<br />
· http://paulbourke.net/miscellaneous//dft/, written by paul bourke<br />
· 네이버 지식인, 네이버 카페 “당근이의 AVR 갖구 놀기”, “전자공작소”, “임베디드공작소”</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ntrexgo.com/archives/33820/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[38호]아두이노를 활용한 지하철 잔여 좌석 알림이</title>
		<link>http://www.ntrexgo.com/archives/31906</link>
		<comments>http://www.ntrexgo.com/archives/31906#comments</comments>
		<pubDate>Sun, 25 Sep 2016 00:26:42 +0000</pubDate>
		<dc:creator>디바이스마트 매거진</dc:creator>
				<category><![CDATA[디바이스마트 매거진]]></category>
		<category><![CDATA[특집]]></category>
		<category><![CDATA[38호]]></category>
		<category><![CDATA[featrue]]></category>
		<category><![CDATA[ict]]></category>
		<category><![CDATA[공모전]]></category>
		<category><![CDATA[디바이스마트]]></category>
		<category><![CDATA[매거진]]></category>
		<category><![CDATA[융합]]></category>
		<category><![CDATA[프로젝트]]></category>

		<guid isPermaLink="false">http://www.ntrexgo.com/?p=31906</guid>
		<description><![CDATA[디바이스마트 매거진 38호 &#124; 지하철의 빈 좌석이 많은 칸을 미리 알려준다면 불필요한 이동을 줄일 수 있고, 한쪽 칸에 사람이 몰리는 현상도 줄일 수 있다. 물론 제일 중요한 것은 지하철을 이용하는 사람들의 편리성일 것이다.]]></description>
				<content:encoded><![CDATA[<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/05/2016-ictmain.png" rel="lightbox[31906]"><img class="alignnone size-large wp-image-31056" alt="2016 ictmain" src="http://www.ntrexgo.com/wp-content/uploads/2016/05/2016-ictmain-620x156.png" width="620" height="156" /></a></p>
<p><strong><span style="background-color: #008000;color: #ffffff">2016 ICT 융합 프로젝트 공모전 참가상</span></strong></p>
<p><span style="font-size: x-large"><strong>아두이노를 활용한 지하철 잔여 좌석 알림이</strong></span></p>
<p style="text-align: right">글 | 부경대학교 김준태, 김중권, 오다희</p>
<p style="text-align: right">
<p><span style="color: #008000"><strong>심사평</strong></span></p>
<p><span style="color: #0000ff"><strong>뉴티씨</strong> </span>평상시에 필요했던 기능을 구현해 본 작품으로 생활 속의 지혜를 발견할 수 있다. 평상시 이러한 호기심이 때로는 좋은 작품으로 많은 사람들이 편리하게 사용할 수 있는 제품으로 탄생하기도 한다. 여기에는 엔지니어의 궁금증에 노력이라는 점과 끝까지 참을성 있게 구현해내는 끈기도 필요하다. 아이디어를 구현가능한지 확인한 수준까지만 된 점이 좀 아쉽지만, 모든 부분을 좀 더 확장하여 만든다면 원래 취지처럼 구현할 수 있을 것으로 생각된다. 다만, 경제적인 구현 등을 위한 노력해야 할 점 등이 매우 많이 남아 있는 것으로 보여 높은 점수를 받지는 못하였다.</p>
<p><strong><span style="color: #0000ff">칩센</span></strong> 지하철의 소음에 초음파 센서가 오동작을 하지 않을까 염려된다.</p>
<p><strong><span style="color: #0000ff">위드로봇</span> </strong>지하철 잔여석을 알려주자는 아이디어가 재미있다. 이를 실현하기 위해 초음파 센서를 사용하였는데, 같은 공간에서 초음파 센서를 여러 개 사용하였을 때 발생하는 문제에 대한 대비책이 없는 점이 아쉽다. 실제 상황에서 발생할 수 있는 문제를 좀 더 깊이 고민하여 그 부분의 해결책이 보고서에 설명되면 좋을 것 같다.</p>
<p><span style="color: #008000"><strong>작품 개요</strong></span></p>
<p>지하철을 타다 보면 종종 빈 좌석이 많은 칸과 사람이 붐비어서 좌석이 꽉 찬 칸 볼 수 있는데, 주로 지상으로 통하는 계단이 있는 곳의 칸이 붐비는 것을 알 수 있다. 그리고 사람이 많이 붐비는 칸에 탄 사람들은 지하철 칸 별로 이동하며 빈 좌석을 찾고는 한다. 만약 지하철의 빈 좌석이 많은 칸을 미리 알려준다면 불필요한 이동을 줄일 수 있고, 한쪽 칸에 사람이 몰리는 현상도 줄일 수 있다. 물론 제일 중요한 것은 지하철을 이용하는 사람들의 편리성일 것이다. 빈 좌석은 파란색, 사람이 앉아 있는 자리는 빨간색으로 표현되고 지하철에 스크린도어 및 영상으로 화면을 전송하여 사람들이 쉽게 확인할 수 있다.</p>
<p><span style="color: #008000"><strong>작품 설명</strong></span><br />
<strong>주요 동작 및 특징</strong><br />
지금까지 있는 알림이 시스템 중엔 도착시간까지의 잔여 시간을 알려주는 시스템은 있지만, 우리가 생각한 지하철 잔여좌석 알림이는 아직까지 만들어지지 않았다. 그래서 이 시스템은 희소성이 큰게 특징이며 초음파를 이용하여 좌석 확인 및 인식이 가능하다. 초음파 중에서도 저렴한 아두이노 초음파센서(HC-SR04는 초음파센서)를 통하여 지하철 좌석 별로 거리 감지를 한다. 여기서 사용하는 장치는 시중에서 저렴하게 판매되는 HC-SR04 초음파센서로, 거리측정을 통해 가까운 거리에 있는 물체 혹은 사람의 유·무, 속도 측정 등에 사용할 수 있다.</p>
<table style="width: 620px" border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td><img class="size-full wp-image-31978 aligncenter" style="color: #333333;font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif;font-size: 13px" alt="38 ict 좌석알림 (1)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-좌석알림-1.jpg" width="283" height="195" /></td>
</tr>
<tr>
<td style="text-align: center">그림 1. 초음파센서(HC-SR04)</td>
</tr>
</tbody>
</table>
<p>여기서 초음파란 인간이 들을 수 있는 가청 최대 한계 범위를 넘어서는 주파수를 갖는 주기적인 음압을 의미한다. 초음파는 매개체를 관통시키거나 여러 가지 값을 측정 또는 집중된 에너지를 공급하는 등 여러 분야에서 사용되고 있다. 밑에 그림에서 볼 수 있듯이 초음파를 만들어 보내주면 어떠한 물체에 닿게 되었을 때 초음파는 다시 튕겨서 돌아온다. 센서가 다시 돌아온 초음파를 통해 걸리는 시간을 계산하여 거리를 측정한다. 단순한 공식인 ‘거리 = 속력×시간’을 이용한다.</p>
<table style="width: 620px" border="0">
<tbody>
<tr>
<td><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-좌석알림-2.jpg" rel="lightbox[31906]"><img class="size-full wp-image-31977 aligncenter" alt="38 ict 좌석알림 (2)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-좌석알림-2.jpg" width="503" height="196" /></a></td>
</tr>
<tr>
<td style="text-align: center">그림 2. 초음파 응답 방식</td>
</tr>
</tbody>
</table>
<p>단순하게 가까운 거리에 물체가 있을 때는 ‘빨간색’, 아무 물체가 없을 때는 ‘파란색’으로 표시해준다. 이 방식을 활용하여 지하철 좌석의 사람 유무를 확인 할 수 있다. 지하철이 도착할 때쯤에 광고 알림이 판에 그 지하철의 빈 좌석과 꽉 찬 좌석들이 다른 색으로 표시되어 사람들이 빈 좌석을 알 수 있다.</p>
<table style="width: 620px" border="0">
<tbody>
<tr>
<td><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-좌석알림-3.jpg" rel="lightbox[31906]"><img class="size-full wp-image-31976 aligncenter" alt="38 ict 좌석알림 (3)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-좌석알림-3.jpg" width="180" height="208" /></a></td>
</tr>
<tr>
<td style="text-align: center">그림 3. 온도센서(LM35)</td>
</tr>
</tbody>
</table>
<p>아두이노를 사용하게 되면 비용이 크게 절감이 되지만 센서의 품질 상 고가의 장비보단 성능이 떨어지기 마련인데, 이를 위해서 거리 감지센서로 정확성이 떨어지게 된다면 온도센서를 추가해서 정확성을 높이는 것도 하나의 방법이다. 만약 어떤 사람이 자신의 옆자리에 짐을 올린 상황에서는 가까워진 거리 때문에 짐을 사람으로 인식할 것이다. 하지만 온도 감지 센서를 이용하여 이 문제를 해결 할 수 있다. 사람의 평균온도가 36.5도 이므로 30도 이상의 온도는 사람으로 인지하고 ‘빨간색’ 불을 켠다</p>
<table style="width: 620px" border="0">
<tbody>
<tr>
<td><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-좌석알림-4.jpg" rel="lightbox[31906]"><img class="size-full wp-image-31975 aligncenter" alt="38 ict 좌석알림 (4)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-좌석알림-4.jpg" width="503" height="321" /></a></td>
</tr>
<tr>
<td style="text-align: center">그림 4 . 아두이노 UNO R3 회로도</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<p><strong>전체 시스템 구성</strong></p>
<table style="width: 620px" border="0">
<tbody>
<tr>
<td><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-좌석알림-5.jpg" rel="lightbox[31906]"><img class="size-full wp-image-31974 aligncenter" alt="38 ict 좌석알림 (5)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-좌석알림-5.jpg" width="503" height="109" /></a></td>
</tr>
<tr>
<td style="text-align: center">그림 5 . 아두이노 UNO R3 회로도</td>
</tr>
</tbody>
</table>
<p>좌석 별로 초음파 거리 감지 센서를 장착하여, 각각의 좌석을 시리얼 넘버로 구별한다. 중앙 PC를 이용하여 시리얼 넘버를 받아들이고 OpenGL로 지하철 화면을 구현하여 빈 좌석과 자리가 있는 좌석을 색으로 표시한다.</p>
<p><strong>개발환경(개발언어, tool, 사용시스템)</strong><br />
물리적인 세계를 감지하고 제어할 수 있는 객체들과 디지털 장치를 만들기 위한 도구로, 간단한 마이크로컨트롤러 보드를 기반으로 한 오픈 소스 컴퓨팅 플랫폼과 소프트웨어 개발 환경을 말하는 아두이노를 이용하고자 한다. 아두이노는 가격이 저렴해 프로젝트 실패시의 Risk가 적으며 기계어에 가까운 언어로의 코딩이 가능하기 때문에 이식성이 좋다. 또한 IDE로는 Microsoft Visual Studio를 활용하여 OpenGL을 이용해 좌석의 도식화를 할 것이다.<br />
프로그램의 구동환경으로는 마이크로소프트의 윈도우 시리즈로 개인용 컴퓨터, 태블릿, 스마트폰 및 임베디드 시스템용 운영체제인 Windows 10을 이용할 것이다.</p>
<p><span style="color: #008000"><strong>단계별 제작 과정</strong></span><br />
<strong><span style="color: #000000">초음파 거리감지 센서를 이용해 거리별로 다른 값을 출력시킨다.</span></strong><br />
이 값들은 아두이노와 PC간의 시리얼 통신을 도와주는 Sketch라는 프로그램을 이용하여 Serial Port를 연결하여 아두이노로부터 값을 넘겨받는 역할을 한다.<br />
아두이노를 이용하여 거리 감지센서의 작동을 확인한 후, LED를 이용하여 임시적으로나마 거리에 따른 전광판의 빈 좌석의 유무를 점등으로 표현한다. 여기까지 확인이 되면 거리에 따른 빈 좌석의 유무를 판별 가능한 소스코드가 완성되어진 것이다.</p>
<table style="width: 620px" border="0">
<tbody>
<tr>
<td><img class="size-full wp-image-31973 aligncenter" alt="38 ict 좌석알림 (6)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-좌석알림-6.jpg" width="503" height="327" /></td>
</tr>
<tr>
<td>
<p style="text-align: center">그림 6. 거리 감지센서를 연결한 아두이노</p>
</td>
</tr>
</tbody>
</table>
<table style="width: 620px" border="0">
<tbody>
<tr>
<td><a style="font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif;font-size: 13px" href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-좌석알림-7.jpg" rel="lightbox[31906]"><img class="size-full wp-image-31972 aligncenter" alt="38 ict 좌석알림 (7)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-좌석알림-7.jpg" width="503" height="299" /></a></td>
</tr>
<tr>
<td style="text-align: center">그림 7. 감지센서가 출력한 결과 값</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<p>그림 6의 아두이노 Uno R3 보드와 시리얼 통신을 통해 컴퓨터로부터 소스코드가 하드웨어에 저장된 이후부터는 전원이 공급될 경우 지속적으로 감지센서가 작동하게 된다. 그림7 은 아두이노 Sketch 프로그램으로 모니터링한 감지센서의 출력 값이다.</p>
<p><strong>거리 별 색깔 변화(빨간색, 파란색)</strong><br />
거리별 색깔의 변화는 전광판에 나타날 빈 좌석인지 아닌지를 구별해주는 일종의 구분자이다. 실사용 이전에 전광판의 좌석이 비어있는지의 유무를 임시적으로 LED로 나타낸다.</p>
<table style="width: 620px" border="0">
<tbody>
<tr>
<td><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-좌석알림-9.jpg" rel="lightbox[31906]"><img class="size-full wp-image-31970 aligncenter" alt="38 ict 좌석알림 (9)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-좌석알림-9.jpg" width="503" height="340" /></a></td>
</tr>
<tr>
<td style="text-align: center">그림 8. LED가 추가된 회로도</td>
</tr>
</tbody>
</table>
<table style="width: 620px" border="0">
<tbody>
<tr>
<td><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-좌석알림-10.jpg" rel="lightbox[31906]"><img class="size-full wp-image-31969 aligncenter" alt="38 ict 좌석알림 (10)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-좌석알림-10.jpg" width="503" height="314" /></a></td>
</tr>
<tr>
<td>
<p style="text-align: center">그림 9. 거리에 따른 LED의 표시</p>
</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<p><strong>온도 별 색깔 표시(빨간색, 파란색)</strong><br />
아두이노용 센서 모듈에 대한 신뢰도가 떨어진다면, 온도센서 IC를 추가함으로써 신뢰도를 높일 수 있다. 거리 감지센서에서 일정거리 이하인 경우, 의자와 센서의 사이에 물체가 존재하게 되고, 물체의 존재유무만으로는 옆 사람이 잠시 올려둔 물체인지 아닌지를 모를 수도 있다. 이럴 때에 온도감지 센서를 통해서 한 번 더 감지하여 확실하게 빈자리의 유무를 확인한다.</p>
<table style="width: 620px" border="0">
<tbody>
<tr>
<td><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-좌석알림-4.jpg" rel="lightbox[31906]"><img class="size-full wp-image-31975 aligncenter" alt="38 ict 좌석알림 (4)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-좌석알림-4.jpg" width="503" height="321" /></a></td>
</tr>
<tr>
<td style="text-align: center">그림 10. 온도센서 회로도</td>
</tr>
<tr>
<td><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-좌석알림-12.jpg" rel="lightbox[31906]"><img class="size-full wp-image-31967 aligncenter" alt="38 ict 좌석알림 (12)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-좌석알림-12.jpg" width="490" height="302" /></a></td>
</tr>
<tr>
<td style="text-align: center">그림 11. LED를 추가한 온도센서 회로도</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<p><strong>지하철 빈좌석 표시</strong></p>
<table style="width: 620px" border="0">
<tbody>
<tr>
<td><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-좌석알림-13.jpg" rel="lightbox[31906]"><img class="size-full wp-image-31966 aligncenter" alt="38 ict 좌석알림 (13)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-좌석알림-13.jpg" width="490" height="109" /></a></td>
</tr>
<tr>
<td style="text-align: center">그림 12. OpenGL로 구현한 지하철 좌석 배치도</td>
</tr>
</tbody>
</table>
<p>앞서 설명한 모듈들을 하나로 구현하여 각각의 센서들에 대해 시리얼 번호를 지정하여 중앙 PC에 송신한다. 중앙PC는 받아들인 시리얼 통신을 OpenGL로 도식화 하여 빈 좌석(초록)과 그렇지 않은 좌석(빨강)을 색으로 표시한다.</p>
<p><strong>참고문헌</strong><br />
[1] 심재창, 고주영, 이영화, 정욱진, “재미삼아 아두이노” pp 97~113</p>
<p><strong>소스코드</strong></p>
<div class="symple-box gray none" style="text-align:left; width:100%;"> 
<p>Opengl.cpp<br />
#include &lt;stdlib.h&gt;<br />
#include &lt;gl/glut.h&gt;<br />
#include &lt;cmath&gt;<br />
#include &lt;gl/glu.h&gt;<br />
#include &lt;gl/gl.h&gt;</p>
<p>#pragma comment(linker, “/SUBSYSTEM:WINDOWS”)<br />
#pragma comment(linker, “/ENTRY:mainCRTStartup”)</p>
<p>GLsizei winWidth = 500, winHeight = 200;<br />
GLuint dlHEX;<br />
int arrr[32];<br />
int distance = 20;</p>
<p>void init(void)<br />
{<br />
glClearColor(1.0, 1.0, 1.0, 0.0); //윈도 색 지정</p>
<p>glMatrixMode(GL_PROJECTION); // 투명행렬 선택<br />
glLoadIdentity();<br />
//원점 위치 지정<br />
}<br />
//x축 y축<br />
void DrawMetro(){<br />
int Left = -215;<br />
int Right = Left + 19;<br />
int Up = 45;<br />
int Down = Up &#8211; 19;</p>
<p>glClear(GL_COLOR_BUFFER_BIT); // 창 초기화 및 컬러설정</p>
<p>glColor3f(0.39, 0.58, 0.93);<br />
glBegin(GL_POLYGON);<br />
glVertex2i(-220, -50);<br />
glVertex2i(-220, 50);<br />
glVertex2i(220, 50);<br />
glVertex2i(220, -50);<br />
glEnd();<br />
glColor3f(0, 0, 0);<br />
glBegin(GL_LINE_LOOP);<br />
glVertex2i(-220, -50);<br />
glVertex2i(-220, 50);<br />
glVertex2i(220, 50);<br />
glVertex2i(220, -50);<br />
glEnd();</p>
<p>for (int i = 0; i &lt; 2; i++){<br />
for (int j = 0; j &lt; 4; j++){<br />
if (distance &lt; 40) {<br />
glColor3f(1, 0, 0);<br />
}<br />
else {<br />
glColor3f(0.3, 0.95, 0.04);<br />
}<br />
glBegin(GL_POLYGON);<br />
glVertex2i(Left, Up);<br />
glVertex2i(Right, Up);<br />
glVertex2i(Right, Down);<br />
glVertex2i(Left, Down);<br />
glEnd();<br />
Left += 20;<br />
Right += 20;</p>
<p>}<br />
Up = -40 + 19;<br />
Down = -40;<br />
Left = -215;<br />
Right = -215 + 19;<br />
}<br />
Up = 45;<br />
Down = Up &#8211; 19;<br />
Left = -215 + 80 + 30 + 25;<br />
Right = Left + 19;<br />
for (int i = 0; i &lt; 2; i++){<br />
for (int j = 0; j &lt; 8; j++){<br />
if (distance &lt; 40) {<br />
glColor3f(1, 0, 0);<br />
}<br />
else {<br />
glColor3f(0.3, 0.95, 0.04);<br />
}<br />
glColor3f(0.3, 0.95, 0.04);<br />
glBegin(GL_POLYGON);<br />
glVertex2i(Left, Up);<br />
glVertex2i(Right, Up);<br />
glVertex2i(Right, Down);<br />
glVertex2i(Left, Down);<br />
glEnd();<br />
Left += 20;<br />
Right += 20;<br />
}<br />
Up = -40 + 19;<br />
Down = -40;<br />
Left = -215 + 80 + 30 + 25;<br />
Right = Left + 19;<br />
}</p>
<p>Left = -215 + 80 + 55 + 80 + 80 + 55;<br />
Right = Left + 19;<br />
Up = 45;<br />
Down = Up &#8211; 19;<br />
for (int i = 0; i &lt; 2; i++){<br />
for (int j = 0; j &lt; 4; j++){<br />
if (distance &lt; 40) {<br />
glColor3f(1, 0, 0);<br />
}<br />
else {<br />
glColor3f(0.3, 0.95, 0.04);<br />
}<br />
glColor3f(0.3, 0.95, 0.04);<br />
glBegin(GL_POLYGON);<br />
glVertex2i(Left, Up);<br />
glVertex2i(Right, Up);<br />
glVertex2i(Right, Down);<br />
glVertex2i(Left, Down);<br />
glEnd();<br />
Left += 20;<br />
Right += 20;<br />
}<br />
Up = -40 + 19;<br />
Down = -40;<br />
Left = -215 + 80 + 55 + 80 + 80 + 55;<br />
Right = Left + 19;<br />
}<br />
glFlush();//버퍼지우기<br />
}</p>
<p>void reshapeFcn(GLint w, GLint h)<br />
{<br />
glMatrixMode(GL_PROJECTION);<br />
glLoadIdentity();<br />
gluOrtho2D(w / -2.0, w / 2.0, h / -2.0, h / 2.0);<br />
glViewport(0, 0, w, h);<br />
}</p>
<p>int main(int argc, char **argv)<br />
{<br />
glutInit(&amp;argc, argv);<br />
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);<br />
glutInitWindowPosition(100, 100);<br />
glutInitWindowSize(winWidth, winHeight);<br />
glutCreateWindow(“지하철 좌석배치도”);</p>
<p>init();<br />
glutDisplayFunc(DrawMetro);<br />
glutReshapeFunc(reshapeFcn);<br />
glutMainLoop();</p>
<p>return 0;<br />
}</p>
<p>main.cpp</p>
<p>#include &lt;stdio.h&gt;<br />
#include &lt;tchar.h&gt;<br />
#include “SerialClass.h”<br />
#include &lt;string&gt;<br />
#pragma warning (disable:4996) //fopen 제거</p>
<p>int main(int argc, _TCHAR* argv[])<br />
{<br />
printf(“아두이노와의 시리얼 통신을 시작합니다\n\n”);</p>
<p>Serial* SP = new Serial(“\\\\.\\COM3”);//시리얼포트는 com3</p>
<p>if (SP-&gt;IsConnected())<br />
printf(“연결되었습니다.”);</p>
<p>char incomingData[256] = “”;<br />
//printf(“%s\n”,incomingData);<br />
int dataLength = 256;<br />
int readResult = 0;<br />
FILE *f;<br />
f = fopen(“TempData.txt”, “w”);<br />
int distance = 0;<br />
char dis = 0;<br />
while (SP-&gt;IsConnected())<br />
{<br />
readResult = SP-&gt;ReadData(incomingData, dataLength);<br />
std::string test(incomingData);</p>
<p>printf(“%s”, incomingData);</p>
<p>char* token = strtok(incomingData, “ “);<br />
int distance = 0;<br />
while (token != NULL) {<br />
fprintf(f, “\t%s”, token);<br />
int distance = atoi(token);<br />
token = strtok(NULL, “ “);<br />
}</p>
<p>// strtok // token<br />
test = “”;</p>
<p>Sleep(2000);</p>
<p>}<br />
fclose(f);<br />
return 0;<br />
}</p>
<p>SerialClass.cpp<br />
#include “SerialClass.h”</p>
<p>Serial::Serial(char *portName)<br />
{<br />
this-&gt;connected = false;</p>
<p>this-&gt;hSerial = CreateFile(portName,<br />
GENERIC_READ,<br />
0,<br />
NULL,<br />
OPEN_EXISTING,<br />
FILE_ATTRIBUTE_NORMAL,<br />
NULL);</p>
<p>if (this-&gt;hSerial == INVALID_HANDLE_VALUE)<br />
{<br />
if (GetLastError() == ERROR_FILE_NOT_FOUND){</p>
<p>printf(“ERROR: Handle was not attached. Reason: %s not available.\n”, portName);</p>
<p>}<br />
else<br />
{<br />
printf(“ERROR!!!”);<br />
}<br />
}<br />
else<br />
{<br />
DCB dcbSerialParams = { 0 };</p>
<p>if (!GetCommState(this-&gt;hSerial, &amp;dcbSerialParams)) {<br />
printf(“failed to get current serial parameters!”);<br />
}<br />
else{<br />
dcbSerialParams.BaudRate = CBR_9600;<br />
dcbSerialParams.ByteSize = 8;<br />
dcbSerialParams.StopBits = ONESTOPBIT;<br />
dcbSerialParams.Parity = NOPARITY;</p>
<p>if (!SetCommState(hSerial, &amp;dcbSerialParams)){<br />
printf(“ALERT: Could not set Serial Port parameters”);<br />
}<br />
else{</p>
<p>this-&gt;connected = true;<br />
Sleep(ARDUINO_WAIT_TIME);<br />
}<br />
}<br />
}</p>
<p>}</p>
<p>Serial::~Serial(){ // 연결 끊기 전에 연결되어있으면<br />
if (this-&gt;connected){<br />
this-&gt;connected = false;<br />
CloseHandle(this-&gt;hSerial);//통신종료<br />
}<br />
}</p>
<p>int Serial::ReadData(char *buffer, unsigned int nbChar){<br />
DWORD bytesRead;//읽은 바이트수<br />
unsigned int toRead;</p>
<p>ClearCommError(this-&gt;hSerial, &amp;this-&gt;errors, &amp;this-&gt;status);</p>
<p>if (this-&gt;status.cbInQue &gt; 0) {<br />
if (this-&gt;status.cbInQue &gt; nbChar){<br />
toRead = nbChar;<br />
}<br />
else{<br />
toRead = this-&gt;status.cbInQue;<br />
}</p>
<p>if (ReadFile(this-&gt;hSerial, buffer, toRead, &amp;bytesRead, NULL) &amp;&amp; bytesRead != 0)<br />
{<br />
return bytesRead;<br />
}<br />
}</p>
<p>return -1;</p>
<p>}</p>
<p>bool Serial::WriteData(char *buffer, unsigned int nbChar){<br />
DWORD bytesSend;</p>
<p>if (!WriteFile(this-&gt;hSerial, (void *)buffer, nbChar, &amp;bytesSend, 0)){<br />
ClearCommError(this-&gt;hSerial, &amp;this-&gt;errors, &amp;this-&gt;status);<br />
return false;<br />
}<br />
else<br />
return true;<br />
}</p>
<p>bool Serial::IsConnected(){<br />
return this-&gt;connected;<br />
}</p>
<p>Serial.h<br />
#ifndef SERIALCLASS_H_INCLUDED<br />
#define SERIALCLASS_H_INCLUDED<br />
#define ARDUINO_WAIT_TIME 2000</p>
<p>#include &lt;windows.h&gt;<br />
#include &lt;stdio.h&gt;<br />
#include &lt;stdlib.h&gt;</p>
<p>class Serial<br />
{<br />
private:<br />
HANDLE hSerial;<br />
bool connected;<br />
COMSTAT status;<br />
DWORD errors;</p>
<p>public:<br />
Serial(char *portName);//포트번호로 통신<br />
~Serial();<br />
int ReadData(char *buffer, unsigned int nbChar);//버퍼로부터<br />
bool WriteData(char *buffer, unsigned int nbChar);<br />
bool IsConnected();<br />
};</p>
<p>#endif</p>
<p>Arduino.ino<br />
int trigPin = 8; // trigPin을 13번에 저장<br />
int echoPin = 7; // echPin을 12번에 저장</p>
<p>void setup()<br />
{<br />
Serial.begin (9600); //시리얼 통신을, 9600속도로 받습니다. (숫자 조정은 자유)<br />
pinMode(trigPin, OUTPUT); //trigPic을 출력모드로<br />
pinMode(echoPin, INPUT); //echoPin을 입력모드로<br />
}</p>
<p>void loop()<br />
{<br />
long duration, distance; //시간과 거리를 설정합니다<br />
digitalWrite(trigPin, LOW); // trigPin이 low 신호를 주면<br />
delayMicroseconds(2); // 2 만큼 지연합니다<br />
digitalWrite(trigPin, HIGH); // trigPin이 high 신호를 주면<br />
delayMicroseconds(10); // 10 만큼 지연합니다<br />
digitalWrite(trigPin, LOW);<br />
duration = pulseIn(echoPin, HIGH); // duration에 밑의 공식을 대입합니다<br />
distance = (duration/2) / 29.1; // 초음파가 갔다가 돌아오기 때문에 2배의 값을 얻습니다 그렇기에 거리/2를 합니다.</p>
<p>if (distance &gt;= 200 ) // 거리가 200cm가 넘어가면<br />
{<br />
Serial.println(“Out of range.”); // 시리얼 모니터에 Out of range.라는 문구가 나옵니다<br />
}<br />
else<br />
{<br />
Serial.print(distance); // 시리얼 모니터에 diseance를 표기<br />
}<br />
delay(2000); // 작동을 500 동안 지연합니다.<br />
}<br />
</div>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ntrexgo.com/archives/31906/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
