<?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; featrure</title>
	<atom:link href="http://www.ntrexgo.com/archives/tag/featrure/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>[39호]4x4x4 RGB LED CUBE Tetris</title>
		<link>http://www.ntrexgo.com/archives/32433</link>
		<comments>http://www.ntrexgo.com/archives/32433#comments</comments>
		<pubDate>Fri, 25 Nov 2016 00:00:59 +0000</pubDate>
		<dc:creator>디바이스마트 매거진</dc:creator>
				<category><![CDATA[디바이스마트 매거진]]></category>
		<category><![CDATA[특집]]></category>
		<category><![CDATA[39호]]></category>
		<category><![CDATA[featrure]]></category>
		<category><![CDATA[ict]]></category>
		<category><![CDATA[공모전]]></category>
		<category><![CDATA[디바이스마트]]></category>
		<category><![CDATA[매거진]]></category>
		<category><![CDATA[융합]]></category>
		<category><![CDATA[참가상]]></category>
		<category><![CDATA[프로젝트]]></category>

		<guid isPermaLink="false">http://www.ntrexgo.com/?p=32433</guid>
		<description><![CDATA[디바이스마트매거진 39호 &#124; 수많은 LED를 3차원으로 배열 하여 소프트웨어로 각 LED의 켜짐과 꺼짐을 제어함으로써 3차원 디스플레이가 되게 하는 기술이다.
]]></description>
				<content:encoded><![CDATA[<p><strong><a href="http://www.ntrexgo.com/wp-content/uploads/2016/05/2016-ictmain.png" rel="lightbox[32433]"><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></strong></p>
<p><span style="font-size: large"><strong>2016 ICT 융합 프로젝트 공모전 참가상</strong></span></p>
<p><strong><span style="font-size: xx-large">4x4x4 RGB LED CUBE Tetris</span></strong></p>
<p style="text-align: right">글 | 동서대학교 이성빈, 김지환, 서성욱, 권병욱</p>
<p>&nbsp;</p>
<p><span style="color: #0000ff"><strong>심사평</strong></span><br />
<span style="color: #3366ff"><strong>뉴티씨</strong></span> 매우 재미있는 작품으로 생각되며, 만드는 동안도 재미있게 작업했을 것 같다. 학습하는데 이만한 작품도 많이 없을 것으로 생각되며, 실용적이지는 않지만, 작품의 완성도는 만점을 주었다. 보고서도 잘 작성하였지만, 좀 더 내용을 자세히 적을 수 있었다면 좋았을 것으로 보인다.<br />
<span style="color: #3366ff"><strong>칩센</strong></span> 유튜브 등에서 많이 나오는 주제다. 심지어 음악에 맞춰 visualize 되는 작품도 본적이 있어 자연스럽게 비교가 된다.<br />
<span style="color: #3366ff"><strong>위드로봇</strong></span> 3차원 LED 큐브를 게임과 접목한 작품입니다. 전체적으로 동작하는 시스템을 구현한 부분을 높이 평가하며, 테트리스보다 직관적인 게임이나 활용처를 찾는다면 좀 더 나은 작품이 될 것 같습니다.</p>
<p><span style="color: #0000ff"><strong>작품 개요</strong></span><br />
3D LED 큐브란 수많은 LED를 3차원으로 배열 하여 소프트웨어로 각 LED의 켜짐과 꺼짐을 제어함으로써 3차원 디스플레이가 되게 하는 기술이다.<br />
최근, 각종 디지털 관련 전시회에서 작품으로 나타나며 인터넷상에도 제작법이 여러 사이트에 공개되어 많은 사람들이 변형된 작품을 제안하고 있다. 당장 유투브, 구글에 검색해 보아도 많은 작품들이 검색되어 나온다. 이 작품들은 대게 LED 큐브 작동을 베이스로 하여 개개인의 패턴을 중점으로 하여 많은 사람들의 이목을 집중 시키는데 목표로 한다.</p>
<p>3x3x3, 4x4x4, 8x8x8, 16x16x16 등 여러가지 모양으로 제작되는데 이 큐브들의 공통점으로는 제작자가 입력한 방식으로만 움직인다는 공통점이 있었다. 대게 패턴을 보여주는데 이 패턴을 작동하는 방식으로 립모션, 프로세싱 등을 이용하여 사용자 인터렉션에 따라 조금씩 움직임이 변화를 줄 수 있지만 실질적으로는 제작자를 제외하고 직접 조작하는데 어려움이 있다고 보고 있다.<br />
그리하여 본 프로젝트에서는 누구나 직접 큐브를 조작할 수 있으며 사용자 인터렉션을 극대화시키는 방안을 생각하던 중 사용자가 가장 다가가기 쉬우며 흥미롭게 조작하는 방식으로 게임을 접목시켜 보기로 하였다.<br />
3D 게임을 접목시키기로 한 후 마땅한 게임을 찾는 도중 가장 대중적으로 알고 있으며 남녀노소 누구나 해보았던 테트리스를 큐브에 맞게 재해석하여 접목시키기로 하였다.</p>
<p><span style="color: #0000ff"><strong>작품 설명</strong></span><br />
<span style="color: #3366ff"><strong>주요 동작 및 특징</strong></span><br />
본 프로젝트에서는 BARE CONDUCTIVE TOUCH BOARD라는 전도성 터치보드를 이용하여 컨트롤판을 커스텀화 제작한다.<br />
제작된 컨트롤판을 터치하게 되면 개별적인 고유 값이 Processing으로 전달이 되며 큐브에 정보를 전송하게 해준다.<br />
각 이벤트 처리는 아두이노에서 자체적으로 하며 Proceesing에서는 큐브를 컨트롤하는 아두이노와 사용자 컨트롤판을 제어하는 역할을 수행 하며 여러 가지 사운드를 제공한다.<br />
본 프로젝트 Cube Tetris의 규칙은 다음과 같다.<br />
1. START를 누르면 Red/Green/Blue 중 랜덤으로 1층에 생성<br />
2. 화살표를 이용하여 4층에서 나온 섞을 색을 이동<br />
3. 합치고 싶은 색 위에서 DOWN을 눌러 색을 해당 층에 혼합<br />
4. Red/Green/Blue를 합쳐 흰색을 만들게 되면 불이 꺼짐<br />
5. 블록 생성 후 5초 동안 DOWN을 누르지 않으면 자동DOWN<br />
6. 중복이 된 색을 넣으면 그 위층에 쌓임<br />
7. 4층까지 모두 쌓이게 된다면 실패<br />
8. 정해진 개수만큼 불을 끄게 된다면 성공</p>
<p>본 프로젝트에서 다루는 Tetris와 기존의 Tetris와의 차이점으로는 입체와 평면의 차이로써 시작점이 일치하지 않다는 점과 다각도에서 보아야 한다는 점이 있다. 또한 기존의 Tetris 에서는 층 별 설계를 잘 하여야 하지만 본 프로젝트의 Tetris에서는 자신이 어떠한 색을 어디에 두어야 하는지 기억력과 순발력을 요구한다.</p>
<p><span style="color: #3366ff"><strong>전체 구성도</strong></span></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-444-tetris-6.jpg" rel="lightbox[32433]"><img alt="39 ict 444 tetris (6)" src="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-444-tetris-6.jpg" width="421" height="403" /></a><br />
1. Touch Board에서 이벤트 발생<br />
2. 프로세싱으로 이벤트 값 전송<br />
3. 이벤트값을 해석 후 Arduino로 값 전송<br />
4. Arduino에서 이벤트 처리<br />
5. Arduino에서 이벤트 처리 후 결과 Processing으로 리턴<br />
6. Processing 리턴 값에 대한 사운드 발생</p>
<p><span style="color: #3366ff"><strong>개발 환경</strong></span><br />
<span style="color: #008080"><strong>(1) Arduino</strong></span><br />
큐브의 RGB 전구 RED, BLUE, GREEN 3가지 색을 개별적으로 컨트롤 한다. 개별적 컨트롤 하는 방식으로 Charlie Plexing 기법을 사용하였다.<br />
Charlie Plexing 기법이란 적은 I/O핀으로 많은 LED를 다루는 기술 이다. 핀당 제어가 가능한 ELD의 수로는 (N^2-N)의 공식으로 성립하게 되며 본 프로젝트의 4X4X4큐브에서 LED 개수 64개는 아두이노의 16개의 핀으로 제어가 된다.</p>
<p>핀과 연결이 되면 C++파일을 이용하여 Mapping Table을 만든 후 헤더에 추가한다.</p>
<p>LED를 개별적으로 켤 경우 drawLed 함수를 이용하여 x, y, z값과 색상 밝기를 입력하면 그 위치가 켜지는 방식이며 이 drawLed를 활용하여 drawBox, drawWall, drawLine등 큐브를 3차원으로 컨트롤 하는 함수를 cubeplex 클래스에 미리 구현하여 헤더에 추가한다.</p>
<p>RGB 각각을 기본 색상으로만 이루어진 PrimaryColor, 두 가지 색을 합친 SecondaryColor, 그리고 모든 색상이 있는 nextColor의 배열에 추가 되며 각각의 어레이 위치에는 매크로 함수를 이용하여 고유 값이 저장 되어 있으며 다른 색상을 원한다면 위 함수를 호출 해 주는 것으로 색상이 변하게 된다.</p>
<p>큐브에 있는 모든 메모리를 해제하는 ClearBuffer가 있으며 이전의 함수의 메모리를 해제하는 FlushBuffer 두 가지 함수가 있다.</p>
<p>하나의 이벤트를 행한 후 FlushBuffer를 호출하지 않을 경우 다음 이벤트에서 이중으로 이벤트가 발생할 수 있기 때문에 항상 이벤트의 마지막에 Flush Buffer를 호출해 주어야 한다.</p>
<p><span style="color: #008080"><strong>(2) Processing</strong></span><br />
컨트롤판에서 사용하는 BARE CONDUCTIVE TOUCH BOARD의 이벤트 값을 받아와 Arduino에 전송해 준다. 이 때 전송받는 이벤트 값은 키보드에 있는 알파벳 값을 고유값으로 들어오게 되며 Arduino에 전송되는 값은 모두 int형으로 고유값을 변환하여 보내주게 된다. 또한 블록이 생성되면 Thread를 이용하여 5초가 지나게 되면 다운되는 이벤트를 보내주게 되는데, 이를 Arduino에서 구현하지 않는 이유로는 아두이노에서 기본적으로 Thread를 지원하지 않으며 메인 프로세스외에 서브 프로세스로 Thread를 구현 하였을 때 정상적으로 작동하지 않는 문제점도 있었기 때문에 제어 역할을 하는 Processing에서 구현하는 방식을 채택 하였다.<br />
또한 Processing에서는 Arduino에서 생기는 이벤트에 대한 사운드 역할도 함께 한다. 예를 들어 블록이 없어지는 이벤트, 새로운 블록이 생성되는 이벤트, 실패 그리고 성공 이벤트 등 모든 이벤트에 대한 사운드는 Processing에서 제공 한다.</p>
<p><span style="color: #0000ff"><strong>단계별 제작 과정</strong></span><br />
1. 4층 높이의 RGB LED 기둥 제작<br />
2. 제작된 기둥을 기판에 부착<br />
3. 기판 뒷부분 공통 색상 다리 연결<br />
4. 연결된 선을 아두이노에 연결<br />
5. 아두이노에 소스 이식 하여 작동 여부 확인<br />
6. Processing &#8211; Arduino 연결<br />
7. Processing을 이용한 큐브 개별 컨트롤<br />
8. Processing &#8211; Touch Board 연결<br />
9. 시리얼 통신 이벤트 전달<br />
10. 큐브 이벤트 동작 확인</p>
<p><span style="color: #0000ff"><strong>기타 자료</strong></span><br />
<span style="color: #3366ff"><strong>회로도</strong></span></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-444-tetris-1.jpg" rel="lightbox[32433]"><img class="alignnone size-full wp-image-32554" alt="39 ict 444 tetris (1)" src="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-444-tetris-1.jpg" width="589" height="383" /></a></p>
<p>위 그림과 같이 Z축으로 한 개씩 쌓아 가지만 90°씩 돌려 서로 다른 다리가 맞물리도록 쌓아간다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-444-tetris-2.jpg" rel="lightbox[32433]"><img class="alignnone size-full wp-image-32556" alt="39 ict 444 tetris (2)" src="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-444-tetris-2.jpg" width="604" height="381" /></a></p>
<p>1층 RGB 전구를 기준으로 각 R, G, B, GND 다리를 공통적으로 모아 한쪽으로 배선을 빼낸다.<br />
배선 번호와 아두이노핀 연결은 다음 표와 같다.<br />
<strong></strong></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-444-tetris-1.png" rel="lightbox[32433]"><img class="alignnone  wp-image-32555" alt="39 ict 444 tetris (1)" src="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-444-tetris-1.png" width="500" /></a></p>
<p><span style="color: #3366ff"><strong>소스코드</strong></span><br />
<span style="color: #008080"><strong>(1) Arduino</strong></span></p>
<div class="symple-box gray none" style="text-align:left; width:100%;"> 
<p>if(Seral.available()&gt;0) {<br />
int b = Serial.read();<br />
Serial.print(b);<br />
int r = b;<br />
if(Start == false){<br />
if(r==0||r==3)<br />
{<br />
moveY(r);<br />
}<br />
if(r==1||r==2){<br />
MoveX(r);<br />
}<br />
if(r==4){<br />
DownKey();<br />
}<br />
}<br />
if(r==5){<br />
planarFlop3D();<br />
starter();<br />
}<br />
if(r==6){<br />
Rcolor=-7;<br />
clearBuffer();<br />
flushBuffer();<br />
Tstatus=true;</p>
<p><strong>Processing &#8211; Arduino간 시리얼 통신</strong></p>
</div>
<p>Serial 통신으로 이벤트 값이 전달되었을 경우 int형으로 값을 읽어온다. 읽어온 값에 의해 다음 이벤트를 호출하게 된다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-444-tetris-2.png" rel="lightbox[32433]"><img class="alignnone  wp-image-32557" alt="39 ict 444 tetris (2)" src="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-444-tetris-2.png" width="500" /></a></p>
<div class="symple-box gray none" style="text-align:left; width:100%;"> 
<p>void MoveY(int a){<br />
if(a==0){<br />
if(Ry!=3){<br />
drawLed(-7,Rx,Ry,Rz);<br />
flushbuffer();<br />
Ry++;<br />
drawLed(Rcolor, Rx, Ry, Rz);<br />
flushBuffer();<br />
delay(200);<br />
}<br />
}<br />
else if(a==3){<br />
if(Ry ! =0){<br />
drawLed(-7,Rx,Ry,Rz);<br />
flushbuffer();<br />
Ry&#8211;;<br />
drawLed(Rcolor, Rx, Ry, Rz);<br />
flushBuffer();<br />
delay(200);<br />
}<br />
}<br />
}</p>
<p><strong>Y축 이동 이벤트</strong></p>
</div>
<div class="symple-box gray none" style="text-align:left; width:100%;"> 
<strong></strong></p>
<p>void MoveX(int t){<br />
if(t==1){<br />
if(Rx!=0){<br />
drawLed(-7,Rx,Ry,Rz);<br />
flushBuffer();<br />
Rx&#8211;;<br />
DrawLed(Rcolor,Rx, Ry,Rz);<br />
flushBuffer();<br />
delay(200);<br />
}<br />
}<br />
else if(t==2){<br />
if(Rx!=3){<br />
drawLed((-7,Rx,Ry,Rz);<br />
flushBuffer();<br />
Rx++;<br />
DrawLed(Rcolor,Rx, Ry,Rz);<br />
flushBuffer();<br />
delay(200);<br />
}<br />
}<br />
}</p>
<p><strong>X축 이동 이벤트</strong></p>
</div>
블록 이동 이벤트로 상승/감소 이벤트를 체크 후 끝점에 위치하고 있는지 확인한다. 만약 끝점에 있지 않은 경우 상승/감소를 하게 되며 끝점에 있다면 이벤트 처리를 하지 않고 넘어가게 된다.</p>
<div class="symple-box gray none" style="text-align:left; width:100%;"> 
<p>void DownKey(){<br />
int ta=0; //합쳐야 될 z축 값<br />
int hap=0; //합침 유무 확인<br />
for(int i=2; i&gt;=0; i&#8211;){<br />
drawLed(Rcolor,Rx,Ry,i+1);<br />
flushBuffer();<br />
delay(100);<br />
drawLed(-7,Rx,Ry,i_1);<br />
flushBuffer();<br />
if(PresentLed[Rx][Ry][i] !=-7){<br />
int Pcolor=PresentLed[Rx][Ry][i];<br />
switch(Pcolor{</p>
<p><strong>Down키 이벤트 호출</strong></p>
</div>
<p>Down 이벤트가 호출되었을 경우 Z축 최상위인 3을 제외하며 한 층씩 내려가며 비교하게 된다. 만약 LED가 켜져 있는 경우 Switch 문을 이용하여 비교하게 된다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-444-tetris-5.png" rel="lightbox[32433]"><img class="alignnone  wp-image-32553" alt="39 ict 444 tetris (5)" src="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-444-tetris-5.png" width="500" /></a><a href="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-444-tetris-4.png" rel="lightbox[32433]"><img class="alignnone  wp-image-32561" alt="39 ict 444 tetris (4)" src="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-444-tetris-4.png" width="500" /></a></p>
<p>현재 Led가 켜져 있는 층의 Color 값과 블록의 Color 값을 비교하여, 기존의 층에 있는 Color에 섞여있지 않은 값이 들어오게 된다면 그 층에 색이 섞여서 반환하게 되며, 이미 있는 색상일 경우 그 위층에 블록의 Color 값을 반환하여 쌓이게 된다.</p>
<div class="symple-box gray none" style="text-align:left; width:100%;"> 
<p>if(hap==0){<br />
if(PresentLed[Rx][Ry][ta]==6){<br />
drawLed(6, Rx, Ry, ta);<br />
flushBuffer();<br />
delay(300);<br />
PresentLed[Rx][Ry][ta]=-7;<br />
drawLed(-7, Rx, Ry, ta);<br />
flushBuffer();<br />
delay(300(;<br />
Tcount++;<br />
}<br />
else{<br />
drawLed(PresentLed[Rx][Ry][ta], Rx, Ry, ta);<br />
flushBuffer();<br />
}<br />
}<br />
else{<br />
drawLed(PresentLed[Rx][Ry][ta+1], Rx, Ry, ta+1);<br />
flushBuffer();<br />
}<br />
flushBuffer();<br />
delay(300);</p>
<p>Tstatus=true;<br />
}</p>
</div>
<p>변수 Hap이 0일 경우 색이 합쳐졌다는 의미이며 현재 층의 Led Color값이 6, 즉 흰색이 되게 되면 0.3초 동안 반짝이며 -7값으로 변경 되면서 꺼지게 된다. Led Color 값이 6이 아니라면 그 층에 색이 합쳐지게 된다.<br />
만약 Hap이 1일 경우 색이 섞이면 안되므로 현재 층 보다 한 칸 위에 색이 쌓이게 된다.</p>
<div class="symple-box gray none" style="text-align:left; width:100%;"> 
<p>void starter(){<br />
Tcount =0;<br />
flushBuffer();<br />
clearBuffer();<br />
for(int i=0; i&lt;4; i++){<br />
for(int j=0; j&lt;4; j++){<br />
for(int a=0; a&lt;4; a++){<br />
PresentLed[i][j][a]=-7;<br />
}<br />
}<br />
}<br />
for(int i=0; i&lt;4; i++){<br />
for(int j=0; J&lt;4; J++){<br />
int rrcolor=random(0,3);<br />
PresentLed[i][j][0];<br />
flushBuffer();<br />
}<br />
}<br />
Start=false;<br />
delay(1000);<br />
}<br />
</div>
<p>starter 이벤트가 호출이 되면 현재 클리어한 블록 카운트를 초기화 하며 기존에 켜져있는 모든 LED를 끈다. 그 후 1층에 RED, BLUE, GREEN 중 1가지 색을 랜덤으로 배치하며 현재 start가 되었다는 값을 반환해준다.</p>
<div class="symple-box gray none" style="text-align:left; width:100%;"> 
<p>void randomCreate(){</p>
<p>Rx = random(0,4);<br />
Ry = random(0,4);<br />
Rz = 3;<br />
Rcolor = random(0,3);<br />
drawLed(Rcolor, Rx, Ry, 3);<br />
flushBuffer();v<br />
Tstatus=false;<br />
Serial,write(1);<br />
}</p>
</div>
게임이 시작하게 되면 randomCreate 함수를 호출하게 되는데 이 함수는 가장 위층에 랜덤 색상으로 하나의 LED를 켜주는 역할을 하며 현재 블록 하나가 컨트롤되고 있는 값을 반환하여 준다. 또 Serial 통신을 통해 프로세싱에 현재 블록이 컨트롤되고 있다는 이벤트를 전달하여 준다.</p>
<div class="symple-box gray none" style="text-align:left; width:100%;"> 
<p>int Discrimination(){<br />
flushBuffer();<br />
if(Tcount!=3){<br />
for(int i=0; i&lt;4, i++){<br />
for(int j=0; j&lt;4; j++){<br />
if(PresentLed[i][j][3]! = -7(<br />
freurn 1;<br />
}<br />
}<br />
}<br />
return 0;<br />
}<br />
else<br />
return 2;<br />
}</p>
</div>
<p>Discrimination 함수는 게임 승패 여부를 확인하는 함수이다. 블록 하나가 다운되어 연산이 실행된 후 호출이 되며 Tcount는 클리어 한 블록의 개수를 나타낸다. 현재 코드에는 3개의 블록을 클리어하게 되면 게임이 승리로 끝나게 되므로 카운트가 Tcount 값이 3일 경우 반환을 2로 하여 게임이 승리하게 되며, Tcount 값이 3이 아니지만 Z축 4층에 LED가 켜져 있다면 실패로 간주한다. Tcount 값이 3이 아니며 4층에 켜져 있는 LED가 없다면 게임을 속행하게 된다.</p>
<p><strong><span style="color: #008080">(2) Processing</span></strong></p>
<p><span style="color: #000000"><div class="symple-box gray none" style="text-align:left; width:100%;"> 
</span></p>
<p>Serial Port;<br />
Serial Port2;<br />
void setup() {<br />
size(1200, 600, P3D);<br />
textureMode(NORMAL);’<br />
fill(255);<br />
prot = new Serial(this, Serial.list()[0], 9600);<br />
}</p>
<p><span style="color: #000000"></div></span></p>
<p>Processing에서 아두이노와 Serial 통신을 위한 포트를 선언하여 준다.<br />
Serial 통신이 다대일 통신이 가능함으로 배열을 통해 포트를 선언하여 설정한다.</p>
<div class="symple-box gray none" style="text-align:left; width:100%;"> 
<p>void framesmanagement(){<br />
int t=0;<br />
t=port.read();<br />
if(t==1){<br />
Ft.start();<br />
}<br />
if (keyPressed) {<br />
if((key== ‘T’ || key == ‘t’)) {<br />
print(key);<br />
delay(300);<br />
port.write(5);<br />
}<br />
else if((key== ‘F’ || key== ‘f’)) {<br />
print(key);<br />
delay(300);<br />
port.write(6);<br />
}<br />
</div>
<p>Touch Board에서 이벤트값이 입력되었을 때 호출되는 함수이다.<br />
t=port.read();는 아두이노에서 Serial 통신을 받아와 읽어오는 역할을 하며 블록이 생성 되었을때 아두이노에서 int형 1의 값이 넘어와 Thread를 시작하는 역할을 수행 한다. 이벤트 값은 키보드의 자판과 동일하게 입력되기 때문에 keyPressed함수로 키가 눌러졌는지 여부를 확인 후 어떤 키가 눌러졌는지 받는다. Touch Board의 키 값과 아두이노에 Serial 통신되는 값은 다음 표와 같다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-444-tetris-5.png" rel="lightbox[32433]"><img class="alignnone  wp-image-32553" alt="39 ict 444 tetris (5)" src="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-444-tetris-5.png" width="500" /></a></p>
<div class="symple-box gray none" style="text-align:left; width:100%;"> 
<p>public class fillThread implements Runnable<br />
{<br />
Thread thread;<br />
int pauseTime; //Time to wait between loops<br />
int level = 0;<br />
boolean filled=true;</p>
<p>public FillThread(int pt)<br />
{</p>
<p>pauseTime = pt;<br />
}<br />
thread = new Thread(this);<br />
thread.start();<br />
}</p>
<p>public void run()<br />
{<br />
// do something threaded here<br />
while(filled!=false) {</p>
<p>// Wait a little(give other threads time to run)<br />
try {<br />
Thread.sleep(1000);<br />
level++;<br />
if(level==4){<br />
stop();<br />
}<br />
}</p>
<p>public void stop()<br />
{<br />
filled=false;<br />
level=0;<br />
thread = null;<br />
}<br />
</div>
Thread 동작하는 함수이다.<br />
블록이 생성되어 Serial통신을 통해 생성되었다는 신호가 Processing에 도착하게 되면 함수가 호출된다.<br />
위 함수에서는 블록이 다운되지 않고 5초가 흐르게 될 경우 다운 이벤트를 포트를 통해 전송하게 되고 Thread가 종료된다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-444-tetris-3.jpg" rel="lightbox[32433]"><img class="alignnone size-full wp-image-32558" alt="39 ict 444 tetris (3)" src="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-444-tetris-3.jpg" width="545" height="294" /></a> <a href="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-444-tetris-4.jpg" rel="lightbox[32433]"><img class="alignnone size-full wp-image-32560" alt="39 ict 444 tetris (4)" src="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-444-tetris-4.jpg" width="545" height="294" /></a></p>
<p><span style="color: #3366ff"><strong>참고문헌</strong></span><br />
[1] http://sobisource.com/<br />
[2] 말하고 듣고 대화하는 Physical Computing 아두이노 (한빛 아카데미)<br />
[3] https://www.youtube.com/watch?v=maM-mrrYY3o</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ntrexgo.com/archives/32433/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[39호]T.E.G(스털링 엔진을 이용한 발전기)</title>
		<link>http://www.ntrexgo.com/archives/32441</link>
		<comments>http://www.ntrexgo.com/archives/32441#comments</comments>
		<pubDate>Fri, 25 Nov 2016 00:00:53 +0000</pubDate>
		<dc:creator>디바이스마트 매거진</dc:creator>
				<category><![CDATA[디바이스마트 매거진]]></category>
		<category><![CDATA[특집]]></category>
		<category><![CDATA[39호]]></category>
		<category><![CDATA[featrure]]></category>
		<category><![CDATA[ict]]></category>
		<category><![CDATA[공모전]]></category>
		<category><![CDATA[디바이스마트]]></category>
		<category><![CDATA[매거진]]></category>
		<category><![CDATA[융합]]></category>
		<category><![CDATA[참가상]]></category>
		<category><![CDATA[프로젝트]]></category>

		<guid isPermaLink="false">http://www.ntrexgo.com/?p=32441</guid>
		<description><![CDATA[디바이스마트매거진 39호 &#124; 환경문제에 대응하기 위하여 신재생 에너지를 이용하여 전기를 만드는 작품을 제작하기로 계획하였다.]]></description>
				<content:encoded><![CDATA[<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/05/2016-ictmain.png" rel="lightbox[32441]"><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><span style="font-size: large"><strong>2016 ICT 융합 프로젝트 공모전 참가상</strong></span></p>
<p><span style="font-size: x-large"><strong>T.E.G(스털링 엔진을 이용한 발전기)</strong></span></p>
<p style="text-align: right">글 | 동양미래대학교 이승민, 이은빈, 윤혜린, 김하은, 이무호, 허창준, 신집섭, 김상훈, 이학기, 김재환</p>
<p><span style="color: #0000ff"><strong>심사평</strong></span><br />
뉴티씨 스털링 엔진은 에너지 분야나 기계 분야에서 매우 관심있게 현재 조명받고 있는 분야인데, 이를 실제로 만들어 보았다는 것은 큰 의미가 있는 것 같다. 실제로 학생이 이를 구현하였다는 것은 앞으로 좀 더 연구하여 친환경적인 에너지를 전자와 접목할 수 있는 근거가 되리라 본다. 창의성이나 실용성, 기술성 면에서 높은 점수를 받았으나, 완성된 모습이 보이지 않아 작품성이나 완성도는 조금 낮은 점수를 받았다.<br />
칩센 쉽게 접할 수 없는 주제라 흥미롭다. 실제 스털링 엔진을 만들어서 구현했다는 점에서 높은 평가를 한다.<br />
위드로봇 스털링 엔진을 활용하는데 있어 발전기를 돌리는 내용까지 진행한 작품은 아이디어가 좀 부족해 보입니다. 이를 잘 활용할 수 있는 상황을 가정하고 그 상황에서 발생하는 문제점을 해결할 수 있는 내용이 추가가 되면 좋겠습니다.</p>
<p><span style="color: #0000ff"><strong>TEG 목적</strong></span><br />
현대인에게 없어서는 안 될 필수자원인 전기를 생산하기 위해서는 화석연료의 사용이 주를 이룬다. 그 과정에서 지구 온난화와 같은 기후적 문제가 발생한다. 이러한 환경문제에 대응하기 위하여 신재생 에너지를 이용하여 전기를 만드는 작품을 제작하기로 계획하였다.<br />
먼저 발전기를 돌릴 때 보편적으로 사용하는 소형 DC모터를 사용하기로 결정했다. 이어서 어떻게 이 모터를 돌릴 것인지를 고안해낸 것이 스털링 엔진이다. 이는 발전기에 필요한 동력도 생산해낼 수 있을 뿐 아니라, 주제와 맞게 친환경적으로 접근 가능하고, 열만 있다면 별다른 준비물이 필요하지 않기 때문에 우리의 의도와 맞아 떨어졌다.</p>
<p><span style="color: #0000ff"><strong>TEG 동작 설명</strong></span><br />
<span style="color: #3366ff"><strong>실린더 가열부 가열</strong></span><br />
스털링 엔진 실린더 가열부에 열을 가한다. 실린더 내부의 공기가 팽창한다.</p>
<p><span style="color: #3366ff"><strong>회전자 회전</strong></span><br />
실린더 가열과 동시에 기동장치를 동작시켜 기동토크를 가해준다. 실린더 가열부 온도를 측정하여 설정온도에 도달하면 기동장치를 정지시키고 스털링 엔진의 피스톤 운동에 의해 회전자가 회전한다.</p>
<p><span style="color: #3366ff"><strong>전기에너지 생성</strong></span><br />
회전자가 회전하면 회전자에 연결되어있는 모터가 구동되어 전기에너지가 발생한다.</p>
<p><span style="color: #0000ff"><strong>기대효과</strong></span></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-teg스털링-엔질을-이용한-발전기-1.png" rel="lightbox[32441]"><img class="alignnone  wp-image-32615" alt="39 ict teg스털링 엔질을 이용한 발전기 (1)" src="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-teg스털링-엔질을-이용한-발전기-1.png" width="500" /></a><br />
최근 환경오염 문제가 심각해짐에 따라 예전의 석탄, 석유 등 화석연료나 위험한 원자력 에너지를 대체할 방법으로 주목 받고 있는데, TEG는 발전 시 해로운 물질이 배출되지 않기 때문에 그린에너지 개발에 큰 기여를 할 것으로 보인다.<br />
또한 사람이 힘을 쓰지 않고, 열만 있다면 언제든지 스털링 엔진 구동이 가능하므로 시간상의 제약이 없으며, 뜨겁거나 차가운 물체가 따로 필요하지 않기 때문에 기존의 스털링 엔진과는 다르게 발전 시 공간상의 제약도 사라지게 된다. 더 나아가 이 TEG는 전기를 필요로 하는 모든 분야에 적용이 가능할 것으로 보인다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-teg스털링-엔질을-이용한-발전기-1.jpg" rel="lightbox[32441]"><img class="alignnone  wp-image-32614" alt="39 ict teg스털링 엔질을 이용한 발전기 (1)" src="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-teg스털링-엔질을-이용한-발전기-1.jpg" width="500" /></a></p>
<p><span style="color: #0000ff"><strong>이론</strong></span><br />
<span style="color: #3366ff"><strong>폐열</strong></span><br />
일상생활에서 열에너지를 사용할 때, 실질적으로 사용되는 열에너지는 50% 이하이므로 사용하고 남은 열에너지는 버려지고 있다. 이렇게 에너지를 이용하는 과정에서 외부로 버려지는 열을 폐열이라 하는데, 이러한 폐열은 원전의 냉각수, 보일러실의 배기가스 열, 발전소의 냉각수열, 목욕탕 온배수 등 에너지를 사용하는 곳에서는 반드시 발생하게 된다. 이 폐열에너지를 이용한다면 에너지를 효율적으로 사용할 수 있다. 따라서 우리는 이러한 폐열에너지를 이용하여 발전을 통해 전기에너지를 생산하고자 한다.</p>
<p><span style="color: #3366ff"><strong>스털링 엔진 </strong></span><br />
본체인 스털링엔진은 실린더나 피스톤으로 이루어진 공간에 수소나 헬륨 등의 가스를 넣고 이를 외부에서 가열시키거나 냉각시켜, 피스톤 운동을 일으켜 전기를 생산해내는 구조이다. 여기서 수소는 안전상의 문제가 있으므로 헬륨을 이용할 계획이다.<br />
스털링 엔진의 종류에는 α형, β형, γ형 등이 있는데 T.E.G는 2개의 피스톤으로 구성되어 있는 형을 선택하였다. 그 이유로는 압축비(최대 용적/최소 용적)를 높이기 쉽고, 고출력을 얻기가 쉽다는 특징 때문이다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-teg스털링-엔질을-이용한-발전기-2.jpg" rel="lightbox[32441]"><img class="alignnone  wp-image-32616" alt="39 ict teg스털링 엔질을 이용한 발전기 (2)" src="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-teg스털링-엔질을-이용한-발전기-2.jpg" width="500" /></a></p>
<p>① 실린더에 열을 가해주면 내부 공기분자가 빠르게 움직여서, 부피가 팽창한다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-teg스털링-엔질을-이용한-발전기-3.jpg" rel="lightbox[32441]"><img class="alignnone  wp-image-32617" alt="39 ict teg스털링 엔질을 이용한 발전기 (3)" src="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-teg스털링-엔질을-이용한-발전기-3.jpg" width="500" /></a><br />
② 그 팽창하는 힘에 의해 피스톤운동을 시작하여 피스톤에 연결된 회전자가 돌기 시작한다.</p>
<p>스털링 엔진의 응용분야로는 태양열을 이용한 스털링 엔진 발전 시스템, 가정용 소형 발전 시스템, 스털링 엔진 자동차와 하이브리드 전기차 시스템, 스털링 냉동기, 스털링 히트 펌프 난방기, 폐열 회수 등이 있다. T.E.G는 이 중에서도 발전 시스템으로 응용한 작품이다.</p>
<p><span style="color: #3366ff"><strong>모터</strong></span></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-teg스털링-엔질을-이용한-발전기-4.jpg" rel="lightbox[32441]"><img class="alignnone size-full wp-image-32584" alt="39 ict teg스털링 엔질을 이용한 발전기 (4)" src="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-teg스털링-엔질을-이용한-발전기-4.jpg" width="178" height="192" /></a><br />
<span style="text-decoration: underline">Nihon Micro Motor</span><br />
· 가정용으로 주로 사용<br />
· AC 모터에 비해 힘이 약함.<br />
· AC 모터에 비해 전력소모가 적어 전기료가 적게 나옴.<br />
· 속도, 경사 등 속도제어가 미세하게 조정이 되어 원하는 속도로 운동이 가능.<br />
· 견고성이 AC 모터에 비해 우수함.<br />
· 미세한 속도제어가 필요한 가정용으로 적합.<br />
· 수리비가 적게 나옴<br />
· 소음이 적어 가정용으로 적합</p>
<p><span style="color: #3366ff"><strong>온도센서</strong></span><br />
DTS-M300은 적외선온도센서를 기반으로 하여 접촉하지 않고, 원하는 대상의 온도를 정확히 측정할 수 있는 온도센서 모듈. 특징은 다음과 같다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-teg스털링-엔질을-이용한-발전기-5.jpg" rel="lightbox[32441]"><img class="alignnone size-full wp-image-32585" alt="39 ict teg스털링 엔질을 이용한 발전기 (5)" src="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-teg스털링-엔질을-이용한-발전기-5.jpg" width="266" height="216" /></a></p>
<p><span style="text-decoration: underline">DTS-M300</span><br />
· 원거리에 물체온도 측정가능<br />
· 30 ~ 300℃ 타겟온도 측정<br />
· 20 ~ 80℃ 주변온도 측정<br />
· 0.01℃ 분해능<br />
· 1mA 저전류 소비<br />
· Small Size(25mm*33mm)</p>
<p>T.E.G는 온도센서를 이용하여 스털링 엔진 실린더 가열부 측 온도를 측정하고, 설정온도에 도달하면 기동장치를 동작시켜 스털링 엔진에 기동토크를 걸어주어서 회전자를 돌린다.</p>
<p><span style="color: #3366ff"><strong>RPM 측정센서</strong></span><br />
TCRT 5000은 적외선 반사광을 기반으로 하여 접촉하지 않고, 원하는 대상의 회전속도를 정확히 측정할 수 있는 적외선 반사광 모듈. 특징은 다음과 같다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-teg스털링-엔질을-이용한-발전기-6.jpg" rel="lightbox[32441]"><img class="alignnone size-full wp-image-32586" alt="39 ict teg스털링 엔질을 이용한 발전기 (6)" src="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-teg스털링-엔질을-이용한-발전기-6.jpg" width="262" height="240" /></a></p>
<p><span style="text-decoration: underline">TCRT 5000</span><br />
· 적외선 반사광 모듈<br />
· -40℃~125℃ 사용가능<br />
· 1.5V~6V 공급전압<br />
· 1mm ~ 8mm 측정가능<br />
· Small Size(37.5mm*10.2mm)</p>
<p>T.E.G는 RPM 측정센서를 이용하여 스털링 엔진 회전자측 회전속도를 측정하여, my DAQ를 통해서 LabVIEW 프로그램에 회전속도를 나타낸다.</p>
<p><span style="color: #3366ff"><strong>my DAQ</strong></span></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-teg스털링-엔질을-이용한-발전기-7.jpg" rel="lightbox[32441]"><img class="alignnone size-full wp-image-32587" alt="39 ict teg스털링 엔질을 이용한 발전기 (7)" src="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-teg스털링-엔질을-이용한-발전기-7.jpg" width="266" height="217" /></a><br />
NI my DAQ은 창의적 공학설계 및 강의를 위한 전문 공학 교육 플랫폼으로, 디지털 멀티미터, 오실로스코프, Function 발생기 등 8가지 계측기와 USB DAQ 기능을 포함하고 있다. 전 세계 수많은 대학에서 널리 사용되고 있는 그래픽 기반 프로그래밍 언어 NI LabVIEW와 Multisim 소프트웨어를 연동하여 다양한 공학 실험이 가능하다.</p>
<p><span style="color: #0000ff"><strong>기존제품과 비교</strong></span></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-teg스털링-엔질을-이용한-발전기-8.jpg" rel="lightbox[32441]"><img class="alignnone size-full wp-image-32588" alt="39 ict teg스털링 엔질을 이용한 발전기 (8)" src="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-teg스털링-엔질을-이용한-발전기-8.jpg" width="526" height="240" /></a><br />
<span style="text-decoration: underline">유사 기존 제품 &#8211; 에피파니 원 퍽</span><br />
에피파니 원 퍽에는 빨간색과 파란색 두 가지 면이 있는데 빨간색 면에는 뜨거운 음료를 파란색 면에는 차가운 음료수를 올려놓으면 휴대폰 충전이 가능하다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-teg스털링-엔질을-이용한-발전기-9.jpg" rel="lightbox[32441]"><img class="alignnone size-full wp-image-32589" alt="39 ict teg스털링 엔질을 이용한 발전기 (9)" src="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-teg스털링-엔질을-이용한-발전기-9.jpg" width="526" height="240" /></a></p>
<p><span style="text-decoration: underline">T.E.G</span><br />
에피파니 원 퍽은 출력이 작아 가정용으로 적합하여 응용이 휴대폰 충전에 초점이 맞춰져 있다. 그런 반면 TEG는 출력이 유사 기존 제품보다 크기 때문에 대형화한다면 공업용으로 사용가능하고 선풍기, 냉각기, 환풍기 등의 여러 가지 응용부하를 선택할 수 있다.</p>
<p><span style="color: #0000ff"><strong>제작 과정</strong></span></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-teg스털링-엔질을-이용한-발전기-10.jpg" rel="lightbox[32441]"><img class="alignnone size-full wp-image-32590" alt="39 ict teg스털링 엔질을 이용한 발전기 (10)" src="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-teg스털링-엔질을-이용한-발전기-10.jpg" width="526" height="334" /></a> <a href="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-teg스털링-엔질을-이용한-발전기-11.jpg" rel="lightbox[32441]"><img class="alignnone size-full wp-image-32591" alt="39 ict teg스털링 엔질을 이용한 발전기 (11)" src="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-teg스털링-엔질을-이용한-발전기-11.jpg" width="526" height="323" /></a> <a href="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-teg스털링-엔질을-이용한-발전기-12.jpg" rel="lightbox[32441]"><img class="alignnone size-full wp-image-32592" alt="39 ict teg스털링 엔질을 이용한 발전기 (12)" src="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-teg스털링-엔질을-이용한-발전기-12.jpg" width="526" height="304" /></a> <a href="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-teg스털링-엔질을-이용한-발전기-13.jpg" rel="lightbox[32441]"><img class="alignnone size-full wp-image-32593" alt="39 ict teg스털링 엔질을 이용한 발전기 (13)" src="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-teg스털링-엔질을-이용한-발전기-13.jpg" width="526" height="310" /></a> <a href="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-teg스털링-엔질을-이용한-발전기-14.jpg" rel="lightbox[32441]"><img class="alignnone size-full wp-image-32594" alt="39 ict teg스털링 엔질을 이용한 발전기 (14)" src="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-teg스털링-엔질을-이용한-발전기-14.jpg" width="526" height="310" /></a></p>
<p>&nbsp;</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-teg스털링-엔질을-이용한-발전기-15.jpg" rel="lightbox[32441]"><img class="alignnone size-full wp-image-32595" alt="39 ict teg스털링 엔질을 이용한 발전기 (15)" src="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-teg스털링-엔질을-이용한-발전기-15.jpg" width="526" height="366" /></a> <a href="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-teg스털링-엔질을-이용한-발전기-16.jpg" rel="lightbox[32441]"><img class="alignnone size-full wp-image-32596" alt="39 ict teg스털링 엔질을 이용한 발전기 (16)" src="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-teg스털링-엔질을-이용한-발전기-16.jpg" width="526" height="339" /></a> <a href="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-teg스털링-엔질을-이용한-발전기-17.jpg" rel="lightbox[32441]"><img class="alignnone size-full wp-image-32597" alt="39 ict teg스털링 엔질을 이용한 발전기 (17)" src="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-teg스털링-엔질을-이용한-발전기-17.jpg" width="526" height="307" /></a></p>
<p>&nbsp;</p>
<p><span style="color: #0000ff"><strong>스털링 엔진 도면</strong></span></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-teg스털링-엔질을-이용한-발전기-18.jpg" rel="lightbox[32441]"><img class="alignnone size-full wp-image-32598" alt="39 ict teg스털링 엔질을 이용한 발전기 (18)" src="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-teg스털링-엔질을-이용한-발전기-18.jpg" width="526" height="188" /></a> <a href="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-teg스털링-엔질을-이용한-발전기-19.jpg" rel="lightbox[32441]"><img class="alignnone size-full wp-image-32599" alt="39 ict teg스털링 엔질을 이용한 발전기 (19)" src="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-teg스털링-엔질을-이용한-발전기-19.jpg" width="526" height="348" /></a> <a href="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-teg스털링-엔질을-이용한-발전기-20.jpg" rel="lightbox[32441]"><img class="alignnone size-full wp-image-32600" alt="39 ict teg스털링 엔질을 이용한 발전기 (20)" src="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-teg스털링-엔질을-이용한-발전기-20.jpg" width="526" height="348" /></a> <a href="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-teg스털링-엔질을-이용한-발전기-21.jpg" rel="lightbox[32441]"><img class="alignnone size-full wp-image-32601" alt="39 ict teg스털링 엔질을 이용한 발전기 (21)" src="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-teg스털링-엔질을-이용한-발전기-21.jpg" width="526" height="332" /></a> <a href="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-teg스털링-엔질을-이용한-발전기-22.jpg" rel="lightbox[32441]"><img class="alignnone size-full wp-image-32602" alt="39 ict teg스털링 엔질을 이용한 발전기 (22)" src="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-teg스털링-엔질을-이용한-발전기-22.jpg" width="526" height="344" /></a> <a href="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-teg스털링-엔질을-이용한-발전기-23.jpg" rel="lightbox[32441]"><img class="alignnone size-full wp-image-32603" alt="39 ict teg스털링 엔질을 이용한 발전기 (23)" src="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-teg스털링-엔질을-이용한-발전기-23.jpg" width="526" height="304" /></a> <a href="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-teg스털링-엔질을-이용한-발전기-24.jpg" rel="lightbox[32441]"><img class="alignnone size-full wp-image-32604" alt="39 ict teg스털링 엔질을 이용한 발전기 (24)" src="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-teg스털링-엔질을-이용한-발전기-24.jpg" width="526" height="351" /></a> <a href="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-teg스털링-엔질을-이용한-발전기-25.jpg" rel="lightbox[32441]"><img class="alignnone size-full wp-image-32605" alt="39 ict teg스털링 엔질을 이용한 발전기 (25)" src="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-teg스털링-엔질을-이용한-발전기-25.jpg" width="526" height="308" /></a> <a href="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-teg스털링-엔질을-이용한-발전기-26.jpg" rel="lightbox[32441]"><img class="alignnone size-full wp-image-32606" alt="39 ict teg스털링 엔질을 이용한 발전기 (26)" src="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-teg스털링-엔질을-이용한-발전기-26.jpg" width="526" height="203" /></a> <a href="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-teg스털링-엔질을-이용한-발전기-27.jpg" rel="lightbox[32441]"><img class="alignnone size-full wp-image-32607" alt="39 ict teg스털링 엔질을 이용한 발전기 (27)" src="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-teg스털링-엔질을-이용한-발전기-27.jpg" width="526" height="311" /></a> <a href="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-teg스털링-엔질을-이용한-발전기-30.jpg" rel="lightbox[32441]"><img class="alignnone size-full wp-image-32610" alt="39 ict teg스털링 엔질을 이용한 발전기 (30)" src="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-teg스털링-엔질을-이용한-발전기-30.jpg" width="526" height="203" /></a> <a href="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-teg스털링-엔질을-이용한-발전기-28.jpg" rel="lightbox[32441]"><img class="alignnone size-full wp-image-32608" alt="39 ict teg스털링 엔질을 이용한 발전기 (28)" src="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-teg스털링-엔질을-이용한-발전기-28.jpg" width="526" height="353" /></a> <a href="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-teg스털링-엔질을-이용한-발전기-29.jpg" rel="lightbox[32441]"><img class="alignnone size-full wp-image-32609" alt="39 ict teg스털링 엔질을 이용한 발전기 (29)" src="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-teg스털링-엔질을-이용한-발전기-29.jpg" width="526" height="307" /></a> <a href="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-teg스털링-엔질을-이용한-발전기-31.jpg" rel="lightbox[32441]"><img class="alignnone size-full wp-image-32611" alt="39 ict teg스털링 엔질을 이용한 발전기 (31)" src="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-teg스털링-엔질을-이용한-발전기-31.jpg" width="526" height="227" /></a> <a href="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-teg스털링-엔질을-이용한-발전기-32.jpg" rel="lightbox[32441]"><img class="alignnone size-full wp-image-32612" alt="39 ict teg스털링 엔질을 이용한 발전기 (32)" src="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-teg스털링-엔질을-이용한-발전기-32.jpg" width="545" height="598" /></a> <a href="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-teg스털링-엔질을-이용한-발전기-33.jpg" rel="lightbox[32441]"><img class="alignnone size-full wp-image-32613" alt="39 ict teg스털링 엔질을 이용한 발전기 (33)" src="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-teg스털링-엔질을-이용한-발전기-33.jpg" width="504" height="447" /></a></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ntrexgo.com/archives/32441/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[39호]SHUSS (Smart Home Umbrella Stand System)</title>
		<link>http://www.ntrexgo.com/archives/32429</link>
		<comments>http://www.ntrexgo.com/archives/32429#comments</comments>
		<pubDate>Fri, 25 Nov 2016 00:00:52 +0000</pubDate>
		<dc:creator>디바이스마트 매거진</dc:creator>
				<category><![CDATA[디바이스마트 매거진]]></category>
		<category><![CDATA[특집]]></category>
		<category><![CDATA[39호]]></category>
		<category><![CDATA[featrure]]></category>
		<category><![CDATA[ict]]></category>
		<category><![CDATA[공모전]]></category>
		<category><![CDATA[디바이스마트]]></category>
		<category><![CDATA[매거진]]></category>
		<category><![CDATA[융합]]></category>
		<category><![CDATA[참가상]]></category>
		<category><![CDATA[프로젝트]]></category>

		<guid isPermaLink="false">http://www.ntrexgo.com/?p=32429</guid>
		<description><![CDATA[디바이스마트매거진 39호 &#124; 우산이라는 도구를 필요로 하는 날씨에 대해서는 자동으로 우산을 준비할 수 있도록 하는 스마트 우산꽂이를 개발하기로 하였습니다.]]></description>
				<content:encoded><![CDATA[<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/05/2016-ictmain.png" rel="lightbox[32429]"><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>2016 ICT 융합 프로젝트 공모전 참가상</strong></p>
<p><span style="font-size: x-large"><strong>SHUSS (Smart Home Umbrella Stand System)</strong></span></p>
<p>글 | 한국해양대학교 이승민, 김남훈, 이동준, 최우성</p>
<p>&nbsp;</p>
<p><span style="color: #0000ff"><strong>심사평</strong></span><br />
<span style="color: #008080"><strong>뉴티씨</strong> </span>간단한 내용이지만, 실제로 비가 온다거나 할 때에 우산을 가지고 나갈 것을 알람 등을 통하여 확인할 수 있도록 하는 아이디어를 구현한 것인데, 학습하는 데에는 좋은 작품으로 보인다. 그리 어렵지 않게 구현할 수 있지만 실용적인 것으로, 이 작품을 만든 학생은 앞으로도 생활 속작품을 많이 만들 수 있을 것으로 생각된다.<br />
<span style="color: #008080"><strong>칩센</strong> </span>쉬운 주제지만 실제 생활에 도움이 될만한 주제다. 좋은 아이디어 라고 생각한다.<br />
<span style="color: #008080"><strong>위드로봇</strong> </span>우산꽂이가 날씨를 파악하여 우산을 챙길 수 있도록 알려주는 아이디어가 재미있다. 하드웨어 구현에 치중하다보니 전체 서비스 관점에서 빠진 부분을 채우지 못한 것 같다. 사람 인식 부분을 좀 더 강화하면 더 재미있는 서비스를 제공할 수 있을 것으로 보인다.</p>
<p><span style="color: #0000ff"><strong>작품 제목</strong></span><br />
SHUSS(Smart Home Umbrella Stand System)<br />
비나 눈이 오는 날씨에는 비를 맞지 않기 위하여 우산이나 우비가 필수적으로 필요합니다. 아래의 사진들은 비를 맞지 않기 위해서 연잎이라도 사용하여 비를 피하려는 사람들의 의지를 보여줍니다. 저희는 우산이 필요한 날에 우산을 챙기지 못하여 발생하는 불상사를 방지하기 위하여 IoT의 일종인 SHUSS를 만들었습니다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-shuss-1.jpg" rel="lightbox[32429]"><img class="wp-image-32536 aligncenter" alt="39 ict shuss (1)" src="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-shuss-1.jpg" width="500" /></a></p>
<p><span style="color: #0000ff"><strong>작품 개요</strong></span><br />
사람들은 아침에 뉴스를 통해 하루의 날씨를 접합니다. 최근에는 스마트폰의 어플과 스마트 미러 등을 통하여 날씨정보를 접하게 되었습니다. 하지만 날씨정보를 외출하기 전에 꼬박꼬박 확인하는 사람이 있는 반면에 날씨정보에 별로 관심을 가지고 있지 않은 사람들도 있습니다. 보통 이러한 사람들은 소나기나 급작스러운 날씨변화에 직면하게 되면 대게 손해를 보게 됩니다. 그래서 저희는 이러한 사람들을 위하여 비나 눈 등의 자연현상이 발생하였거나 그 날의 날씨 중에 조짐이 보이면 낭패를 당하지 않게 하기 위한 장비를 개발하게 되었습니다. 비나 눈 등 우산이라는 도구를 필요로 하는 날씨에 대해서는 자동으로 우산을 준비할 수 있도록 하는 스마트 우산꽂이를 개발하기로 하였습니다.</p>
<p><span style="color: #0000ff"><strong>작품 설명</strong></span><br />
<span style="color: #3366ff"><strong>주요 동작 및 특징</strong></span></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-shuss-2.jpg" rel="lightbox[32429]"><img class="wp-image-32537 aligncenter" alt="39 ict shuss (2)" src="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-shuss-2.jpg" width="500" /></a><br />
<strong>(가) 주요 동작</strong><br />
저희 작품은 날씨 정보를 받아와 눈과 비 등의 날씨에 우산을 갖추고 외출할 수 있도록 하는 시스템입니다.<br />
와이파이는 아두이노 윤을 사용하여 연결하게 되는데 한번 전원과 WIFI에 연결하여 놓으면 지속적으로 사용가능 합니다. WIFI가 연결되면 기상청에서 RSS를 받아 pty(날씨)값을 받아들여 적외선센서가 작동합니다.<br />
사람인식은 적외선 센서 2개(A,B) 사용하여 A(앞쪽)가 먼저 인식하고 B(뒤쪽)를 두 번째로 인식하면 집에서 나가는 것으로 판단, B(뒤쪽)을 먼저 인식하고 A(앞쪽)을 두 번째로 인식하면 집으로 들어오는 것으로 판단합니다. 우산꽂이 안에도 적외선 센서를 부착하여 출입을 판단하고 우산이 계속 감지되면 부저가 작동하게 됩니다. 그리고 우산을 가지고 가게 되면 소리가 꺼집니다.<br />
사용자에게 알림을 주는 방법은 부저를 이용하여 소리로 인지시켜 주는 방법을 사용했다.</p>
<p><strong>(나) 특징</strong><br />
시중에서 볼 수 없는 아이템이며 저렴한 가격과 실생활에 매우 유용하게 쓰일 수 있습니다. 또한 실생활에 매우 밀착되어 있는 작품이기에 활용도가 매우 높습니다.<br />
집집마다 와이파이를 대부분 갖고 있기 때문에 연동하기도 매우 쉽고, 자동 알림 서비스이므로 편리성이 높습니다. 또한 입출을 판단하여 나갈 때에만 센서가 작동하게 했습니다. 만약에 이 상품이 시중에 나오게 된다면 현대 사회에 필요한 필수품이 될 것 같습니다.</p>
<p><span style="color: #0000ff"><strong>단계별 제작 과정</strong></span><br />
<span style="color: #3366ff"><strong>부품 설명</strong></span><br />
<span style="color: #3366ff"><strong>초기</strong></span></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-shuss-3.jpg" rel="lightbox[32429]"><img class="wp-image-32538 aligncenter" alt="39 ict shuss (3)" src="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-shuss-3-507x620.jpg" width="500" /></a></p>
<p style="text-align: center">WIFI연결 방법( 아두이노 윤 or 아두이노 와이파이 쉴드 ), 출입 감지 방법, 알람</p>
<p>&nbsp;</p>
<p><span style="color: #3366ff"><strong>중반 (예비 실험)</strong></span></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-shuss-5.jpg" rel="lightbox[32429]"><img class="alignnone size-full wp-image-32540" alt="39 ict shuss (5)" src="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-shuss-5.jpg" width="589" height="345" /></a></p>
<p>모의실험으로 LED를 연결하여 각각의 센서 인식 후 불이 들어오는지 확인 작업을 했으며 아두이노 윤으로 와이파이 연결을 하여서 pty 값 즉, 없음(맑음), 비, 눈의 값이 들어오는지 확인을 하는 작업을 동시에 이루었습니다. 또한 적외선센서 역시 거리를 감지를 해보니 원하는 값들이 나오는 것을 확인할 수 있었습니다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-shuss-6.jpg" rel="lightbox[32429]"><img class="alignnone size-full wp-image-32541" alt="39 ict shuss (6)" src="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-shuss-6.jpg" width="589" height="290" /></a></p>
<p>여기서는 적외선 센서를 달아보아서 직접 사람이 움직여서 거리를 감지할 수 있는지 체크와 우산이 통에 들어있다는 것에 대한 인식을 실험을 실행해보니 저의 의도와 맞게 잘 작동을 했다는 것을 확인할 수 있었습니다.<br />
<strong></strong></p>
<p><span style="color: #3366ff"><strong>후반 (제작 과정)</strong></span></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-shuss-7.jpg" rel="lightbox[32429]"><img class="alignnone size-full wp-image-32542" alt="39 ict shuss (7)" src="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-shuss-7.jpg" width="589" height="338" /></a></p>
<p>작품을 만들기 전 부품 준비 : 적외선 센서, 브레드 보드, 우산꽂이, LED</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-shuss-8.jpg" rel="lightbox[32429]"><img class="alignnone size-full wp-image-32543" alt="39 ict shuss (8)" src="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-shuss-8.jpg" width="589" height="299" /></a></p>
<p>우산 꽂이의 외관을 위해서 뒤에 브레드 보드를 장착하였습니다. 그래야지 우산을 꽂을 때도 방해가 되지 않고 비를 맞은 우산에 대해 전선에 물이 들어가지 않기 때문입니다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-shuss-9.jpg" rel="lightbox[32429]"><img class="alignnone size-full wp-image-32544" alt="39 ict shuss (9)" src="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-shuss-9.jpg" width="589" height="299" /></a></p>
<p>우산 꽂이 앞 편에는 실질적인 역할을 하는 적외선 센서의 위치를 선정하고 부착하는 모습입니다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-shuss-10.jpg" rel="lightbox[32429]"><img class="alignnone size-full wp-image-32545" alt="39 ict shuss (10)" src="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-shuss-10.jpg" width="589" height="299" /></a></p>
<p>뒤쪽에는 LED부착과 적외선 센서 선을 연결하는 모습입니다. LED의 부착은 앞서 말하듯이 센서의 동작 인식 확인과 소스코드에서 나온 듯이 LED의 불의 유무로 동작을 시키기 때문에 연결을 하는 것입니다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-shuss-11.jpg" rel="lightbox[32429]"><img class="alignnone size-full wp-image-32546" alt="39 ict shuss (11)" src="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-shuss-11.jpg" width="589" height="299" /></a></p>
<p>아두이노 윤을 연결한 후에 각각의 전선을 적외선에는 아날로그 쪽, LED 및 LED는 디지털 핀 쪽에 알맞게 넣어줬습니다. 그 후에 아두이노 윤에는 소스코드를 코딩을 해주고 외부 전압을 연결한 후 부착해서 완성했습니다.</p>
<p><span style="color: #0000ff"><strong>기타(회로도, 소스코드, 참고문헌 등)</strong></span><br />
<span style="color: #3366ff"><strong>회로도</strong></span></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-shuss-12.jpg" rel="lightbox[32429]"><img class="alignnone size-full wp-image-32547" alt="39 ict shuss (12)" src="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-shuss-12.jpg" width="589" height="506" /></a></p>
<p><span style="color: #3366ff"><strong>소스코드</strong></span></p>
<div class="symple-box gray none" style="text-align:left; width:100%;"> 
<p>int pinNum0 = A0;<br />
int pinNum1 = A1;<br />
int pinNum2 = A2;</p>
<p>// 적외선 입력 핀 설정</p>
<p>int distance0 = 0;<br />
int distance1 = 0;<br />
int distance2 = 0;</p>
<p>// 거리 값 정수형 설정</p>
<p>int led1 = 11;<br />
int led2 = 12;<br />
int led3 = 13;</p>
<p>// led 3개 아날로그 핀 설정</p>
<p>int speakerPIN = 13;<br />
// 부저 쪽 핀 설정</p>
<p>int numTones = 20;<br />
// 20개 값 설정</p>
<p>int c = 0;<br />
int d = 0;<br />
// 적외선 출입 시스템 제어 위한 변수 설정</p>
<p>int tones[] = {262, 294, 330, 349, 392, 440, 494, 262, 294, 330, 349, 392, 440, 494}; // 각 주파수 별 소리 설정 (도 레 미 파 솔 라 시) * 2<br />
#include &lt;Bridge.h&gt;<br />
#include &lt;HttpClient.h&gt;</p>
<p>void setup() {</p>
<p>pinMode(13, OUTPUT);<br />
digitalWrite(13, LOW);<br />
Bridge.begin();<br />
digitalWrite(13, HIGH);</p>
<p>Serial.begin(9600);<br />
pinMode (pinNum0, INPUT);<br />
pinMode (pinNum1, INPUT);<br />
pinMode (pinNum2, INPUT);</p>
<p>pinMode(led1, OUTPUT);<br />
pinMode(led2, OUTPUT);<br />
pinMode(led3, OUTPUT);</p>
<p>while (!Serial); // serial접속을 기다린다.<br />
}</p>
<p>void loop() {<br />
// 클라이언트라는 변수를 설정하여 주어서 인터넷 접속 시 데이터를 받아올 수 있게끔 해준다.<br />
HttpClient client;</p>
<p>int data = analogRead(pinNum0);<br />
int data1 = analogRead(pinNum1);<br />
int data2 = analogRead(pinNum2);</p>
<p>int volt = map(data, 0, 1023, 0, 5000);<br />
int volt1 = map(data1, 0, 1023, 0, 5000);<br />
int volt2 = map(data2, 0, 1023, 0, 5000);</p>
<p>distance0 = (21.61/(volt-0.1696))*1000;<br />
distance1 = (21.61/(volt1-0.1696))*1000;<br />
distance2 = (21.61/(volt2-0.1696))*1000;<br />
// 적외선 거리 감지</p>
<p>Serial.print(“distance0 : “);<br />
Serial.println(distance0);<br />
delay(100);</p>
<p>Serial.print(“distance1 : “);<br />
Serial.println(distance1);<br />
delay(100);</p>
<p>Serial.print(“distance2 : “);<br />
Serial.println(distance2);<br />
delay(100);<br />
// 각 센서별 거리 시리얼 모니터에 띄우기</p>
<p>// 인터넷으로 기상청에 접속하여 날씨정보에 관한 RSS값을 받아온다.<br />
client.get(“http://www.kma.go.kr/wid/queryDFSRSS.jsp?zone=2620065000”);</p>
<p>// 들어오는 바이트들을 사용가능한 동안 동작하며 구문을 반복하게 된다.</p>
<p>while (client.available()) {<br />
//라인을 기준으로 문자열을 저장한다.</p>
<p>String line = client.readStringUntil(‘\n’);<br />
//pty는 날씨 정보 코드이므로 파싱한 데이터들중에서 날씨 정보만 판단한다.</p>
<p>int temp11= line.indexOf(“&lt;/pty&gt;”);<br />
if(temp11&gt;0) {<br />
String tmp_str=”&lt;pty&gt;”;<br />
String wt_hour = line.substring(line.indexOf(tmp_str)+tmp_str.length(),temp11);<br />
//pty에서 0이 날씨 맑음 코드이므로 0이 아닐때는 비와 눈 등의 날씨 정보를 나타내는 것으로 pty가 0이 아닐 때, 즉 비나 눈이 올 때 구문이 동작하도록 설정해 준다.</p>
<p>//wt_hour은 string형으로 선언되어져 있으므로 이 것과 비교하기 위하여 comp라는 변수를 char배열형, 즉 문자열로 선언해주어 비교가 가능하게 해준다.<br />
char comp[] =”0”; //wt_hour의 값, 즉 pty 의 값이 0이 아니면 if구문 안에 있는 구문들을 동작하여 준다.<br />
if(wt_hour!=&amp;comp[0]){</p>
<p>if(distance0 &lt; 18) // 적외선 센서 1 거리를 감지해 우산의 존재여부를 파악한다.</p>
<p>{<br />
digitalWrite(led1, HIGH);<br />
c = 1;<br />
}<br />
//c라는 값은 우산이 우산꽂이에 존재할 시에 할당되어 있는 값이므로 이 값이 1인 경우 사람이 우산 꽂이 앞을 지나가는 것을 인식하도록 설정해 주었다.<br />
if(c == 1)<br />
{<br />
if(distance1 &lt; 20) // 적외선 센서 2 거리 감지</p>
<p>{<br />
digitalWrite(led2, HIGH);<br />
d = 1;<br />
}<br />
// 우산의 존재여부를 알려주는 변수 c와 사람이 첫 번째 센서를 지나가는 것을 인식하는 변수 d를 사용하여 우산이 존재할 때 사람이 첫 번째 센서를 지나 두 번째 센서에 도달하였을 시에 움직임을 감지하는 센서를 작동시키고 부저를 울려 사람에게 알려준다.<br />
if(c == 1 &amp;&amp; d == 1)<br />
{<br />
if(distance2 &lt; 18) // 적외선 센서 3 거리 감지</p>
<p>{<br />
digitalWrite(led3, HIGH);</p>
<p>for (int i = 0; i &lt; numTones; i++)<br />
{<br />
tone(speakerPIN, tones[i]);<br />
delay(500);<br />
}<br />
// 소리 출력</p>
<p>noTone(speakerPIN);<br />
}<br />
// 변수 초기화<br />
else<br />
{<br />
digitalWrite(led1, LOW);<br />
digitalWrite(led2, LOW);<br />
digitalWrite(led3, LOW);<br />
c = 0;<br />
d = 0;<br />
}<br />
}<br />
}<br />
}<br />
}<br />
}<br />
Serial.print(“회차종료”);<br />
//3초마다 동작을 반복한다.</p>
<p>delay(3000);<br />
}<br />
</div>
<span style="color: #3366ff"><strong>참고문헌</strong></span><br />
· 밝은 미래 사회구현, ‘스마트 홈’의 기술 세계<br />
· 아두이노 윤 와이파이 연결하기 (https://www.arduino.cc/en/Guide/ArduinoYun)<br />
· 스마트폰의 블루투스 통신을 이용한 다중 오브젝트 제어방법 및 장치에 관한 융합연구<br />
· 스마트 object에 관한 논문( WBAN(Wireless Body Area Network)기반 스마트 오브잭트 설계)</p>
<p>&nbsp;</p>
<p>작동영상 : <a href="https://youtu.be/m8Mabt70N1A" target="_blank"><span style="text-decoration: underline">https://youtu.be/m8Mabt70N1A</span></a></p>
<p>설명영상 : <a href="https://youtu.be/6FnzJuXGNQk" target="_blank">https://youtu.be/6FnzJuXGNQk</a></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ntrexgo.com/archives/32429/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[39호]BC ECO-Ship(블루투스 제어 친환경 배)</title>
		<link>http://www.ntrexgo.com/archives/32422</link>
		<comments>http://www.ntrexgo.com/archives/32422#comments</comments>
		<pubDate>Fri, 25 Nov 2016 00:00:44 +0000</pubDate>
		<dc:creator>디바이스마트 매거진</dc:creator>
				<category><![CDATA[디바이스마트 매거진]]></category>
		<category><![CDATA[특집]]></category>
		<category><![CDATA[39호]]></category>
		<category><![CDATA[featrure]]></category>
		<category><![CDATA[ict]]></category>
		<category><![CDATA[공모전]]></category>
		<category><![CDATA[디바이스마트]]></category>
		<category><![CDATA[매거진]]></category>
		<category><![CDATA[융합]]></category>
		<category><![CDATA[참가상]]></category>
		<category><![CDATA[프로젝트]]></category>

		<guid isPermaLink="false">http://www.ntrexgo.com/?p=32422</guid>
		<description><![CDATA[디바이스마트매거진 39호 &#124; Bluetooth Control Ecology Ship은 블루투스로 제어하는 친환경 배라는 뜻이다.]]></description>
				<content:encoded><![CDATA[<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/05/2016-ictmain.png" rel="lightbox[32422]"><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>2016 ICT 융합 프로젝트 공모전 참가상</strong></p>
<p><span style="font-size: xx-large"><strong>BC ECO-Ship(블루투스 제어 친환경 배)</strong></span></p>
<p style="text-align: right">
<p style="text-align: right">글 | 한국해양대학교 박동욱, 공정배, 김희수, 강병조, 강윤성, 오성윤</p>
<p>&nbsp;</p>
<p><span style="background-color: #0000ff;color: #ffffff"><strong>심사평</strong></span><br />
<span style="color: #008080"><strong>뉴티씨</strong></span> 친환경 배라는 개념으로 쓰레기 수거 등에 쓰일 수 있는, 말하자면 바다의 드론을 구현한 좋은 작품이다. 바다에 버려진 많은 쓰레기들을 장기적으로 로봇배 등을 이용해 수거한다는 개념은 예전부터 있어왔지만, 실제로 구현한 사람들은 많지 않다. 이번에는 모터 선정이나 전원소스 등의 잘못된 선정과 계산으로 잘되지는 않았지만, 앞으로 좀 더 노력하면 좋은 작품이 나올 것으로 생각된다. 꼭 좋은 쓰레기 수거용 배를 만들어 우리의 해양환경이 조금이나마 깨끗해지기를 기대한다.</p>
<p><strong><span style="color: #008080">칩센</span></strong> 드론의 영역이 확대되는 시기에 활용목적을 심도 깊게 고민한 흔적이 보입니다. 해양을 운행할 내구성과 구동되는 전력을 감당하는 문제 및 비용의 문제는 지금 기성품으로 나와있는 드론(소형무인기기) 제품들도 풀어야 할 숙제입니다.</p>
<p><span style="color: #008080"><strong>위드로봇</strong></span> ECO-ship 작품은 아이디어가 좋습니다. 쓰레기를 치우는 과정을 시민들의 체험으로 바꾸는 발상이 재미있습니다. 단, 선체의 완성도나 전체 시스템의 완성도가 떨어지는 점이 아쉽습니다. 좀 더 보강하면 좋은 작품이 될 수 있을 것 같습니다.</p>
<p><span style="background-color: #0000ff;color: #ffffff"><strong>작품 제목</strong></span><br />
Bluetooth Control Ecology Ship은 블루투스로 제어하는 친환경 배라는 뜻이다.</p>
<p><span style="background-color: #0000ff;color: #ffffff"><strong>작품 개요</strong></span><br />
‘세계 경제포럼’에 따르면, 2050년까지 바다에 떠있는 플라스틱 쓰레기의 무게가 바다 속에 있는 물고기의 양을 넘어선다는 결과가 나왔다. 이러한 결과는 해상의 쓰레기들이 매우 심각한 문제로 성장해가고 있다는 것을 이야기한다.<br />
해상 쓰레기 문제는 우리 생활 가까이서 관측할 수 있었다. 등교를 하며 보이던 바다쓰레기는 이의 심각성을 깨닫게 해주었고, 이에 획기적인 아이템을 만들어 저렴한 비용과 효과적인 방법으로 ‘바다생태계 문제해결’이 필요하다고 느꼈다. 이러한 발상에서 우리는 바다의 쓰레기를 수거해 해안가를 깨끗하게 하는 해상용 쓰레기 처리 드론의 개발에 착수했다.<br />
해상의 쓰레기를 회수하는 방식은 해수면에 내밀어져 있는 그물 위에 있는 쓰레기를 들어 올려 선체에 담는 방식이고, 이때 쓰레기와 함께 수거되는 해수는 펌프를 통해 배출한다. 동력방식은 선체 위에 달려있는 프로펠러가 공기를 밀어내 풍압으로 움직이게 되고 조타부분은 프로펠러 뒤의 방향타가 진행할 풍향을 제어하는 방식이다. 이 드론을 사용자가 손쉽게 제어할 수 있도록 블루투스 통신 방식을 적용하였다. 이를 통해 현재 범용화된 기기인 스마트폰을 통하여 누구나 쉽게 제어가 가능하다. 이로써 시민들에게 색다를 체험을 하게 해주어 해상 쓰레기의 심각성을 전달할 수 있는 효과가 예상된다.</p>
<p><span style="background-color: #0000ff;color: #ffffff"><strong>작품 설명</strong></span><br />
<strong></strong></p>
<p><span style="color: #008080"><strong>주요 동작 및 특징</strong></span></p>
<p><span style="color: #33cccc"><strong>(가) 주요 동작</strong></span><br />
본 작품의 구성은 5개의 파트로 구분된다.<br />
· 쓰레기 처리부 : 해상쓰레기를 들어 올려 물을 뺀 후 선체에 보관한다.<br />
· 동력부 : 조타 장치를 향해 팬을 돌려 추진력을 공급한다.<br />
· 조타부 : 풍향을 바꿔 선체의 진행 방향을 전환한다.<br />
· 펌프부 : 선체에 담겨진 쓰레기에 고이는 해수를 배출한다.<br />
· 통신제어 : 블루투스 모듈로 선체와 어플리케이션간의 컨트롤 신호를 수신한다.<br />
먼저, 선체의 앞에 달린 쓰레기 처리부에서는 해상쓰레기를 천천히 들어 올려서 물을 뺀 뒤 담을 수 있게 설계하였다. 그 모양은 그물과 선체의 접합부 양옆에 달린 서보모터가 그물을 들어 올리는 방식으로 되어있다. 그물의 들어 올리는 속도는 출력하고자 하는 목표치에 따라 전압을 달리주어 조절할 수 있다. 올리는 속도는 빠르게 하여 최대토크가 걸리게 했고 쓰레기를 담고 그물을 내릴 때는 토크를 비교적 약하게 걸어 천천히 내려오게 전압값을 조절했다.<br />
선체 뒷부분에 있는 동력부는 해상드론이 진행할 수 있게 DC모터의 최대 RPM으로 프로펠러를 회전시켜 출력되는 공기의 힘으로 진행하게 해준다.<br />
동력부 뒤에 연결한 조타부는 동력부에서 출력하는 풍압을 한쪽으로 쏠리게 만들어 방향을 제어하게 하는 역할을 한다. 형태는 ㅁ자 상자모양의 통풍 케이스 가운데에 두 개의 방향타가 병렬로 동시에 동작하도록 이루어져있으며, 좌·우 45도 꺾을 수 있다.<br />
중앙에 있는 펌프부는 선체 앞에 달린 쓰레기 처리장치에서 미처 빼지 못해 선체에 고여 있는 해수를 해상으로 배출한다. 이때 흡기관을 몸체 바닥중앙에 놓고 배기관을 선체 바깥쪽방향으로 둔다.<br />
마지막으로 무선통신부는 앞에서 설명한 4개의 동작을 모두 제어하는 통신방식으로 스마트폰 어플리케이션을 통한 블루투스 통신이 가능하게 한다. 블루투스로 스마트폰과 연결된 MCU에 입력한 명령어를 스마트폰 어플리케이션의 버튼에 설정해두고 누르면 MCU에 명령어가 입력되어 그 동작을 취하게 되는 방식이다.</p>
<table style="width: 500px" border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td><img class="alignnone  wp-image-32495" alt="39 ict bc eco-ship  (2)" src="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-bc-eco-ship-2.jpg" width="620" /></td>
</tr>
<tr>
<td><img class="alignnone  wp-image-32497" alt="39 ict bc eco-ship  (3)" src="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-bc-eco-ship-3.jpg" width="620" /></td>
</tr>
<tr>
<td><img class="alignnone  wp-image-32498" alt="39 ict bc eco-ship  (4)" src="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-bc-eco-ship-4.jpg" width="620" /></td>
</tr>
<tr>
<td><img class="alignnone  wp-image-32511" alt="39 ict bc eco-ship  (17)" src="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-bc-eco-ship-17.jpg" width="620" /></td>
</tr>
<tr>
<td style="text-align: center">육상에서 구동wnddls BC ECO-Ship</td>
</tr>
</tbody>
</table>
<p><strong style="color: #33cccc">(나) 특징</strong></p>
<p>몸체는 방향전환이 자유로우면서 해상에 잘 뜨는 형태인 타원형으로 하고, 이에 적합한 소재로 일상에서 흔히 쓸 수 있는 전등갓을 사용하였다. 또한 부력의 부족함을 해결하기 위해 몸체 아래 부분에 고무 튜브를 고정시켰다.<br />
물에서 쓰레기 처리장치의 올리는 힘이 부족함을 고려해 무게중심을 추가하기 위해 추를 매달아 적은 힘으로도 정지마찰력을 이겨낼 수 있도록 설계하였다. 또한 추는 안정적으로 그물을 들어 올리고 내리는 작용도 한다.<br />
전등갓, 자전거 고무 튜브 외에도 방충망, 낚시 추, 밀폐용기와 같은 일상에서 흔히 쓸 수 있는 재료들을 가지고 만들어서 매우 친환경적이다.<br />
작품의 동작 환경이 쓰레기가 떠다니는 부두 연안임을 고려한다면, 수중에서 스크류의 출력으로 이동할 경우에 쓰레기가 얽히는 문제가 생긴다고 판단하였다. 그래서 동작의 방식은 공기부양정의 이동방식을 응용해 해상드론의 윗부분에서 풍압으로 이동하는 방식으로 채택했다.<br />
해상에서 사용하기 때문에 방수가 필수적이다. 배선을 길게 늘어뜨려 전선 피복이 누전을 방지하며, 전선이 들어가는 부분마다 글루건으로 봉합을 해주었다. 그리고 프로펠러 고정부위에 밀폐 용기를 두어, 뚜껑을 반대로 붙여넣을 것이다. 밀폐 용기에 구멍을 뚫어 선을 통과시킨 후 밀폐 용기 구멍에 통과한 선들 사이에 빈틈이 없도록 글루건으로 봉합을 해주었다.</p>
<p><span style="color: #008080"><strong>전체 시스템 구성</strong></span></p>
<table style="width: 500px" border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td><a href="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-bc-eco-ship-5.jpg" rel="lightbox[32422]"><img alt="39 ict bc eco-ship  (5)" src="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-bc-eco-ship-5.jpg" width="595" height="387" /></a></td>
</tr>
<tr>
<td style="text-align: center">그림 1. 전체 완성 사진</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<p><span style="color: #33cccc"><strong>(가) 동작신호제어</strong></span><br />
전체적인 동작 시스템은 사용자의 스마트폰 어플리케이션을 통해 MCU가 제어하게 된다. 아두이노(MCU)와 사용자를 연결해주는 무선방식은 스마트폰 앱을 통한 블루투스 통신이 가능하게 한다. 블루투스 통신은 범용적인 통신 방식이며 거리는 10m 내 사용이 가능하고 사용자가 흔히 가지고 있는 스마트폰에 간단한 인터페이스를 통해 조절이 가능하다. 이를 통해 사용자는 자기가 원하는 동작을 해안가에서 배에 실시간으로 신호를 줘서 작동시키게 할 수 있다. 아두이노와 배 사이의 신호는 유선으로 연결되어 있다. 이로써 블루투스 컨트롤러로 각 key에 맞게 원하는 동작을 출력하여 쓰레기를 올려 담으며 선체에 남아있는 물을 빼거나 원하는 방향으로 진행할 수 있도록 기능별 다양한 모습을 나타낼 수 있다.</p>
<table style="width: 500px" border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td><a href="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-bc-eco-ship-6.jpg" rel="lightbox[32422]"><img class="alignnone  wp-image-32500" alt="39 ict bc eco-ship  (6)" src="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-bc-eco-ship-6.jpg" width="620" /></a></td>
</tr>
<tr>
<td style="text-align: center">그림 2. 신호흐름구성도</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<p><span style="color: #33cccc"><strong>(나) 전력시스템</strong></span><br />
전체 전력시스템은 12V 배터리에서 시작되어 동력부, 펌프부, MCU에 전력을 공급하고, MCU가 낮은 전압을 분배하여 출력을 컨트롤 하게 된다. 선체 앞의 해상쓰레기 처리 장치는 모터 쉴드로 부터 MCU가 공급을 제어하게 구성했고, 조타부는 저전력 서보모터로 구성하여 MCU에서 전력과 신호를 동시에 제어하게 하였다. 이 모든 것을 제어하는 사용자가 명령어를 전달받는 블루투스 모듈 또한 MCU 자체전력으로 공급하고 제어한다.<br />
총 2개의 DC전력을 사용하였는데, 동력부와 펌프부에 공급하는 리튬폴리머 건전지와 아두이노에 공급하는 알카라인 건전지를 사용하였다.<br />
전력공급을 따로 해주는 이유는 쓰레기 처리장치의 순간 출력이 커져 배터리가 쉽게 방전될 수 있기 때문인데, 이 때문에 12V를 AA사이즈 알카라인 건전지 8개로 분리시켰다. 그리고 비교적 일정한 전압을 쓰는 펌프부와 동력부에는 충전식 리튬폴리머 건전지를 사용하였다.</p>
<p>리튬폴리머 건전지(12v)로 작동되는 파트 : DC모터, 펌프<br />
알카라인 건전지로 작동되는 파트(12.0v) : 아두이노, 블루투스통신, 쓰레기 처리부, 조타부</p>
<p><span style="color: #008080"><strong>개발 환경(개발 언어, Tool, 사용시스템)</strong></span><br />
<span style="color: #33cccc"><strong>(가) Arduino IDE</strong></span><br />
아두이노 제품군을 제어하는 데에는 제조사에서 기본적으로 제공하는 통합개발환경(IDE)를 사용하였다. C언어 기반의 명령어를 사용하며, 제공하는 다양한 라이브러리와 기본적인 스케치 예시들을 활용하여 제작하려는 작품의 하드웨어를 스케치 하는데 적합했으며 Arduino 및 Make 포럼을 참고하여 작품 구현하는데 필요한 기술적 정보를 수집하는데 수월했다.</p>
<table style="width: 500px" border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td><a href="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-bc-eco-ship-7.jpg" rel="lightbox[32422]"><img class="alignnone  wp-image-32501" alt="39 ict bc eco-ship  (7)" src="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-bc-eco-ship-7.jpg" width="620" /></a></td>
</tr>
<tr>
<td style="text-align: center">그림 3. Arduino sketch</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<p><span style="color: #33cccc"><strong>(나) Arduino UNO</strong></span><br />
ATMEGA328 기반으로 제작된 MCU인 Arduino UNO는 Arduino 제품들의 기준이다. 따라서 다른 Arduino 제품들과 하드웨어의 호환성이 높다고 판단하였고, 모터 쉴드를 다루는데 쉽게 접근할 수 있었다. 또한 작품에서 요구하는 하드웨어 제어능력은 모터 쉴드를 통해 DC모터 2개와 서보모터 3~4개와 제어하는 것, 그리고 블루투스 모듈을 사용해 스마트폰과 통신하는 것이었고, 이는 UNO의 스펙이면 충분한 연산능력이라고 판단하여 MCU로 Arduino UNO를 선택하고 작품을 제작했다. 아래 스펙을 보면 외부전원 연결시 최대 20V까지 버틸 수 있어 12V이하 기기를 다루는데 적합하다고 생각했다.</p>
<table style="width: 620px" border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td><img class="alignnone size-full wp-image-32502" alt="39 ict bc eco-ship  (8)" src="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-bc-eco-ship-8.jpg" width="595" height="392" /></td>
</tr>
<tr>
<td><img class="alignnone size-full wp-image-32503" alt="39 ict bc eco-ship  (9)" src="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-bc-eco-ship-9.jpg" width="595" height="315" /></td>
</tr>
<tr>
<td style="text-align: center">그림 4. Arduino specification</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<p><strong style="color: #33cccc">(다) Bluetooth Controller</strong></p>
<p>스마트폰 어플리케이션으로 블루투스 통신을 쉽게 해줄 수 있는 어플리케이션이어서 선택했다. Google play에서 무료로 배포되고 있으며 스마트폰에서 블루투스 통신을 통해 모듈에 명령어를 전송해주는 역할을 한다. AVR, ARM 등 임베디드 시스템에서 사용가능하다. 따라서 AVR기반의 아두이노 또한 사용이 가능하다.<br />
사용 방법은 우선 스마트폰 설정에서 블루투스를 켜고, 화면 상단에 받은 데이터가 표시되고 키를 누르면 데이터를 보낼 수 있게 되어있다. 키 설정을 통해 키 이름과 데이터를 설정할 수 있다.<br />
1. 장치검색을 눌러 장치를 연결한다.<br />
2. 키 설정을 눌러 키 이름과 보낼 데이터를 설정한다.<br />
3. 키를 눌러 원하는 데이터를 전송한다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-bc-eco-ship-10.jpg" rel="lightbox[32422]"><img class="alignnone size-full wp-image-32504" alt="39 ict bc eco-ship  (10)" src="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-bc-eco-ship-10.jpg" width="595" height="538" /></a></p>
<p><span style="background-color: #0000ff;color: #ffffff"><strong>단계별 제작 과정</strong></span></p>
<p><span style="color: #008080"><strong>아이디어 회의</strong></span><br />
ICT 공모전에 따른 아이디어 회의를 시작하였다. 브레인스토밍을 통해다양한 의견이 나왔다. 그 중 “Sea bin Project”라는 오스트레일리아의 서퍼 2명(앤드류 터튼, 피트 세글린스키)이 바다에 버려진 수백만 톤의 쓰레기를 담는 해상쓰레기통 프로젝트에 이야기에 초점이 맞춰졌다. 결론적으로 기존의 부둣가 근처에서의 고정 장착식의 방식에서 벗어나 움직일 수 있는 해상용 드론 쪽에 무게를 두게 되었다. 해수면 표면의 쓰레기 수집이 목적이었고, 쓰레기 수거방식에 대해서는 컨베이어 벨트 방식, 흡입식, 뒤에 그물망을 따로 다는 방식, 로봇팔로 들어올리는 방식 등 다양한 의견들이 나왔다. 구동방식은 물속에서 스크류를 돌리는 방식, 돛을 이용한 방식, 노를 젓는 방식, 호버크래프트(공중부양선)등의 아이디어가 나왔다.</p>
<table style="width: 620px" border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td><a href="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-bc-eco-ship-11.jpg" rel="lightbox[32422]"><img class="size-full wp-image-32505 aligncenter" alt="39 ict bc eco-ship  (11)" src="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-bc-eco-ship-11.jpg" width="595" height="295" /></a></td>
</tr>
<tr>
<td style="text-align: center">그림 6. 씨빈프로젝트 작동 사진</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<p><span style="color: #008080"><strong>제작 초기</strong></span></p>
<table style="width: 620px" border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td><a href="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-bc-eco-ship-12.jpg" rel="lightbox[32422]"><img class="size-full wp-image-32506 alignright" alt="39 ict bc eco-ship  (12)" src="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-bc-eco-ship-12.jpg" width="595" height="295" /></a></td>
</tr>
<tr>
<td style="text-align: center">그림 7. 앤드류 터튼과 피트 세글린스키. 우측은 그들이 만든 제작도이다.</td>
</tr>
</tbody>
</table>
<p>제작 초기에는 몸체와 재료의 선택이 중요했다. 부력을 크게 해서 뒤집어지지 않게 하기 위해선 표면적이 넓은 아크릴 재질의 몸체가 필요했다. 일상에서 흔히 쓸 수 있는 전등갓의 형태가 적합하다 판단되었고 물 속에 띄운 결과 해수면과의 높이차가 작아 물이 많이 유입 될 것 같았다. 그래서 부력을 좀 더 주기위해 고무 튜브를 낚싯줄로 엮어 고정시켰다.<br />
&lt;그림9&gt;와 같이 선체 앞부분 쓰레기 처리부는 쇠판과 철조망을 덧대어 레진으로 단단히 고정시켰다. 처음에는 컴퓨터에서 공급되는 MCU 내부전력만으로 쓰다가 실험 결과 전력이 부족해서 외부전력 9V를 달아 출력을 높였다. 지상에서의 실험 결과 처음에는 쓰레기 처리부분이 들어 올려 지지 않았지만 외부전력으로 바꾸고 나서는 쉽게 들어 올려졌다. 프로펠러의 지면과 마찰은 일정이상의 거리를 유지하도록 정비했다. 각 문제를 개선하고 해상에서의 1차 실험을 시도해보았다.</p>
<table style="width: 620px" border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td><a href="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-bc-eco-ship-13.jpg" rel="lightbox[32422]"><img class="size-full wp-image-32507 aligncenter" alt="39 ict bc eco-ship  (13)" src="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-bc-eco-ship-13.jpg" width="595" height="301" /></a></td>
</tr>
<tr>
<td>
<p style="text-align: center">그림 9. 제작초기 Proto-model</p>
</td>
</tr>
</tbody>
</table>
<p><strong style="color: #008080">1차 해상실험</strong></p>
<p>학교 앞 바다에서 실험을 진행했다. 외부전력(9V)의 힘에도 물을 머금은 쓰레기를 들어 올리지 못했다. 또한 무리한 동작요구에 회전부에 심한 손상을 발견했다. 이에 모터 교체 및 외부전력을 12V로 높였다. 이러한 조치에도 무게의 부담감은 여전히 존재했고, 이는 무게 추를 달아서 물체의 정지마찰력을 줄임으로써 해결했다. 이후 쓰레기 처리부의 원활한 동작을 확인하고 조타 제작에 돌입했다. 조타는 기존의 한 방향 진행을 좌우로 움직일 수 있도록 했다. 이번 1차 실험을 통해 쓰레기 처리 장치의 경량화 및 방향 조절 가능한 조타와 방수 기능을 첨가했다.</p>
<table style="width: 620px" border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td><a href="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-bc-eco-ship-14.jpg" rel="lightbox[32422]"><img class="size-full wp-image-32508 aligncenter" alt="39 ict bc eco-ship  (14)" src="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-bc-eco-ship-14.jpg" width="595" height="349" /></a></td>
</tr>
<tr>
<td style="text-align: center">그림 10. 서보모터 교체작업</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<p><span style="color: #008080"><strong>최종완성 및 시현 영상</strong></span><br />
1차 해상 실험 후 선체 앞부분 쓰레기 처리부를 가볍게 구성하기 위해 옷걸이를 사용하여 무게를 경량화 했고, 조타장치를 달아 방향조절이 가능하게 했다. 조타장치의 상단부분을 아크릴로 구성한 이유는 투명하게 하여 방향타가 제대로 작동되는지 확인하기 위해서이다.</p>
<table style="width: 620px" border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td><a href="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-bc-eco-ship-15.jpg" rel="lightbox[32422]"><img class="size-full wp-image-32509 aligncenter" alt="39 ict bc eco-ship  (15)" src="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-bc-eco-ship-15.jpg" width="595" height="495" /></a></td>
</tr>
<tr>
<td style="text-align: center">그림 11. 해상에서 구동 이미지</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<p><span style="color: #ffffff;background-color: #0000ff"><strong>작품의 가치</strong></span><br />
<span style="color: #008080"><strong>기존의 작품들과 차이점</strong></span><br />
현재 해상 쓰레기 문제는 연안에서만 이슈화되어 크게 논란이 되고 있지는 않다. 하지만 앞서 말한 세계 경제포럼에 따르면 해상 쓰레기 문제는 점점 확대되어 2050년에는 매우 심각한 세계 문제로 자리잡을 것이라 예측하고 있다. 이러한 문제를 해결하고자 ‘씨빈(Seabin)’과 ‘마린드론(Marine Drone)’ 같은 다양한 발명품이 있다. 그러나 이러한 발명품들은 큰 부피에 고정식으로 전력 또한 선착장에서 끌어서 오기 때문에 위험하고 비효율적일 수밖에 없으며, 따라서 고도의 기술과 전문가들의 취급을 요하게 되었다.<br />
우리는 이러한 기존의 작품들의 문제점을 다른 방식으로 해결하고자 한다. 따라서 작품은 제작이 쉽고 일반시민들이 간편하게 사용할 수 있도록 만들어졌다. 다양한 계층의 사람들이 본인의 휴대폰만으로 편리하게 연결가능 하다는 데서 접근성이 뛰어나며 그와 함께 해양생태계를 아름답게 보존하는데 의의를 둔다.</p>
<p><span style="color: #008080"><strong>한계점 및 개선방안</strong></span><br />
완성된 작품은 쓰레기의 무게를 나타내는 장치를 아직 구현하지 못했다. 이는 선체에 담긴 쓰레기양이 부력을 넘어서게 될 경우 침몰할 수도 있다는 의미이기도 하다. 이는 앞으로 감압센서와 같은 무게를 측정하는 센서를 설치하여 값을 LCD로 표현하고자 한다. 더불어 그 값을 휴대폰으로 전송하여 멀리서도 쓰레기의 양을 정확한 수치로 알 수 있게 된다.</p>
<p><span style="color: #008080"><strong>기대효과</strong></span><br />
<span style="color: #33cccc"><strong>(가) 창의성</strong></span><br />
바다쓰레기의 많은 비중을 차지하는 플라스틱을 바탕으로 제작했다. 이는 실제 수거한 쓰레기들을 가지고 제작하여 비용 절감을 이끌어 낼 수 있다. 또 작품은 고정식이 아닌 유동성을 띄고 있어 원활한 작업 수행이 가능하다.</p>
<p><span style="color: #33cccc"><strong>(나) 사업성</strong></span><br />
쓰레기가 많은 해안가에 해상용 드론을 대여해주고 kg당 일정금액을 받는다. 이런 시스템을 효율적으로 운영하여 해양쓰레기를 수요하는 3D프린트 오션 플라스틱 신발이나 예술작품에 사용한다. 이러한 제도는 시민의식을 고양하는 동시에, 국민들에게 신뢰받는 사업아이템이 될 수 있다.</p>
<p><span style="color: #33cccc"><strong>(다) 경제성</strong></span><br />
해상용 드론 한 개를 만드는데 재활용품을 제외한 구입비용은 5만원이다. 기존에 나와 있는 씨빈이나 마린드론을 한 대를 제작하는데 드는 비용에 1000배 절감할 수 있고 각 인원들이 드론을 조정하기에 인원수만큼 영역범위가 넓어진다.</p>
<p><span style="color: #33cccc"><strong>(라) 실용성</strong></span><br />
이 작품으로 관광산업이 활성화가 된다면 사용자를 국제적으로 늘릴 수 있다. 전 세계인이 동참하여 하는 활동이기에 쓰레기가 발생된 시간만큼 빠르게 줄어들 것으로 보인다. 처리방법과 비용에 대해 어떤 나라도 선뜻 나서지 못한 상황에서 핵심기술로 뽑히면 환경개선에 NO.1이 될 것이다.</p>
<p><span style="background-color: #0000ff;color: #ffffff"><strong>기타(회로도, 소스코드, 참고문헌 등)</strong></span><br />
<span style="color: #008080"><strong>회로도</strong></span><br />
<span style="color: #33cccc"><strong>(가) 아두이노 회로도</strong></span><br />
모든 신호는 아두이노 MCU에서 받아들여 컨트롤하게 되어있다. 외부전압 12V를 아두이노에 인가하면 아두이노 내 MCU가 자동으로 전력을 제어하게 된다. 아두이노 우노 위에 모터 쉴드를 얹게 되면 모터쉴드는 핀 4번부터 7번까지 자동 할당받게 된다. 이 부분이 쓰레기 처리부의 서보모터이다. 무선통신을 위해 블루투스모듈을 받는 부분과 보내는 부분을 각 단자 2,3번에 꼽고 아두이노 자체전력 5V를 인가시킨다. 조타 모터 또한 블루투스와 같이 아두이노 자체 전력을 쓰지만 신호선은 하나만 있으면 된다. 그 외 동력부와 펌프부는 각 12번, 13번 핀에 신호를 연결하여 외부전력을 공급받는다. 외부전력 공급회로도는 다음 장을 참고 바란다.</p>
<table style="width: 620px" border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td><a href="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-bc-eco-ship-16.jpg" rel="lightbox[32422]"><img class="size-full wp-image-32510 aligncenter" alt="39 ict bc eco-ship  (16)" src="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-bc-eco-ship-16.jpg" width="595" height="454" /></a></td>
</tr>
<tr>
<td style="text-align: center">그림 12. 아두이노 핀 번호별 용도</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<p><span style="color: #33cccc"><strong>(나) 동력부, 펌프부 전력제어 회로도</strong></span><br />
12V를 사용하는 DC모터와 펌프는 아두이노만으로는 제어하기 힘들어, 아날로그 회로를 사용하여 증폭시켰다. 즉 아두이노 신호(5V)를 스위치 작용 효과를 내는 IC소자 FDS6990A를 달았다. 스위치 작용 효과란 게이트(G) 단자에 신호(5V)를 흘려보내면 드레인(D)과 소스(S) 사이에 전류가 인가되고 만약 (G) 단자에 신호(0V)가 없으면 D와 S가 닫히는 스위치 작용을 말한다.<br />
FDS6990A란 IC소자는 두 개의 MOSFET으로 구성되어 있는 파워트렌치소자이다. 이 IC특징은 다이오드가 달려있어 역전류를 방지하여 트랜지스터를 보호해준다. 그리고 용량은 Vdss가 +30V까지 버틸 수 있고 Vgss는 -20 V에서 + 20V까지 신호를 받아들일 수 있어서 우리가 사용하는 신호 5V와 공급되는 전압 12V에 적합한 소자였다.<br />
IC소자 하나로 동력부와 펌프부를 제어할 수 있게 한다. &lt;그림11&gt;와 같이 아두이노 13핀과 12핀에 펌프(P)와 DC모터(M)를 제어하기 위해 신호선을 배당한 뒤 G1. G2에 신호를 보내면 P와 M에 각각 Vds에 전류가 흐르게 되어 전력을 제어할 수 있게 된다.</p>
<table style="width: 620px" border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td><a href="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-bc-eco-ship-2.png" rel="lightbox[32422]"><img class="alignnone size-full wp-image-32496" alt="39 ict bc eco-ship  (2)" src="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-bc-eco-ship-2.png" width="610" height="320" /></a></td>
</tr>
<tr>
<td><a href="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-bc-eco-ship-1.png" rel="lightbox[32422]"><img class="size-full wp-image-32494 aligncenter" alt="39 ict bc eco-ship  (1)" src="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-bc-eco-ship-1.png" width="595" height="318" /></a></td>
</tr>
<tr>
<td style="text-align: center">그림 13. 전력계통 회로도</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<p><span style="color: #008080"><strong>소스코드</strong></span></p>
<div class="symple-box gray none" style="text-align:left; width:100%;"> 
<p>#include &lt;SoftwareSerial.h&gt;<br />
#include &lt;Servo.h&gt;<br />
SoftwareSerial BTSerial(2, 3);<br />
Servo myservo1;<br />
Servo myservo2;<br />
/* HC-06의 TX,RX을 pin 2,3에 연결 */</p>
<p>void setup()<br />
{<br />
int i;<br />
for(i=4;i&lt;=7;i++)<br />
pinMode(i, OUTPUT); /*Arduino Motor Shield의 pin 4~7값 지정*/<br />
Serial.begin(9600); /*PC와 연결*/<br />
BTSerial.begin(9600);/*블루투스 연결*/<br />
myservo1.attach(8); /* pin8에 servo를 부착 */<br />
myservo2.attach(9); /* pin9에 servo를 부착 */<br />
pinMode(12, OUTPUT); /* MOSFET의 Gate1과 12pin 연결 */<br />
pinMode(13, OUTPUT); /* MOSFET의 Gate2와 13pin 연결 */<br />
}</p>
<p>int EN1 = 5; /* Motor1의 아날로그 값 입력을 위해 pin5 지정 */<br />
int EN2 = 6; /* Motor2의 아날로그 값 입력을 위해 pin6 지정 */<br />
int IN1 = 4; /* Motor1의 디지털 값 입력을 위해 pin4 지정 */<br />
int IN2 = 7; /* Motor2의 디지털 값 입력을 위해 pin7 지정 */</p>
<p>void Motor1(int pwm, boolean reverse)<br />
{<br />
analogWrite(EN1 ,pwm);<br />
/*Motor1을 0에서 정지하고 255에서 최고속도를 내도록 PWM을 제어*/<br />
if(reverse)<br />
{<br />
digitalWrite(IN1,HIGH);<br />
}<br />
else<br />
{<br />
digitalWrite(IN1,LOW);<br />
}<br />
}</p>
<p>void Motor2(int pwm, boolean reverse)<br />
{<br />
analogWrite(EN2,pwm);<br />
/*Motor2를 0에서 정지하고 255에서 최고속도를 내도록 PWM을 제어*/<br />
if(reverse)<br />
{<br />
digitalWrite(IN2,HIGH);<br />
}<br />
else<br />
{<br />
digitalWrite(IN2,LOW);<br />
}<br />
}</p>
<p>void loop()<br />
{<br />
if (BTSerial.available())<br />
Serial.write(BTSerial.read());<br />
/* 블루투스 신호 -&gt; PC 시리얼모니터 */<br />
if (Serial.available())<br />
BTSerial.write(Serial.read());<br />
/* PC 시리얼모니터 -&gt; 블루투스 */<br />
char val;<br />
while(1)<br />
{<br />
val = BTSerial.read();<br />
if(val!=-1) /* 블루투스 통신 제어가능 */<br />
{<br />
switch(val)<br />
{<br />
case ‘a’: /* 담기 */<br />
Motor1(250,true);<br />
Motor2(250,true);<br />
break;</p>
<p>case ‘b’: /* 복귀 */<br />
Motor1(150,false);<br />
Motor2(150,false);<br />
break;</p>
<p>case ‘c’: /* 쓰레기 처리장치 정지 */<br />
Motor1(0,false);<br />
Motor2(0,false);<br />
break;</p>
<p>case ‘d’: /* 프로펠러 가동 */<br />
digitalWrite(12, HIGH);<br />
break;</p>
<p>case ‘e’: /* 펌프 가동 */<br />
digitalWrite(13, HIGH);<br />
break;</p>
<p>case ‘f’: /* 프로펠러 펌프 정지 */<br />
digitalWrite(12, LOW);<br />
digitalWrite(13, LOW);<br />
break;</p>
<p>case ‘g’: /* 조타 왼쪽 */<br />
myservo1.write(40);<br />
myservo2.write(40);<br />
break;</p>
<p>case ‘h’: /* 조타 0도 */<br />
myservo1.write(20);<br />
myservo2.write(20);<br />
break;</p>
<p>case ‘i’: /* 조타 오른쪽 */<br />
myservo1.write(-80);<br />
myservo2.write(-80);<br />
break;<br />
}<br />
}<br />
}<br />
}<br />
</div>
<p><span style="color: #008080"><strong>참고문헌</strong></span><br />
<span style="text-decoration: underline">아이디어 회의(Tool)</span><br />
아두이노란 무엇인가?<a href="http://blog.naver.com/3demp/220378933583" target="_blank"> http://blog.naver.com/3demp/220378933583</a><br />
<span style="text-decoration: underline">개발환경(사용시스템)</span><br />
블루투스 컨트롤 구글play 어플리케이션<a href="https://play.google.com/store/apps/details?id=apps.BT" target="_blank">(https://play.google.com/store/apps/details?id=apps.BT)</a><br />
<span style="text-decoration: underline">아이디어 회의</span><br />
씨빈 프로젝트 <a href="http://www.seabinproject.com/" target="_blank">http://www.seabinproject.com/</a></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ntrexgo.com/archives/32422/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[39호]Wearable Marionette</title>
		<link>http://www.ntrexgo.com/archives/32426</link>
		<comments>http://www.ntrexgo.com/archives/32426#comments</comments>
		<pubDate>Fri, 25 Nov 2016 00:00:06 +0000</pubDate>
		<dc:creator>디바이스마트 매거진</dc:creator>
				<category><![CDATA[디바이스마트 매거진]]></category>
		<category><![CDATA[특집]]></category>
		<category><![CDATA[39호]]></category>
		<category><![CDATA[featrure]]></category>
		<category><![CDATA[ict]]></category>
		<category><![CDATA[공모전]]></category>
		<category><![CDATA[디바이스마트]]></category>
		<category><![CDATA[매거진]]></category>
		<category><![CDATA[융합]]></category>
		<category><![CDATA[참가상]]></category>
		<category><![CDATA[프로젝트]]></category>

		<guid isPermaLink="false">http://www.ntrexgo.com/?p=32426</guid>
		<description><![CDATA[디바이스마트매거진 39호 &#124; 3D Printer와 Dynamixel을 활용해 Wearable을 통한 로봇으로 팔을 제어한다.]]></description>
				<content:encoded><![CDATA[<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/05/2016-ictmain.png" rel="lightbox[32426]"><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>&nbsp;</p>
<p><span style="font-size: medium;background-color: #000000;color: #ffffff"><strong>2016 ICT 융합 프로젝트 공모전 참가상</strong></span></p>
<p><span style="font-size: x-large"><strong>Wearable Marionette</strong></span></p>
<p style="text-align: right">글 | 목원대학교 진선기, 한승원, 김인창</p>
<p>&nbsp;</p>
<p><strong><span style="color: #0000ff">심사평</span> </strong><br />
<span style="color: #3366ff"><strong>JK전자</strong> </span>3D 모델링툴과 프린터를 이용해서 기구물을 제작하고 모터와 연결해 제어하는 과정에서 굉장한 노력이 보이고, 앞으로 다가올 개인 맞춤형 제품(장치)의 시대에 적합한 제작 방식에 대해서 후한 점수를 주었다. 하지만 소프트웨어 구현 부분이 아직 미흡하고 모터의 위치 제어에 대한 부분이 기성 제품과 소프트웨어의 도움을 받아 너무 간단하게 제작이 된 부분이 아쉽다.</p>
<p><span style="color: #3366ff"><strong>뉴티씨</strong></span> 로봇을 직접 제작하고, 센서로 감지한 팔의 움직임을 로봇의 움직임으로 대체하려고 한 것은 매우 중요한 연구테마의 한 가지이다. 하지만, 현재 제작된 로봇팔의 토크 등이 부족하여 움직임이 자유롭지 못하였을 부분, 팔의 처짐 등이 있었다는 보고가 없으며, 이에 대한 대책 등으로 개선 사항 등이 없는 부분 등을 보면 전반적으로 동작이 원활치 않았음을 알 수 있다. 또한, 현재의 모터로는 필요한 토크를 전부 얻어서 동작하는 것이 어려워 보인다. 모터의 선들은 어떻게 처리하여, 각각의 모터들이 잘 동작할 수 있는 무게나 유연성 등의 부분도 연구가 좀 더 필요해 보인다. 어려운 주제인 로봇팔을 크게 제작하여 어려움을 겪었을 것으로 예상되며, 다음에는 좀 더 작은 것부터 섬세하게 움직이도록 제작하면 좋은 결과를 가져올 것으로 생각된다.</p>
<p><span style="color: #3366ff"><strong>칩센</strong></span> 센서를 이용한 원격 로봇 제어 방식과 유사하다, 실제 로봇과 동일한 형식의 기기를 착용하여 제어한다는 개념은 신선하나, 내용상의 표현 처럼 더 불편 해 보인다. 하지만 나름 어려운 주제를 선택해서 노력한 부분이 보이고 실제 구현 후 얻은 교훈으로 더 발전할 수 있을 것 같다.</p>
<p><span style="color: #3366ff"><strong>위드로봇</strong></span> master-slave 구조의 tele-robotics 분야에서 master 조작기를 착용형으로 만든 연구 결과로 보여집니다. 시중에서 손쉽게 확보할 수 있는 모터-엔코더 셋트를 조합해서 빠르게 연구 결과를 도출한 아이디어를 높이 평가합니다. 단, 보고서 상에서는 결과 내용이 어떻게 되어 있는지 확인할 방법이 없어 아쉽습니다. 무엇인가를 만드는 것 만큼이나 실험 결과에 대한 분석도 중요합니다. 결과에 대한 분석, 부족한 부분에 대한 추후 보완 방법 등이 정리되었다면 훨씬 높은 점수를 받을 수 있을 겁니다.</p>
<p><span style="color: #0000ff"><strong>작품 개요</strong> </span><br />
<span style="color: #3366ff"><strong>작품 소개</strong></span><br />
· 3D Printer와 Dynamixel을 활용해 Wearable을 통한 로봇 팔 제어<br />
· [그림1]은 작품형태를 이미지화 시켜놓은 그림이다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-wearable-1.jpg" rel="lightbox[32426]"><img alt="39 ict wearable (1)" src="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-wearable-1.jpg" width="500" /></a></p>
<p><strong style="color: #3366ff"><br />
작품의 개발 배경 및 필요성</strong></p>
<p>여러 탐사로봇을 개발함에 있어 많은 문제점을 발견할 수 있었다. 그 중 탐사로봇을 섬세하게 조종하는데 있어 문제를 발견했고 보다 수월하고 섬세하게 제어할 수 있는 Wearable 제어기를 개발하게 되었다.</p>
<p><span style="color: #3366ff"><strong>작품의 특장점</strong></span><br />
<strong>작품(Wearable)의 특장점</strong><br />
· 3D Printer를 이용한 Wearable 설계 및 제작<br />
· Wearable Dynamixel의 모터 값(목표위치)을 이용한 로봇 제어<br />
· OpenCM보드를 통한 Wearable 모터 값 전송</p>
<p><strong>작품(로봇 팔)의 특장점</strong><br />
· 3D printer를 이용한 로봇 팔 설계 및 제작<br />
· USB2Dynamixel를 이용한 모터 통신<br />
· Dynamixel을 이용한 로봇팔 5자유도 구현</p>
<p><span style="color: #0000ff"><strong>작품 설명</strong></span><br />
<span style="color: #3366ff"><strong>주요 동작 및 특징</strong></span><br />
<strong>3D Printer를 이용한 Wearable 및 로봇 제작</strong><br />
· 3D Printer를 활용 &#8211; 비용절감, 경량화</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-wearable-2.jpg" rel="lightbox[32426]"><img class="alignnone  wp-image-32516" alt="39 ict wearable (2)" src="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-wearable-2.jpg" width="500" /></a></p>
<p>· Wearable 설계 및 제작</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-wearable-3.jpg" rel="lightbox[32426]"><img class="alignnone  wp-image-32517" alt="39 ict wearable (3)" src="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-wearable-3.jpg" width="500" /></a></p>
<p>· 로봇 팔 설계 및 제작 : 프로파일 형식으로 프로파일과 연결 가능하도록 설계 및 제작</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-wearable-4.jpg" rel="lightbox[32426]"><img class="alignnone  wp-image-32518" alt="39 ict wearable (4)" src="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-wearable-4.jpg" width="500" /></a></p>
<p><strong>서보모터 Dynamixel을 이용한 Wearable 및 로봇 제어</strong><br />
· Dynamixel AX-18A : 무게 54.6g에 크기 32mm x 50.1mm x 40mm, 기어 비 254 : 1배로 전압 9~12V에서 작동한다. 통신 속도는 115200bps을 이용할 수 있다. 그러므로 DYNAMIXEL AX-18A는 사람과 좀 더 비슷한 자유도를 제작하기 위한 최적의 모터로써 로봇 팔 및 Wearable 관절부분에 사용했다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-wearable-5.jpg" rel="lightbox[32426]"><img class="alignnone  wp-image-32519" alt="39 ict wearable (5)" src="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-wearable-5.jpg" width="500" /></a></p>
<p><strong>Wearable Dynamixel의 모터값(목표위치)을 이용한 로봇 제어</strong></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-wearable-6.jpg" rel="lightbox[32426]"><img class="alignnone  wp-image-32520" alt="39 ict wearable (6)" src="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-wearable-6.jpg" width="500" /></a></p>
<p><strong>OpenCM보드를 통한 Wearable 모터 값 전송</strong></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-wearable-7.jpg" rel="lightbox[32426]"><img class="alignnone  wp-image-32521" alt="39 ict wearable (7)" src="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-wearable-7.jpg" width="500" /></a></p>
<p>&nbsp;</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-wearable-8.jpg" rel="lightbox[32426]"><img class="alignnone  wp-image-32522" alt="39 ict wearable (8)" src="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-wearable-8.jpg" width="500" /></a><a href="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-wearable-9.jpg" rel="lightbox[32426]"><img class="alignnone  wp-image-32523" alt="39 ict wearable (9)" src="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-wearable-9.jpg" width="500" /></a></p>
<p>&nbsp;</p>
<p><strong>USB2Dynamixel를 이용한 모터 통신</strong></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-wearable-10.jpg" rel="lightbox[32426]"><img class="alignnone  wp-image-32524" alt="39 ict wearable (10)" src="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-wearable-10.jpg" width="500" /></a></p>
<p>&nbsp;</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-wearable-11.jpg" rel="lightbox[32426]"><img class="alignnone  wp-image-32525" alt="39 ict wearable (11)" src="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-wearable-11.jpg" width="500" /></a></p>
<p><strong>Dynamixel을 이용한 로봇 팔 5자유도 구현</strong><br />
· Dynamixel AX-18A 5개를 활용하여 5자유도 구현</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-wearable-12.jpg" rel="lightbox[32426]"><img class="alignnone  wp-image-32526" alt="39 ict wearable (12)" src="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-wearable-12.jpg" width="500" /></a> <a href="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-wearable-13.jpg" rel="lightbox[32426]"><img class="alignnone  wp-image-32527" alt="39 ict wearable (13)" src="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-wearable-13.jpg" width="500" /></a></p>
<p><strong>Dynamixel을 이용한 Wearable 관절 구현</strong><br />
· Dynamixel AX-12A 5개를 활용하여 5자유도 구현<br />
· 사람 팔에 착용할 수 있도록 제작</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-wearable-14.jpg" rel="lightbox[32426]"><img class="alignnone  wp-image-32528" alt="39 ict wearable (14)" src="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-wearable-14.jpg" width="500" /></a> <a href="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-wearable-15.jpg" rel="lightbox[32426]"><img class="alignnone  wp-image-32529" alt="39 ict wearable (15)" src="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-wearable-15.jpg" width="500" /></a></p>
<p><strong>C#을 이용한 프로그램Form 개발</strong><br />
· OpenCM 보드를 통해 받은 Wearable 모터 데이터 값을 C#으로 받아 프로그램Form에 출력하도록 한다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-wearable-16.jpg" rel="lightbox[32426]"><img class="alignnone  wp-image-32530" alt="39 ict wearable (16)" src="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-wearable-16.jpg" width="500" /></a></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-wearable-17.jpg" rel="lightbox[32426]"><img class="alignnone  wp-image-32531" alt="39 ict wearable (17)" src="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-wearable-17.jpg" width="500" /></a><br />
<span style="color: #0000ff"><strong>전체 시스템 구성</strong></span></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-wearable-18.jpg" rel="lightbox[32426]"><img class="alignnone  wp-image-32532" alt="39 ict wearable (18)" src="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ict-wearable-18.jpg" width="500" /></a></p>
<p><span style="color: #0000ff"><strong>개발환경(개발언어, Tool, 사용 시스템 등)</strong></span><br />
<strong>개발언어</strong><br />
· C# : C++에 기본을 두고 visual basic의 편의성을 결합하여 만든 객체지향 프로그래밍언어이다.(첨부1. C# 소스 첨부)<br />
· ROBOTIS OpenCM : OpenCM9.04 임베디드 보드를 쉽게 프로그래밍하고 다운로드 할 수 있는 통합개발환경 소프트웨어이다.(첨부2. ROBOTIS OpenCM 소스 첨부)</p>
<p><span style="color: #0000ff"><strong>단계별 제작 과정</strong></span><br />
<strong>작품계획 및 자료조사</strong><br />
· 작품계획 : 작품제작 및 일정 계획<br />
· 자료조사 : Wearable 및 로봇 팔에 대한 자료(논문, 기사 등)조사</p>
<p><strong>하드웨어 설계</strong><br />
· Solidworks를 통해 Wearable 및 로봇 팔 설계<br />
· Dynamixel 플랫폼과 연결하기 위한 기구적 설계<br />
· 프로파일 형식으로 프로파일과 연결 가능하도록 설계 및 제작</p>
<p><strong>하드웨어 제작</strong><br />
· 3D Printer를 이용하여 로봇 팔 및 Wearable 제작<br />
· 3D Printer를 활용함으로써 비용절감 및 경량화</p>
<p><strong>프로그램 개발</strong><br />
· USB2Dynamixel를 통한 Dynamixel 제어<br />
· C#으로 동한 프로그램 Form개발 및 데이터를 통한 모터 제어<br />
· OpenCM보드를 통한 Wearable 모터 값을 C#으로 전송<br />
· Wearable 및 로봇 팔에 대한 데이터 값을 PC에서 실시간 확인</p>
<p><strong>테스트</strong><br />
· 진행된 작품의 완성도 및 오작동 여부를 테스트 하였다.<br />
· 여러번의 테스트를 통한 문제점 발견(Wearable 착용 불편함)</p>
<p><strong>작품 보완</strong><br />
· 작품 테스트에서 문제점(Wearable 착용 불편함)이 발견되어 착용감이 편하도록 보완하였다.</p>
<p><strong>작품 제작 종료</strong><br />
· 최종 테스트 및 작품을 보완해 작품을 완성하였다.</p>
<p><span style="color: #0000ff"><strong>기타(회로도, 소스코드, 참고문헌 등)</strong></span><br />
<span style="color: #3366ff"><strong>참고 사이트</strong></span><br />
· 로보티즈(다이나믹셀, openCM, USB2Dynamixel) 사이트 참조(이미지, 매뉴얼) : http://www.robotis.com/index/index.php<br />
· XYZ 3D Printer 사이트 참조 (프로그램, 이미지) :</p>
<p>http://kr.xyzprinting.com/</p>
<p><span style="color: #3366ff"><strong>C# 소스코드</strong></span></p>
<div class="symple-box gray none" style="text-align:left; width:100%;"> 
<p>· Port 설정<br />
//Dynamixel<br />
this.timer.Interval = 200;<br />
this.timer.Tick += new EventHandler(timer_Tick);<br />
this.timer.Enabled = true;<br />
this.seriaport.BaudRate = 1000000;<br />
this.seriaport.Encoding = Encoding.Default;<br />
this.seriaport.Parity = Parity.None;<br />
this.seriaport.DataBits = 8;<br />
this.seriaport.StopBits = StopBits.One;<br />
this.seriaport.Handshake = Handshake.None;<br />
this.seriaport2.BaudRate = 1000000;<br />
this.seriaport2.Encoding = Encoding.Default;<br />
this.seriaport2.Parity = Parity.None;<br />
this.seriaport2.DataBits = 8;<br />
this.seriaport2.StopBits = StopBits.One;<br />
this.seriaport2.Handshake = Handshake.None;</p>
<p>// initialize the components (controls) of the window<br />
this.InitializeComponent();<br />
string[] Ports = SerialPort.GetPortNames();<br />
foreach (string i in Ports)<br />
{<br />
ComboBox1.Items.Add(i);<br />
}<br />
ComboBox1.SelectedIndex = ComboBox1.Items.Count &#8211; 1;<br />
myDynamixel = new Dynamixel(this.seriaport);<br />
string[] Ports2 = SerialPort.GetPortNames();<br />
foreach (string i in Ports2)<br />
{<br />
ComboBox2.Items.Add(i);<br />
}<br />
ComboBox2.SelectedIndex = ComboBox1.Items.Count &#8211; 1;<br />
myDynamixel2 = new Dynamixel(this.seriaport2);<br />
}</p>
<p>·Wearable 값 읽기<br />
private void serialPort_DataReceived2 (object sender,Serial Data Received Event Argse)<br />
{<br />
string buff;<br />
buff = this.seriaport2.ReadLine();<br />
if (buff.Length &lt; 32) return;<br />
//Console.WriteLine(buff.Length);<br />
if (buff.Substring(0, 2) == “WM”)<br />
{<br />
_sensor[0] = Convert.ToInt32(buff.Substring(3, 4));<br />
_sensor[1] = Convert.ToInt32(buff.Substring(8, 4));<br />
_sensor[2] = Convert.ToInt32(buff.Substring(13, 4));<br />
_sensor[3] = Convert.ToInt32(buff.Substring(18, 4));<br />
_sensor[4] = Convert.ToInt32(buff.Substring(23, 4));<br />
_sensor[5] = Convert.ToInt32(buff.Substring(28, 4));<br />
}<br />
}</p>
<p>· 모터 속도 조절<br />
private void MotorSpeed()<br />
{<br />
if (this.seriaport.IsOpen)<br />
{<br />
for (int i = 0; i &lt;= 10; i++)<br />
{<br />
myDynamixel.ax12_write2(i, Dynamixel.AX_GOAL_SPEED_L, 1023);<br />
myDynamixel.ax12_write2(i, Dynamixel.AX_TORQUE_LIMIT_L, 1023);<br />
}</p>
<p>}<br />
}<br />
void SendSerialData(SerialPort _serial, byte[] buffer)<br />
{<br />
try<br />
{<br />
_serial.Write(buffer, 0, buffer.Length);<br />
}<br />
catch<br />
{ }<br />
}<br />
void SendSerialData(SerialPort _serial, byte[] buffer, int Length)<br />
{<br />
try<br />
{<br />
_serial.Write(buffer, 0, Length);<br />
}<br />
catch<br />
{ }<br />
}</p>
<p>· 모터 움직이기<br />
private void moveVactor()<br />
{<br />
if (this.seriaport.IsOpen)<br />
{<br />
_motorData[0] = (1024 &#8211; (int)_sensor[1]);<br />
_motorData[1] = (1024 &#8211; (int)_sensor[2]);<br />
_motorData[2] = (1024 &#8211; (int)_sensor[3]);<br />
_motorData[3] = (1024 &#8211; (int)_sensor[4]);<br />
_motorData[4] = (1024 &#8211; (int)_sensor[5]);<br />
if (_sensor[0] &gt; 1000)<br />
_motorData[5] = (int)(512 &#8211; ((int)((_sensor[0] &#8211; 7) / 100) * 1024 / 31));<br />
else<br />
_motorData[5] = 512;<br />
myDynamixel.ax12_sync_write(Dynamixel.AX_GOAL_POSITION_L, 2, 10, _motorData);<br />
}<br />
}</p>
<p>· ROBOTIS OpenCM 소스코드<br />
/* Minimum_Source*/<br />
#include &lt;stdio.h&gt;<br />
#define AX_START 255</p>
<p>#define AX_READ_DATA 2<br />
#define AX_WRITE_DATA 3<br />
#define AX_LENGTH 5<br />
#define AX_TORQIUELIMIT 34<br />
#define AX_NOW 36<br />
#define sendData(args) (Serial1.write(args))<br />
Dynamixel Dxl(1);<br />
int pp[5];<br />
char buff[50]={0};<br />
int temp=0;<br />
void setup() {<br />
// put your setup code here, to run once:<br />
Dxl.begin(3);<br />
for(int i=1;i&lt;=5;i++){<br />
settorque(i);<br />
}<br />
}</p>
<p>void settorque(unsigned char ID)<br />
{<br />
unsigned int Checksum;<br />
unsigned int MaxTorque = 1;<br />
Checksum = (~(ID + AX_LENGTH + AX_WRITE_DATA + AX_TORQIUELIMIT + MaxTorque + (MaxTorque&gt;&gt;8)))&amp;0xFF; //패킷설정<br />
gpio_write_bit(PORT_TXRX_DIRECTION, PIN_TXRX_DIRECTION, 1);</p>
<p>sendData(AX_START); //시리얼 통신 보내기<br />
sendData(AX_START);<br />
sendData(ID);<br />
sendData(AX_LENGTH);<br />
sendData(AX_WRITE_DATA);<br />
sendData(AX_TORQIUELIMIT);<br />
sendData(MaxTorque);<br />
sendData((MaxTorque&gt;&gt;8));</p>
<p>sendData(Checksum);<br />
}</p>
<p>void stoptorque(unsigned char ID)<br />
{<br />
unsigned int Checksum;<br />
unsigned int MaxTorque = 1023;</p>
<p>Checksum = (~(ID + AX_LENGTH + AX_WRITE_DATA + AX_TORQIUELIMIT + MaxTorque + (MaxTorque&gt;&gt;8)))&amp;0xFF; //패킷설정<br />
gpio_write_bit(PORT_TXRX_DIRECTION, PIN_TXRX_DIRECTION, 1);<br />
sendData(AX_START); //시리얼 통신 보내기<br />
sendData(AX_START);<br />
sendData(ID);<br />
sendData(AX_LENGTH);<br />
sendData(AX_WRITE_DATA);<br />
sendData(AX_TORQIUELIMIT);<br />
sendData(MaxTorque);<br />
sendData((MaxTorque&gt;&gt;8));<br />
sendData(Checksum);<br />
}<br />
void loop() {<br />
int AdcData = analogRead(2);<br />
for(int i=1;i&lt;=5;i++)<br />
{<br />
temp=pp[i-1];<br />
pp[i-1] = Dxl.readWord(i,AX_NOW);<br />
if(pp[i-1]&gt;1000)<br />
pp[i-1]=temp;<br />
}<br />
sprintf(buff,”WM %04d %04d %04d %04d %04d %04d”, AdcData,pp[0],pp[1],pp[2],pp[3],pp[4],pp[5]);<br />
SerialUSB.println(buff);<br />
}</p>
</div>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ntrexgo.com/archives/32426/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[39호]스마트헬스케어시스템 &#8220;아비터&#8221;</title>
		<link>http://www.ntrexgo.com/archives/32438</link>
		<comments>http://www.ntrexgo.com/archives/32438#comments</comments>
		<pubDate>Fri, 25 Nov 2016 00:00:02 +0000</pubDate>
		<dc:creator>디바이스마트 매거진</dc:creator>
				<category><![CDATA[디바이스마트 매거진]]></category>
		<category><![CDATA[특집]]></category>
		<category><![CDATA[39호]]></category>
		<category><![CDATA[featrure]]></category>
		<category><![CDATA[ict]]></category>
		<category><![CDATA[공모전]]></category>
		<category><![CDATA[디바이스마트]]></category>
		<category><![CDATA[매거진]]></category>
		<category><![CDATA[융합]]></category>
		<category><![CDATA[참가상]]></category>
		<category><![CDATA[프로젝트]]></category>

		<guid isPermaLink="false">http://www.ntrexgo.com/?p=32438</guid>
		<description><![CDATA[디바이스마트매거진 39호 &#124; 헬스장에서 일어날 수 있는 헬스기구 사용자간 발생할 수 있는 사소한 마찰 및 불미스러운 일을 미연에 방지하고, 유연한 순환과 유동적인 헬스시설 이용을 돕는데 그 목적을 두고 있다.
]]></description>
				<content:encoded><![CDATA[<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/05/2016-ictmain.png" rel="lightbox[32438]"><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><span style="font-size: medium;background-color: #000000;color: #ffffff"><strong>  2016 ICT 융합 프로젝트 공모전 참가상  </strong></span></p>
<p><span style="font-size: x-large"><strong>스마트헬스케어시스템 &lt;아비터&gt;</strong></span></p>
<p style="text-align: right">글 | 한국외국어대학교 박대원, 우지훈, 허행찬</p>
<p>&nbsp;</p>
<p><span style="color: #0000ff"><strong>심사평</strong></span><br />
JK전자 요즘 대부분의 스마트폰에는 NFC기능이 포함되어 있기 때문에 아두이노와 스마트폰의 인터페이스를 블루투스로 하는것 보다는 스마트폰의 NFC를 활용하여 중간에 아두이노 없이 바로 NFC태그를 이용한다면 조금더 효율적일수 있을 것 같다. 또한 블루투스는 보안상의 문제로 페어링 과정을 거쳐야 하기 때문에 모든 운동기구에 항상 다른 블루투스와 슬레이브 연결을 해야 한다면 이용자 입장에서는 불편할 수도 있을 것 같다. 구현 방법을 다르게 해서 조금 더 쉽고, 편리하게 개발을 한다면 아이디어는 괜찮은 것 같다.<br />
뉴티씨 현대에는 운동을 통한 개인의 육체 단련도 매우 중요하다. 건강이 담보되지 않은 생활이란 있을 수 없기 때문인데, 공동으로 사용하는 헬스기구에 대해 여러사람들이 함께 이용할 수 있도록 한 점 등이 좋은 아이디어로 보인다. 다만, 실제로 구현하면서 적용하지 못한 점 등이 실용성이나 기술성, 완성도 등에서 좋은 점수를 받지 못하였으며, 보고서의 완성도에서도 좋은 점수를 받지 못하였다.<br />
다만, 앞으로 이 아이디어를 제대로 구현하고 좀 더 IoT 환경에 맞는 나은 제품을 구현한다면 좀 더 실용적인 좋은 제품이 될 것 같다.<br />
칩센 재미있는 아이디어지만 이미 회원증 또는 스마트폰을 통한 기기 운용과 운동기록 등을 진행하는 업체도 있고 해당 아이디어들이 구현된 업체가 많은편이다. 게임과 같이 가벼운 보상을 줘서 다른 운동기기로 자연스럽게 바꿀 수 있게 하는게 더 좋았을 것 같다.<br />
위드로봇 간단하지만 꼭 필요할 법한 부분에 착안한 아이디어에 높은 점수를 줍니다. 단, 앱까지 제작되어 스마트폰에서 동작될 때 이 작품의 진가가 드러나게 될 것 같습니다. 이 부분의 구현이 부족한 점이 아쉽습니다.</p>
<p><span style="color: #0000ff"><strong>프로젝트 목표</strong></span><br />
본 프로젝트는 아두이노와 안드로이드를 복합적으로 응용하여, 소프트웨어와 하드웨어가 융합된 어플 개발 및 서비스제작을 목표로 한다. 이 시스템을 통하여 헬스장에서 일어날 수 있는 헬스기구 사용자간 발생할 수 있는 사소한 마찰 및 불미스러운 일을 미연에 방지하고, 유연한 순환과 유동적인 헬스시설 이용을 돕는데 그 목적을 두고 있다.</p>
<p><span style="color: #0000ff"><strong>프로젝트 내용</strong></span><br />
먼저 헬스장 회원들은 해당 앱을 설치하고, 실행하면 사용할 기구와 블루투스 모듈을 통하여 연결한다. 그리고 해당 기구의 RFID 리더기에 회원카드를 인식하면, 회원 로그인이 된다. 그리고 아두이노로 연결된 헬스기구 상단에 LED가 소등된다. 다른 회원들은 소등되어있는 LED를 확인하고, 해당 기구가 사용 중이라는 사실을 알 수 있다.<br />
또한 로그인 된 어플리케이션은 회원의 정보와 현재 운동중인 부위와 운동데이터를 실시간 확인이 가능하며, 해당 데이터는 트레이너에게 전달되어 회원관리도 가능하다. 그리고 어플 내 관리자 호출기능을 통하여 관리자 및 트레이너와 통화 역시 가능하여, 불편한 사항이나 문제가 발생했을 시에도 즉시에 해결이 가능하다.<br />
기구마다 일정 최대 사용시간이 정해져 있어서 사용자가 최대 사용 시간동안 한 기구를 이용할 경우 자동 로그아웃이 되고 LED가 점등되어, 다른 사용자들이 해당 기구를 사용 할 수 있게 된다. 그리고 가장 최근에 기구를 사용했던 사람은 바로 연속해서 기구를 사용할 수 없고 5분간의 쿨타임 동안은 같은 기구를 재사용할 수 없다. 5분이 지난 이후에도 해당 기구의 사용자가 없을 경우에는 재사용이 가능하다.<br />
만약 기구 사용 도중에 운동을 그만하고 싶을 경우에는 어플리케이션 상에서 로그아웃을 하면 자동으로 LED가 점등이 되며 사용정지모드가 된다.</p>
<p><span style="color: #0000ff"><strong>수행방법</strong> </span><br />
문제 상황에 대한 인식과 해결방법에 대해 논의하며 해결책에 다가가면서 그에 대한 환경을 조사하고 해당 기술을 개발한다. 개발에 들어갈 때 각각 업무를 크게 어플 UI, RFID 인식, 블루투스 장치 파트로 분담하여 개발한다. 시스템 프로그래밍 수업시간에 배웠던 아두이노를 이용하여 프로그래밍을 하고 더 나아가 안드로이드를 자체적으로 연구하여 앱 개발에 들어간다. 각 팀원들의 개발 성과물을 계속 검토하며 시스템의 안정도를 체크한다. 이때 디버깅 과정에서 오류의 발생 여부에 따라 팀별 피드백을 수행하여 보완점을 수정한다.</p>
<p><span style="color: #0000ff"><strong>향후 응용 및 활용방법</strong></span><br />
과학기술의 발달로 인하여 사람들에게 생활의 편의를 제공하기 위한 제품과 아이디어가 출시되고 있다. 현대인의 삶의 질적인 만족을 충족시키기 위하여 여가와 관련된 다양한 시스템이 나오고 있는 추세이다. 우리가 개발하고자 하는 ‘아비터’시스템은 스마트폰에 내장된 어플과 헬스 기구에 설치된 아두이노와 RFID 그리고 블루투스를 통해 정보를 교환함으로써 원활한 스포츠 시설의 환경을 제공할 수 있다. 이를 통해 헬스장 회원의 기다림을 최소화할 수 있을 뿐만 아니라 헬스기구 사용자 간의 사소한 마찰을 방지함으로써 건강한 운동문화를 조성할 것이다.</p>
<p><span style="color: #0000ff"><strong>프로젝트 제목</strong></span><br />
우리가 개발하는 서비스의 명칭으로서, 아비터란 중재자라는 뜻을 가지고 있다. 저희가 개발한 이 서비스가 헬스장에서 발생할 수 있는 여러 가지 불미스러운 일들을 중재할 수 있는 중재자 역할을 할 수 있기를 바라는 마음으로 네이밍 하였다.</p>
<p><span style="color: #0000ff"><strong>프로젝트 개요</strong> </span><br />
<strong>프로젝트 배경 및 필요성</strong></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ICT-아비터-1.jpg" rel="lightbox[32438]"><img class="alignnone size-full wp-image-32567" alt="39 ICT 아비터 (1)" src="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ICT-아비터-1.jpg" width="288" height="186" /></a></p>
<p>과학기술의 발달 및 경제성장에 따라 현대인들은 삶의 질 향상을 위한 여가 욕구가 증가하고 있다. 현대인들은 제한된 시간 및 공간에서 그들의 여가생활에 대한 욕구를 충족시킬 수 있는 공간이 필요하다. 이러한 욕구를 충족시킬 수 있는 공간은 대표적으로 ‘헬스장’이다. 현대인들에게 헬스장은 단순히 살을 빼기 위한 목적이 아닌 건강, 스트레스 해소 및 사교범위 확장을 위한 새로운 여가활동을 할 수 있는 장소이다. 그러나 여가 욕구를 충족시키기 위한 헬스장은 헬스기구를 기다리는 잉여시간으로 인하여 여가 욕구 충족이라는 목적을 달성하는 데 한계가 존재한다. 그뿐만 아니라 헬스 회원의 장시간 운동기구 독점으로 인하여 헬스 회원 간의 언쟁 및 불필요한 다툼이 발생하기도 한다. 이러한 헬스장의 문제는 여가 욕구의 충족이라는 본연의 목적을 달성하지 못할 뿐 아니라 개인의 삶의 질을 하락시킬 수도 있는 장소가 될 수 있다.<br />
따라서, 위와 같은 헬스장의 문제점 및 한계를 해결하기 위해 우리는 스마트폰에 내장된 어플리케이션과 헬스기구에 설치된 아두이노와 RFID 그리고 블루투스 모듈을 통해 어떤 헬스기구를 이용할 수 있는지 확인 가능한 시스템을 고안하였다. 또한, 우리가 고안한 ‘아비터’ 시스템을 통해 헬스장 회원의 운동데이터를 쉽게 확인할 수 있을 뿐만 아니라 동일 기구를 독점할 수 없도록 쿨타임 기능을 추가하여 건강한 운동문화를 조성할 수 있을 것이다. 이 시스템은 점차 증가하는 여가 욕구에 대응하여 쾌적한 여가생활을 즐길 수 있는 환경을 제공할 뿐만 아니라 건강한 운동문화를 조성하고자 하는데서 프로젝트를 시작하였다.</p>
<p><strong>프로젝트 목표</strong><br />
먼저 이 아이디어를 생각하게 된 것은 요즘 대형마트 주차장에서 흔히 볼 수 있게 된 주정차 센서와 도서관 좌석 관리 시스템이다. 주정차 센서는 주차가 되어있으면 위쪽에 빨간불, 비어있는 공간이면 초록색으로 표시가 되어 어디가 비어있는지 쉽게 볼 수 있는 센서장치이다. 그리고 도서관 좌석 관리 시스템 역시 한눈에 도서관 남는 좌석을 확인할 수 있는 시스템이다. 우리는 이 두 가지를 헬스장에 접목하면 어떨까 생각하게 되었다. 그리고 헬스장 내에도 전용 카드를 사용하는 곳이 많아 연관 지어 생각해 IC 칩이 내장된 카드를 이용해 해당 어플과 연동해 이용을 편리하게 하도록 했다.<br />
먼저 블루투스를 이용하여 기구 내 하드웨어부와 사용자의 스마트폰을 연결하고, 회원정보가 등록된 카드를 하드웨어부의 RFID 모듈에 스캔하면 카드 안의 회원정보가 데이터화 되어 어플로 확인이 가능하다. 또한 기구에 있는 사용 중 표시등으로 기구가 현재 사용 중인지 사용 가능한지를 알려준다. 이러한 기술을 이용하여 운동기구의 사용 시간을 제한하거나 연속으로 등록하지 못하는 등을 통해 운동기구의 독점을 막고 다양한 사람들로 하여금, 운동기구를 사용함에 있어 유연한 순환이 가능할 수 있도록 돕는다.<br />
한 기구를 사용하기 위해 오랜 시간 기다리지 않아도 되고, 잠시 자리를 비운 동안 자리가 없어지거나, 다른 한 사람이 기구를 독점해서 쓰지 못하는 일이 없도록 도와, 보다 쾌적하고 원활하게 헬스장을 이용할 수 있도록 돕는다. 또 원래 있던 카드와 스마트폰 만으로 이를 제어할 수 있도록 하여 이용하는 입장에서 금액 부담을 줄였다. 이를 통해 사용자들이 좀 더 여유롭고 기분 좋은 여가생활을 누릴 수 있도록 하는데 목표가 있다.</p>
<p><strong>향후 프로젝트 활용도 및 기대효과</strong><br />
과학기술의 발달 및 경제의 고도성장은 사람들에게 풍요로운 생활과 생활의 첨단화라는 혜택을 주었을 뿐만 아니라 여러 가지 생활상의 변화를 가져왔다. 이러한 변화 중 가장 대표적인 것으로 스마트폰의 사용과 여가생활에 대한 욕구증가라고 말할 수 있다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ICT-아비터-2.jpg" rel="lightbox[32438]"><img class="alignnone  wp-image-32569" alt="39 ICT 아비터 (2)" src="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ICT-아비터-2.jpg" width="500" /></a></p>
<p>위의 그래프를 통해 알 수 있듯이 스마트폰 사용은 점차 증가하였으며, 오늘날 스마트폰은 현대인과 뗄 수 없는 존재로 자리 잡았다.<br />
이러한 스마트폰의 사용 증가는 개인의 건강 증진과 연관되어 새로운 삶의 문화를 창조해가고자 하는 여가생활에 대한 욕구를 더욱 더 효율적으로 충족시킬 수 있다. 우리 팀이 개발하는 시스템은 스마트폰을 통해 현대인들의 잉여시간 및 자원을 효율적으로 활용하도록 도와 건강한 삶을 영위할 수 있도록 한다. 예를 들어 헬스 기구를 이용하기 위해 헬스장의 다른 회원의 헬스 기구 이용이 끝날 때까지 무작정 기다리기보다 ‘아비터’라는 어플을 통해 현재 이용 가능한 헬스 기구를 한눈에 볼 수 있다. 또한, 헬스기구의 최대사용시간을 설정하여 모든 회원이 공평하게 헬스기구를 이용할 수 있게 된다. 이를 통해 헬스 기구를 이용하기 위한 기다림을 최소화할 수 있으며, 개인의 헬스기구 장시간 사용으로 인한 헬스장 회원들 간의 마찰을 방지하여 건강한 운동문화를 조성할 것이다. 또한 ‘아비터’시스템을 통해 다른 경쟁 헬스장과 비교하여 높은 고객 만족을 충족시켜 경쟁력을 갖출 수 있을 것이다.</p>
<p><span style="color: #0000ff"><strong>프로젝트 설명</strong></span><br />
<strong>프로젝트 주요 동작 및 시스템 구성</strong><br />
수행 결과물로는 하드웨어적 결과물과 어플리케이션을 나누어 설명하도록 하겠다. 먼저 어플리케이션의 경우 너무 복잡하지 않은 필요한 정보와 화면만을 담아 무겁지 않게 개발한다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ICT-아비터-3.jpg" rel="lightbox[32438]"><img class="alignnone size-medium wp-image-32571" alt="39 ICT 아비터 (3)" src="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ICT-아비터-3-300x150.jpg" width="300" height="150" /></a></p>
<p><span style="text-decoration: underline">APP 실행 첫 화면</span><br />
어플리케이션을 실행하면, 나타나는 시동화면으로써, 헬스케어서비스라는 어플리케이션의 특징을 잘 나타낼 수 있도록, 로고를 디자인하였고, 활기찬 느낌을 주는 파란색으로 메인 색을 설정하였다. 화면을 터치하면 다음화면으로 넘어간다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ICT-아비터-4.jpg" rel="lightbox[32438]"><img class="alignnone size-medium wp-image-32572" alt="39 ICT 아비터 (4)" src="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ICT-아비터-4-300x150.jpg" width="300" height="150" /></a></p>
<p><span style="text-decoration: underline">블루투스 연결화면</span><br />
휴대폰과 운동기구를 블루투스를 이용하여 연결한다. 이때 블루투스 버튼을 누르게 되면, 주변에 블루투스를 잡게 되는데, 사용자는 본인이 사용할 기구의 신호를 찾아 연결한다. 연결이 되면 자동으로 다음화면으로 넘어간다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ICT-아비터-5.jpg" rel="lightbox[32438]"><img class="alignnone size-medium wp-image-32573" alt="39 ICT 아비터 (5)" src="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ICT-아비터-5-300x149.jpg" width="300" height="149" /></a></p>
<p><span style="text-decoration: underline">사용자 ID카드 인식 화면</span><br />
사용자의 헬스장 회원 ID카드를 대면, 회원의 정보가 운동기구에 입력된다. 카드를 인식하게 되면, 개인정보를 확인할 수 있는 화면으로 자동으로 넘어간다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ICT-아비터-6.jpg" rel="lightbox[32438]"><img class="alignnone size-medium wp-image-32574" alt="39 ICT 아비터 (6)" src="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ICT-아비터-6-300x152.jpg" width="300" height="152" /></a></p>
<p><span style="text-decoration: underline">쿨 타임 화면</span><br />
사용시간이 다 되거나 로그아웃을 할 경우 쿨 타임이 진행된다. 쿨 타임을 사용하는 이유는 같은 사람이 한 가지 기구를 연속해서 사용하여 독점하는 것을 방지하기 위함이다. 쿨 타임은 약 5분 정도를 두고, 5분 동안은 다른 회원들에게 사용할 수 있는 기회를 주게 되고, 5분 내에 아무도 사용하는 인원이 없을 경우는 재사용이 가능하다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ICT-아비터-7.jpg" rel="lightbox[32438]"><img class="alignnone size-medium wp-image-32575" alt="39 ICT 아비터 (7)" src="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ICT-아비터-7-300x153.jpg" width="300" height="153" /></a></p>
<p><span style="text-decoration: underline">개인 정보 확인 화면</span><br />
ID카드를 인식하면, 회원의 기본정보가 확인가능하다. 사용 중인 기구마다 각각의 유형의 기구별로 한 번에 이용 가능한 시간을 제한하여 이용시간을 실시간으로 확인 가능하다. 또한, 사용도중에 문제가 발생하거나 운동방법에 대해 궁금한 것이 있을 경우 관리자 호출을 통하여 바로 트레이너 및 관리자와 통화가 가능하다. 기구마다 배정된 최대운동시간이 다 되거나, 로그아웃버튼을 누르면 다음화면으로 넘어가고, 하드웨어부에 부착된 사용 중 표시등은 꺼진다.<br />
또한 기구마다 현재 사용 중인 운동부위를 알려줌으로써, 관리자는 회원의 운동부위에 따른 운동량 데이터를 실시간으로 확인이 가능하고, 회원의 개인별 관리를 좀 더 편하게 할 수 있다.</p>
<p><span style="color: #3366ff"><strong>개발환경</strong></span><br />
이와 같이 주요화면 5가지를 토대로 하여 어플리케이션을 제작한다.<br />
다음은 하드웨어적 결과물에 관한 내용이다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ICT-아비터-8.jpg" rel="lightbox[32438]"><img class="alignnone size-full wp-image-32576" alt="39 ICT 아비터 (8)" src="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ICT-아비터-8.jpg" width="458" height="399" /></a><br />
하드웨어의 경우, 헬스 기구마다 설치될 예정이고, 아두이노를 이용하여 블루투스 모듈과 RFID를 연결한다. 그리고 RFID 모듈은 회원카드 접지부가 된다. 회원카드를 접지부에 대면 회원의 정보가 RFID 모듈을 통하여 아두이노에 전송이 되고 그 정보는 블루투스를 통하여 회원의 휴대전화로 전송이 된다. 또한, 기구에는 ‘사용중’ 표시등이 설치되어 있기 때문에 회원이 휴대전화를 통하여 로그아웃을 하거나 사용종료를 하게 되면, 그 정보가 아두이노를 통하여 표시등이 꺼지게 된다.<br />
이처럼 하드웨어적 부분까지 완성을 하게 되면, 오류검출, 디버깅 작업을 마지막으로 프로젝트를 마무리하게 된다.</p>
<p><span style="color: #0000ff"><strong>단계별 제작 과정</strong></span><br />
<span style="color: #3366ff"><strong>수행 방법</strong></span><br />
문제 상황을 인식하고, 배경환경을 조사한다. 그리고 개발에 필요한 기술과 정보에 대하여 인지하고, 해당 기술에 대하여 팀원들이 모여 스터디를 시행한다. 관련 기술을 팀원끼리 분담하여 연구를 하고, 각자 본인이 맡은 분야에 대하여 다른 팀원에게 지도하는 방식으로 내부 세미나를 진행한다. 앱 디자인과 개발을 연구하고 해당 내용을 완성한다. 앱 개발이 끝나면, 운동기구를 구해서 실제로 하드웨어를 설계하기 위한 디자인팀과 아두이노를 활용한 하드웨어 개발팀으로 나뉘어 각각 하드웨어를 개발한다. 이 때 디자인팀과 개발팀 중 먼저 완료가 되는 팀은 어플리케이션과 하드웨어 연계 전에 어플리케이션에서 발생하는 독자적인 오류를 잡기 위하여 반복 디버깅한다. 하드웨어의 개발이 끝나면, 어플리케이션과 직접적 연결을 통하여 동작에 이상이 없는지 확인하고, 오류 발생 시 수정작업을 진행한다. 이 작업까지 끝나면 세부적인 사항을 조정하고, 팀원 간 최종회의 및 제품 구동을 통하여 보완점을 개선하고, 프로젝트를 마무리한다.</p>
<p><span style="color: #3366ff"><strong>세부 추진 일정</strong></span></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ICT-아비터-1.png" rel="lightbox[32438]"><img class="alignnone  wp-image-32568" alt="39 ICT 아비터 (1)" src="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ICT-아비터-1.png" width="450" /></a></p>
<p><span style="color: #3366ff"><strong>목표 설정 및 성과 측정</strong> </span></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ICT-아비터-2.png" rel="lightbox[32438]"><img class="alignnone size-full wp-image-32570" alt="39 ICT 아비터 (2)" src="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ICT-아비터-2.png" width="560" height="391" /></a></p>
<p><span style="color: #3366ff"><strong>프로토타입</strong></span></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ICT-아비터-9.jpg" rel="lightbox[32438]"><img class="alignnone size-full wp-image-32577" alt="39 ICT 아비터 (9)" src="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ICT-아비터-9.jpg" width="564" height="240" /></a><a href="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ICT-아비터-10.jpg" rel="lightbox[32438]"><img class="alignnone size-full wp-image-32578" alt="39 ICT 아비터 (10)" src="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ICT-아비터-10.jpg" width="560" height="355" /></a></p>
<p><span style="color: #0000ff"><strong>기타</strong></span></p>
<p><span style="color: #3366ff"><strong>소스코드</strong></span></p>
<div class="symple-box gray none" style="text-align:left; width:100%;"> 
<p>#include &lt;SoftwareSerial.h&gt;<br />
SoftwareSerial bt(2, 3); //3번 핀은 아두이노의 RX와 연결<br />
byte buffer[100];<br />
// 17C24, 51B00<br />
void setup() {<br />
// put your setup code here, to run once:<br />
Serial.begin(9600);// 시리얼 모니터 통신설정<br />
bt.begin(9600); //블루투스 시리얼 통신속도 선언<br />
Serial.println(“CARD HERE!”);<br />
int bufferPos = 0;<br />
}</p>
<p>void loop() {<br />
byte data;<br />
char tagString[4];<br />
int index = 0;<br />
int kk = 0;<br />
//////////////////BLUETOOTH/////////////////<br />
/*if(bt.available()) //블루투스를 통해 데이터가 날아오면( 앱에서 버튼눌리면)<br />
{<br />
byte data = bt.read();//수신받은 데이터 저장<br />
buffer[bufferPos++]=data;</p>
<p>for(int k=0;k&lt;bufferPos;k++){<br />
Serial.print((char)buffer[k]);<br />
}</p>
<p>bufferPos = 0;<br />
if(data==’\n’){ //문자열 종료<br />
buffer[bufferPos]=’’;<br />
}<br />
}<br />
if(Serial.available())//시리얼 모니터로 값을 주면<br />
{<br />
byte data = Serial.read();<br />
buffer[bufferPos++]=data;<br />
if(buffer[0] == ‘5’)<br />
{<br />
bt.write(“ 1234”);<br />
}<br />
bt.write(buffer,bufferPos);// 스마트폰으로 받은 데이터 출력<br />
bufferPos=0;</p>
<p>if(data==’\n’){ //문자열 종료<br />
buffer[bufferPos]=’’;<br />
}<br />
}<br />
*/<br />
////////////////RFID/////////////<br />
while(Serial.available()){<br />
// for(int index =0;index&lt;=3;index++){<br />
char readByte = Serial.read();<br />
tagString[index] = readByte;<br />
index++;<br />
Serial.println(“tagString is : “);<br />
Serial.println(tagString);<br />
Serial.println(index);</p>
<p>bt.write(“1234”);<br />
// }</p>
<p>//delay(1000);<br />
}<br />
}<br />
</div>
<p>&nbsp;</p>
<p><span style="color: #3366ff"><strong>회로도</strong></span></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ICT-아비터-11.jpg" rel="lightbox[32438]"><img class="alignnone  wp-image-32579" alt="39 ICT 아비터 (11)" src="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ICT-아비터-11.jpg" width="500" /></a></p>
<p>&nbsp;</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ICT-아비터-12.jpg" rel="lightbox[32438]"><img class="alignnone  wp-image-32580" alt="39 ICT 아비터 (12)" src="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ICT-아비터-12.jpg" width="500" /></a><a href="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ICT-아비터-13.jpg" rel="lightbox[32438]"><img class="alignnone  wp-image-32566" alt="39 ICT 아비터 (13)" src="http://www.ntrexgo.com/wp-content/uploads/2016/11/39-ICT-아비터-13.jpg" width="500" /></a></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ntrexgo.com/archives/32438/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[20호]JK전자와 함께하는 ARM 완전정복(6)-2</title>
		<link>http://www.ntrexgo.com/archives/21271</link>
		<comments>http://www.ntrexgo.com/archives/21271#comments</comments>
		<pubDate>Fri, 30 Aug 2013 06:28:42 +0000</pubDate>
		<dc:creator>디바이스마트 매거진</dc:creator>
				<category><![CDATA[디바이스마트 매거진]]></category>
		<category><![CDATA[특집]]></category>
		<category><![CDATA[20호]]></category>
		<category><![CDATA[ARM완전정복]]></category>
		<category><![CDATA[featrure]]></category>
		<category><![CDATA[jk전자]]></category>
		<category><![CDATA[디바이스마트]]></category>
		<category><![CDATA[매거진]]></category>

		<guid isPermaLink="false">http://www.ntrexgo.com/?p=21271</guid>
		<description><![CDATA[디바이스마트 매거진 20호 &#124; 이번 파트에서는 STM32F103VC Dragon 개발보드 + 3.2 터치 LCD 가 부착된 실제 개발보드를 가지고 이론으로만 공부했던 내용을 실제 예제를 통해서 하나씩 배워나가보도록 하겠습니다. ]]></description>
				<content:encoded><![CDATA[<table style="width: 620px" border="0">
<tbody>
<tr>
<td><a href="http://www.ntrexgo.com/wp-content/uploads/2013/05/jk전자.jpg" rel="lightbox[21271]"><img class="alignnone wp-image-13318" alt="jk전자" src="http://www.ntrexgo.com/wp-content/uploads/2013/05/jk전자-300x222.jpg" width="192" height="142" /></a></td>
<td><span style="color: #000080"><strong><span style="font-size: large">JK전자와 함/께/하/는 ARM 완전 정복</span></strong></span></p>
<p>Ⅳ. Cortex-M3 Applications</p>
<p>&nbsp;</p>
<p>글 | JK전자</td>
</tr>
</tbody>
</table>
<p><a title="[20호]JK전자와 함께하는 ARM 완전정복(6)-1 보러가기" href="http://www.ntrexgo.com/archives/20915" target="_blank">이어서 계속 됩니다. &gt;&gt;&gt;</a></p>
<p><span style="color: #ffffff;background-color: #ff6600"><strong>4. Examples</strong></span></p>
<p><strong><span style="color: #ff6600">4.1 GPIO Output without SDK</span></strong></p>
<p>STM32F 시리즈에는 ST사에서 제공하는 CPU Datasheet를 보지 않더라도 함수 이름만 보고서도 따라할 수 있을 정도의 아주 훌륭한 Library가 있습니다. 하지만 우리는 처음에는 STM32F CPU의 레지스터들을 더 잘 이해하기 위해서 SDK 라이브러리를 사용하지 않고 직접 SFR 레지스터드를 설정하는 방법으로 해보도록 하겠습니다.<br />
첫번째 예제로 Dragon 개발보드의 Bottom 보드에 있는 LED들 중에서 LED2, LED4는 On, LED3는 Off 시키는 예제를 해보도록 하겠습니다.</p>
<p><span style="color: #99cc00"><strong>(1) Dragon 개발보드의 LED 회로</strong></span></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2013/08/20feajk-9.png" rel="lightbox[21271]"><img class="alignnone  wp-image-21157" alt="20feajk (9)" src="http://www.ntrexgo.com/wp-content/uploads/2013/08/20feajk-9-620x325.png" width="496" height="260" /></a></p>
<p>회로를 보면 LED를 켜기 위해서는 GPIO포트를 High로 하면 LED가 켜지도록 되어 있습니다.</p>
<p><span style="color: #99cc00"><strong>(2) Peripheral Bus</strong></span></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2013/08/20feajk-10.png" rel="lightbox[21271]"><img class="alignnone  wp-image-21158" alt="20feajk (10)" src="http://www.ntrexgo.com/wp-content/uploads/2013/08/20feajk-10-620x326.png" width="496" height="261" /></a><br />
GPIOE는 APB2 버스에 연결되어 있으므로 APB2 버스의 GPIOE 포트의 Clock을 Enable시켜주어야 합니다.</p>
<p><span style="color: #99cc00"><strong>(3) STM32 Peripheral Boundary Address : 0&#215;4002 1000 (STM32F103 Reference Guide Page 50)</strong></span></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2013/08/20feajk-11.png" rel="lightbox[21271]"><img class="alignnone  wp-image-21159" alt="20feajk (11)" src="http://www.ntrexgo.com/wp-content/uploads/2013/08/20feajk-11-620x128.png" width="434" height="90" /></a></p>
<p><span style="color: #99cc00"><strong>(4) RCC_APB2ENR Boundary Address : 0&#215;4002 1000 + 0&#215;18 (STM32F103 Reference Guide Page 119)</strong></span></p>
<p><img class="alignnone size-large wp-image-21160" alt="20feajk (12)" src="http://www.ntrexgo.com/wp-content/uploads/2013/08/20feajk-12-620x231.png" width="620" height="231" /></p>
<p><span style="color: #99cc00"><strong>(5) RCC_APB2ENR Boundary Address : 0&#215;4002 1018 (STM32F103 Reference Guide Page 142)</strong></span><br />
- GPIOE Port Enable : (*(volatile unsigned *)0&#215;4002 1018) |= 0&#215;01 &lt;&lt; 6</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2013/08/20feajk-13.png" rel="lightbox[21271]"><img class="alignnone size-large wp-image-21161" alt="20feajk (13)" src="http://www.ntrexgo.com/wp-content/uploads/2013/08/20feajk-13-620x239.png" width="620" height="239" /></a></p>
<p><span style="color: #99cc00"><strong>(6) GPIOE Port Boundary address : 0&#215;4001 1800 ( STM32F103 Reference Guide Page 51 )</strong></span></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2013/08/20feajk-14.png" rel="lightbox[21271]"><img class="alignnone  wp-image-21162" alt="20feajk (14)" src="http://www.ntrexgo.com/wp-content/uploads/2013/08/20feajk-14-620x206.png" width="446" height="149" /></a></p>
<p><span style="color: #99cc00"><strong>(7) GPIO and AFIO register maps (STM32F103 Reference Guide Page 188)</strong></span></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2013/08/20feajk-15.png" rel="lightbox[21271]"><img class="alignnone size-large wp-image-21163" alt="20feajk (15)" src="http://www.ntrexgo.com/wp-content/uploads/2013/08/20feajk-15-620x286.png" width="620" height="286" /></a></p>
<p><span style="color: #99cc00"><strong>(8) GPIOE_CRL Register Boundary address : 0&#215;4001 1800</strong></span><br />
- GPIOE Port2, 3, 4를 Output push-pull로 설정</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2013/08/20feajk-16.png" rel="lightbox[21271]"><img class="alignnone  wp-image-21164" alt="20feajk (16)" src="http://www.ntrexgo.com/wp-content/uploads/2013/08/20feajk-16-591x620.png" width="532" height="558" /></a></p>
<p><span style="color: #99cc00"><strong>(9) GPIOE_BSRR(Set/Reset) Register Boundary address : 0&#215;4001 1810</strong></span></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2013/08/20feajk-17.png" rel="lightbox[21271]"><img class="alignnone  wp-image-21165" alt="20feajk (17)" src="http://www.ntrexgo.com/wp-content/uploads/2013/08/20feajk-17-620x345.png" width="496" height="276" /></a><br />
BSRR 레지스터는 GPIO Set or Reset 전용 레지스터입니다. 0 ~ 15비트는 Set 전용이고 16 ~ 31비트는 Reset 레지스터입니다.<br />
LED2(GPIOE2), LED4(GPIOE4) 포트를 Set하기 위해서는 BSRR 레지스터의 2, 4번 비트를 1로 만들면 됩니다. &#8220;0&#8243;을 Write했을때 &#8220;No action&#8221; 이라고 되어 있는 부분은 일반적으로 레지스터의 특정 비트를 Set or Clear하기 위해서는 LDR, Bit 조작, STR의 3단계가 필요한데, 이러한 Feature가 지원이 되면 Bit 조작 다음에 바로 STR 명령어에 의해서 레지스터 비트 조작이 가능하게 됩니다.</p>
<p><span style="color: #99cc00"><strong>(10) GPIOE_BRR(Reset) Register Boundary address : 0&#215;4001 1814</strong></span></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2013/08/20feajk-18.png" rel="lightbox[21271]"><img class="alignnone  wp-image-21166" alt="20feajk (18)" src="http://www.ntrexgo.com/wp-content/uploads/2013/08/20feajk-18-620x269.png" width="496" height="215" /></a><br />
GPIO Reset 전용 레지스터를 이용해서 GPIOE3을 Reset 합니다.<br />
(*(volatile unsigned *) 0&#215;40011814) = (0&#215;1 &lt;&lt; 3); // PE3 Off</p>
<div class="symple-box gray none" style="text-align:left; width:100%;"> 
<p><strong>예제 전체 코드</strong></p>
<p>void led_test_wo_sdk(void)<br />
{<br />
// APB2 Clock enable<br />
// Reference Page 47, 50, 119, 142<br />
// APB2 peripheral GPIOE clock enable register (RCC_APB2ENR)<br />
(*(volatile unsigned *)0&#215;40021018) |= 0&#215;01 &lt;&lt; 6;<br />
// General Purpose output push-pull<br />
// Reference Page 51, 188, 166<br />
// GPIOE_CRL<br />
(*(volatile unsigned *)0&#215;40011800) &amp;= ~(0xf &lt;&lt; 8);<br />
(*(volatile unsigned *)0&#215;40011800) &amp;= ~(0xf &lt;&lt; 12);<br />
(*(volatile unsigned *)0&#215;40011800) &amp;= ~(0xf &lt;&lt; 16);</p>
<p>// PE2, 3, 4 Ouput mode configuration<br />
// Reference Page 51, 188, 166<br />
// GPIOE_CRL<br />
(*(volatile unsigned *)0&#215;40011800) |= (0&#215;3 &lt;&lt; 8); // PE2 Ouput Mode 50MHz<br />
(*(volatile unsigned *)0&#215;40011800) |= (0&#215;3 &lt;&lt; 12); // PE3 Ouput Mode 50MHz<br />
(*(volatile unsigned *)0&#215;40011800) |= (0&#215;3 &lt;&lt; 16); // PE4 Ouput Mode 50MHz<br />
// Reference Page 168<br />
// GPIOE_BSRR<br />
(*(volatile unsigned *)0&#215;40011810) = (0&#215;1 &lt;&lt; 2); // PE2 On<br />
// GPIOE_BSRR<br />
(*(volatile unsigned *)0&#215;40011810) = (0&#215;1 &lt;&lt; 4); // PE4 On<br />
// GPIOE_BRR<br />
(*(volatile unsigned *)0&#215;40011814) = (0&#215;1 &lt;&lt; 3); // PE3 Off</p>
<p>}</p>
</div>
<p><span style="color: #ff6600"><strong>4.2 GPIO Output with SDK</strong></span></p>
<p><strong><span style="color: #99cc00">(1) 첫번째 예제와 동일한 동작을 하는데 이번에는 ST사에서 제공한 SDK 라이브러리를 이용해서 해보도록 하겠습니다.</span></strong></p>
<p><span style="color: #99cc00"><strong>(2) 프로젝트와 stm32f10x_conf.h 파일 수정</strong></span></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2013/11/73.png" rel="lightbox[21271]"><img class="alignnone size-large wp-image-21278" alt="73" src="http://www.ntrexgo.com/wp-content/uploads/2013/11/73-620x304.png" width="620" height="304" /></a><br />
GPIO 라이브러리를 사용하기 위해서는 프로젝트에 stm32f10x_gpio.c 파일을 추가 하고 stm32f10x_conf.h 에서 stm32f10x_gpio.h 를 include 해야 합니다.</p>
<div class="symple-box gray none" style="text-align:left; width:100%;"> 
<p>예제 전체 코드</p>
<p>void led_test_wt_sdk(void)<br />
{</p>
<p>// Define GPIO Init structure<br />
GPIO_InitTypeDef GPIO_InitStructure;<br />
// APB2 Clock enable<br />
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);</p>
<p>/* Configure the GPIOE ports for output*/<br />
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4;<br />
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;<br />
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;<br />
GPIO_Init(GPIOE, &amp;GPIO_InitStructure);</p>
<p>GPIO_SetBits(GPIOE, GPIO_Pin_2); // LED2 On<br />
GPIO_ResetBits(GPIOE, GPIO_Pin_3); // LED3 Off<br />
GPIO_SetBits(GPIOE, GPIO_Pin_4); // LED4 On</p>
<p>}</p>
</div>
<p>별도의 설명을 하지 않아도 함수의 이름만 봐도 쉽게 코드를 이해할 수 있습니다.</p>
<p><span style="color: #ff6600"><strong>4.3 GPIO Output with BitBand</strong></span></p>
<p><strong><span style="color: #99cc00">(1) 예제 2번과 동일한 작업을 하는데, 이번에는 Bitband를 이용해서 해보도록 하겠습니다.</span></strong></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2013/08/20feajk-19.png" rel="lightbox[21271]"><img class="alignnone size-large wp-image-21167" alt="20feajk (19)" src="http://www.ntrexgo.com/wp-content/uploads/2013/08/20feajk-19-620x269.png" width="620" height="269" /></a><br />
Peripheral 영역의 Bitband 영역을 이용해야하기 때문에 Bitband base 영역은 0&#215;40000000이 되고 Bitword base는 0&#215;42000000 이 됩니다.<br />
Bitband 영역의 계산식을 다시 한번 상기하면서 소스코드를 분석해 보시기 바랍니다. GPIOE의 ODR 레지스터를 이용해서 구현하였습니다.<br />
bit_word_offset = (byte_offset x 32) + (bit_number × 4)<br />
bit_word_addr = bit_band_base + bit_word_offset</p>
<p>// GPIOE_ODR : 0x4001180C<br />
// 2,3,4 Bit : PE2, PE3, PE4</p>
<div class="symple-box gray none" style="text-align:left; width:100%;"> 
<p><strong>예제 전체 코드</strong></p>
<p>#define PERI_BASE 0&#215;40000000<br />
#define PERI_BB_BASE 0&#215;42000000</p>
<p>void led_test_wt_bitband(void)<br />
{</p>
<p>// Define GPIO Init structure<br />
GPIO_InitTypeDef GPIO_InitStructure;</p>
<p>// APB2 Clock enable<br />
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);</p>
<p>/* Configure the GPIOE ports */<br />
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4;<br />
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;<br />
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;<br />
GPIO_Init(GPIOE, &amp;GPIO_InitStructure);</p>
<p>(*(volatile unsigned *)(PERI_BB_BASE + (0x4001180C-PERI_BASE)*32 + 2*4)) = 0&#215;1; // PE2 On<br />
(*(volatile unsigned *)(PERI_BB_BASE + (0x4001180C-PERI_BASE)*32 + 3*4)) = 0&#215;0; // PE3 On<br />
(*(volatile unsigned *)(PERI_BB_BASE + (0x4001180C-PERI_BASE)*32 + 4*4)) = 0&#215;1; // PE4 On</p>
<p>}</p>
</div>
<p><span style="color: #ff6600"><strong>4.4 GPIO Input &#8211; Polling</strong></span><br />
Dragon 개발보드에 있는 버튼 입력을 Polling 방식으로 처리해 보도록 하겠습니다.</p>
<p><span style="color: #99cc00"><strong>(1) BTN2가 눌리면 LED2를 ON 시키고, BTN2가 눌리지 않은 상태면 LED2를 Off 합니다. 동일한 방법으로 BTN3, BTN4 에도 적용 합니다. </strong></span><span style="color: #99cc00"><strong>그리고 BTN1을 누르면 테스트를 종료 합니다.</strong></span></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2013/08/20feajk-87.jpg" rel="lightbox[21271]"><img class="alignnone  wp-image-21234" alt="20feajk (87)" src="http://www.ntrexgo.com/wp-content/uploads/2013/08/20feajk-87-537x620.jpg" width="376" height="434" /></a></p>
<p>BTN 회로를 보면 버튼이 눌리지 않았을때는 VCC에 연결이 되어 High 상태이고 버튼이 눌리면 GND에 연결이 되면서 Low 상태가 됩니다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2013/08/20feajk-21.png" rel="lightbox[21271]"><img class="alignnone  wp-image-21169" alt="20feajk (21)" src="http://www.ntrexgo.com/wp-content/uploads/2013/08/20feajk-21.png" width="391" height="206" /></a></p>
<p><span style="color: #99cc00"><strong>(2) GPIOC 그룹을 사용하기 위해서는 APB2 버스의 GPIOC 그룹의 Clock을 Enable 해야 합니다.</strong></span></p>
<p><span style="color: #99cc00"><strong>(3) GPIOC1, 2, 3을 Input floating으로 설정합니다. </strong></span></p>
<div class="symple-box gray none" style="text-align:left; width:100%;"> 
<p><strong>예제 전체 코드</strong></p>
<p>void key_input_test_polling_wt_sdk(void)<br />
{</p>
<p>// Define GPIO Init structure<br />
GPIO_InitTypeDef GPIO_InitStructure;</p>
<p>// APB2 Clock enable for LED<br />
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);</p>
<p>// APB2 Clock enable for KEY<br />
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);</p>
<p>/* Configure the GPIOE ports for output*/<br />
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4;<br />
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;<br />
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;<br />
GPIO_Init(GPIOE, &amp;GPIO_InitStructure);</p>
<p>/* Configure the GPIOC ports for input */<br />
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;<br />
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;<br />
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;<br />
GPIO_Init(GPIOC, &amp;GPIO_InitStructure);</p>
<p>while(1)<br />
{</p>
<p>// BTN1<br />
if( (!GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_0 )) )<br />
{<br />
break;<br />
}</p>
<p>// BTN2<br />
if( (!GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_1 )) )<br />
{<br />
GPIO_SetBits(GPIOE, GPIO_Pin_2); // LED2 On<br />
}<br />
else<br />
{<br />
GPIO_ResetBits(GPIOE, GPIO_Pin_2); // LED2 Off<br />
}</p>
<p>// BTN3<br />
if( (!GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_2 )) )<br />
{<br />
GPIO_SetBits(GPIOE, GPIO_Pin_3); // LED3 On<br />
}<br />
else<br />
{<br />
GPIO_ResetBits(GPIOE, GPIO_Pin_3); // LED3 Off<br />
}</p>
<p>// BTN4<br />
if( (!GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_3 )) )<br />
{<br />
GPIO_SetBits(GPIOE, GPIO_Pin_4); // LED4 On<br />
}<br />
else<br />
{<br />
GPIO_ResetBits(GPIOE, GPIO_Pin_4); // LED4 Off<br />
}<br />
}</p>
<p>}</p>
</div>
<p><span style="color: #ff6600"><strong>4.5 GPIO Input &#8211; Interrupt</strong></span><br />
이번에는 BTN 입력을 폴링 방식이 아닌 인터럽트 방식으로 구현해 보도록 하겠습니다.</p>
<p><strong><span style="color: #99cc00">(1) BTN2를 한번 누르면 LED2를 On 시키고, 다시 BTN2를 누르면 LED2를 Off 합니다.</span></strong></p>
<p><strong><span style="color: #99cc00">(2) BTN 입력을 Falling Edge에서 검출되도록 설정합니다.</span></strong><br />
Falling Edge에서 검출한다는 것은 KEY Down에서 인터럽트가 발생하도록 한다는 것이죠. KEY Up을 검출하기 위해서는 Rising Edge 에서 검출되도록 설정하면 됩니다.</p>
<p><span style="color: #99cc00"><strong>(3) PC1 포트의 인터럽트 입력을 받으려면 외부 인터럽트 1번에 연결해야 합니다. 당연히 PC2는 외부 인터럽트 2번에 연결해야 하겠죠</strong>.</span></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2013/08/20feajk-22.png" rel="lightbox[21271]"><img class="alignnone  wp-image-21170" alt="20feajk (22)" src="http://www.ntrexgo.com/wp-content/uploads/2013/08/20feajk-22.png" width="492" height="558" /></a></p>
<p><span style="color: #99cc00"><strong>(4) 인터럽트 레지스터 설정</strong></span></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2013/08/20feajk-23.png" rel="lightbox[21271]"><img class="alignnone  wp-image-21171" alt="20feajk (23)" src="http://www.ntrexgo.com/wp-content/uploads/2013/08/20feajk-23.png" width="482" height="217" /></a></p>
<p><span style="color: #99cc00"><strong>(5) SDK 라이브러리 추가</strong></span></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2013/08/20feajk-89.jpg" rel="lightbox[21271]"><img class="alignnone size-large wp-image-21236" alt="20feajk (89)" src="http://www.ntrexgo.com/wp-content/uploads/2013/08/20feajk-89-620x364.jpg" width="620" height="364" /></a></p>
<p><span style="color: #99cc00"><strong>(6) 인터럽트 우선순위</strong></span><br />
STM32에서 인터럽트 우선순위 비트는 8비트중에서 상위 4비트만 사용합니다. 4비트 중에서 이번 예제에서는 Priority group 2를 사용해서 Group 우선순위 2비트 Sub 우선순위 2비트를 사용하도록 설정합니다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2013/08/20feajk-90.jpg" rel="lightbox[21271]"><img class="alignnone  wp-image-21237" alt="20feajk (90)" src="http://www.ntrexgo.com/wp-content/uploads/2013/08/20feajk-90-620x392.jpg" width="496" height="314" /></a></p>
<p><span style="color: #99cc00"><strong>(7) 인터럽트 서비스 흐름도</strong></span><br />
외부 인터럽트가 발생해서 인터럽트 핸들러 함수로 분기하기까지의 과정을 도식화 해보았습니다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2013/08/20feajk-91.jpg" rel="lightbox[21271]"><img class="alignnone  wp-image-21238" alt="20feajk (91)" src="http://www.ntrexgo.com/wp-content/uploads/2013/08/20feajk-91-620x346.jpg" width="496" height="277" /></a></p>
<p><span style="color: #99cc00"><strong>(8) 예제 코드 작성 순서</strong></span><br />
□ APB2 Clock enable for LED<br />
□ APB2 Clock enable for KEY<br />
□ Configure the GPIOE ports for output<br />
□ Configure the GPIOC ports for input<br />
□ Configure EXTI to generate an interrupt on falling edge<br />
□ EXTIPR : pending 여부및 pending clear(1:pending clear)<br />
□ ICPR : pending clear Cortex-M3</p>
<div class="symple-box gray none" style="text-align:left; width:100%;"> 
<p><strong>예제 전체 코드</strong></p>
<p>void key_input_test_interrupt(void)<br />
{<br />
EXTI_InitTypeDef EXTI_InitStructure;<br />
NVIC_InitTypeDef NVIC_InitStructure;</p>
<p>// Define GPIO Init structure<br />
GPIO_InitTypeDef GPIO_InitStructure;</p>
<p>// APB2 Clock enable for LED<br />
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);<br />
// APB2 Clock enable for KEY<br />
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);</p>
<p>// for Interrupt<br />
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);<br />
/* Configure the GPIOE ports for output*/<br />
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4;<br />
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;<br />
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;<br />
GPIO_Init(GPIOE, &amp;GPIO_InitStructure);</p>
<p>/* Configure the GPIOC ports for input */<br />
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;<br />
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;<br />
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;<br />
GPIO_Init(GPIOC, &amp;GPIO_InitStructure);</p>
<p>/* Connect EXTI */<br />
// External Interrupt configuration register1 (AFIO_EXTICR1)<br />
GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource1);</p>
<p>/* Configure EXTI1 to generate an interrupt on falling edge */<br />
EXTI_InitStructure.EXTI_Line = EXTI_Line1;<br />
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;<br />
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;<br />
EXTI_InitStructure.EXTI_LineCmd = ENABLE;<br />
EXTI_Init(&amp;EXTI_InitStructure);<br />
// 2 bit for pre-emption priority, 2 bits for subpriority<br />
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);</p>
<p>NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn;<br />
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;<br />
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;<br />
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;<br />
NVIC_Init(&amp;NVIC_InitStructure);</p>
<p>/* Clear EXTI Line Pending Bit */<br />
// STM32F10x Pending Register : 0&#215;40010400 + 0&#215;14<br />
EXTI_ClearITPendingBit(EXTI_Line1);</p>
<p>/* Enable the Key EXTI line Interrupt */<br />
// Cortex-M3 Interrupt Clear-Pending Register : 0xE000E280-0xE000E29C<br />
NVIC_ClearPendingIRQ(EXTI1_IRQn);<br />
}<br />
void EXTI1_IRQHandler(void)<br />
{<br />
if(EXTI_GetITStatus(EXTI_Line1) != RESET)<br />
{<br />
EXTI_ClearITPendingBit(EXTI_Line1);</p>
<p>// Blink<br />
GPIOE-&gt;ODR ^= (0&#215;1 &lt;&lt; 2);<br />
}<br />
}</p>
</div>
<p><span style="color: #ff6600"><strong>4.6 General Purpose Timer</strong></span></p>
<p>임베디드 시스템에서 Timer는 가장 중요하고 필수적인 요소로 OS에서 Task스케줄링을 위해서 사용되기도 하고, 전자액자, 차량용 블랙박스 등의 응용 어플리케이션에서도 특정 시간 이후에 인터럽트를 발생시켜 정해진 일을 수행하는 경우 등 응용분야는 무수히 많습니다.</p>
<p><strong>■ 참고 ■</strong><br />
CPU의 클럭 속도가 1Hz 라는 것은 무엇을 의미하는 것일까요?<br />
이것은 1초에 1번의 Tick이 발생한다는 것임. STM32가 72MHz 로 동작한다면 1초에 7천 2백만번의 Tick이 발생하는 것</p>
<p>이번 예제에서는 STM32 CPU에 내장된 Timer2를 이용해서 1초에 한번씩 Timer 인터럽트를 발생시켜 LDE2, LED3를 Toggle(On/Off 를 반복하는것)하는 실험을 해보도록 하겠습니다.</p>
<p><strong>■ 참고 ■</strong><br />
1sec = 1,000ms = 1,000,000us = 1,000,000,000ns<br />
1Hz = 1KHz = 1MHz = 1GHz</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2013/08/20feajk-26.png" rel="lightbox[21271]"><img class="alignnone  wp-image-21174" alt="20feajk (26)" src="http://www.ntrexgo.com/wp-content/uploads/2013/08/20feajk-26-620x395.png" width="496" height="316" /></a></p>
<p><span style="color: #99cc00"><strong>(1) STM32F CPU의 타이머 종류</strong></span></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2013/08/20feajk-27.jpg" rel="lightbox[21271]"><img class="alignnone  wp-image-21175" alt="20feajk (27)" src="http://www.ntrexgo.com/wp-content/uploads/2013/08/20feajk-27-620x447.jpg" width="496" height="358" /></a></p>
<p><span style="color: #99cc00"><strong>(2) Timer Clock</strong></span><br />
Timer2는 APB1 버스에 연결되어 있습니다. APB1 버스의 최대 동작 속도는 36MHz이지만 위의 그림을 잘 보면 APB1의 Prescaler가 1이 아니면 PB1 Clock x2를 하고 있습니다. 그러므로 Timer2가 APB1에 연결되어 있지만 Timer2에 공급되는 Clock은 72MHz가 됩니다. 주의해서 보지 않으면 Timer2에 공급되는 Clock이 36MHz라고 착각할 수 있습니다.</p>
<p><span style="color: #99cc00"><strong>(3) 프로젝트와 stm32f10x_conf.h 파일 수정</strong></span></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2013/08/20feajk-93.jpg" rel="lightbox[21271]"><img class="alignnone  wp-image-21240" alt="20feajk (93)" src="http://www.ntrexgo.com/wp-content/uploads/2013/08/20feajk-93-620x310.jpg" width="496" height="248" /></a></p>
<p><span style="color: #99cc00"><strong>(4) 예제 코드 작성 순서</strong></span><br />
□ APB1 Clock enable for TIM2<br />
□ GPIO Init for LED<br />
□ Configure the TIM2 interrupt<br />
□ Time base configuration<br />
□ TIM2 Enable<br />
□ TIM2 interrupt enable</p>
<div class="symple-box gray none" style="text-align:left; width:100%;"> 
<p>예제 전체 코드</p>
<p>void gpio_init_led(void)<br />
{<br />
// Define GPIO Init structure<br />
GPIO_InitTypeDef GPIO_InitStructure;</p>
<p>// APB2 Clock enable<br />
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);</p>
<p>/* Configure the GPIOE ports for output*/<br />
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4;<br />
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;<br />
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;<br />
GPIO_Init(GPIOE, &amp;GPIO_InitStructure);<br />
}<br />
void gpio_init_key(void)<br />
{<br />
// Define GPIO Init structure<br />
GPIO_InitTypeDef GPIO_InitStructure;</p>
<p>// APB2 Clock enable for KEY<br />
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);</p>
<p>// for Interrupt<br />
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);</p>
<p>/* Configure the GPIOC ports for input */<br />
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;<br />
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;<br />
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;<br />
GPIO_Init(GPIOC, &amp;GPIO_InitStructure);<br />
}</p>
<p>void TIM2_IRQHandler(void)<br />
{<br />
if(TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET )<br />
{<br />
// Also cleared the wrong interrupt flag in the ISR<br />
TIM_ClearFlag(TIM2, TIM_FLAG_Update);<br />
TIM_ClearITPendingBit(TIM2, TIM_IT_Update); // Clear the interrupt flag</p>
<p>// Blink<br />
GPIOE-&gt;ODR ^= (0&#215;1 &lt;&lt; 2);<br />
GPIOE-&gt;ODR ^= (0&#215;1 &lt;&lt; 3);<br />
}<br />
}<br />
void timer2_test(void)<br />
{<br />
NVIC_InitTypeDef NVIC_InitStructure;<br />
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;</p>
<p>/* TIM2 clock enable */<br />
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);</p>
<p>gpio_init_led();</p>
<p>/* Enable the TIM2 global Interrupt */<br />
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;<br />
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;<br />
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;<br />
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;<br />
NVIC_Init(&amp;NVIC_InitStructure);</p>
<p>// TIM2CLK = 72 MHz( APB1은 원래 36MHz 인데 분주를 해서 사용하므로 36*2 = 72MHz 가 된다. )<br />
// 시간의 기본단위 :S(초)&#8211;&gt;nS.uS.mS.S.<br />
// 72000000/60000=1200 즉 1초에 1200번 클럭이 발생하므로<br />
// ARR 레지스터를 1199+1 번에 한번 인터럽트가<br />
// 발생하도록 설정하면 1초에 한번 인터럽트가 발생된다.<br />
/* Time base configuration */<br />
TIM_TimeBaseStructure.TIM_Period = 1200-1; // ARR(Auto reload register)<br />
TIM_TimeBaseStructure.TIM_Prescaler = 60000-1;<br />
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;<br />
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;<br />
TIM_TimeBaseInit(TIM2, &amp;TIM_TimeBaseStructure);</p>
<p>TIM_ARRPreloadConfig(TIM2, ENABLE);<br />
TIM_Cmd(TIM2, ENABLE);</p>
<p>/* TIM IT enable */<br />
TIM_ITConfig(TIM2, TIM_IT_Update , ENABLE);<br />
}</p>
</div>
자주 사용하는 LED, KEY포트를 초기화하는 함수 gpio_init_led, gpio_init_key를 만들어서 호출하였습니다.</p>
<p><span style="color: #ff6600"><strong>4.7 Systick &#8211; Delay</strong></span></p>
<p>SysTick Timer를 이용해서 1us Delay 함수를 구현하자. delay_ms 함수를 이용하여 LED2, LED3을 1초 간격으로 Toggle(On/Off) 해 봅시다.</p>
<p><span style="color: #99cc00"><strong>(1) System Control Space</strong></span></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2013/08/20feajk-28.png" rel="lightbox[21271]"><img class="alignnone size-large wp-image-21176" alt="20feajk (28)" src="http://www.ntrexgo.com/wp-content/uploads/2013/08/20feajk-28-620x217.png" width="620" height="217" /></a><br />
System timer인 SysTick은 System Control Space 영역에 위치하고 있습니다.</p>
<p><span style="color: #99cc00"><strong>(2) SysTick Control and Status Register</strong></span></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2013/08/20feajk-29.png" rel="lightbox[21271]"><img class="alignnone  wp-image-21177" alt="20feajk (29)" src="http://www.ntrexgo.com/wp-content/uploads/2013/08/20feajk-29.png" width="496" height="388" /></a><br />
이번에는 SysTick 인터럽트는 사용하지 않을 예정이며, CLKSOURCE는 core clock(72MHz)을 그대로 사용할 것입니다.</p>
<p><span style="color: #99cc00"><strong>(3) Systick Reload Register</strong></span></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2013/08/20feajk-30.png" rel="lightbox[21271]"><img class="alignnone  wp-image-21178" alt="20feajk (30)" src="http://www.ntrexgo.com/wp-content/uploads/2013/08/20feajk-30.png" width="496" height="329" /></a><br />
Systick Current Value Register를 보면 Systick Timer는 24비트 타이머라는것을 알 수 있습니다.</p>
<div class="symple-box gray none" style="text-align:left; width:100%;"> 
<p>예제 전체 코드</p>
<p>// 1us delay 함수<br />
void delay_us (const uint32_t usec)<br />
{<br />
RCC_ClocksTypeDef RCC_Clocks;</p>
<p>/* Configure HCLK clock as SysTick clock source */<br />
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK);<br />
RCC_GetClocksFreq(&amp;RCC_Clocks);<br />
// Set SysTick Reload(1us) register and Enable<br />
// usec * (RCC_Clocks.HCLK_Frequency / 1000000) &lt; 0xFFFFFFUL &#8212; because of 24bit timer<br />
// RCC_Clocks.HCLK_Frequency = 72000000<br />
// Systick Reload Value Register = 72<br />
// 72 / 72000000 = 1us<br />
SysTick_Config(usec * (RCC_Clocks.HCLK_Frequency / 1000000));</p>
<p>// SysTick Interrupt Disable<br />
SysTick-&gt;CTRL &amp;= ~SysTick_CTRL_TICKINT_Msk ;</p>
<p>// Until Tick count is 0<br />
while (!(SysTick-&gt;CTRL &amp; SysTick_CTRL_COUNTFLAG_Msk));<br />
}<br />
// 1ms delay 함수<br />
void delay_ms (const uint32_t msec)<br />
{<br />
delay_us(1000 * msec);<br />
}<br />
void systick_test_delay(void)<br />
{<br />
gpio_init_led();<br />
gpio_init_key();</p>
<p>while(1)<br />
{<br />
// BTN1<br />
if( (!GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_0 )) )<br />
{<br />
break;<br />
}</p>
<p>delay_ms(100);<br />
delay_ms(100);<br />
delay_ms(100);<br />
delay_ms(100);<br />
delay_ms(100);<br />
delay_ms(100);<br />
delay_ms(100);<br />
delay_ms(100);<br />
delay_ms(100);<br />
delay_ms(100);</p>
<p>// Blink<br />
GPIOE-&gt;ODR ^= (0&#215;1 &lt;&lt; 2);<br />
GPIOE-&gt;ODR ^= (0&#215;1 &lt;&lt; 3);<br />
}<br />
}</p>
</div>
72MHz 클럭을 가지는 24Bit SysTick 타이머로는 1초 Delay를 만들어 낼 수 없기 때문에 100msec delay 함수를 10번 호출하여 구현하였습니다.</p>
<p><span style="color: #ff6600"><strong>4.8 Systick &#8211; Interrupt</strong></span></p>
<p>SysTick Timer를 이용해서 100msec 간격으로 SysTick_Handler 인터럽트를 발생시키고 LED2, LED3을 Toggle(On/Off) 해 봅시다.</p>
<div class="symple-box gray none" style="text-align:left; width:100%;"> 
<p><strong>예제 전체 코드</strong></p>
<p>void SysTick_Handler(void)<br />
{<br />
// Blink<br />
GPIOE-&gt;ODR ^= (0&#215;1 &lt;&lt; 2);<br />
GPIOE-&gt;ODR ^= (0&#215;1 &lt;&lt; 3);<br />
}<br />
void systick_test_interrupt(void)<br />
{<br />
RCC_ClocksTypeDef RCC_Clocks;</p>
<p>gpio_init_led();</p>
<p>/* Configure HCLK clock as SysTick clock source */<br />
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK);<br />
RCC_GetClocksFreq(&amp;RCC_Clocks);</p>
<p>/* Setup SysTick Timer for 100 msec interrupts */<br />
if (SysTick_Config(RCC_Clocks.HCLK_Frequency / 10))<br />
{<br />
/* Capture error */<br />
while (1);<br />
}<br />
}</p>
</div>
SysTick_Config 함수 안에서 기본으로 SysTick 인터럽트를 Enable 하고 있기 때문에 다른 설정을 하지 않아도 SysTick_Handler 인터럽트 핸들러로 진입합니다.<br />
이전 SysTick Delay 예제에서는 인터럽트가 발생하지 않도록 하기 위해서,<br />
SysTick-&gt;CTRL &amp;= ~SysTick_CTRL_TICKINT_Msk ;<br />
위와 같은 코드가 삽입되어 있었습니다.</p>
<p><span style="color: #ff6600"><strong>4.9 USART &#8211; Polling</strong></span></p>
<p>UART1를 PC와 115200bps Baudrate로 통신(RX, TX)을 하는 Echo server로 만들어 봅시다.<br />
RX, TX 통신을 폴링 방식으로 처리합니다. 터미널에서 ‘x’ 가 입력되면 폴링을 종료합니다.</p>
<p><span style="color: #99cc00"><strong>(1) Dragon 개발보드의 UART 회로</strong></span></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2013/08/20feajk-31.jpg" rel="lightbox[21271]"><img class="alignnone size-full wp-image-21179" alt="20feajk (31)" src="http://www.ntrexgo.com/wp-content/uploads/2013/08/20feajk-31.jpg" width="568" height="329" /></a><br />
Dragon 개발보드에는 COM포트가 없는 노트북, 데스크탑에서 편리하게 사용하게 하기 위해서 USB to Serial 포트가 내장되어 있습니다.<br />
회로도를 보면 PA10이 RX, PA9가 TX 포트입니다. 이번 예제 테스트를 위해서 단순히 USB 미니케이블을 이용해서 Dragon Bottom 보드에 있는 UART 0번과 PCB의 USB 포트에 연결하면 됩니다. 이때 아직 USB to Serial USB 드라이버를 설치하지 않았다면 이전 강좌에서 설명한 &#8220;PL2303 USB to Serial 드라이버 설치&#8221; 부분을 참조하시기 바랍니다.</p>
<p><span style="color: #99cc00"><strong>(2) Peripheral Bus</strong></span></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2013/08/20feajk-32.png" rel="lightbox[21271]"><img class="alignnone  wp-image-21180" alt="20feajk (32)" src="http://www.ntrexgo.com/wp-content/uploads/2013/08/20feajk-32.png" width="398" height="210" /></a><br />
APB2 버스에 연결되어 있는 USART1과 GPA9, 10번 포트도 사용되고 있기 때문에 2개의 Peripheral Clock을 모두 Enable해 주어야 합니다.</p>
<p><span style="color: #99cc00"><strong>(3) UART1 사용을 위한 GPIO 포트 초기화</strong></span></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2013/08/20feajk-41.png" rel="lightbox[21271]"><img class="alignnone  wp-image-21189" alt="20feajk (41)" src="http://www.ntrexgo.com/wp-content/uploads/2013/08/20feajk-41-620x313.png" width="496" height="250" /></a></p>
<p><span style="color: #99cc00"><strong>(4) 프로젝트와 stm32f10x_conf.h 파일 수정</strong></span></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2013/08/20feajk-95.jpg" rel="lightbox[21271]"><img class="alignnone  wp-image-21242" alt="20feajk (95)" src="http://www.ntrexgo.com/wp-content/uploads/2013/08/20feajk-95-620x330.jpg" width="496" height="264" /></a></p>
<p><span style="color: #99cc00"><strong>(5) USART Status register</strong></span></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2013/08/20feajk-42.png" rel="lightbox[21271]"><img class="alignnone  wp-image-21190" alt="20feajk (42)" src="http://www.ntrexgo.com/wp-content/uploads/2013/08/20feajk-42-620x209.png" width="496" height="167" /></a></p>
<p>&nbsp;</p>
<div class="symple-box gray none" style="text-align:left; width:100%;"> 
<p><strong>예제 전체 코드</strong></p>
<p>void usart1_test_polling(void)<br />
{<br />
GPIO_InitTypeDef GPIO_InitStructure;<br />
USART_InitTypeDef USART_InitStructure;</p>
<p>char receive_data;<br />
// APB2 Clock enable for USART(GPIOA9, A10)<br />
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);<br />
/* USART1 clock enable */<br />
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);</p>
<p>/* Configure the GPIO ports( USART1 Transmit and Receive Lines) */<br />
/* Configure the USART1_Tx as Alternate function Push-Pull */<br />
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;<br />
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;<br />
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;<br />
GPIO_Init(GPIOA, &amp;GPIO_InitStructure);</p>
<p>/* Configure the USART1_Rx as input floating */<br />
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;<br />
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;<br />
GPIO_Init(GPIOA, &amp;GPIO_InitStructure);</p>
<p>/* Configure the USART1 */<br />
USART_InitStructure.USART_BaudRate = 115200;<br />
USART_InitStructure.USART_WordLength = USART_WordLength_8b;<br />
USART_InitStructure.USART_StopBits = USART_StopBits_1;<br />
USART_InitStructure.USART_Parity = USART_Parity_No;<br />
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;<br />
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;<br />
USART_Init(USART1, &amp;USART_InitStructure);</p>
<p>/* Enable the USART1 */<br />
USART_Cmd(USART1, ENABLE);</p>
<p>while(1)<br />
{<br />
// Rx not empty 가 될때까지 Polling<br />
while(USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET );<br />
// Rx not empty가 되면 USART Data register 에서 data를 읽어옴<br />
receive_data = USART_ReceiveData(USART1) &amp; 0xFF;</p>
<p>// Tx data 전송<br />
USART_SendData(USART1, receive_data);<br />
// Tx empty가 상태가 될때까지 Polling<br />
// Tx 전송시 이 코드를 생략하면 빠른 Data 전송시 중간에 Tx Data 가 유실될수 있음<br />
while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET );</p>
<p>if( receive_data == &#8216;x&#8217; )<br />
break;<br />
}<br />
}</p>
</div>
<p>&nbsp;</p>
<p><strong><span style="color: #ff6600">4.10 USART &#8211; Interrupt</span></strong></p>
<p>UART1를 PC와 115200bps Baudrate로 통신(RX, TX)을 하는 Echo server로 만들어 봅시다. TX는 폴링 방식으로 처리하고 RX는 Interrupt 방식으로 처리합니다.</p>
<p><span style="color: #99cc00"><strong>(1) USART1 Control Register</strong></span></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2013/08/20feajk-43.png" rel="lightbox[21271]"><img class="alignnone  wp-image-21191" alt="20feajk (43)" src="http://www.ntrexgo.com/wp-content/uploads/2013/08/20feajk-43-620x311.png" width="496" height="249" /></a></p>
<p>&nbsp;</p>
<div class="symple-box gray none" style="text-align:left; width:100%;"> 
<p><strong>예제 전체 코드</strong></p>
<p>void USART1_IRQHandler(void)<br />
{<br />
char receive_data;</p>
<p>if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)<br />
{<br />
receive_data = USART_ReceiveData(USART1) &amp; 0xFF;</p>
<p>USART_SendData(USART1, receive_data);<br />
while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET );</p>
<p>USART_ClearITPendingBit(USART1, USART_IT_RXNE);<br />
}<br />
}<br />
void usart1_test_interrupt(void)<br />
{<br />
GPIO_InitTypeDef GPIO_InitStructure;<br />
USART_InitTypeDef USART_InitStructure;<br />
NVIC_InitTypeDef NVIC_InitStructure;</p>
<p>// APB2 Clock enable for USART(GPIOA9, A10)<br />
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);</p>
<p>/* USART1 clock enable */<br />
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);</p>
<p>/* Enable the USART1 Interrupt */<br />
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;<br />
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;<br />
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;<br />
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;<br />
NVIC_Init(&amp;NVIC_InitStructure);</p>
<p>/* Configure the GPIO ports( USART1 Transmit and Receive Lines) */<br />
/* Configure the USART1_Tx as Alternate function Push-Pull */<br />
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;<br />
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;<br />
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;<br />
GPIO_Init(GPIOA, &amp;GPIO_InitStructure);</p>
<p>/* Configure the USART1_Rx as input floating */<br />
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;<br />
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;<br />
GPIO_Init(GPIOA, &amp;GPIO_InitStructure);</p>
<p>/* Configure the USART1 */<br />
USART_InitStructure.USART_BaudRate = 115200;<br />
USART_InitStructure.USART_WordLength = USART_WordLength_8b;<br />
USART_InitStructure.USART_StopBits = USART_StopBits_1;<br />
USART_InitStructure.USART_Parity = USART_Parity_No;<br />
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;<br />
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;<br />
USART_Init(USART1, &amp;USART_InitStructure);<br />
// Rx Not empty interrupt enable<br />
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);</p>
<p>/* Enable the USART1 */<br />
USART_Cmd(USART1, ENABLE);<br />
}</p>
</div>
<p><strong style="color: #ff6600">4.11 USART &#8211; Name Card</strong></p>
<p>PC의 터미널에 다음과 같이 명함을 출력해 보세요.</p>
<p>*************************************<br />
* Name : Kyung Yeon Kim *<br />
* Company : JK Electronics *<br />
* No : 010-XXXX-XXXX *<br />
*************************************</p>
<p>참고1. 터미널의 행 개행 문자는 “\r\n”<br />
참고2. 터미널 문자열 출력을 하는데 문자열 출력 함수를 만들어 사용하세요.<br />
void usart1_send_string(char *data);<br />
참고3. usart1 초기(폴링방식)화 함수를 작성하세요.<br />
void usart1_init(void);</p>
<div class="symple-box gray none" style="text-align:left; width:100%;"> 
<p>예제 전체 코드</p>
<p>void usart1_init(void)<br />
{<br />
GPIO_InitTypeDef GPIO_InitStructure;<br />
USART_InitTypeDef USART_InitStructure;</p>
<p>// APB2 Clock enable for USART(GPIOA9, A10)<br />
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);</p>
<p>/* USART1 clock enable */<br />
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);</p>
<p>/* Configure the GPIO ports( USART1 Transmit and Receive Lines) */<br />
/* Configure the USART1_Tx as Alternate function Push-Pull */<br />
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;<br />
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;<br />
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;<br />
GPIO_Init(GPIOA, &amp;GPIO_InitStructure);</p>
<p>/* Configure the USART1_Rx as input floating */<br />
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;<br />
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;<br />
GPIO_Init(GPIOA, &amp;GPIO_InitStructure);<br />
/* Configure the USART1 */<br />
USART_InitStructure.USART_BaudRate = 115200;<br />
USART_InitStructure.USART_WordLength = USART_WordLength_8b;<br />
USART_InitStructure.USART_StopBits = USART_StopBits_1;<br />
USART_InitStructure.USART_Parity = USART_Parity_No;<br />
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;<br />
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;<br />
USART_Init(USART1, &amp;USART_InitStructure);</p>
<p>/* Enable the USART1 */<br />
USART_Cmd(USART1, ENABLE);<br />
}<br />
void usart1_send_string(char* data)<br />
{<br />
while(*data != &#8221;)<br />
{<br />
USART_SendData(USART1, *(unsigned char *)data);<br />
while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET );<br />
data++;<br />
}<br />
}<br />
void usart1_test_namecard(void)<br />
{<br />
usart1_init();</p>
<p>usart1_send_string(&#8220;\r\n&#8221;);<br />
usart1_send_string(&#8220;****************************************\r\n&#8221;);<br />
usart1_send_string(&#8220;* Name : Kyung Yeon Kim *\r\n&#8221;);<br />
usart1_send_string(&#8220;* Company : JK Electronics *\r\n&#8221;);<br />
usart1_send_string(&#8220;* No : 010-XXXX-XXXX *\r\n&#8221;);<br />
usart1_send_string(&#8220;****************************************\r\n&#8221;);<br />
usart1_send_string(&#8220;\r\n&#8221;);<br />
}</p>
</div>
<p><span style="color: #ff6600"><strong>4.12 Interrupt Priority1</strong></span></p>
<p>BTN3를 누르면 LED3를 무한 반복을 하면서 On을 시키고 BTN4를 누르면 LED4를 무한 반복을 하면서 On을 시킨다.</p>
<p><span style="color: #99cc00"><strong>(1) Group, Sub Priority bit를 각각 2Bit씩 설정</strong></span></p>
<p><span style="color: #99cc00"><strong>(2) BTN3의 Group Priority를 2, Sub Priority를 0으로 설정</strong></span></p>
<p><span style="color: #99cc00"><strong>(3) BTN4의 Group Priority를 1, Sub Priority를 0으로 설정 후 테스트</strong></span></p>
<div class="symple-box gray none" style="text-align:left; width:100%;"> 
<p><strong>예제 전체 코드</strong></p>
<p>void EXTI2_IRQHandler(void)<br />
{<br />
if(EXTI_GetITStatus(EXTI_Line2) != RESET)<br />
{<br />
EXTI_ClearITPendingBit(EXTI_Line2);</p>
<p>while(1)<br />
{<br />
GPIO_SetBits(GPIOE, GPIO_Pin_3); // LED3 On<br />
}<br />
}<br />
}</p>
<p>void EXTI3_IRQHandler(void)<br />
{<br />
if(EXTI_GetITStatus(EXTI_Line3) != RESET)<br />
{<br />
EXTI_ClearITPendingBit(EXTI_Line3);</p>
<p>while(1)<br />
{<br />
GPIO_SetBits(GPIOE, GPIO_Pin_4); // LED4 On<br />
}<br />
}<br />
}<br />
void interrupt_priority1_test(void)<br />
{<br />
EXTI_InitTypeDef EXTI_InitStructure;<br />
NVIC_InitTypeDef NVIC_InitStructure;</p>
<p>gpio_init_led();<br />
gpio_init_key();</p>
<p>/* Connect EXTI */<br />
// External Interrupt configuration register1 (AFIO_EXTICR1)<br />
GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource2);<br />
GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource3);</p>
<p>/* Configure EXTI2 to generate an interrupt on falling edge */<br />
EXTI_InitStructure.EXTI_Line = EXTI_Line2;<br />
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;<br />
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;<br />
EXTI_InitStructure.EXTI_LineCmd = ENABLE;<br />
EXTI_Init(&amp;EXTI_InitStructure);</p>
<p>/* Configure EXTI3 to generate an interrupt on falling edge */<br />
EXTI_InitStructure.EXTI_Line = EXTI_Line3;<br />
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;<br />
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;<br />
EXTI_InitStructure.EXTI_LineCmd = ENABLE;<br />
EXTI_Init(&amp;EXTI_InitStructure);</p>
<p>// 2 bit for pre-emption priority, 2 bits for subpriority<br />
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);</p>
<p>NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn;<br />
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;<br />
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;<br />
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;<br />
NVIC_Init(&amp;NVIC_InitStructure);</p>
<p>NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn;<br />
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;<br />
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;<br />
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;<br />
NVIC_Init(&amp;NVIC_InitStructure);</p>
<p>/* Clear EXTI Line Pending Bit */<br />
// STM32F10x Pending Register : 0&#215;40010400 + 0&#215;14<br />
EXTI_ClearITPendingBit(EXTI_Line2);<br />
EXTI_ClearITPendingBit(EXTI_Line3);</p>
<p>/* Enable the Key EXTI line Interrupt */<br />
// Cortex-M3 Interrupt Clear-Pending Register : 0xE000E280-0xE000E29C<br />
NVIC_ClearPendingIRQ(EXTI2_IRQn);<br />
NVIC_ClearPendingIRQ(EXTI3_IRQn);<br />
}</p>
</div>
예제의 실행결과를 알 수 있겠죠. BTN3의 Group Priority를 2로 BTN4보다 높기 때문에 BTN3을 먼저 누르면 BTN4의 인터럽트가 실행되지 못합니다. 반대로 BTN4의 인터럽트 실행 중에 BTN3을 누르면 즉시 BTN3의 인터럽트 서비스 루틴이 실행됩니다.</p>
<p><strong><span style="color: #ff6600">4.13 Interrupt Priority2</span></strong></p>
<p>BTN3를 누르면 LED3를 무한 반복을 하면서 On을 시키고 BTN4를 누르면 LED4를 무한 반복을 하면서 On을 시킨다.</p>
<p><span style="color: #99cc00"><strong>(1) Group, Sub Priority bit를 각각 2Bit씩 설정</strong></span></p>
<p><span style="color: #99cc00"><strong>(2) BTN3의 Group Priority를 2, Sub Priority를 0으로 설정</strong></span></p>
<p><span style="color: #99cc00"><strong>(3) BTN4의 Group Priority를 2, Sub Priority를 1로 설정 후 테스트</strong></span></p>
<div class="symple-box gray none" style="text-align:left; width:100%;"> 
<p>예제 전체 코드</p>
<p>void EXTI2_IRQHandler(void)<br />
{<br />
if(EXTI_GetITStatus(EXTI_Line2) != RESET)<br />
{<br />
EXTI_ClearITPendingBit(EXTI_Line2);</p>
<p>while(1)<br />
{<br />
GPIO_SetBits(GPIOE, GPIO_Pin_3); // LED3 On<br />
}<br />
}<br />
}</p>
<p>void EXTI3_IRQHandler(void)<br />
{<br />
if(EXTI_GetITStatus(EXTI_Line3) != RESET)<br />
{<br />
EXTI_ClearITPendingBit(EXTI_Line3);</p>
<p>while(1)<br />
{<br />
GPIO_SetBits(GPIOE, GPIO_Pin_4); // LED4 On<br />
}<br />
}<br />
}<br />
void interrupt_priority1_test(void)<br />
{<br />
EXTI_InitTypeDef EXTI_InitStructure;<br />
NVIC_InitTypeDef NVIC_InitStructure;</p>
<p>gpio_init_led();<br />
gpio_init_key();</p>
<p>/* Connect EXTI */<br />
// External Interrupt configuration register1 (AFIO_EXTICR1)<br />
GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource2);<br />
GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource3);</p>
<p>/* Configure EXTI2 to generate an interrupt on falling edge */<br />
EXTI_InitStructure.EXTI_Line = EXTI_Line2;<br />
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;<br />
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;<br />
EXTI_InitStructure.EXTI_LineCmd = ENABLE;<br />
EXTI_Init(&amp;EXTI_InitStructure);</p>
<p>/* Configure EXTI3 to generate an interrupt on falling edge */<br />
EXTI_InitStructure.EXTI_Line = EXTI_Line3;<br />
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;<br />
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;<br />
EXTI_InitStructure.EXTI_LineCmd = ENABLE;<br />
EXTI_Init(&amp;EXTI_InitStructure);</p>
<p>// 2 bit for pre-emption priority, 2 bits for subpriority<br />
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);</p>
<p>NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn;<br />
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;<br />
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;<br />
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;<br />
NVIC_Init(&amp;NVIC_InitStructure);</p>
<p>NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn;<br />
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;<br />
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;<br />
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;<br />
NVIC_Init(&amp;NVIC_InitStructure);</p>
<p>/* Clear EXTI Line Pending Bit */<br />
// STM32F10x Pending Register : 0&#215;40010400 + 0&#215;14<br />
EXTI_ClearITPendingBit(EXTI_Line2);<br />
EXTI_ClearITPendingBit(EXTI_Line3);</p>
<p>/* Enable the Key EXTI line Interrupt */<br />
// Cortex-M3 Interrupt Clear-Pending Register : 0xE000E280-0xE000E29C<br />
NVIC_ClearPendingIRQ(EXTI2_IRQn);<br />
NVIC_ClearPendingIRQ(EXTI3_IRQn);<br />
}</p>
</div>
<p>이번 예제에서는 BTN3과 4의 Group 우선순위가 같기 때문에 서로 인터럽트 수행 중에는 선점을 하지 못합니다.</p>
<p><strong><span style="color: #ff6600">4.14 Power Management &#8211; Sleep</span></strong></p>
<p>Cortex-M3에서 Power Management 기능은 NVIC에 포함되어 있습니다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2013/08/20feajk-44.png" rel="lightbox[21271]"><img class="alignnone  wp-image-21192" alt="20feajk (44)" src="http://www.ntrexgo.com/wp-content/uploads/2013/08/20feajk-44-620x234.png" width="496" height="187" /></a></p>
<p><span style="color: #99cc00"><strong>(1) Sleep 모드 테스트</strong></span><br />
터미널 창에 아래와 같이 표시되도록 합니다.<br />
Entered Sleep mode.<br />
__WFI(); // Sleep mode 로 진입<br />
Exit Sleep mode.</p>
<p><span style="color: #99cc00"><strong>(2) BTN2를 인터럽트 모드로 입력 받아서 Sleep 모드를 빠져 나오도록 합니다. 추가로 BTN2를 누르면 LED2를 On 시키고 BTN2를 떼면 LED2를 Off 합니다.</strong></span></p>
<p><span style="color: #99cc00"><strong>(3) STM32F Low Power Mode</strong></span></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2013/08/20feajk-45.png" rel="lightbox[21271]"><img class="alignnone  wp-image-21193" alt="20feajk (45)" src="http://www.ntrexgo.com/wp-content/uploads/2013/08/20feajk-45-620x291.png" width="558" height="262" /></a><br />
STM32에서 Sleep 모드로 진입하기 위해서는 WFI(Wait for Interrupt) or WFE(Wait for Event) 어셈블리어에 의해서 진입할 수 있습니다. 이번 예제에서는 WFI를 이용해서 Sleep 모드로 진입하도록 하겠습니다. WFI에 의해서 진입한 Sleep 모드에서 깨어나기 위해서는 어떠한 인터럽트 발생에 의해서라도 깨어날 수 있습니다.</p>
<div class="symple-box gray none" style="text-align:left; width:100%;"> 
<p><strong>예제 전체 코드</strong></p>
<p>void power_management_sleep_test(void)<br />
{<br />
key_input_test_interrupt();</p>
<p>usart1_send_string(&#8220;\r\nEnter Sleep mode.\r\n&#8221;);</p>
<p>__WFI();</p>
<p>usart1_send_string(&#8220;\r\nExit Sleep mode.\r\n&#8221;);</p>
<p>}</p>
</div>
Sleep모드의 장점은 Cortex-M3 Core의 Clock만 멈추어 있는 상태여서 인터럽트에 의해서 즉시 깨어날 수가 있어서 Sleep 모드에 진입해있는지 조차 알 수가 없다는 것이고 단점은 Stop, StandBy 모드에 비해서 소모전류가 많다는 것입니다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2013/08/20feajk-46.png" rel="lightbox[21271]"><img class="alignnone  wp-image-21194" alt="20feajk (46)" src="http://www.ntrexgo.com/wp-content/uploads/2013/08/20feajk-46-620x315.png" width="496" height="252" /></a><br />
Sleep 모드별 Wakeup 방식과 Clock Management 방법입니다.</p>
<p><span style="color: #ff6600"><strong>4.15 Power Management &#8211; Stop</strong></span></p>
<p>Stop, StandBy 모드는 모두 Cortex-M3 Deep sleep 모드에 해당 합니다.</p>
<p><span style="color: #99cc00"><strong>(1) Stop 모드 실험</strong></span><br />
□ Timer2 인터럽트를 1초 간격으로 발생시켜 LED2, LED3를 Toggle<br />
□ PWR_EnterSTOPMode() 함수를 호출하여 Stop 모드로 진입 합니다.<br />
□ BTN2를 인터럽트 모드로 입력 받아서 Stop 모드를 빠져 나오도록 합니다. 추가로 BTN2를 누르면 LED2를 On 시키고 BTN2를 떼면 LED2를 Off 합니다.<br />
□ STOP 모드를 빠져나온 이후에 LED2, LED3이 1초 간격으로 Toggle<br />
□ PWR_EnterSTOPMode를 호출하면 진입</p>
<p style="padding-left: 60px">■ SRAM, Register 상태는 유지<br />
■ 1.8V Domain에 있는 모든 클럭이 Stop<br />
■ PLL, HIS RC, HSE crystal oscillator 모두 disable<br />
■ Voltage regulator는 normal or low power mode</p>
<p>□ Wakeup</p>
<p style="padding-left: 30px">■ EXTI line 중의 하나를 받아야 함<br />
■ 16개의 EXTI line or PVD output, RTC alarm, USB wakeup</p>
<p><span style="color: #99cc00"><strong>(2) Peripheral Bus &#8211; PWR</strong></span></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2013/08/20feajk-47.png" rel="lightbox[21271]"><img class="alignnone  wp-image-21154" alt="20feajk (47)" src="http://www.ntrexgo.com/wp-content/uploads/2013/08/20feajk-47-620x251.png" width="496" height="201" /></a><br />
STM32F의 Power 블럭은 APB1 버스에 연결되어 있습니다.</p>
<p><span style="color: #99cc00"><strong>(3) 프로젝트와 stm32f10x_conf.h 파일 수정</strong></span></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2013/08/20feajk-96.jpg" rel="lightbox[21271]"><img class="alignnone  wp-image-21243" alt="20feajk (96)" src="http://www.ntrexgo.com/wp-content/uploads/2013/08/20feajk-96-620x289.jpg" width="496" height="231" /></a></p>
<p><span style="color: #99cc00"><strong>(4) STM32 PWR 블럭도</strong></span></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2013/11/20feajk-51.png" rel="lightbox[21271]"><img class="alignnone  wp-image-21280" alt="20feajk 51" src="http://www.ntrexgo.com/wp-content/uploads/2013/11/20feajk-51-620x416.png" width="496" height="333" /></a></p>
<p><span style="color: #99cc00"><strong>(5) Cortex-M3 System Control Registe</strong></span><span style="color: #99cc00"><strong>r</strong></span></p>
<p><span style="color: #99cc00"><strong><a href="http://www.ntrexgo.com/wp-content/uploads/2013/08/20feajk-33.png" rel="lightbox[21271]"><img class="alignnone  wp-image-21181" alt="20feajk (33)" src="http://www.ntrexgo.com/wp-content/uploads/2013/08/20feajk-33-620x451.png" width="496" height="361" /></a></strong></span><br />
Stop 모드로 진입시키기 위해서는 2번 비트의 SLEEPDEEP을 Set해야 합니다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2013/08/20feajk-34.png" rel="lightbox[21271]"><img class="alignnone  wp-image-21182" alt="20feajk (34)" src="http://www.ntrexgo.com/wp-content/uploads/2013/08/20feajk-34-620x534.png" width="496" height="427" /></a></p>
<p><span style="color: #99cc00"><strong>(6) STM32 Power Control Register</strong></span><br />
PDDS를 o으로, LPDS를 0으로 할 수도 있고, 1로 할 수도 있으나 이번 예제에서는 1로 설정하여 Vdd Domain에 있는 Voltage Regulator를 low-power 모드로 설정합니다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2013/11/20feajk-52.png" rel="lightbox[21271]"><img class="alignnone  wp-image-21281" alt="20feajk 52" src="http://www.ntrexgo.com/wp-content/uploads/2013/11/20feajk-52-620x487.png" width="496" height="390" /></a></p>
<p>&nbsp;</p>
<div class="symple-box gray none" style="text-align:left; width:100%;"> 
<p><strong>예제 전체 코드</strong></p>
<p>// STOP 모드에 진입하면 HSE Clock 등이 Disale 되기 때문에 Wakeup시에 다시 설정을 해주어야 합니다.<br />
void system_clock_config_stop(void)<br />
{<br />
RCC_HSEConfig(RCC_HSE_ON); // Enable HSE</p>
<p>if( RCC_WaitForHSEStartUp() == SUCCESS)<br />
{<br />
RCC_PLLCmd(ENABLE); // Enable PLL</p>
<p>// Wait until PLL is ready<br />
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) {}</p>
<p>// Select PLL as system clock source<br />
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);</p>
<p>// wait until PLL is used as system clock source<br />
while(RCC_GetSYSCLKSource() != 0&#215;08) {}<br />
}<br />
}<br />
void power_management_stop_test(void)<br />
{<br />
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);</p>
<p>timer2_test();<br />
key_input_test_interrupt();</p>
<p>usart1_send_string(&#8220;\r\nEnter Stop mode.\r\n&#8221;);</p>
<p>// STOP 모드로 진입하고 외부 인터럽트에 의해서 깨어남<br />
PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI);</p>
<p>system_clock_config_stop();</p>
<p>usart1_send_string(&#8220;\r\nExit Stop mode.\r\n&#8221;);<br />
}</p>
</div>
<p>&nbsp;</p>
<p><span style="color: #ff6600"><strong>4.16 Power Management &#8211; StandBy</strong></span></p>
<p><strong><span style="color: #99cc00">(1) PWR_WakeUpPinCmd(ENABLE)를 호출, PA0를 Wakeup 핀으로 설정</span></strong></p>
<p><span style="color: #99cc00"><strong>(2) BTN2를 인터럽트 모드로 입력 받아서 Stop 모드를 빠져나오도록 설정</strong></span></p>
<p><span style="color: #99cc00"><strong>(3) PWR_EnterSTANDBYMode()를 호출, StandBy 모드로 진입</strong></span><br />
StandBy모드로 진입하는 방법은 STOP모드로 진입하는 방법에서 STM32의 PWR_CR 레지스터의 PDDS를 1로 설정하는것을 제외하면 동일합니다. 단지 StandBy모드에서는 Wakeup 하는 방법에서 차이가 있으면 StandBy모드에서 Wakeup을 한다는 것은 CPU가 처음부터 다시 부팅하는 절차와 동일합니다. 하지만 StandBy모드에서 Wakeup이 되는 경우에는 PWR_CSR 레지스터의 Standby Flag가 H/W 적으로 Set이 되어 있습니다.</p>
<p><span style="color: #99cc00"><strong>(4) Power Control Register</strong></span></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2013/08/20feajk-36.png" rel="lightbox[21271]"><img class="alignnone  wp-image-21184" alt="20feajk (36)" src="http://www.ntrexgo.com/wp-content/uploads/2013/08/20feajk-36-620x524.png" width="496" height="419" /></a></p>
<p><span style="color: #99cc00"><strong>(5) System Control Register</strong></span></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2013/08/20feajk-37.png" rel="lightbox[21271]"><img class="alignnone  wp-image-21185" alt="20feajk (37)" src="http://www.ntrexgo.com/wp-content/uploads/2013/08/20feajk-37-620x428.png" width="496" height="342" /></a></p>
<p><span style="color: #99cc00"><strong>(6) Enable Wakeup PIN</strong></span></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2013/08/20feajk-38.png" rel="lightbox[21271]"><img class="alignnone  wp-image-21186" alt="20feajk (38)" src="http://www.ntrexgo.com/wp-content/uploads/2013/08/20feajk-38-620x484.png" width="496" height="387" /></a><br />
StandBy모드에서 깨어나기 위해서 Wakeup핀을 Enable 합니다. 반드시 PA0 핀이 이용됩니다.</p>
<p><span style="color: #99cc00"><strong>(7) Power control/status register</strong></span></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2013/08/20feajk-39.png" rel="lightbox[21271]"><img class="alignnone  wp-image-21187" alt="20feajk (39)" src="http://www.ntrexgo.com/wp-content/uploads/2013/08/20feajk-39-620x418.png" width="496" height="334" /></a></p>
<p>※ StandbyMode에서 깨어났을 경우에 Hardware적으로 1로 설정됨</p>
<div class="symple-box gray none" style="text-align:left; width:100%;"> 
<p>예제 전체 코드</p>
<p>void power_management_standby_test(void)<br />
{<br />
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);</p>
<p>// Enable Wakeup Pin(should be PA0)<br />
PWR_WakeUpPinCmd(ENABLE);</p>
<p>usart1_send_string(&#8220;\r\nWakeup pin enabled.\r\n&#8221;);</p>
<p>usart1_send_string(&#8220;Enter Standby mode.\r\n&#8221;);</p>
<p>// Standby Mode<br />
PWR_EnterSTANDBYMode();</p>
<p>// 이 코드는 실행될수 없음<br />
usart1_send_string(&#8220;\r\nExit Standby mode.\r\n&#8221;);<br />
}</p>
</div>
<p>&nbsp;</p>
<p><span style="color: #ff6600"><strong>4.17 Mode Privilege</strong></span></p>
<p><span style="color: #99cc00"><strong>(1) Reset 이후의 Mode(Privilege or Unprivilege)와 어떤 Stack(Main Stack, Process Stack)을 사용하는지를 PC의 터미널에 표시합니다.</strong></span></p>
<p><span style="color: #99cc00"><strong>(2) Mode를 Unprivilege 모드로 전환합니다.</strong></span></p>
<p><strong><span style="color: #99cc00">(3) 모든 전환 이후에 Mode(Privilege or Unprivilege)와 어떤 Stack(Main Stack, Process Stack)을 사용하는지를 PC의 터미널에 표시합니다.</span></strong></p>
<p><span style="color: #99cc00"><strong>(4) SVC 명령어 “__ASM(&#8220;svc #1&#8243;)” 를 사용해서 SVC_Handler Exception을 발생시키고 SVC_Handler 핸들러 진입 여부를 터미널에 표시합니다.</strong></span></p>
<p><span style="color: #99cc00"><strong>(5) SVC 핸들러내에서 Mode를 Privilege 모드로 전환합니다.</strong></span></p>
<p><span style="color: #99cc00"><strong>(6) 모든 전환 이후에 Mode(Privilege or Unprivilege)와 어떤 Stack(Main Stack, Process Stack)을 사용하는지를 PC의 터미널에 표시합니다.</strong></span></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2013/08/20feajk-40.png" rel="lightbox[21271]"><img class="alignnone  wp-image-21188" alt="20feajk (40)" src="http://www.ntrexgo.com/wp-content/uploads/2013/08/20feajk-40-620x250.png" width="496" height="200" /></a></p>
<div class="symple-box gray none" style="text-align:left; width:100%;"> 
<p><strong>예제 전체 코드</strong></p>
<p>void SVC_Handler(void)<br />
{<br />
usart1_send_string(&#8220;\r\nSVC_Handler\r\n&#8221;);<br />
usart1_send_string(&#8220;Mode change to privilege\r\n&#8221;);<br />
__set_CONTROL(0&#215;0);<br />
}</p>
<p>void mode_privilege_test(void)<br />
{<br />
usart1_send_string(&#8220;\r\n\r\n&#8212;- mode privilege test start &#8212;-\r\n\r\n&#8221;);</p>
<p>// Mode<br />
if( (__get_CONTROL() &amp; 0&#215;1) == 0&#215;1 )<br />
usart1_send_string(&#8220;Mode = Unprivilege\r\n&#8221;);<br />
else if( (__get_CONTROL() &amp; 0&#215;1) == 0&#215;0 )<br />
usart1_send_string(&#8220;Mode = Privilege Mode\r\n&#8221;);</p>
<p>// Stack<br />
if( (__get_CONTROL() &amp; 0&#215;2) == 0&#215;0 )<br />
usart1_send_string(&#8220;Stack = MSP Stack\r\n&#8221;);<br />
else if( (__get_CONTROL() &amp; 0&#215;2) == 0&#215;1 )<br />
usart1_send_string(&#8220;Stack = PSP Stack\r\n&#8221;);</p>
<p>// mode change to unprivilege<br />
usart1_send_string(&#8220;Mode change to unprivilege\r\n&#8221;);<br />
__set_CONTROL(0&#215;1);</p>
<p>// Mode<br />
if( (__get_CONTROL() &amp; 0&#215;1) == 0&#215;1 )<br />
usart1_send_string(&#8220;Mode = Unprivilege\r\n&#8221;);<br />
else if( (__get_CONTROL() &amp; 0&#215;1) == 0&#215;0 )<br />
usart1_send_string(&#8220;Mode = Privilege Mode\r\n&#8221;);</p>
<p>// Stack<br />
if( (__get_CONTROL() &amp; 0&#215;2) == 0&#215;0 )<br />
usart1_send_string(&#8220;Stack = MSP Stack\r\n&#8221;);<br />
else if( (__get_CONTROL() &amp; 0&#215;2) == 0&#215;1 )<br />
usart1_send_string(&#8220;Stack = PSP Stack\r\n&#8221;);</p>
<p>__ASM(&#8220;svc #1&#8243;);</p>
<p>// Mode<br />
if( (__get_CONTROL() &amp; 0&#215;1) == 0&#215;1 )<br />
usart1_send_string(&#8220;Mode = Unprivilege\r\n&#8221;);<br />
else if( (__get_CONTROL() &amp; 0&#215;1) == 0&#215;0 )<br />
usart1_send_string(&#8220;Mode = Privilege Mode\r\n&#8221;);</p>
<p>// Stack<br />
if( (__get_CONTROL() &amp; 0&#215;2) == 0&#215;0 )<br />
usart1_send_string(&#8220;Stack = MSP Stack\r\n&#8221;);<br />
else if( (__get_CONTROL() &amp; 0&#215;2) == 0&#215;1 )<br />
usart1_send_string(&#8220;Stack = PSP Stack\r\n&#8221;);</p>
<p>usart1_send_string(&#8220;&#8212;- mode privilege test end &#8212;-\r\n\r\n&#8221;);<br />
}</p>
</div>
<p>여기까지 전통적인 ARM 프로세서인 ARM9의 구조를 시작으로 ARM9 Application을 거쳐 Cortex-M3 Architecture, Cortex-M3 Application의 모든 과정이 마무리되었습니다. 머리 속에 있는 내용을 글로 옮긴다는 것이 쉽지는 않았던 것 같습니다. Cortex-M3 Application part에서 기본적인 예제만 다룬 것이 아쉬움이 남네요. 기회가 된다면 STM32 Dragon 개발보드에 있는 모든 디바이스들을 제어해보는 연재를 다시 시작해볼까 합니다. 그리고 개발 환경도 GCC와 이클립스 환경으로 바꾸어 좀 더 사이즈가 크고 전문적인 S/W개발 방법에 대해서 공부해보도록 하겠습니다. 특히 SD메모리와 LCD를 이용해서 예쁜 GUI를 구성하는 부분에 대해서 집중적으로 준비해보도록 하겠습니다.</p>
<p>수고하셨습니다.</p>
<p>&nbsp;</p>
<p><span style="background-color: #3366ff;color: #ffffff">JK전자와 함께하는 ARM 완전정복 시즌1이 모두 마무리 되었습니다.</span><br />
<span style="background-color: #3366ff;color: #ffffff"> 약 6개월 뒤쯤 새롭게 시작될 시즌 2도 기대해주시기 바랍니다. </span><br />
<span style="background-color: #3366ff;color: #ffffff">아울러 컨텐츠를 제공해주신 JK전자 관계자분들께 다시 한번 감사의 말씀을 드립니다.</span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ntrexgo.com/archives/21271/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
