<?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; 우수상</title>
	<atom:link href="http://www.ntrexgo.com/archives/tag/%ec%9a%b0%ec%88%98%ec%83%81/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>[42호]실내 위치 인식용 마커의 무결성 검사 로봇</title>
		<link>http://www.ntrexgo.com/archives/33941</link>
		<comments>http://www.ntrexgo.com/archives/33941#comments</comments>
		<pubDate>Thu, 25 May 2017 00:00:43 +0000</pubDate>
		<dc:creator>디바이스마트 매거진</dc:creator>
				<category><![CDATA[디바이스마트 매거진]]></category>
		<category><![CDATA[특집]]></category>
		<category><![CDATA[42호]]></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=33941</guid>
		<description><![CDATA[디바이스마트 매거진 42호 &#124; 차륜 형태의 실내에서 주행 가능하고 QR 코드 마커를 인식해 로봇의 엔코더/센서를 이용한 위치와 비교하여 해당 위치에 설치된 QR 코드가 정상 상태인지를 확인하는 로봇을 개발하고자 한다.]]></description>
				<content:encoded><![CDATA[<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/05/2016-ictmain.png" rel="lightbox[33941]"><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;background-color: #000000;color: #ffffff"><strong>2016 ICT 융합 프로젝트 공모전 우수상</strong></span></p>
<p><span style="font-size: x-large"><strong>실내 위치 인식용 마커의 무결성 검사 로봇<br />
</strong></span></p>
<p style="text-align: right">글 | 한국과학기술원 김규광, 최덕규, 임휘준</p>
<p>&nbsp;</p>
<p><span style="color: #008000"><strong>심사평</strong></span></p>
<p><strong>뉴티씨 </strong>실내 위치 인식 등에 관한 여러가지 연구들이 그동안 많이 진척되었는데, 그 중 한가지 아이템에 집중하여 결과를 낸 부분이 인상적이다. 실제로 로봇을 제작하여, NFC와 QR 코드를 인식하고, 자신의 위치를 보정하는 등 현재 위치를 확인하고, 이를 통하여 로봇의 위치 인식으로 물류 시스템 등에서 사용할 수 있도록 하려고 노력한 점이 돋보인다. 다만, 실제 상황에서의 고려 사항인 안전, 전원문제, 기구적인 토크 문제, 거리 문제 등은 고려되지 않은 점이 아쉽다. 실질적인 연구로 이어질 수 있을 것 같아서 좋은 점수를 주었다.<br />
<strong></strong></p>
<p><strong>칩센</strong> 이미 구현된 기술에서 새로운 실용적인 아이디어를 도출했다, 실제 완성도를 조금만 더 높일 수 있고 마커를 활용한 물류 로봇들과 운용에서 문제를 없앨 수 있다면 상품화에 도전해도 될 만큼 좋은 아이디어 같다.<br />
<strong></strong></p>
<p><strong>위드로봇</strong> 이동 로봇의 자기 위치 추정 문제는 꽤 오랫동안 로봇공학자들이 풀려고 고생하고 있는 난제입니다. 해당 작품은 QR 코드와 RFID 및 엔코더를 누적한 DR로 제한된 환경 내에서 위치 추정 문제를 풀려고 시도한 작품입니다. 아쉬운 부분은 융합 알고리즘을 너무 단순화하여, 전체 시스템의 성능이 더 나은 결과를 낼 수 있음에도 불구하고 그만큼 나오지 않는 부분입니다. 그리고 부수적이긴 하지만 QR 코드는 코드 자체적으로 오염에 의한 손상 문제에 대해 값을 복원할 수 있는 오류 정정 코드를 삽입할 수 있는 기능이 있습니다. 이러한 부분도 같이 고려되면 완성도가 훨씬 높아질 것 같습니다. 실제 로봇을 만들어 아이디어를 확인하는 과정이 쉽지 않는데, 결과를 도출해 낸 점에 박수를 보냅니다.</p>
<p><span style="color: #008000"><strong>작품 개요</strong></span><br />
다양한 목적에 로봇을 적용하려는 시도가 늘어나고 있으며 실제로 물류 창고 등에서 로봇이 사용되기도 하는 등 실내 환경에서의 로봇의 임무 수행을 위한 위치 인식과 추정에 대한 관심이 증가하고 있다. 간단한 Monte Carlo Localization에서부터 레이저 스캐너, 카메라 등을 이용한 SLAM 기술, 전파 신호의 삼각 측량이나 fingerprinting을 이용한 위치 측위 등 다양한 기술이 개발되었으나 센서의 가격으로 인한 다수의 로봇 제작 비용의 증가, 전파 신호 측정값의 불안전성 등 여러 이유로 인해 일정 간격으로 마커를 부착하고 이를 로봇이 인식해 엔코더 정보 등과 조합 함으로서 위치를 인식하는 방식 또한 꾸준히 사용되어 왔다. 특히 마커 설치에 대한 미관상의 부담이 없으며 다수의 로봇을 안정적이고 효율적으로 운영해야 하는 물류 창고에 보통 적용되며 아마존 사의 KIVA 로봇의 경우 이러한 부착식 마커 시스템을 사용하는 대표적인 성공 사례이다. 하지만 이러한 부착식 마커의 경우 로봇 주행 및 기타 원인에 의한 물리적인 충격이나 먼지 등의 오염물질에 의해 손상될 수 있다. 대형 물류 창고의 경우 이러한 손상을 사람이 일일이 검사한다는 것은 쉬운 일이 아니며 발생할 경우 물류 체계에 비효율성을 불러올 수 있다. 본 프로젝트에서는 차륜 형태의 실내에서 주행 가능하고 QR 코드 마커를 인식해 로봇의 엔코더/센서를 이용한 위치와 비교하여 해당 위치에 설치된 QR 코드가 정상 상태인지를 확인하는 로봇을 개발하고자 한다. 또한 RFID/NFC 태그를 QR 코드와 같이 사용하여 QR 코드 손상 시에도 위치 인식을 도와줄 수 있는 시스템을 제안하고자 한다.</p>
<p><span style="color: #008000"><strong>작품 설명</strong></span><br />
<span style="color: #33cccc"><strong>주요 동작 및 특징</strong></span><br />
Differential Wheel 형태의 차량형 주행 로봇이며 실내 주행을 돕기 위해 Wi-Fi를 이용하여 카메라 영상과 엔코더, 나침반 센서의 데이터를 전송하며 웹기반 조종 인터페이스를 제공한다. 로봇에는 스마트폰이 장착되어 있어 이를 이용하여 QR 코드와 NFC 태그를 인식한다.</p>
<p><span style="color: #33cccc"><strong>전체 시스템 구성</strong></span><br />
로봇의 주 제어장치는 라즈베리파이 보드를 사용하였으며 센서와 하드웨어 인터페이스를 위해 아두이노 보드를 부착하였다. 로봇 프레임에 장착된 서보모터를 사용해 문턱 등의 장애물을 손쉽게 넘어갈 수 있으며 모터에 부착된 엔코더와 지자기 센서를 사용해 현재 위치를 계산한다. 지자기센서는 모터와 회로 등의 자기장에 영향을 받지 않도록 앞으로 길게 빼서 설치하였으며 제작 후에는 360도 회전시켜 heading 각을 계산하기 전 보정을 해 주었다. 아두이노는 센서 데이터를 모아 라즈베리파이 보드로 전달하며 모터 제어 명령이 내려올 경우 해당하는 모터를 움직인다. (그림 1.)</p>
<table style="width: 620px;border-color: #dbdbdb;border-width: 1px;border-style: solid" border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td><img class="alignnone size-full wp-image-33953 aligncenter" alt="42 ict 실내위치 (1)" src="http://www.ntrexgo.com/wp-content/uploads/2017/05/42-ict-실내위치-1.png" width="592" height="313" /></td>
</tr>
<tr>
<td style="text-align: center">그림 1</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<p>라즈베리파이에서는 시리얼 통신을 통해 아두이노와 통신하며 제어용 웹 서버를 구동한다. 통상적으로 블루투스나 RC 수신기를 이용한 1대 1통신을 사용하며 많은 DIY프로젝트에서는 안드로이드 어플리케이션을 조종 인터페이스로 사용하나 본 프로젝트에서는 web 인터페이스를 사용해보고자 하였다. Wi-Fi를 통해 연결하므로 영상 전송 등에 필요한 넓은 대역폭과 빠른 속도가 보장되며 소켓 핸들을 계속 관리해 줘야 하는 TCP/IP통신과는 다르게 비동기식 통신인 request 방식을 사용해 일시적인 연결 장애에도 더 강인한 특징이 있다. 또한 안드로이드에서만 구동 가능한 앱과는 달리 웹 브라우저가 구동 가능하고 같은 ip대역 내에만 들어 있으면 접속하는 장비의 기종에 상관 없이 사용이 가능하다는 장점을 갖고 있다. (그림 2.)</p>
<table style="width: 620px;border-color: #dbdbdb;border-width: 1px;border-style: solid" border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td><a href="http://www.ntrexgo.com/wp-content/uploads/2017/05/42-ict-실내위치-2.png" rel="lightbox[33941]"><img class="alignnone size-full wp-image-33955" alt="42 ict 실내위치 (2)" src="http://www.ntrexgo.com/wp-content/uploads/2017/05/42-ict-실내위치-2.png" width="592" height="335" /></a></td>
</tr>
<tr>
<td style="text-align: center">그림 2</td>
</tr>
</tbody>
</table>
<p>또한 jQuery Mobile을 사용하여 웹에서 폰의 앱과 비슷한 UI를 구현하였다. 조종 버튼을 누르거나 슬라이드가 움직이면 javascript 코드에 의해 POST request가 웹서버로 보내지며 서버는 수신받은 값을 아두이노로 보내 사용자의 요청에 맞춰 구동한다. (그림 3,4)</p>
<table style="width: 620px;border-color: #dbdbdb;border-width: 1px;border-style: solid" border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td style="text-align: center"><a href="http://www.ntrexgo.com/wp-content/uploads/2017/05/42-ict-실내위치-3.png" rel="lightbox[33941]"><img class="alignnone size-full wp-image-33957" alt="42 ict 실내위치 (3)" src="http://www.ntrexgo.com/wp-content/uploads/2017/05/42-ict-실내위치-3.png" width="265" height="334" /></a></td>
</tr>
<tr>
<td style="text-align: center">그림 3</td>
</tr>
</tbody>
</table>
<table style="width: 620px;border-color: #dbdbdb;border-width: 1px;border-style: solid" border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td><a href="http://www.ntrexgo.com/wp-content/uploads/2017/05/42-ict-실내위치-4.png" rel="lightbox[33941]"><img class="alignnone size-full wp-image-33959" alt="42 ict 실내위치 (4)" src="http://www.ntrexgo.com/wp-content/uploads/2017/05/42-ict-실내위치-4.png" width="572" height="334" /></a></td>
</tr>
<tr>
<td style="text-align: center">그림 4</td>
</tr>
</tbody>
</table>
<p>통상의 리니어 5V 출력 레귤레이터로는 라즈베리파이와 서보, 구동용 모터 등에 전력을 공급하기 힘들어 직접 전원 모듈을 제작하였다. 주 전력인 DC 5V는 스위칭 레귤레이터를 사용하여 큰 발열 없이 수 암페어 단위의 출력을 낼 수 있도록 하였으며 코일이나 커패시터 등의 회로 소자도 해당 전류를 견딜 수 있는 소자를 사용하였다. 지자기센서에 사용되는 3.3V는 많은 전력을 소비하지 않아 회로 단순화를 위해 리니어 레귤레이터를 사용하였다. 11.1V 리튬 폴리머 배터리를 사용하여 시스템 구동에 필요한 충분한 전력을 넣어주었다. (그림 5.)</p>
<table style="width: 620px;border-color: #dbdbdb;border-width: 1px;border-style: solid" border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td><a href="http://www.ntrexgo.com/wp-content/uploads/2017/05/42-ict-실내위치-5.png" rel="lightbox[33941]"><img class="alignnone size-full wp-image-33961" alt="42 ict 실내위치 (5)" src="http://www.ntrexgo.com/wp-content/uploads/2017/05/42-ict-실내위치-5.png" width="578" height="268" /></a></td>
</tr>
<tr>
<td style="text-align: center">그림 5</td>
</tr>
</tbody>
</table>
<p>안드로이드 스마트폰을 부착시키기 위해 홀더를 직접 설계하였으며 QR 코드를 읽을 적절한 초점거리를 벌리면서도 NFC 태그를 읽을 수 있는 거리를 맞추기 위해 높이 조절이 가능하도록 3D 프린터의 히트베드 위치를 조절하는데 쓰이는 것과 같은 구조의 스프링과 나사를 같이 사용하였다. 설계한 홀더는 3D 프린터를 사용하여 제작하였으며 로봇에 부착하였다. (그림 6, 7) QR 코드와 NFC 태그를 읽을 수 있는 앱 또한 개발하였다 (그림 8).</p>
<p>&nbsp;</p>
<table style="width: 620px;border-color: #dbdbdb;border-width: 1px;border-style: solid" border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td><a href="http://www.ntrexgo.com/wp-content/uploads/2017/05/42-ict-실내위치-1.jpg" rel="lightbox[33941]"><img class="alignnone size-full wp-image-33952" alt="42 ict 실내위치 (1)" src="http://www.ntrexgo.com/wp-content/uploads/2017/05/42-ict-실내위치-1.jpg" width="574" height="321" /></a></td>
</tr>
<tr>
<td style="text-align: center">그림 6</td>
</tr>
</tbody>
</table>
<table style="width: 620px;border-color: #dbdbdb;border-width: 1px;border-style: solid" border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td><a href="http://www.ntrexgo.com/wp-content/uploads/2017/05/42-ict-실내위치-2.jpg" rel="lightbox[33941]"><img class="alignnone size-full wp-image-33954" alt="42 ict 실내위치 (2)" src="http://www.ntrexgo.com/wp-content/uploads/2017/05/42-ict-실내위치-2.jpg" width="571" height="319" /></a></td>
</tr>
<tr>
<td style="text-align: center">그림 7</td>
</tr>
</tbody>
</table>
<table style="width: 620px;border-color: #dbdbdb;border-width: 1px;border-style: solid" border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td><a href="http://www.ntrexgo.com/wp-content/uploads/2017/05/42-ict-실내위치-3.jpg" rel="lightbox[33941]"><img class="alignnone size-full wp-image-33956" alt="42 ict 실내위치 (3)" src="http://www.ntrexgo.com/wp-content/uploads/2017/05/42-ict-실내위치-3.jpg" width="568" height="300" /></a></td>
</tr>
<tr>
<td style="text-align: center">그림 8</td>
</tr>
</tbody>
</table>
<p>위치 인식은 엔코더 데이터와 지자기센서를 사용하여 진행하였으며 QR 코드에 비해 손상되기가 힘들고 인식이 편리한 NFC 태그를 우선하여 위치 보정을 하였다. NFC 태그에는 QR 코드를 부착하였으며 QR 코드와 동일한 데이터를 NFC 태그에 입력하였다. (그림 9)</p>
<table style="width: 620px;border-color: #dbdbdb;border-width: 1px;border-style: solid" border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td style="text-align: center"><a href="http://www.ntrexgo.com/wp-content/uploads/2017/05/42-ict-실내위치-6.png" rel="lightbox[33941]"><img class="alignnone size-full wp-image-33962" alt="42 ict 실내위치 (6)" src="http://www.ntrexgo.com/wp-content/uploads/2017/05/42-ict-실내위치-6.png" width="592" height="198" /></a></td>
</tr>
<tr>
<td style="text-align: center">그림 9</td>
</tr>
</tbody>
</table>
<p>꺾어진 모양의 주행 코스를 선정하고 가운데 점과 양 꼭지점에 태그를 붙여 총 9장의 태그를 설치하였다. (그림 10)</p>
<table style="width: 620px;border-color: #dbdbdb;border-width: 1px;border-style: solid" border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td style="text-align: center"><a href="http://www.ntrexgo.com/wp-content/uploads/2017/05/42-ict-실내위치-4.jpg" rel="lightbox[33941]"><img class="alignnone size-full wp-image-33958" alt="42 ict 실내위치 (4)" src="http://www.ntrexgo.com/wp-content/uploads/2017/05/42-ict-실내위치-4.jpg" width="592" height="324" /></a></td>
</tr>
<tr>
<td style="text-align: center">그림 10</td>
</tr>
</tbody>
</table>
<p>주행 코스를 따라 로봇을 조종하여 이동하였으며 NFC 태그 인식 데이터와 모터 입력값, 엔코더 제어값을 모두 저장하여 off line 분석에 사용하였다. 위치 보정에는 EKF SLAM, RFID SLAM 등의 사용을 고려했으나 SLAM 특유의 연산량과 marker의 위치를 모두 연산에 포함해야 하는 문제점(EKF SLAM의 경우) 등이 있어 좀 더 간단한 방식으로 보정계산을 진행하였다. NFC 태그가 인식될 경우 로봇의 현재 좌표를 기존의 이동 궤적을 모두 무시하고 NFC 태그 정중앙으로 이동시켜 엔코더를 사용함으로써 생기는 문제 중 하나인 오차 누적에 의한 drift를 해결하고자 하였다. 아래 그림의 differential wheel 로봇 모델을 사용하여 odometry를 우선적으로 계산하였다. (그림 11)</p>
<p>&nbsp;</p>
<table style="width: 620px;border-color: #dbdbdb;border-width: 1px;border-style: solid" border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td><a href="http://www.ntrexgo.com/wp-content/uploads/2017/05/42-ict-실내위치-7.png" rel="lightbox[33941]"><img class="alignnone size-full wp-image-33963" alt="42 ict 실내위치 (7)" src="http://www.ntrexgo.com/wp-content/uploads/2017/05/42-ict-실내위치-7.png" width="592" height="205" /></a></td>
</tr>
<tr>
<td><a href="http://www.ntrexgo.com/wp-content/uploads/2017/05/42-ict-실내위치-8.png" rel="lightbox[33941]"><img class="alignnone size-full wp-image-33964" alt="42 ict 실내위치 (8)" src="http://www.ntrexgo.com/wp-content/uploads/2017/05/42-ict-실내위치-8.png" width="592" height="366" /></a></td>
</tr>
<tr>
<td style="text-align: center">그림 11</td>
</tr>
</tbody>
</table>
<p>로봇이 바라보는 방향(Heading)의 경우 엔코더를 사용하지 않고 지자기센서를 사용한 자북극 기준 heading 방향을 사용하였다. 실제 이동한 위치를 좌표평면으로 표현하여 의도된 주행 궤적대로 위치 추정 결과가 나오는지를 확인하였다. 수집된 데이터는 Python 언어와 matplotlib 라이브러리를 사용하여 그림 12에 시각화하였다.</p>
<table style="width: 620px;border-color: #dbdbdb;border-width: 1px;border-style: solid" border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td><a href="http://www.ntrexgo.com/wp-content/uploads/2017/05/42-ict-실내위치-9.png" rel="lightbox[33941]"><img class="alignnone size-full wp-image-33965" alt="42 ict 실내위치 (9)" src="http://www.ntrexgo.com/wp-content/uploads/2017/05/42-ict-실내위치-9.png" width="578" height="328" /></a></td>
</tr>
<tr>
<td style="text-align: center">그림 12</td>
</tr>
</tbody>
</table>
<p>파란 선이 Ground Truth, 노란 점이 NFC 태그의 위치이며 녹색 선이 엔코더로만 계산한 궤적, 붉은 선이 NFC 태그를 이용해 보정한 이동 궤적이다. 엔코더만 사용하여 이동 궤적을 계산한 경우 엔코더의 drift 오차, 좌우 엔코더의 인식률 차이, 나침반의 heading 오류 등에 의해 한번의 이동 궤적 오류가 전체적인 이동 궤적에 누적된 오차를 주는 drift 를 볼 수 있다. 반면 NFC 태그를 이용하여 NFC 태그를 밟은 경우 바로 위치를 NFC 인식 지점으로 옮겨버리는 경우 이러한 기존의 오차의 영향을 받지 않고 ground truth에 맞는 위치로 옮겨감으로서 위치가 보정되는 것을 볼 수 있다. 정확한 위치를 알아 냄으로서 QR 코드/NFC 태그의 위치 또한 알 수 있고 이를 이용하여 QR 코드나 NFC 태그가 손상되더라도 상호 검증을 통해 손상된 marker를 알려줄 수 있다.</p>
<p>본 프로젝트에서는 로봇의 실내 위치 인식에 사용되는 로봇의 marker의 정상 여부를 검증하기 위해 QR 코드(혹은 apriltag 등의 visual 마커) 와 NFC/RFID 태그를 동시에 사용하여 한 쪽이 손상되더라도 다른 마커를 사용하여 오류를 검사하는 방식을 제안하였으며 이 임무를 수행할 수 있는 로봇을 제작하였다. 제작된 로봇은 엔코더와 나침반을 사용해 자신의 이동 위치를 알 수 있으며 안드로이드 폰을 사용하여 NFC와 QR 코드를 인식할 수 있다. 마커 인식을 통해 자신의 위치를 보정할 수 있으며 이를 이용해 “다른 마커가 인식되어야 할 자리에 QR코드/NFC 중 하나만 인식되거나 둘 다 인식되지 않는 경우 이를 사용자에게 알려 줌으로서 대형 물류창고 등에서 로봇의 위치인식을 이용한 process가 원할하게 구동되도록 도와줄 수 있을 것이라 기대된다.<br />
또한 실내 위치 인식의 정확도를 올리기 위해 Wi-Fi, Zigbee 등의 무선 비콘 및 여러 방식이 사용되고 fingerprinting 방식 등 모든 구역에서의 전파 신호 세기를 수집하여 기계학습을 이용해 실내 위치를 인식하려는 시도 또한 사용되고 있다. 이때 사람이 직접 이러한 신호를 수집하는 것은 매우 불편하며 이미 QR코드 등의 기존 마커가 사용될 경우 이 로봇을 이용하여 각 위치 별 전파 신호 수집 등을 수월하게 진행하는 등의 추가적인 활용 또한 기대된다.</p>
<p><span style="color: #008000"><strong>개발 환경</strong></span><br />
아두이노와 아두이노 IDE를 사용하였으며 라즈베리파이 보드에 전용 Debian 리눅스를 올려 사용하였으며 vim 에디터 개발 환경에서 python을 사용하여 프로그램하였다. 인터페이스 웹서버는 python의 BaseHTTPServer 모듈을 사용하여 구동하였으며 HTML과 jQuery Mobile을 사용하여 웹 인터페이스를 제작하였다. 영상 전송에는 OpenCV를 사용하였다.</p>
<p><strong><span style="color: #008000">기타 (회로도/소스코드)</span></strong><br />
<span style="color: #33cccc"><strong>아두이노 소스코드</strong></span></p>
<div class="symple-box gray none" style="text-align:left; width:100%;"> 
<p>#include &lt;Servo.h&gt;<br />
#include &lt;Wire.h&gt;<br />
#include &lt;HMC5883L.h&gt;<br />
#include &lt;string.h&gt;<br />
#define MAX_LEN 30<br />
char cmd_array[MAX_LEN];<br />
Servo servo_arm;<br />
HMC5883L compass;<br />
int error = 0;<br />
int rignt_motor_A = 10;<br />
int rignt_motor_B = 11;<br />
int rignt_motor_power = 6;<br />
volatile int right_wheel_count = 0;<br />
int left_motor_A = 7;<br />
int left_motor_B = 8;<br />
int left_motor_power = 5;<br />
volatile int left_wheel_count = 0;<br />
int servo_arm_port = 9;<br />
void setup()<br />
{<br />
Serial.begin(9600);<br />
Wire.begin();</p>
<p>compass = HMC5883L();<br />
error = compass.SetScale(1.3); //Set compass scale<br />
if(error != 0) { Serial.println(&#8220;Compass ERR 1&#8243;);}<br />
error = compass.SetMeasurementMode(Measurement_Continuous); //Set cont. measure mode<br />
if(error != 0) { Serial.println(&#8220;Compass ERR 2&#8243;);}</p>
<p>attachInterrupt(0, right_wheel_encoder, CHANGE); // Right Wheel Encoder<br />
attachInterrupt(1, left_wheel_encoder, CHANGE); // Left Wheel Encoder</p>
<p>servo_arm.attach(servo_arm_port);<br />
servo_arm.write(140); //180 (max down) 140 (midpoint) 0(original)</p>
<p>pinMode(rignt_motor_A,OUTPUT);<br />
pinMode(rignt_motor_B,OUTPUT);<br />
pinMode(rignt_motor_power,OUTPUT);</p>
<p>pinMode(left_motor_A,OUTPUT);<br />
pinMode(left_motor_B,OUTPUT);<br />
pinMode(left_motor_power,OUTPUT);<br />
}<br />
void set_servo_angle(int angle)<br />
{<br />
servo_arm.write(angle);<br />
delay(15);<br />
}<br />
void set_motor_value(int right_dir, int left_dir, int right_speed, int left_speed, int delay_time)<br />
{</p>
<p>if(right_dir == 1) //front<br />
{<br />
digitalWrite(rignt_motor_A,HIGH);<br />
digitalWrite(rignt_motor_B,LOW);<br />
}<br />
if(right_dir == 0) //back<br />
{<br />
digitalWrite(rignt_motor_A,LOW);<br />
digitalWrite(rignt_motor_B,HIGH);<br />
}</p>
<p>if(left_dir == 1) //front<br />
{<br />
digitalWrite(left_motor_A,HIGH);<br />
digitalWrite(left_motor_B,LOW);<br />
}<br />
if(left_dir == 0) //back<br />
{<br />
digitalWrite(left_motor_A,LOW);<br />
digitalWrite(left_motor_B,HIGH);<br />
}</p>
<p>analogWrite(rignt_motor_power,right_speed);<br />
analogWrite(left_motor_power,left_speed);</p>
<p>delay(delay_time);</p>
<p>digitalWrite(rignt_motor_power,0);<br />
digitalWrite(left_motor_power,0);<br />
}<br />
float read_compass()<br />
{<br />
MagnetometerScaled scaled = compass.ReadScaledAxis();<br />
int MilliGauss_OnThe_XAxis = scaled.XAxis;<br />
float heading = atan2(scaled.YAxis+136, scaled.XAxis+40);<br />
//float declinationAngle = 0.0457;<br />
//heading += declinationAngle;</p>
<p>if(heading &lt; 0) {heading += 2*PI;}<br />
if(heading &gt; 2*PI) {heading -= 2*PI;}</p>
<p>float deg_heading = ((heading * 180)/PI)-9;<br />
if(deg_heading &lt; 0) {deg_heading += 360;}</p>
<p>return deg_heading;<br />
}<br />
void right_wheel_encoder() {right_wheel_count++;}<br />
void left_wheel_encoder() {left_wheel_count++;}<br />
void send_all_sensor_val()<br />
{<br />
float heading = read_compass();</p>
<p>Serial.print(&#8220;r,&#8221;);<br />
Serial.print(heading);<br />
Serial.print(&#8220;,&#8221;);<br />
Serial.print(right_wheel_count);<br />
Serial.print(&#8220;,&#8221;);<br />
Serial.print(left_wheel_count);<br />
Serial.print(&#8220;,&#8221;);</p>
<p>MagnetometerRaw raw = compass.ReadRawAxis();<br />
Serial.print(raw.XAxis);<br />
Serial.print(&#8220;,&#8221;);<br />
Serial.print(raw.YAxis);<br />
Serial.print(&#8220;,&#8221;);<br />
Serial.print(raw.ZAxis);<br />
Serial.print(&#8220;,&#8221;);</p>
<p>Serial.println(&#8220;&#8221;);<br />
right_wheel_count = 0;<br />
left_wheel_count = 0;<br />
}<br />
void loop()<br />
{<br />
if(Serial.available()&gt;0)<br />
{<br />
String cmd = Serial.readStringUntil(&#8216;\n&#8217;);<br />
//s,servo_angle,\n &lt;- servo cmd<br />
//s,140,\n<br />
//m,right_fb,left_fb,right_pw,left_pw,time,\n &lt;- move cmd<br />
//m,1,0,125,125,500,\n<br />
//r,0\n &lt;- request cmd<br />
char *ptr;<br />
cmd.toCharArray(cmd_array,MAX_LEN);</p>
<p>char * header = strtok(cmd_array, &#8220;,&#8221;);<br />
if(strcmp(header,&#8221;s&#8221;) == 0) //data request<br />
{<br />
int servo_val = atoi(strtok(NULL, &#8220;,&#8221;));<br />
set_servo_angle(servo_val);<br />
}<br />
if(strcmp(header,&#8221;m&#8221;) == 0) //move command<br />
{</p>
<p>int right_direction = atoi(strtok(NULL, &#8220;,&#8221;));<br />
int left_direction = atoi(strtok(NULL, &#8220;,&#8221;));<br />
int right_power = atoi(strtok(NULL, &#8220;,&#8221;));<br />
int left_power = atoi(strtok(NULL, &#8220;,&#8221;));<br />
int power_time = atoi(strtok(NULL, &#8220;,&#8221;));</p>
<p>set_motor_value(right_direction, left_direction, right_power, left_power, power_time);<br />
}</p>
<p>if(strcmp(header,&#8221;r&#8221;) == 0) //data request<br />
{<br />
send_all_sensor_val();<br />
}<br />
}<br />
delay(200);<br />
}<br />
</div>
<span style="color: #33cccc"><strong>웹서버 코드</strong></span></p>
<div class="symple-box gray none" style="text-align:left; width:100%;"> 
<p>#!/usr/bin/python<br />
import BaseHTTPServer<br />
import SimpleHTTPServer<br />
import SocketServer<br />
import json<br />
import serial<br />
STOP_CODE = 0<br />
HEADING = 0<br />
L_ENCODER = 0<br />
R_ENCODER = 0<br />
#com = serial.Serial(&#8220;/dev/ttyACM0&#8243;)<br />
com = serial.Serial(&#8220;COM11&#8243;)<br />
#LOG_FILE = open(&#8220;rover_log.txt&#8221;,&#8217;w')<br />
class ThreadServer(SocketServer.ThreadingMixIn, BaseHTTPServer.HTTPServer):<br />
pass<br />
#<br />
class MyRequestHandler(SimpleHTTPServer.SimpleHTTPRequestHandler):<br />
def do_GET(self):<br />
return SimpleHTTPServer.SimpleHTTPRequestHandler.do_GET(self)<br />
#<br />
def do_POST(self):<br />
global STOP_CODE<br />
global HEADING<br />
global L_ENCODER<br />
global R_ENCODER<br />
global LOG_FILE</p>
<p>length = int(self.headers.getheader(&#8216;content-length&#8217;))<br />
var = self.rfile.read(length) #code=f&amp;data=125&amp;delay=500, code=s&amp;data=57<br />
packet = var.split(&#8220;&amp;&#8221;)<br />
cmd = packet[0].split(&#8220;=&#8221;)[1]
<p>if cmd == &#8220;f&#8221;: #Front<br />
header = &#8220;m,&#8221;<br />
right_dir = &#8220;1,&#8221;<br />
left_dir = &#8220;1,&#8221;<br />
right_pw = packet[1].split(&#8220;=&#8221;)[1]
left_pw = packet[1].split(&#8220;=&#8221;)[1]
time_delay = packet[2].split(&#8220;=&#8221;)[1]
ser_cmd = header + right_dir + left_dir + right_pw + &#8220;,&#8221; + left_pw + &#8220;,&#8221; + time_delay + &#8220;,\n&#8221;<br />
print ser_cmd<br />
com.write(ser_cmd)<br />
#&#8221;"&#8221;<br />
com.write(&#8216;r,0\n&#8217;)<br />
raw_sensor_str = com.readline() #r,heading,rencoder,lencoder,mag_x,mag_y,mag_z,\n<br />
#&#8221;"&#8221;<br />
sensor_data = raw_sensor_str.split(&#8220;,&#8221;)<br />
HEADING = sensor_data[1]
L_ENCODER = sensor_data[3]
R_ENCODER = sensor_data[2]
#LOG_FILE.write(ser_cmd)<br />
#LOG_FILE.write(raw_sensor_str)</p>
<p>if cmd == &#8220;b&#8221;: #Back<br />
header = &#8220;m,&#8221;<br />
right_dir = &#8220;0,&#8221;<br />
left_dir = &#8220;0,&#8221;<br />
right_pw = packet[1].split(&#8220;=&#8221;)[1]
left_pw = packet[1].split(&#8220;=&#8221;)[1]
time_delay = packet[2].split(&#8220;=&#8221;)[1]
ser_cmd = header + right_dir + left_dir + right_pw + &#8220;,&#8221; + left_pw + &#8220;,&#8221; + time_delay + &#8220;,\n&#8221;<br />
print ser_cmd<br />
com.write(ser_cmd)<br />
#&#8221;"&#8221;<br />
com.write(&#8216;r,0\n&#8217;)<br />
raw_sensor_str = com.readline() #r,heading,rencoder,lencoder,mag_x,mag_y,mag_z,\n<br />
#&#8221;"&#8221;<br />
sensor_data = raw_sensor_str.split(&#8220;,&#8221;)<br />
HEADING = sensor_data[1]
L_ENCODER = sensor_data[3]
R_ENCODER = sensor_data[2]
#LOG_FILE.write(ser_cmd)<br />
#LOG_FILE.write(raw_sensor_str)<br />
if cmd == &#8220;r&#8221;: #Right<br />
header = &#8220;m,&#8221;<br />
right_dir = &#8220;0,&#8221;<br />
left_dir = &#8220;1,&#8221;<br />
right_pw = packet[1].split(&#8220;=&#8221;)[1]
left_pw = packet[1].split(&#8220;=&#8221;)[1]
time_delay = packet[2].split(&#8220;=&#8221;)[1]
ser_cmd = header + right_dir + left_dir + right_pw + &#8220;,&#8221; + left_pw + &#8220;,&#8221; + time_delay + &#8220;,\n&#8221;<br />
print ser_cmd<br />
com.write(ser_cmd)<br />
#&#8221;"&#8221;<br />
com.write(&#8216;r,0\n&#8217;)<br />
raw_sensor_str = com.readline() #r,heading,rencoder,lencoder,mag_x,mag_y,mag_z,\n<br />
#&#8221;"&#8221;<br />
sensor_data = raw_sensor_str.split(&#8220;,&#8221;)<br />
HEADING = sensor_data[1]
L_ENCODER = sensor_data[3]
R_ENCODER = sensor_data[2]
#LOG_FILE.write(ser_cmd)<br />
#LOG_FILE.write(raw_sensor_str)<br />
if cmd == &#8220;l&#8221;: #Left<br />
header = &#8220;m,&#8221;<br />
right_dir = &#8220;1,&#8221;<br />
left_dir = &#8220;0,&#8221;<br />
right_pw = packet[1].split(&#8220;=&#8221;)[1]
left_pw = packet[1].split(&#8220;=&#8221;)[1]
time_delay = packet[2].split(&#8220;=&#8221;)[1]
ser_cmd = header + right_dir + left_dir + right_pw + &#8220;,&#8221; + left_pw + &#8220;,&#8221; + time_delay + &#8220;,\n&#8221;<br />
print ser_cmd<br />
com.write(ser_cmd)<br />
#&#8221;"&#8221;<br />
com.write(&#8216;r,0\n&#8217;)<br />
raw_sensor_str = com.readline() #r,heading,rencoder,lencoder,mag_x,mag_y,mag_z,\n<br />
#&#8221;"&#8221;<br />
sensor_data = raw_sensor_str.split(&#8220;,&#8221;)<br />
HEADING = sensor_data[1]
L_ENCODER = sensor_data[3]
R_ENCODER = sensor_data[2]
#LOG_FILE.write(ser_cmd)<br />
#LOG_FILE.write(raw_sensor_str)<br />
if cmd == &#8220;s&#8221;: #Servo<br />
servo_angle = packet[1].split(&#8220;=&#8221;)[1]
header = &#8220;s,&#8221;<br />
ser_cmd = header + servo_angle + &#8220;,\n&#8221;<br />
print ser_cmd<br />
com.write(ser_cmd)<br />
sensor_data_dict = {&#8216;heading&#8217;:HEADING,&#8217;l_encoder&#8217;:L_ENCODER,&#8217;r_encoder&#8217;:R_ENCODER}</p>
<p>self.send_response(200)<br />
self.send_header(&#8220;Content-type&#8221;, &#8220;text/html&#8221;)<br />
self.end_headers()<br />
self.wfile.write(json.dumps(sensor_data_dict))<br />
#<br />
#<br />
if __name__ == &#8220;__main__&#8221;:<br />
Handler = MyRequestHandler<br />
server = ThreadServer((&#8217;0.0.0.0&#8242;,8080), Handler)</p>
<p>while not STOP_CODE == 1:<br />
server.handle_request()<br />
#LOG_FILE.close()<br />
server.server_close()<br />
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.ntrexgo.com/archives/33941/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[42호]실시간 자세교정 도우미</title>
		<link>http://www.ntrexgo.com/archives/33946</link>
		<comments>http://www.ntrexgo.com/archives/33946#comments</comments>
		<pubDate>Thu, 25 May 2017 00:00:32 +0000</pubDate>
		<dc:creator>디바이스마트 매거진</dc:creator>
				<category><![CDATA[디바이스마트 매거진]]></category>
		<category><![CDATA[특집]]></category>
		<category><![CDATA[42호]]></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=33946</guid>
		<description><![CDATA[
2016 ICT 융합 프로젝트 공모전 우수상
실시간 자세교정 도우미
&#160;
&#160;
글 &#124; 성균관대학교 구기원, 명지대학교 하진수, 한양대학교 이기범
&#160;
심사평
JK전자 의자에 앉아 있는 시간이 점점 많아지는 현대사회에서 앞으로 꼭 필요한 작품이네요. 특히나 모바일 디바이스가 많아지면서 업무시간 뿐만이 아니라 이동중에도 모바일 디바이스를 이용하게 됨으로써 예전보다 훨씬 많은 시간을 좋지 못한 자세를 유지하게 되면서 여러가지 관절 관련 질환이 늘어나고 있습니다. 상용화가 된다면 대단히 인기가 좋을것 같네요.

뉴티씨 자세는 오랜기간 만들어지는 것으로, 몸의 형상과 균형을 좌우하여 개인의 장기적인 건강에 치명적으로 관여하게 된다. 사람의 자세를 PC에 집어 넣어서 유니티를 통하여 가상인물로 구현한 점은 매우 높은 점수를 주었다. 하지만, 실제로 자세를 교정하는 기기와 연결하여, 자세교정용 건강기기로 거듭난다면 더 좋은 작품이 되었을...]]></description>
				<content:encoded><![CDATA[<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/05/2016-ictmain.png" rel="lightbox[33946]"><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;background-color: #000000;color: #ffffff"><strong>2016 ICT 융합 프로젝트 공모전 우수상</strong></span></p>
<p><span style="font-size: xx-large"><strong>실시간 자세교정 도우미</strong></span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p style="text-align: right"><strong>글 | 성균관대학교 구기원, 명지대학교 하진수, 한양대학교 이기범</strong></p>
<p>&nbsp;</p>
<p><span style="color: #008000"><strong>심사평</strong></span></p>
<p><strong>JK전자</strong> 의자에 앉아 있는 시간이 점점 많아지는 현대사회에서 앞으로 꼭 필요한 작품이네요. 특히나 모바일 디바이스가 많아지면서 업무시간 뿐만이 아니라 이동중에도 모바일 디바이스를 이용하게 됨으로써 예전보다 훨씬 많은 시간을 좋지 못한 자세를 유지하게 되면서 여러가지 관절 관련 질환이 늘어나고 있습니다. 상용화가 된다면 대단히 인기가 좋을것 같네요.<br />
<strong></strong></p>
<p><strong>뉴티씨 </strong>자세는 오랜기간 만들어지는 것으로, 몸의 형상과 균형을 좌우하여 개인의 장기적인 건강에 치명적으로 관여하게 된다. 사람의 자세를 PC에 집어 넣어서 유니티를 통하여 가상인물로 구현한 점은 매우 높은 점수를 주었다. 하지만, 실제로 자세를 교정하는 기기와 연결하여, 자세교정용 건강기기로 거듭난다면 더 좋은 작품이 되었을 것 같다. 허리가 구부정한 경우가 많아 컴퓨터 등의 부작용이 있는데, 이를 이 작품이 진화한 컴퓨터 교정기를 통하여 간단히 훈련받을 수 있다면 좋을 것 같아 아쉽고, 앞으로 기대도 된다.<br />
<strong></strong></p>
<p><strong>칩센</strong> 거북목 예방하는 센서로 아이디어가 좋다. 재미있는 발상이고 개발과정이다.<br />
<strong></strong></p>
<p><strong>위드로봇</strong> 작품의 완성도가 무척 높습니다. 단순한 측정을 넘어서 분석, 평가를 통해 사용자에게 피드백을 줄 수 있도록 만든 부분이 훌륭합니다. 보고서의 완성도도 뛰어나며, 상품성이 충분한 수준까지 제작한 것으로 보입니다.</p>
<p><span style="color: #008000"><strong>개요</strong></span></p>
<p><span style="color: #99cc00"><strong>작품 개요</strong></span><br />
우리 작품은 자세교정을 목적으로 만든 웨어러블이다. 자세교정의 원리는 스포츠 웨어의 등과 허리 부분에 각도 측정 센서를 부착한다. 두 각도 센서의 측정된 각도 값 차이가 오차 범위를 넘어가면 신호를 주어 사용자 스스로 자세를 바로할 수 있도록 설계했다. 기존 자세교정 제품과는 달리 이동성, 정확성, 편리성을 갖춘 제품이다. 또한 핸드폰 앱을 통해 자신의 자세를 실시간으로 확인할 수 있도록 했다.</p>
<p><span style="color: #99cc00"><strong>목적</strong></span><br />
작품의 주목적은 바른 자세를 습관화하여 허리·목 디스크를 예방하는 것이다. 책상에 앉아 있는 시간이 많아 발생하는 허리·목 디스크를 예방함으로써 그로 인한 합병증을 예방하고 경제적 이득도 기대할 수 있을 것이다. 우리는 디스크 예방을 넘어 ‘원격 진료’, ‘개인 운동 활용’, ‘과학적 훈련기법 활용’까지도 기대한다.</p>
<p><span style="color: #008000"><strong>작품 설명</strong></span></p>
<p><span style="color: #99cc00"><strong>Software 구성</strong></span><br />
· AVR : avr studio를 통해 코딩가능하며 웨어러블 디바이스로부터 각도 값을 받아서 용도에 맞게 계산한다.<br />
· Android : AVR에서 전송된 데이터를 소팅 후 Unity로 데이터를 넘겨준다.<br />
· Unity : Android에서 전송된 데이터를 소팅한다.<br />
· SQLite : AVR에서 전송된 데이터들을 데이터베이스에 입력하고 원하는 형태로 출력한다.</p>
<p><span style="color: #99cc00"><strong>Software 흐름도 및 클래스 다이어그램</strong></span></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2017/05/42-ict-실시간-자세교정-1.png" rel="lightbox[33946]"><img class="alignnone size-full wp-image-34000" alt="42 ict 실시간 자세교정 (1)" src="http://www.ntrexgo.com/wp-content/uploads/2017/05/42-ict-실시간-자세교정-1.png" width="620" height="307" /></a></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2017/05/42-ict-실시간-자세교정-2.png" rel="lightbox[33946]"><img class="alignnone size-full wp-image-33969" alt="42 ict 실시간 자세교정 (2)" src="http://www.ntrexgo.com/wp-content/uploads/2017/05/42-ict-실시간-자세교정-2.png" width="620" height="579" /></a></p>
<p>본 시스템의 시스템구성도(도면1)에 따르면 무선센서에서 보내지는 센서 값을 AVR부로 송신하고 이를 본체에 달린 시스템의 연산에 의해 정제해 Android부로 송신 후, Unity3D부 내부 엔진을 이용하여 3D모델을 움직이고 이를 디스플레이부에 표시한다. 또한 정제된 값을 SQLite 테이블에 입력하고 이를 통해 입력 값들의 통계적인 결과를 디스플레이부에 출력해준다. 본 시스템의 자세한 플로우차트는 첨부된 도면2와 같으며, 시스템 전반에 대한 실제 움직임을 표현하고 있다.</p>
<p><span style="color: #99cc00"><strong>Software 기능</strong></span><br />
· AVR : 3개의 센서로부터 roll, pitch, yaw값을 받는다. 통신은 적외선 통신으로 이뤄지며 초당 5~15개의 값을 받는다. 이 hex 값을 avr에서 받은 후에 각도 값 변환 공식을 써서 실제 우리가 인지하기 쉬운 각도 값으로 바꾼다. 이때 만약 실시간 측정 스위치를 통해서 인터럽트 값이 들어오면 값은 계속적으로 저장-&gt;덮어쓰기를 반복한다. 이때 또 인터럽트가 calibration(눈금조정) 스위치를 통해서 들어오면 최근 100개의 값을 정자세의 값으로 인지하여 평균을 내고 블루투스 모듈을 통해서 앱으로 송신한다. 이후 다시 실시간 검사 스위치를 누르면 앱으로 실시간 각도값을 송신한다. 그리고 목부분의 센서와 허리위쪽의 roll 값의 차이를 계산하여 만약 차이값이 (10도이상&amp;&amp;5초이상) 지속될 경우 avr에 장착된 진동센서를 울려준다.<br />
· Android : AVR에서 전송된 데이터를 소팅한다. 소팅된 데이터를 8가지 파라미터로 구분한 후 데이터를 저장후 Unity로 전송한다. 4가지 기준값을 갖는 파라미터와 실시간으로 적용되는 4가지 센서값을 바탕으로, 기준자세를 기반으로 한 상대적인 허리각도를 측정한다. 이후 측정값이 정자세로부터 10도이상 차이가 나는 경우 진동을 울려준다.<br />
· Unity : Android에서 전송된 데이터를 소팅한다. 소팅된 데이터를 Object에 적용하여 물체를 움직인다. 소팅된 데이터에 따른 특이값(잘못된 허리각도)을 검출시 디스플레이부(의자부분)의 색을 변경시켜 사용자가 이를 쉽게 확인할 수 있다.<br />
· SQLite : Android에서 전송된 데이터를 SQLite의 DB에 저장한다. 저장된 데이터를 허리각도 종류별 hj(3가지)로 각각 평균을 출력한다. 사용자의 선택에 따라서 시간별, 일별, 월별로 통계 데이터를 출력해 보여준다.</p>
<p><span style="color: #99cc00"><strong>프로그램 사용법</strong></span><br />
※ 무빙을 통하여((ex)옆으로 밀기, 두 손가락으로 잡아당기기 등)화면을 옆이나 위에서 바라볼 수 있다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2017/05/42-ict-실시간-자세교정-3.png" rel="lightbox[33946]"><img class="alignnone size-full wp-image-33971" alt="42 ict 실시간 자세교정 (3)" src="http://www.ntrexgo.com/wp-content/uploads/2017/05/42-ict-실시간-자세교정-3.png" width="620" height="425" /></a> <a href="http://www.ntrexgo.com/wp-content/uploads/2017/05/42-ict-실시간-자세교정-4.png" rel="lightbox[33946]"><img class="alignnone size-full wp-image-33973" alt="42 ict 실시간 자세교정 (4)" src="http://www.ntrexgo.com/wp-content/uploads/2017/05/42-ict-실시간-자세교정-4.png" width="620" height="427" /></a> <a href="http://www.ntrexgo.com/wp-content/uploads/2017/05/42-ict-실시간-자세교정-5.png" rel="lightbox[33946]"><img class="alignnone size-full wp-image-33975" alt="42 ict 실시간 자세교정 (5)" src="http://www.ntrexgo.com/wp-content/uploads/2017/05/42-ict-실시간-자세교정-5.png" width="620" height="424" /></a> <a href="http://www.ntrexgo.com/wp-content/uploads/2017/05/42-ict-실시간-자세교정-6.png" rel="lightbox[33946]"><img class="alignnone size-full wp-image-33976" alt="42 ict 실시간 자세교정 (6)" src="http://www.ntrexgo.com/wp-content/uploads/2017/05/42-ict-실시간-자세교정-6.png" width="620" height="424" /></a> <a href="http://www.ntrexgo.com/wp-content/uploads/2017/05/42-ict-실시간-자세교정-7.png" rel="lightbox[33946]"><img class="alignnone size-full wp-image-33977" alt="42 ict 실시간 자세교정 (7)" src="http://www.ntrexgo.com/wp-content/uploads/2017/05/42-ict-실시간-자세교정-7.png" width="620" height="424" /></a><br />
<span style="color: #99cc00"><strong> 개발환경 (언어, Tool, 사용시스템 등)</strong></span><br />
· 개발언어 : C, JAVA, javascript, C#, SQLite<br />
· 개발Tool : AVR studio, Eclipse, Unity3d, Monodevelop<br />
· 사용시스템 : Android<br />
· OpenSource : BlueTerm(hyperterminal Application)</p>
<p><span style="color: #99cc00"><strong>하드웨어 구성</strong></span></p>
<p><span style="color: #99cc00"><strong><a href="http://www.ntrexgo.com/wp-content/uploads/2017/05/42-ict-실시간-자세교정-8.png" rel="lightbox[33946]"><img class="alignnone size-full wp-image-33978" alt="42 ict 실시간 자세교정 (8)" src="http://www.ntrexgo.com/wp-content/uploads/2017/05/42-ict-실시간-자세교정-8.png" width="620" height="307" /></a></strong></span></p>
<p>9축 무선 센서 3ea를 사용하여 일상생활에서도 편리하게 사용할 수 있는 웨어러블 디바이스 기능을 구현하였다. 현재 6축을(3축 자이로센서, 3축 가속도센서) 사용했지만 이후에 더욱더 정밀한 자세데이터 출력을 위해 9축 무선센서를 사용하였다. 1cell 리튬폴리머배터리 충전회로를 내장하고 있으며 32mm X 24mm의 초소형 사이즈로 크기와 무게 면에서 큰 장점을 가지기 때문에 일상에서도 지장 없이 사용할 수 있다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2017/05/42-ict-실시간-자세교정-1.jpg" rel="lightbox[33946]"><img class="alignnone size-full wp-image-33999" alt="42 ict 실시간 자세교정 (1)" src="http://www.ntrexgo.com/wp-content/uploads/2017/05/42-ict-실시간-자세교정-1.jpg" width="620" height="422" /></a> <a href="http://www.ntrexgo.com/wp-content/uploads/2017/05/42-ict-실시간-자세교정-9.png" rel="lightbox[33946]"><img class="alignnone size-full wp-image-33979" alt="42 ict 실시간 자세교정 (9)" src="http://www.ntrexgo.com/wp-content/uploads/2017/05/42-ict-실시간-자세교정-9.png" width="620" height="232" /></a> <a href="http://www.ntrexgo.com/wp-content/uploads/2017/05/42-ict-실시간-자세교정-10.png" rel="lightbox[33946]"><img class="alignnone size-full wp-image-33980" alt="42 ict 실시간 자세교정 (10)" src="http://www.ntrexgo.com/wp-content/uploads/2017/05/42-ict-실시간-자세교정-10.png" width="620" height="232" /></a><br />
2.4GHz 무선 수신기로써 허리 및 목의 6축 센서로부터 받은 데이터 최대 100개를 무선 수신 및 처리를 할 수 있으며, 통신 속도는 9600bps~921600bps를 갖는다. RF SMA 커넥터에 안테나를 연결하여 데이터 수신을 원활하게 하며, 데이터 수신 상태를 수신 LED를 통해 확인할 수 있다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2017/05/42-ict-실시간-자세교정-2.jpg" rel="lightbox[33946]"><img class="alignnone size-full wp-image-34001" alt="42 ict 실시간 자세교정 (2)" src="http://www.ntrexgo.com/wp-content/uploads/2017/05/42-ict-실시간-자세교정-2.jpg" width="620" height="271" /></a><br />
atmega128(AVR)은 16MHz, 8bit microcontroller로써 RISC 구조를 갖는다. 또한 비휘발성 메모리이며 8 channel, 10bit ADC의 형태를 갖는다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2017/05/42-ict-실시간-자세교정-12.png" rel="lightbox[33946]"><img alt="42 ict 실시간 자세교정 (12)" src="http://www.ntrexgo.com/wp-content/uploads/2017/05/42-ict-실시간-자세교정-12.png" width="620" height="184" /></a></p>
<p>&nbsp;</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2017/05/42-ict-실시간-자세교정-13.png" rel="lightbox[33946]"><img class="alignnone size-full wp-image-33983" alt="42 ict 실시간 자세교정 (13)" src="http://www.ntrexgo.com/wp-content/uploads/2017/05/42-ict-실시간-자세교정-13.png" width="620" height="229" /></a></p>
<p><span style="color: #99cc00"><strong>하드웨어 흐름도</strong></span><br />
본 디바이스의 전체적인 작동 흐름(도면4)에 따르면 웨어러블 디바이스에 장착되어 있는 6축 무선 센서에서 사용자의 목, 등, 허리 각도들을 측정한다. 그 후에 센서 수신기에 각도 값들을 전송을 한 후에 종합된 값들을 atmega128(AVR)로 송신을 한다. 그 후 허리의 굽어짐, 양옆으로 꺾임, 뒤틀림 각도를 등 부분에서 측정된 Roll, Pitch, Yaw의 각도 값과 허리 부분의 값의 차를 이용해 계산한다. 또한, 목의 굽어짐을 판단하기 위해 목 부분과 등 부분의 Roll 각도 값의 차를 이용하여 계산한다.<br />
처음에 사용자의 맞춤형 바른 자세 각도를 Calibration한 후, 바른 자세의 오차범위에서 벗어나게 되면 진동센서에서 진동을 주어 사용자가 곧 바로 자세를 고칠 수 있게끔 하였다. 또한, AVR의 연산에 의해 정제된 값을 핸드폰의 Application으로 송신하여, 실시간으로 사용자가 자신의 자세를 3D display로 확인할 수 있게끔 하여 시각화에 의한 편리함을 주었다. 진동센서와 마찬가지로 바른 자세의 오차를 벗어나는 불량한 자세를 할 때, 핸드폰의 진동 및 Application 화면을 색깔 변화를 주어서 사용자가 한 번 더 자세를 고칠 수 있게끔 도움을 주었다. Roll, Pitch, Yaw의 바른 자세에 대한 오차의 Display 색 변화는 다음과 같다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2017/05/42-ict-실시간-자세교정-14.png" rel="lightbox[33946]"><img class="alignnone size-full wp-image-33984" alt="42 ict 실시간 자세교정 (14)" src="http://www.ntrexgo.com/wp-content/uploads/2017/05/42-ict-실시간-자세교정-14.png" width="620" height="277" /></a></p>
<p>이로써 사용자가 굽어짐, 양옆으로 휘어짐, 뒤틀어짐 중 어느 자세로 불량한지를 파악하여 자세를 고치기도 쉬울 것이고, 어느 자세로 자주 불량 했는지도 파악하기 쉬울 것이다.<br />
거기서 끝이 아니라 측정된 데이터 값들을 데이터베이스화하여 일, 주, 월, 년 단위로 통계치를 표시해줘서 얼마만큼 자신의 자세가 나아지고 있는지도 파악할 수 있도록 했다. 이에 따라 사용자가 자세를 고치는 데 더욱 동기부여를 가질 수 있을 것이다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2017/05/42-ict-실시간-자세교정-15.png" rel="lightbox[33946]"><img class="alignnone size-full wp-image-33985" alt="42 ict 실시간 자세교정 (15)" src="http://www.ntrexgo.com/wp-content/uploads/2017/05/42-ict-실시간-자세교정-15.png" width="620" height="508" /></a></p>
<p><span style="color: #99cc00"><strong>하드웨어 기능</strong></span><br />
·  웨어러블 디바이스 : 허리의 각도를 정확하게 측정하기 위해 몸에 안정감 있게 달라붙고, 편안함을 주는 스포츠 웨어에 센서를 부착한다. 또한, 목의 각도를 측정하기 위해 여름에는 쿨링 목토시, 겨울에는 워머에 센서를 부착한다.</p>
<p>· 6축 무선 센서 3ea : 웨어러블 디바이스를 통해 목, 등, 허리에 장착하여 6축의 각도를 측정한 후 그 값들을 센서 수신기로 송신 한다.</p>
<p>· 센서 수신기 : 6축 무선 센서로 부터의 데이터 값들을 수신한 후 종합하여, 그 값을 atmega128(AVR)로 송신한다.</p>
<p>· atmega128(AVR) : 센서로부터 수신한 데이터 값들을 용도에 맞게 계산한다. 허리와 등 부분에서 측정된 Roll, Pitch, Yaw 각도들의 차를 계산하여 허리의 굽힘, 양옆으로 꺾임, 뒤틀림 각도를 파악한다. 또한, 목과 등 부분에서 측정된 각도의 차를 계산하여 목의 굽어짐 정도를 파악하여 거북목을 예방할 수 있도록 한다. 거북목 예방 부분에서는 목의 굽은 정도만 측정하면 되기 때문에 Roll의 값만 이용해서 연산한다.</p>
<p>· 스위치 : 바른 자세 Calibration 등, 장치가 용도에 맞게 여러 가지 작동을 하도록 한다.</p>
<p>· Led : 데이터 값들이 제대로 수신되고 있는지를 파악한다.</p>
<p>· 진동센서 : 바른 자세의 오차범위를 벗어나게 되면 진동을 울려 사용자가 파악할 수 있도록 해준다.</p>
<p><span style="color: #008000"><strong>프로그램 설명</strong></span><br />
<span style="color: #99cc00"><strong>파일 구성</strong></span><br />
<span style="color: #33cccc"><strong>AVR</strong></span></p>
<div class="symple-box gray none" style="text-align:left; width:100%;"> 
<p>void LCD_init(void) //LCD를 추가하여 사용하는 경우 lcd를 위해 포트를 초기화시키는 함수이다.(현재 장치는 크기를 줄이기 위해 lcd를 사용안하고 있음)<br />
void LCD_INT(int num) // LCD를 통하여 정수값 출력<br />
void LCD_String(char str[]) // LCD를 통하여 캐릭터 배열 출력(문자열 출력)<br />
void Control(unsigned char byte) // LCD 제어 함수</p>
<p>void TX0_CHAR(char ch) // uart 0 번을 통한 캐릭터 송신함수<br />
void TX0_str(char *str) // usart 0번 송신 함수 스트링<br />
void TX1_CHAR(char ch)// usart 1번 송신 함수 캐릭터<br />
void TX1_INT(int in)// usart 1번 송신 함수 인트<br />
void TX1_str(char *str)// usart 1번 송신함수 스트링</p>
<p>ISR(INT2_vect)// 거북목 검사를 하게 되면 1,2번 led를 켜기(인터럽트_스위치연결)<br />
ISR(INT0_vect)// 캘리브레이션 단추(인터럽트_스위치 연결)<br />
ISR(INT1_vect)// 실시간 검사 시작하기<br />
ISR(SIG_UART0_RECV)// uart1 데이터 리시브 인터럽트＿각도를 받아서 계산하여 uart0으로 송신_ uart0에 연결된 블루투스 모듈을 통해 휴대폰으로 각도값 송신<br />
ISR(SIG_UART1_RECV)// uart0 데이터 리시브 인터럽트_ 휴대폰 앱으로부터 받은 값을 구분하여 직접적으로 하드웨어 스위치를 누를 필요없이 하드웨어 조종 가능.<br />
</div>
<p><span style="color: #33cccc"><strong>Android</strong></span><br />
· BlueTurn.java : Android 플랫폼과 AVR간의 BlueTooth 통신을 가능하게 한다.<br />
· Hellotwo.java : Android Input/Output 내부처리 부분.<br />
· unity-classes.jar : Unity Class를 Import하여 안드로이드에서 사용가능하게 한다.<br />
· UnityPlayerNativeActivityR.java : Android와 Unity를 연동하는 부분.</p>
<p><span style="color: #33cccc"><strong>Unity3D</strong></span><br />
· Standard Assets 폴더 : Unity 엔진을 활용하기 위해 가져온 기본 라이브러리.<br />
· AndroidPluginManager.cs : Unity와 Android를 연동하는 부분.<br />
· Rotate.cs : 3D모델이 움직이는 부분.<br />
· MoveCamera.cs : Unity 내부 카메라를 움직이는 부분(touch로 움직임)</p>
<p><span style="color: #33cccc"><strong>SQLite</strong></span><br />
· Method.java : DB로 데이터를 입력하고 Android로 출력해주는 부분<br />
· StatisticActivity.java: 통계결과를 화면에 출력해주기 위한 Activity<br />
· MySQLiteOpenHelper.java : DB를 생성하고 테이블을 만들어주는 부분</p>
<p><span style="color: #99cc00"><strong>함수별 기능</strong></span><br />
<span style="color: #33cccc"><strong>AVR</strong></span><br />
1. ISR(INT2_vect)_우선적으로 거북목 체크 스위치를 누른다. 이 인터럽트는 스위치에 연결되어 있으며 직접적으로 하드웨어 스위치와 앱화면의 버튼을 통하여 활성화되며 활성화 된 경우 led를 켜준다.<br />
2. ISR(INT1_vect)_다음으로 올바른 자세의 평균값을 구하기 위해 실시간 각도 값을 구한다. 실시간 각도값은 Roll, pitch, yaw의 세 개의 값과 목토시의 각도값으로 웨어러블 디바이스의 센서로부터 나오고 그 값은 avr와 연결된 수신기로 들어온다. 수신기로 들어온 값은 uart를 통해 mcu를 통하여 들어오고 이 값을 가공하여 다시 uart에 연결된 블루투스 모듈을 통하여 앱으로 송신한다. (캘리브레이션을 위해 10초이상 유지 필요)<br />
3. ISR(INT0_vect)_ 캘리브레이션 함수를 실행하며 최근 100개의 데이터 값을 평균내서 정자세에 대한 캘리브레이션 값을 저장한다.<br />
4. ISR(INT1_vect)_ 2)와 같이 다시 실시간 자세 측정을 하게 되며 정자세 값과의 차이값을 블루투스 모듈을 통해 휴대폰 앱으로 송신한다.</p>
<p><span style="color: #33cccc"><strong>Android</strong></span></p>
<div class="symple-box gray none" style="text-align:left; width:100%;"> 
<p>((String) msg.obj).split(&#8220;\\,&#8221;); //저장된 값을 sorting하기 위해 split하는 부분.<br />
UnitySendMessage(String, &#8220;SetLog&#8221;, strSendMsg); //unity로 메시지를 보냄<br />
</div>
<p><strong></strong><br />
<span style="color: #33cccc"><strong> Unity</strong></span></p>
<div class="symple-box gray none" style="text-align:left; width:100%;"> 
<p>AndroidJavaClass(&#8220;PackagePath&#8221;) //Android를 호출.<br />
curActivity.Call(&#8220;CallAndroid_U&#8221;, strMsg); //Android 내에 코드 호출.<br />
Quaternion.Euler(X, Y, Z) //Object를 XYZ축으로 XYZ각만큼 비틈.<br />
Quaternion.Slerp(rotation, target, Time); //Object를 부드럽게 하는 함수<br />
</div>
<p><span style="color: #33cccc"><strong>SQLite</strong></span></p>
<div class="symple-box gray none" style="text-align:left; width:100%;"> 
<p>Method.insert(); //Table에 데이터 입력<br />
Method.select(); //Table로부터 데이터 출력<br />
</div>
<span style="color: #99cc00"><strong>주요 함수의 흐름도</strong></span></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2017/05/42-ict-실시간-자세교정-16.png" rel="lightbox[33946]"><img class="alignnone size-full wp-image-33986" alt="42 ict 실시간 자세교정 (16)" src="http://www.ntrexgo.com/wp-content/uploads/2017/05/42-ict-실시간-자세교정-16.png" width="620" height="563" /></a></p>
<p><span style="color: #99cc00"><strong>기술적 차별성</strong></span><br />
우리 기술의 차별성은 그동안 시중에 없었던 방식으로 허리의 각도 값을 측정하는 것이다. 물론 병원에서 비싼 진단기기로 측정하는 것이 더욱도 정확하지만 가격적으로 고가이고 매일 측정할 수 없으며 이동성 또한 없다. 이렇게 많은 제약사항을 우리 제품을 이용하게 되면 훨씬 줄일 수 있다. 우선 6축 센서를 통하여 웨어러블 디바이스에 장착시켜 누구든 이 장치를 손쉽게 사용할 수 있다. 물론 이 센서는 탈부착이므로 세탁을 할 때 또한 어려움이 없다.<br />
다음으로 휴대폰 어플리케이션과 연동되어진다는 큰 장점이 있다. 자신의 값을 3d 그림을 통해서 실시간으로 확인할 수 있으며 이 값은 모두 데이터베이스에 저장이 되어서 한 달 후, 일 년 후 에도 자신의 자세의 변화를 측정할 수 있으며 의료적으로도 사용될 수 있다는 큰 장점이 있다.<br />
현재 시중에 나와 있는 제품은 비자율적 제품들 뿐이다. 따라서 사람들은 허리가 아프면 무조건 병원에 가야 하는 병이기 때문에 큰 병에 걸릴 수 있다는 두려움을 갖고 있다. 우리제품은 자율적인 바른 자세 습관화를 만들어줄 수 있으며 수천만의 학생, 직장인에게 올바른 자세습관을 유지해서 병을 예방할 수 있으며, 수술을 받은 후인 환자에게 지속적인 관리를 해줄 수 있다.<br />
마지막으로 중요한 장점은 바로 거북목 측정 시스템이다. 요즘 많은 사람들이 스마트폰, 컴퓨터를 장시간 이용함에 따라 거북목 증후군을 앓고 있는 사람이 많아져 사회적 이슈가 되고 있다. 우리 제품은 등에 장착한 센서와 목토시에 장착한 센서 차이값을 이용하여 일정시간 이상 각도차가 벌어져 거북목 자세가 되었을 때 사용자에게 알림으로써 거북목 증후군을 예방할수 있도록 만들었다.<br />
또한 센서를 이용한 프로그램으로서, 실질적으로 들어오는 데이터를 기반으로 인체를 모델링한 오브젝트를 활용하여, 실제로 움직임에 따른 3D모델 오브젝트의 움직임을 쉽게 볼 수 있다. 이는 기존에 있는 그림과 글자로만 보여주는 디스플레이 방식을 뛰어넘는 실사용자가 시각적으로 접근하기 쉽게하는 효과를 갖고 있다.</p>
<p><span style="color: #008000"><strong>응용 분야</strong></span></p>
<p><span style="color: #99cc00"><strong>허리 및 목 디스크 예방</strong></span><br />
<span style="color: #33cccc"><strong>허리가 건강해야 몸이 건강하다.(허리디스크 예방)</strong></span></p>
<p><span style="color: #33cccc"><strong><a href="http://www.ntrexgo.com/wp-content/uploads/2017/05/42-ict-실시간-자세교정-17.png" rel="lightbox[33946]"><img class="alignnone size-full wp-image-33987" alt="42 ict 실시간 자세교정 (17)" src="http://www.ntrexgo.com/wp-content/uploads/2017/05/42-ict-실시간-자세교정-17.png" width="620" height="230" /></a></strong></span></p>
<p>위와 같이 허리디스크는 고통뿐만 아니라 많은 다른 질병을 함께 유발할 수 있다. 따라서 우리 제품을 이용하면 애초에 이러한 허리디스크를 예방하는데 큰 도움이 될 수 있다.<br />
허리디스크 수술은 척추사이의 염증을 치료하는 것이다. 때문에 재활 치료로 허리의 근육을 잡아주지 못한다면, 허리디스크가 다시 발병할 가능성이 크다. 따라서 재활치료를 통해 허리의 근육을 강화시켜 디스크 재발을 방지해야한다.</p>
<p><span style="color: #33cccc"><strong>거북목 증후군(목 디스크) 예방</strong></span><br />
<strong>거북목 정의</strong><br />
목을 앞으로 뺀 자세를 거북목이라고 한다. 더 자세히 설명하면 전체 목뼈 수가 7개인데 정상적으로는 귀가 어깨뼈봉우리와 같은 수직면 상에 있고 7개의 목뼈는 앞쪽으로 볼록하게 휘어서 배열되어 있다. 이를 경추 전만이라고 한다. 거북목 자세는 아래쪽 목뼈는 과하게 구부러지는 방향으로 배열되고 위쪽 목뼈와 머리뼈는 머리를 젖히는 방향으로 배열되어 전체적으로 목뼈 전만이 소실되고 머리가 숙여지지 않은 상태에서 고개가 앞으로 빠진 자세이다.</p>
<p><strong>원인</strong><br />
나이가 들수록, 근육이 없을수록 거북목이 잘 생긴다. 그러나 컴퓨터를 많이 하는 요즘에는 연령, 성별에 관계없이 호발한다.</p>
<p><strong>치료</strong><br />
기본적 치료는 어깨를 펴고 고개를 꼿꼿이 하는 것이다. 아울러 20~30분에 한 번씩 목을 스트레칭해 주면 큰 도움이 된다.</p>
<p><span style="color: #33cccc"><strong>제품을 이용한 거북목 예방</strong></span><br />
목의 휨 정도에 따라 실시간으로 진동을 통해 사용자에게 알려주기 때문에 거북목 증상을 예방할 수 있다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2017/05/42-ict-실시간-자세교정-3.jpg" rel="lightbox[33946]"><img class="alignnone size-full wp-image-33970" alt="42 ict 실시간 자세교정 (3)" src="http://www.ntrexgo.com/wp-content/uploads/2017/05/42-ict-실시간-자세교정-3.jpg" width="620" height="302" /></a></p>
<p><span style="color: #33cccc"><strong>경제적 효과</strong></span></p>
<p><span style="color: #33cccc"><strong><a href="http://www.ntrexgo.com/wp-content/uploads/2017/05/42-ict-실시간-자세교정-18.png" rel="lightbox[33946]"><img class="alignnone size-full wp-image-33988" alt="42 ict 실시간 자세교정 (18)" src="http://www.ntrexgo.com/wp-content/uploads/2017/05/42-ict-실시간-자세교정-18.png" width="620" height="263" /></a></strong></span></p>
<p><strong>척추 측만증 예방으로 치료비용 절감</strong><br />
척추 측만증 수술과 치료비용은 정확히 공개된 것은 없지만, 측만증을 치료하려면 수백만원 이상의 비용이 든다는 것으로 알려져 있다. 우리는 웨어러블을 이용하여 측만증을 예방하고 경제적 측면에서도 상당한 이득을 볼 것이라 예상한다.</p>
<p><span style="color: #99cc00"><strong>의사와 원격 진료</strong></span><br />
S·U·S의 기능 중 하나는 환자의 데이터화된 환자의 상태를 축적하는 것이다. 우리는 축적된 데이터를 의사에게 전송함으로써 의사가 환자의 허리 상태를 파악할 수 있게 할 것이다. 이것은 환자가 직접 의사를 찾아가지 않아도 치료를 받을 수 있도록 도울 것이다.</p>
<p><span style="color: #99cc00"><strong>바른 자세로 운동하기</strong></span><br />
스쿼트, 데드리프트 등 개인 피트니스 운동은 바른 자세를 유지로 운동하는 것이 운동 효과와 허리통증 등의 역효과를 방지할 수 있는 유일한 길이다. 예를 들어 스쿼트 운동을 할 때, 허리와 등을 곧게 펴고 무릎의 구부림 정도가 중요한데, 우리제품을 사용하여 각도를 설정하고 정해진 각도를 벗어났을 때 알림을 주는 방식으로 바른 자세를 유지할 수 있다. 이를 통해서 초보자들도 비싼 개인 트레이너를 구하지 않고 바른 자세로 운동을 할 수 있을 것으로 예상된다.</p>
<p><span style="color: #99cc00"><strong>과학적 훈련기법 활용</strong></span><br />
스포츠는 과학이다. 뉴스를 통해 과학적 훈련기법을 통해 선수들의 기량을 향상시킨 것을 자주 접할 수 있다. 이처럼 스포츠에서도 선수의 자세가 중요한 것은 부정할 수 없다. 골프가 그 하나의 예이다. 골프 선수의 허리와 무릎 굽힘, 팔의 각도 하나하나 선수들의 성적에 영향을 줄 수 있다. 우리 제품을 사용함으로써 선수들의 자세를 교정하고 기량을 향상 시킬 수 있을 것으로 생각한다.</p>
<p><span style="color: #008000"><strong>개발 단계</strong></span></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2017/05/42-ict-실시간-자세교정-19.png" rel="lightbox[33946]"><img class="alignnone size-large wp-image-33989" alt="42 ict 실시간 자세교정 (19)" src="http://www.ntrexgo.com/wp-content/uploads/2017/05/42-ict-실시간-자세교정-19-602x620.png" width="602" height="620" /></a><br />
<span style="color: #008000"><strong>기타</strong></span></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2017/05/42-ict-실시간-자세교정-20.png" rel="lightbox[33946]"><img class="alignnone size-full wp-image-33990" alt="42 ict 실시간 자세교정 (20)" src="http://www.ntrexgo.com/wp-content/uploads/2017/05/42-ict-실시간-자세교정-20.png" width="620" height="309" /></a> <a href="http://www.ntrexgo.com/wp-content/uploads/2017/05/42-ict-실시간-자세교정-5.jpg" rel="lightbox[33946]"><img class="alignnone size-full wp-image-33974" alt="42 ict 실시간 자세교정 (5)" src="http://www.ntrexgo.com/wp-content/uploads/2017/05/42-ict-실시간-자세교정-5.jpg" width="620" height="345" /></a> <a href="http://www.ntrexgo.com/wp-content/uploads/2017/05/42-ict-실시간-자세교정-21.png" rel="lightbox[33946]"><img class="alignnone size-full wp-image-33991" alt="42 ict 실시간 자세교정 (21)" src="http://www.ntrexgo.com/wp-content/uploads/2017/05/42-ict-실시간-자세교정-21.png" width="620" height="377" /></a> <a href="http://www.ntrexgo.com/wp-content/uploads/2017/05/42-ict-실시간-자세교정-22.png" rel="lightbox[33946]"><img class="alignnone size-full wp-image-33992" alt="42 ict 실시간 자세교정 (22)" src="http://www.ntrexgo.com/wp-content/uploads/2017/05/42-ict-실시간-자세교정-22.png" width="620" height="285" /></a> <a href="http://www.ntrexgo.com/wp-content/uploads/2017/05/42-ict-실시간-자세교정-23.png" rel="lightbox[33946]"><img class="alignnone size-full wp-image-33993" alt="42 ict 실시간 자세교정 (23)" src="http://www.ntrexgo.com/wp-content/uploads/2017/05/42-ict-실시간-자세교정-23.png" width="620" height="326" /></a> <a href="http://www.ntrexgo.com/wp-content/uploads/2017/05/42-ict-실시간-자세교정-24.png" rel="lightbox[33946]"><img class="alignnone size-full wp-image-33994" alt="42 ict 실시간 자세교정 (24)" src="http://www.ntrexgo.com/wp-content/uploads/2017/05/42-ict-실시간-자세교정-24.png" width="620" height="465" /></a> <a href="http://www.ntrexgo.com/wp-content/uploads/2017/05/42-ict-실시간-자세교정-25.png" rel="lightbox[33946]"><img class="alignnone size-full wp-image-33995" alt="42 ict 실시간 자세교정 (25)" src="http://www.ntrexgo.com/wp-content/uploads/2017/05/42-ict-실시간-자세교정-25.png" width="620" height="457" /></a> <a href="http://www.ntrexgo.com/wp-content/uploads/2017/05/42-ict-실시간-자세교정-26.png" rel="lightbox[33946]"><img class="alignnone size-full wp-image-33996" alt="42 ict 실시간 자세교정 (26)" src="http://www.ntrexgo.com/wp-content/uploads/2017/05/42-ict-실시간-자세교정-26.png" width="620" height="382" /></a> <a href="http://www.ntrexgo.com/wp-content/uploads/2017/05/42-ict-실시간-자세교정-27.png" rel="lightbox[33946]"><img class="alignnone size-full wp-image-33997" alt="42 ict 실시간 자세교정 (27)" src="http://www.ntrexgo.com/wp-content/uploads/2017/05/42-ict-실시간-자세교정-27.png" width="620" height="394" /></a> <a href="http://www.ntrexgo.com/wp-content/uploads/2017/05/42-ict-실시간-자세교정-28.png" rel="lightbox[33946]"><img class="alignnone size-large wp-image-33998" alt="42 ict 실시간 자세교정 (28)" src="http://www.ntrexgo.com/wp-content/uploads/2017/05/42-ict-실시간-자세교정-28-620x450.png" width="620" height="450" /></a></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ntrexgo.com/archives/33946/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[42호]Outline CNC Plotter With ATmega128 &amp; OpenCV</title>
		<link>http://www.ntrexgo.com/archives/34008</link>
		<comments>http://www.ntrexgo.com/archives/34008#comments</comments>
		<pubDate>Thu, 25 May 2017 00:00:29 +0000</pubDate>
		<dc:creator>디바이스마트 매거진</dc:creator>
				<category><![CDATA[디바이스마트 매거진]]></category>
		<category><![CDATA[특집]]></category>
		<category><![CDATA[42호]]></category>
		<category><![CDATA[cnc]]></category>
		<category><![CDATA[ict]]></category>
		<category><![CDATA[outline]]></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=34008</guid>
		<description><![CDATA[디바이스마트 매거진 42호 &#124; 이 작품은 직접적으로 외곽선을 그리게 될 하드웨어(프레임 및 마이크로 컨트롤러 ATmega128 펌웨어 제작)부문과 일반 그림파일의 픽셀을 분석, 추적하여 프린트 가능한 데이터로 변환해 주는 소프트웨어(윈도우즈 기반 C# 및 OpenCV 영상처리 개발)부문으로 나눠진다.]]></description>
				<content:encoded><![CDATA[<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/05/2016-ictmain.png" rel="lightbox[34008]"><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;background-color: #000000;color: #ffffff"><strong>2016 ICT 융합 프로젝트 공모전 우수상</strong></span></p>
<p><span style="font-size: xx-large"><strong>Outline CNC Plotter With ATmega128 &amp; OpenCV</strong></span></p>
<p><span style="font-size: x-large"><strong>(Portable electrospinning device and fine fiber)</strong></span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p style="text-align: right"><strong>글 | 국민대학교 정구영</strong></p>
<p>&nbsp;</p>
<p><span style="color: #008000"><strong>심사평</strong></span></p>
<p><strong>JK전자</strong> PC용 제어 소프트웨어, 8비트 마이크로프로세서용 펌웨어, 완벽한 기계 파트까지 전체적으로 완성도가 높은 작품 입니다. 기술적으로도 이미 공개되어 있는 G-Code를 사용하지 않고, 자체적인 알고리즘을 개발한 노력이 엿보이네요. 하지만 이미 유사한 프로젝트가 많이 공개되어 있는 기능이고 창의성이 부족한 부분이 아쉽네요.</p>
<p><strong>뉴티씨</strong> 실제로 CNC를 구현 완료하여 이를 통한 데모를 유튜브 등을 통하여 보여주고 있으며, 이를 모두 알고리즘으로 처리하여 실제로 구현한 점 등이 큰 점수를 받았다. 또한, 윈도우 소프트웨어 등도 모두 직접 구현하였으며, 기계적인 부분들도 모두 처리하였고, 두꺼운 선이나, 다양한 터치 방법 등도 매우 창의적으로 구현한 점 등이 높은 점수를 받았다. 창의성도 매우 좋고, 바로 시제품을 만들어서 실용적으로 판매도 할 수 있을 것으로 생각된다. 이 작품은 실제 구현이 완벽히 되었고, 기술성, 작품완성도, 작품성 등 대부분 최고 점수를 받았다.</p>
<p><strong>칩센</strong> 킥스타터 등에서 본 듯하나, 학생들이 직접 이미지 외곽선 검출부터 제어까지 구현했다는 점에서 높은 평가를 주고 싶다.</p>
<p><strong>위드로봇</strong> 단순히 X-Y 플로터가 아닌 윤곽선을 추출하는 부분까지 구현한 점이 전체 작품의 완성도를 끌어올리는 멋진 부분이라 생각합니다. YouTube에 올린 동영상으로 작품의 완성도가 높다는 것을 한 눈에 파악할 수 있어 좋았습니다. 전반적인 부분을 스스로의 힘으로 해결하였기에 실력 향상에 많은 도움이 되는 작품이었을 것으로 보입니다.</p>
<p><span style="color: #008000"><strong>작품 개요 및 내용</strong></span><br />
·  X, Y의 2축과 Z의 1축으로 구성된 8방향 정밀제어 평면 제도 플로터의 구현<br />
·  윈도우즈 기반 프로그램과 플로터의 유선 연결을 통한 직접 지령 전달 및 양방향 통신의 구현<br />
·  C#과 OpenCV를 이용한 이미지 파일의 분석 및 픽셀 추적 알고리즘의 구현</p>
<p>본 작품은 직접적으로 외곽선을 그리게 될 하드웨어(프레임 및 마이크로 컨트롤러 ATmega128 펌웨어 제작)부문과 일반 그림파일의 픽셀을 분석, 추적하여 프린트 가능한 데이터로 변환해 주는 소프트웨어(윈도우즈 기반 C# 및 OpenCV 영상처리 개발)부문으로 나눠지게 되고, PC의 C# Windows Form 프로그램을 통해 특정 지령으로 변환된 외곽선 데이터를 전송받아 정확한 치수에 기반을 두어 펜으로 그림을 그려주는 기능을 가집니다.</p>
<p><span style="color: #008000"><strong>개발 동기</strong></span><br />
본 프로젝트의 개발 동기는 하드웨어와 소프트웨어의 융합 개발에 그 의의를 두고 있습니다. 상기 본인이 소속한 국민대학교 전자공학부 학술동아리에서는 1년에 1회 개인 작품 제작을 통한 전시회를 개최하고 있습니다. 해당 전시회에서의 개인 전시를 위한 작품에 대해 생각하던 중, 그동안 배워왔던 아날로그 수동 소자들을 이용한 실제 전자회로의 설계, 그리고 C 언어 프로그래밍, 마이크로 컨트롤러를 이용한 임베디드 시스템의 설계 등을 응용한 좋은 작품이 없을까 고민을 하였습니다. 그 결과 하드웨어에만 치중하지 않는 하드웨어 &#8211; 소프트웨어 융합 개발에 대해 크게 흥미를 느꼈고 개인적으로 관심이 많았던 치수제어 분야와 복합적으로 개발할 수 있는 것을 찾아보았습니다. 그리고 머지않아 그 대상은 그리 먼 곳에 있지 않다는 것을 깨달았습니다. 그것은 바로 누구나가 사용하고 있는 일반 잉크젯 프린터였습니다.<br />
본 개발의 핵심 알고리즘은 기존의 상용화된 G-CODE 알고리즘을 참조하지 않고 직접 구현을 통해 이루어졌으며, 하드웨어와 소프트웨어의 융합개발로 실제 치수에 기반을 둔 하드웨어 제작(물리적)과 프로그래밍에 기반을 둔 소프트웨어 제작(논리적)의 융합으로 개인 실력 향상에도 도움이 많이 되었다고 생각합니다.</p>
<p><span style="color: #008000"><strong>개발 목적</strong></span><br />
CNC 머신은 우리 생활과 그리 먼 곳에 있지 않습니다. 전문적인 운용에 있어선 CNC 밀링(절삭)머신이나 3D프린터(적층) 등이 있으나, 우리가 평소에 사용하는 프린터 또한 컴퓨터 수치제어로 움직이는 하나의 CNC 머신입니다. 옛날에 PCB를 자작하기 위해서 에칭을 하는 과정 중 도선이 될 부분을 코팅시키기 위해 동판에 잉크를 전사시키는 작업이 필수로 행해졌는데, 이 과정에서 사용됐던 것이 레이저 프린터로 OHP 필름에 회로 패턴을 인쇄한 다음 다리미를 이용하여 동판에 인쇄물을 부착해서 잉크를 녹여 그대로 전사시키는 방법이었습니다. 패턴의 경우 펜으로 직접 그려도 상관이 없었으나, 정밀한 패턴의 경우 최대한의 패턴 정밀도를 유지하기 위해 전사방식을 사용하였던 것입니다. 하지만 그 과정을 한 번에 단축시킬 수 있는 것이 CNC를 이용한 패턴 직접 인쇄였습니다. CNC 제어로 동판에 직접 인쇄를 하면 정밀도를 유지하면서 전사시키는 과정이 필요가 없어지기 때문이지요. 물론 정확한 데이터를 바탕으로 머신을 움직여, 원하는 결과물을 얻는 과정은 매우 까다롭고 어렵습니다. 하지만 자동화 시스템을 완성하여 여러가지 입력 데이터에 대한 정확한 결과물을 얻는다면 작업시간이 단축되는 효과를 얻을 수 있습니다.</p>
<p><span style="color: #008000"><strong>작품 설명</strong></span><br />
본 작품은 하드웨어 파트와 소프트웨어 파트로 나뉘어져 있습니다. 하드웨어 파트로는 알루미늄 프로파일을 이용한 플로터 프레임 제작과 ATmega128을 실장시킬 기판 제작, 그리고 전원공급을 위한 12V-5V 레귤레이팅 회로 제작, ATmega128로부터 출력을 담당할 포트의 모듈화(PCB 아트워크), 프레임을 뼈대로 한 Stepper Motor 2개의 X, Y축 운반시스템 장착 및 Motor 제어 알고리즘 개발 등이 있으며 소프트웨어 파트로는 PC의 윈도우즈 환경을 기반으로 한 C# Windows Form 프로그래밍을 이용하여 임의의 이미지파일을 불러와 OpenCV를 거쳐 외곽선을 출력하고, 출력된 외곽선을 분석, 픽셀 트래킹 알고리즘을 적용하여 개발된 플로터에서 인쇄할 수 있는 데이터로 변환하고 전송하는 기능까지가 되겠습니다.</p>
<p><span style="color: #008000"><strong>주요 동작 및 특징</strong></span><br />
<span style="color: #99cc00"><strong>1) 하드웨어 동작 및 특징</strong></span><br />
하드웨어 제작의 경우 타 작품의 참고없이 프레임의 사이즈부터 도면 설계, 회로에 사용될 각종 소자들과 마이크로 컨트롤러의 선별, 모터드라이버와 모터의 선별 모두 직접 실시하였습니다. PCB기판 제작에는 만능기판을 사용하였으며 전원을 안정적으로 공급하기 위해 7805 정전압 회로를 구현하였고 축의 운반을 위해 2개의 Stepper Motor를 사용하였으며 각 축이 직각을 이루도록 Motor를 배치, 풀리와 타이밍 벨트를 사용하여 정밀한 제어가 가능하게 하였습니다. 모터제어의 경우 센서에 의한 피드백없이 개발하기 위해 1:1 제어가 가능한 Stepper 모터를 사용하였으며 중심점을 기준으로 8방향 제어를 완벽하게 구현하여 원이나 대각선, 포물선 등을 그릴 수 있게 되었습니다.</p>
<p><span style="color: #99cc00"><strong>2) 소프트웨어 동작 및 특징</strong></span><br />
PC &lt;-&gt; ATmega128간의 양방향 통신을 구현하였으며 소프트웨어 상으로는 자동 픽셀 추적 알고리즘을 개발하여 출력된 외곽선을 (0, 0)에서 가장 가까운 지점을 찾아 지속적으로 추적, 데이터화 하였습니다. 실용화 되어있는 방식(G-Code)을 따르지 않고 독자적으로 개발한 제어 프로토콜을 따르고 있으며 피드백이 없는 제어방식이지만 비교적 높은 정확성을 보이고 있어 피드백 알고리즘을 구현하여 추가할 시 2D CNC 머신이 아닌 3D 정밀 절삭, 적층 머신까지도 본 알고리즘을 통하여 독자적으로 개발할 수 있을 것으로 생각합니다.</p>
<p><span style="color: #99cc00"><strong>3) 동작 시나리오 &#8211; 시스템 아키텍처</strong></span><br />
<strong></strong></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2017/08/42-ict-outline-cnc-1.png" rel="lightbox[34008]"><img class="alignnone size-full wp-image-34011" alt="42 ict outline cnc (1)" src="http://www.ntrexgo.com/wp-content/uploads/2017/08/42-ict-outline-cnc-1.png" width="620" height="380" /></a></p>
<p><span style="color: #99cc00"><strong>4) 동작 시나리오</strong></span><br />
플로터를 제어할 컴퓨터 시스템에서는 이미지를 외곽선으로 변환한 후 직접 제작한 픽셀 추적 알고리즘을 통해 (0, 0)에서 제일 가까운 픽셀을 추적하여 기준점으로 삼고, 해당 픽셀에서부터 다음 픽셀을 추적하여 그 방향을 데이터화 하여 저장합니다. 최종적으로 남아있는 외곽선이 없으면 추적을 중단하게 되고 저장된 데이터를 바탕으로 ATmega128로 지령을 보냅니다. ATmega128에서는 받은 지령을 모터제어를 위한 PWM 파형으로 변환하는 해석기(interpreter)역할을 하며 모터드라이버로 PWM을 출력하는 역할을 합니다. 일정 데이터만큼 지령을 보내면 플로터를 제어할 컴퓨터 시스템으로 완수신호를 보내 그 다음으로 인쇄할 데이터를 요구합니다. 이미지 상에서 보이듯이, 피드백 시스템은 존재하지 않으며 1:1 대응의 제어 신호를 통해 X, Y축을 제어하게 됩니다. Z-축의 서보는 펜을 들었다 놓는 기능이 있으며 서로 떨어져 있는 픽셀을 감지하여 펜을 들었다가 픽셀이 시작되는 위치에서 다시 펜을 내려놓는 기능을 하게 됩니다.</p>
<p><span style="color: #008000"><strong>전체 시스템 구성</strong></span><br />
<span style="color: #99cc00"><strong>1) 시스템 흐름 순서도</strong></span></p>
<p><span style="color: #99cc00"> <a href="http://www.ntrexgo.com/wp-content/uploads/2017/08/42-ict-outline-cnc-2.png" rel="lightbox[34008]"><img class="alignnone size-full wp-image-34013" alt="42 ict outline cnc (2)" src="http://www.ntrexgo.com/wp-content/uploads/2017/08/42-ict-outline-cnc-2.png" width="620" height="291" /></a></span></p>
<p><span style="color: #99cc00"><strong>2) 소프트웨어 구성 및 처리 과정</strong></span></p>
<p><span style="color: #99cc00"> <a href="http://www.ntrexgo.com/wp-content/uploads/2017/08/42-ict-outline-cnc-3.png" rel="lightbox[34008]"><img class="alignnone size-full wp-image-34015" alt="42 ict outline cnc (3)" src="http://www.ntrexgo.com/wp-content/uploads/2017/08/42-ict-outline-cnc-3.png" width="620" height="415" /></a></span></p>
<p><span style="color: #99cc00"><strong>3) 하드웨어 구성 및 처리 과정</strong></span></p>
<p><span style="color: #99cc00"> <a href="http://www.ntrexgo.com/wp-content/uploads/2017/08/42-ict-outline-cnc-4.png" rel="lightbox[34008]"><img class="alignnone size-full wp-image-34017" alt="42 ict outline cnc (4)" src="http://www.ntrexgo.com/wp-content/uploads/2017/08/42-ict-outline-cnc-4.png" width="620" height="314" /></a></span></p>
<p><span style="color: #99cc00"><strong>4) 소프트웨어 세부 구성</strong></span></p>
<p><span style="color: #99cc00"><strong><a href="http://www.ntrexgo.com/wp-content/uploads/2017/08/42-ict-outline-cnc-5.png" rel="lightbox[34008]"><img class="alignnone size-full wp-image-34018" alt="42 ict outline cnc (5)" src="http://www.ntrexgo.com/wp-content/uploads/2017/08/42-ict-outline-cnc-5.png" width="620" height="458" /></a></strong></span></p>
<p>소프트웨어는 C#와 OpenCV를 이용해 제작되었고 ATmega128과의 통신을 위해 시리얼 포트를 설정할 수 있으며 임의의 이미지파일을 불러와 외곽선을 추출합니다. 추출된 외곽선으로부터 영점을 기준으로 최단거리에 있는 픽셀을 다음 기준점으로 잡으며, 기준점으로부터 가장 가까이 있는 픽셀을 자동으로 추적합니다. 만약 추적 후 외곽선이 남아있다면 계속해서 추적을 하게 되며 남아있는 외곽선이 없다면 추적을 종료하게 됩니다. 픽셀 트래킹 알고리즘은 직접 개발하였으며 기준점을 중심으로 우선순위를 두어 주위 8방향에 존재하는 픽셀을 추적하게 됩니다. 만들어진 인쇄 데이터는 일정 간격으로 잘라 플로터로 전송합니다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2017/08/42-ict-outline-cnc-6.png" rel="lightbox[34008]"><img class="alignnone size-full wp-image-34019" alt="42 ict outline cnc (6)" src="http://www.ntrexgo.com/wp-content/uploads/2017/08/42-ict-outline-cnc-6.png" width="620" height="366" /></a></p>
<p>1. CNC 제어 프로그램 초기 실행 시 이미지를 불러오게 됩니다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2017/08/42-ict-outline-cnc-7.png" rel="lightbox[34008]"><img class="alignnone size-full wp-image-34020" alt="42 ict outline cnc (7)" src="http://www.ntrexgo.com/wp-content/uploads/2017/08/42-ict-outline-cnc-7.png" width="620" height="359" /></a></p>
<p>2. 불러온 이미지는 프로그램 좌상단에 표시가 되며 이미지의 크기는 제한이 없습니다.</p>
<p>3. 이미지를 불러온 후 “포트설정”을 클릭하여 Outline CNC Plotter와 통신할 포트를 설정합니다.</p>
<p>4. 포트와 연결합니다.</p>
<p>&nbsp;</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2017/08/42-ict-outline-cnc-8.png" rel="lightbox[34008]"><img alt="42 ict outline cnc (8)" src="http://www.ntrexgo.com/wp-content/uploads/2017/08/42-ict-outline-cnc-8.png" width="620" height="407" /></a></p>
<p>5. 포트와 연결되면 우상단의 작업창이 활성화 되며 하단의 메시지가 작업 가능으로 변경됩니다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2017/08/42-ict-outline-cnc-9.png" rel="lightbox[34008]"><img class="alignnone size-full wp-image-34022" alt="42 ict outline cnc (9)" src="http://www.ntrexgo.com/wp-content/uploads/2017/08/42-ict-outline-cnc-9.png" width="620" height="359" /></a></p>
<p>6. 프린트 할 그림의 이진화 Threshold를 정해주고 외곽선 버튼을 누릅니다.<br />
7. OpenCV의 그레이스케일 ▶ 이진화 ▶ 케니엣지를 거쳐 외곽선을 추출하여 중앙에 출력합니다.<br />
8. 출력된 외곽선을 보고 적당히 다듬어질 때 까지 Threshold를 조절하며 외곽선을 추출합니다.<br />
9. 원하는 모양의 외곽선이 추출 되면 “픽셀체크” 버튼을 클릭합니다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2017/08/42-ict-outline-cnc-10.png" rel="lightbox[34008]"><img class="alignnone size-full wp-image-34023" alt="42 ict outline cnc (10)" src="http://www.ntrexgo.com/wp-content/uploads/2017/08/42-ict-outline-cnc-10.png" width="620" height="429" /></a></p>
<p>10. “픽셀체크” 버튼을 클릭하면 추출된 외곽선 데이터 중 좌상단(0, 0)으로부터 ‘가장 근접한 거리’에 있는 픽셀을 추적하게 되며 좌측 중앙에 X2+Y2의 거리 값이 표시되고 우측 텍스트박스에 Xvalue Yvalue X2+Y2가 표시됩니다. 좌측 하단에는 총 픽셀의 개수가 표시됩니다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2017/08/42-ict-outline-cnc-11.png" rel="lightbox[34008]"><img class="alignnone size-full wp-image-34024" alt="42 ict outline cnc (11)" src="http://www.ntrexgo.com/wp-content/uploads/2017/08/42-ict-outline-cnc-11.png" width="620" height="310" /></a></p>
<div class="symple-box gray none" style="text-align:left; width:100%;"> 
<p>public int PixelAccess2(IplImage src)<br />
{<br />
int length = 1121000;<br />
int xshort = 0;<br />
int yshort = 0;<br />
//byte* img = (byte*)src.ImageData;<br />
for (int y = 0; y &lt; 950; y++)<br />
{<br />
for (int x = 0; x &lt; 1180; x++)<br />
{<br />
if (Cv.Get2D(src, y, x) == 0)<br />
{<br />
if (length &gt; y * y + x * x)<br />
{<br />
length = y * y + x * x;<br />
xshort = x;<br />
yshort = y;<br />
//img[(y) * 950 + x] = 255;<br />
}<br />
}<br />
}<br />
}<br />
Cv.Set2D(result, yshort, xshort, 255);<br />
Commandbox.Text += &#8221; &#8221; + xshort.ToString() + &#8221; &#8221; + yshort.ToString() + &#8221; &#8221; + length.ToString();<br />
trackx = xshort;<br />
tracky = yshort;<br />
for (; xshort &gt; 0; xshort&#8211;)<br />
Fill_image_data(4);<br />
for (; yshort &gt; 0; yshort&#8211;)<br />
Fill_image_data(2);<br />
return length;<br />
}<br />
</div>
<p>11. 거리추적의 경우 표시된 외곽선의 데이터(x, y)에 직접 접근하여 화면상에 표시되는 모든 픽셀을 스캔하고, 최종적으로 (0, 0)에서 가장 가까운 거리에 있는 픽셀만큼의 거리(xmin, ymin)를 저장합니다.<br />
12. 저장된(xmin, ymin) 값을 기반으로 프로그램이 자동적으로 데이터를 플로터에 내릴 지령으로 변환합니다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2017/08/42-ict-outline-cnc-12.png" rel="lightbox[34008]"><img class="alignnone size-full wp-image-34025" alt="42 ict outline cnc (12)" src="http://www.ntrexgo.com/wp-content/uploads/2017/08/42-ict-outline-cnc-12.png" width="620" height="428" /></a><br />
13. 첫 픽셀을 추적한 후 그 다음으로, 8방향 중 최소 한 방향으로 이어진 하나의 픽셀을 추적하는 “다음픽셀” 과 더 이상 이어진 픽셀이 없을 경우 끊겨진 지점에서 최소거리에 있는 픽셀을 자동으로 추적하는 “최소거리” 기능을 사용하여 픽셀을 계속 추적합니다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2017/08/42-ict-outline-cnc-13.png" rel="lightbox[34008]"><img class="alignnone size-full wp-image-34026" alt="42 ict outline cnc (13)" src="http://www.ntrexgo.com/wp-content/uploads/2017/08/42-ict-outline-cnc-13.png" width="620" height="307" /></a><br />
14. “추적전송” 버튼의 경우 “다음픽셀” 기능을 더 이상 이어지지 않는 구간까지 자동반복 합니다.<br />
15. 픽셀추적의 경우 Raster식 이미지는 도트로 이루어져있다는 점으로부터 착안하였으며 모터제어의 8방향 제어와 부합하는 알고리즘을 구상하였습니다.<br />
16. 모든 도트는 중심점(x, y)을 기준으로 8방향 내에서 정의가 되며 추적된 결과 값을 제어문으로 변환 후 데이터로 저장하여 반환합니다.<br />
17.  저장된(xdir, ydir) 값을 기반으로 프로그램이 자동적으로 데이터를 플로터에 내릴 지령으로 변환합니다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2017/08/42-ict-outline-cnc-14.png" rel="lightbox[34008]"><img class="alignnone size-full wp-image-34027" alt="42 ict outline cnc (14)" src="http://www.ntrexgo.com/wp-content/uploads/2017/08/42-ict-outline-cnc-14.png" width="620" height="429" /></a></p>
<p>18. 외곽선 픽셀이 성공적으로 추적됨에 따라 자동적으로 추적된 픽셀은 0(Zero Fill)으로 바뀌며, 모든 픽셀의 추적이 완료되면 외곽선 픽셀은 모두 사라지게 되고 좌측 중앙에 모든 구간에서 픽셀이 발견되지 않아 이미지의 X2width + y2height 값이 출력되게 됩니다.<br />
19.  모든 픽셀을 추적하여 추출된 외곽선이 남아있지 않게 되면, 자동적으로 C# Windows Form 프로그램은 마지막 픽셀 값인 (Xnow, Ynow)값을 기반으로 프로그램이 자동적으로 펜을 다시 원점(0, 0)으로 되돌리는 데이터를 플로터에 내릴 지령으로 변환합니다.<br />
20. 인쇄 버튼을 클릭하면 초기에 연결한 포트를 통해 Outline CNC Plotter로 데이터를 전송합니다.<br />
21. Outline CNC Plotter의 ATmega128과 UART 양방향 통신을 통해 C# Windows Form 프로그램에서 인쇄 지령 데이터를 전송하게 되며, 역방향으로 ATmega128에서는 일정 구간의 데이터를 인쇄 완료했다는 완수신호를 보내게 됩니다.<br />
22. C# Windows Form 프로그램에 저장된 인쇄 데이터는 모든 지령을 담고 있어 8bit-Processor인 ATmega128은 한 번에 많은 양의 데이터를 받을 수 없으므로 일정 구간의 데이터를 보내게 되며, Polling 방식의 자동화 시스템에서 착안하여 일정 구간 데이터의 처리를 완료하면 Master에게 완수신호를 보내어 그 다음으로 처리해야 할 Data를 받는 형식의 프로토콜을 가지고 있습니다.</p>
<div class="symple-box gray none" style="text-align:left; width:100%;"> 
<p>void EventDataReceived(object sender, SerialDataReceivedEventArgs e)<br />
{<br />
//if (printdata[processing] == 0)<br />
//return;<br />
byte[] buff = new byte[1];<br />
serialPort1.Read(buff, 0, 1);<br />
if (Convert.ToChar(buff[0]) == &#8216;l&#8217;)<br />
{<br />
serialPort1.Write(&#8220;r&#8221;);<br />
for (int temp = 0; temp &lt; 1024; temp++)<br />
{<br />
//serialPort1.Write(PixelAccess3(result).ToString());<br />
serialPort1.Write(printdata[processing + temp].ToString());<br />
//Commandbox.Text += printdata[processing + temp].ToString();<br />
}<br />
processing += 1024;<br />
serialPort1.Write(&#8220;p&#8221;);<br />
}<br />
}<br />
</div>
<p>23. 좌측은 프로그램 내부의 통신 이벤트 핸들러 함수입니다. 데이터의 보냄과 요청이 Interrupt에 의해 이루어지며, 한 번에 1024개의 지령이 전송되는 것을 볼 수 있습니다. 이는 픽셀 1024개만큼의 8방향 제어 지령 데이터가 ATmega128이 완수신호를 보낼 때 마다 자동으로 그 다음 데이터를 보내는 것을 의미합니다. 결과적으로 인쇄버튼 클릭 후 Outline CNC Plotter가 인쇄를 끝낼 때까지의 모든 과정이 자동적으로 이루어지는 것을 말합니다.</p>
<p><span style="color: #99cc00"><strong>5) 하드웨어 세부 구성</strong></span></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2017/08/42-ict-outline-cnc-15.png" rel="lightbox[34008]"><img class="alignnone size-full wp-image-34028" alt="42 ict outline cnc (15)" src="http://www.ntrexgo.com/wp-content/uploads/2017/08/42-ict-outline-cnc-15.png" width="620" height="429" /></a></p>
<p>Outline CNC Plotter의 하드웨어는 전송된 데이터를 바탕으로 ATmega128에서 8방향 제어 알고리즘을 통해 모터를 구동하게 됩니다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2017/08/42-ict-outline-cnc-16.png" rel="lightbox[34008]"><img class="alignnone size-full wp-image-34029" alt="42 ict outline cnc (16)" src="http://www.ntrexgo.com/wp-content/uploads/2017/08/42-ict-outline-cnc-16.png" width="620" height="429" /></a></p>
<p>1. 2개의 Stepper Motor(NEWTC SE-SM243 Stepper Motor)을 X, Y축으로 구성하였습니다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2017/08/42-ict-outline-cnc-17.png" rel="lightbox[34008]"><img class="alignnone size-full wp-image-34030" alt="42 ict outline cnc (17)" src="http://www.ntrexgo.com/wp-content/uploads/2017/08/42-ict-outline-cnc-17.png" width="620" height="429" /></a></p>
<p>2. Stepper Motor를 제어하기 위해 NEWTC AM-CS2(P) Stepping Motor Driver를 사용하였습니다.<br />
3. 펜의 상승, 하강을 제어하는 1개의 Z축을 HS-422 Servo Motor로 구성하였습니다.<br />
4. LM7805를 이용한 5V 정전압 출력 회로 및 ATmega128 회로를 제작하였으며 2개의 STEP 모터 구동을 위한 GPIO의 소켓을 장착하고 1개의 Servo 모터 출력을 지원하며 6개의 인터럽트 스위치를 장착하였습니다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2017/08/42-ict-outline-cnc-19.png" rel="lightbox[34008]"><img class="alignnone size-large wp-image-34032" alt="42 ict outline cnc (19)" src="http://www.ntrexgo.com/wp-content/uploads/2017/08/42-ict-outline-cnc-19-579x620.png" width="579" height="620" /></a><br />
5. PC와의 양방향 통신을 위해 UART 시리얼 통신을 구현하고, 지령의 해석을 통한 하드웨어의 직접 제어를 위해 8방향 제어 알고리즘을 구현하여 정밀도를 최대화 합니다.</p>
<p><span style="color: #008000"><strong>하드웨어 및 소프트웨어 개발 환경</strong></span><br />
<span style="color: #99cc00"><strong> 하드웨어 개발 환경</strong></span><br />
· AVR Studio Version 4.17<br />
· WinAVR &#8211; 20100110<br />
· ATmega128 * 1<br />
· Windows 7(64bit)</p>
<p><span style="color: #99cc00"><strong>소프트웨어 개발 환경</strong></span><br />
· Microsoft Visual Studio 2010<br />
· C# Winform, OpenCV Sharp<br />
· Windows 7(64bit)</p>
<p><span style="color: #008000"><strong>하드웨어 제작 과정</strong></span><br />
<span style="color: #99cc00"><strong> 하드웨어 제작 환경</strong></span><br />
· 원가절감 및 제작편의성 고려, 알루미늄 프로파일사용 하드웨어 프레임 제작<br />
· 전원공급 회로 기판 제작 및 ATmega128 실장, GPIO 및 각종 입출력 회로 제작<br />
· AVR ATmega128을 이용한 Stepper Motor PWM 제어 및 유선 UART 통신 구현</p>
<p><span style="color: #99cc00"><strong>하드웨어 프레임 제작</strong></span><br />
· 알루미늄 프로파일 프레임 제작 및 구조물 장착<br />
· 도면작성 후 알루미늄 프로파일 발주 및 재단 의뢰</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2017/08/42-ict-outline-cnc-20.png" rel="lightbox[34008]"><img class="alignnone size-full wp-image-34033" alt="42 ict outline cnc (20)" src="http://www.ntrexgo.com/wp-content/uploads/2017/08/42-ict-outline-cnc-20.png" width="620" height="383" /></a> <a href="http://www.ntrexgo.com/wp-content/uploads/2017/08/42-ict-outline-cnc-21.png" rel="lightbox[34008]"><img class="alignnone size-full wp-image-34034" alt="42 ict outline cnc (21)" src="http://www.ntrexgo.com/wp-content/uploads/2017/08/42-ict-outline-cnc-21.png" width="620" height="379" /></a> <a href="http://www.ntrexgo.com/wp-content/uploads/2017/08/42-ict-outline-cnc-22.png" rel="lightbox[34008]"><img class="alignnone size-full wp-image-34035" alt="42 ict outline cnc (22)" src="http://www.ntrexgo.com/wp-content/uploads/2017/08/42-ict-outline-cnc-22.png" width="620" height="379" /></a> <a href="http://www.ntrexgo.com/wp-content/uploads/2017/08/42-ict-outline-cnc-23.png" rel="lightbox[34008]"><img class="alignnone size-full wp-image-34036" alt="42 ict outline cnc (23)" src="http://www.ntrexgo.com/wp-content/uploads/2017/08/42-ict-outline-cnc-23.png" width="620" height="379" /></a></p>
<p>프레임은 알루미늄 프로파일을 도면대로 재단하여 만들어졌습니다. 축 운반 시스템은 원가절감을 위해 책상 레일을 롤러로 사용하였으며, 모터의 회전을 동력으로 이용하기 위해 모터에 풀리와 타이밍 벨트를 달아 정밀한 제어가 가능하도록 하였습니다. 하판은 아크릴로 제작되어 인쇄될 대상을 지지해주고 있습니다.<br />
· 각 축 Stepper Motor 선별 및 구동 확인<br />
· 풀리 및 타이밍 벨트 장착, 운반 점검</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2017/08/42-ict-outline-cnc-24.png" rel="lightbox[34008]"><img class="alignnone size-full wp-image-34037" alt="42 ict outline cnc (24)" src="http://www.ntrexgo.com/wp-content/uploads/2017/08/42-ict-outline-cnc-24.png" width="620" height="379" /></a>  <a href="http://www.ntrexgo.com/wp-content/uploads/2017/08/42-ict-outline-cnc-1.jpg" rel="lightbox[34008]"><img class="alignnone  wp-image-34010" alt="42 ict outline cnc (1)" src="http://www.ntrexgo.com/wp-content/uploads/2017/08/42-ict-outline-cnc-1-575x620.jpg" width="620" /></a><a href="http://www.ntrexgo.com/wp-content/uploads/2017/08/42-ict-outline-cnc-25.png" rel="lightbox[34008]"><img class="alignnone size-full wp-image-34038" alt="42 ict outline cnc (25)" src="http://www.ntrexgo.com/wp-content/uploads/2017/08/42-ict-outline-cnc-25.png" width="620" height="383" /></a></p>
<p><span style="color: #99cc00"><strong>하드웨어 기판 제작</strong></span><br />
· ATmega128 장착을 위한 컨트롤러 기판 제작<br />
· MCU 및 스위치, 서보모터를 위한 정전압 회로 설계<br />
· I/O 소켓 배치 및 만능기판 납땜, 최종 조립</p>
<table style="width: 620px" border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td><a style="font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif;font-size: 13px" href="http://www.ntrexgo.com/wp-content/uploads/2017/08/42-ict-outline-cnc-34.png" rel="lightbox[34008]"><img class="alignnone size-large wp-image-34047" alt="42 ict outline cnc (34)" src="http://www.ntrexgo.com/wp-content/uploads/2017/08/42-ict-outline-cnc-34-620x341.png" width="620" height="341" /></a></td>
</tr>
<tr>
<td>
<p style="text-align: center">Stepper Motor 선별 및 Motor Driver, ATmega128 PWM 출력 테스트</p>
</td>
</tr>
</tbody>
</table>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2017/08/42-ict-outline-cnc-26.png" rel="lightbox[34008]"><img class="alignnone size-full wp-image-34039" alt="42 ict outline cnc (26)" src="http://www.ntrexgo.com/wp-content/uploads/2017/08/42-ict-outline-cnc-26.png" width="620" height="586" /></a></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2017/08/42-ict-outline-cnc-27.png" rel="lightbox[34008]"><img class="alignnone size-large wp-image-34040" alt="42 ict outline cnc (27)" src="http://www.ntrexgo.com/wp-content/uploads/2017/08/42-ict-outline-cnc-27-610x620.png" width="610" height="620" /></a></p>
<p><span style="color: #99cc00"><strong>ATmega128 펌웨어 개발</strong></span><br />
· ATmega128기반의 Stepper Motor제어 펌웨어 개발<br />
· Interrupt, UART통신을 이용한 PC와의 양방향 통신 실시<br />
· Stepper Motor X, Y축 동시제어(대각선 제어) 방법 연구 및 Servo Motor Z축 제어</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2017/08/42-ict-outline-cnc-2.jpg" rel="lightbox[34008]"><img alt="42 ict outline cnc (2)" src="http://www.ntrexgo.com/wp-content/uploads/2017/08/42-ict-outline-cnc-2.jpg" width="620" height="883" /></a></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2017/08/42-ict-outline-cnc-3.jpg" rel="lightbox[34008]"><img alt="42 ict outline cnc (3)" src="http://www.ntrexgo.com/wp-content/uploads/2017/08/42-ict-outline-cnc-3.jpg" width="620" height="746" /></a></p>
<p>· Stepper Motor X, Y축 동시제어(대각선 제어) 방법 연구 및 Servo Motor Z축 제어</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2017/08/42-ict-outline-cnc-28.png" rel="lightbox[34008]"><img class="alignnone size-full wp-image-34041" alt="42 ict outline cnc (28)" src="http://www.ntrexgo.com/wp-content/uploads/2017/08/42-ict-outline-cnc-28.png" width="620" height="430" /></a> <a href="http://www.ntrexgo.com/wp-content/uploads/2017/08/42-ict-outline-cnc-4.jpg" rel="lightbox[34008]"><img class="alignnone size-full wp-image-34016" alt="42 ict outline cnc (4)" src="http://www.ntrexgo.com/wp-content/uploads/2017/08/42-ict-outline-cnc-4.jpg" width="620" height="430" /></a></p>
<p><strong style="color: #008000">소프트웨어 제작 과정</strong></p>
<p><span style="color: #99cc00"><strong>소프트웨어 제작 환경</strong></span><br />
· Windows 기반 Outline CNC Plotter 제어 C# Windows Form 프로그램 개발<br />
· PC &lt;-&gt; ATmega128 양방향 UART 시리얼 통신 구현 및 프로토콜 정의<br />
· OpenCV를 이용한 이미지 외곽선 검출 및 이미지 픽셀 직접 제어를 통한 픽셀 추적 알고리즘 작성</p>
<p><span style="color: #99cc00"><strong>Windows 기반 C# Windows Form 프로그램 개발</strong></span></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2017/08/42-ict-outline-cnc-29.png" rel="lightbox[34008]"><img class="alignnone size-full wp-image-34042" alt="42 ict outline cnc (29)" src="http://www.ntrexgo.com/wp-content/uploads/2017/08/42-ict-outline-cnc-29.png" width="620" height="430" /></a><br />
1. 소프트웨어는 UART 시리얼통신 프로그램과 영상처리 프로그램을 따로 제작한 후 통합하였습니다.<br />
2. 1차적으로 ATmega128과의 UART 통신을 테스트하기 위한 프로그램을 제작하였습니다.<br />
3. UART 단방향 통신(PC ▶ ATmega128) 프로그램을 제작하여 모터제어를 테스트하였습니다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2017/08/42-ict-outline-cnc-30.png" rel="lightbox[34008]"><img alt="42 ict outline cnc (30)" src="http://www.ntrexgo.com/wp-content/uploads/2017/08/42-ict-outline-cnc-30.png" width="620" height="349" /></a></p>
<p>위는 최초 제작된 프로그램이며 #1의 넘버링을 가지고 있습니다. ATmega128 과의 UART 시리얼 통신을 위해 제작되었으며 ATmega128의 펌웨어와 연동하여 특정 LED를 OFF하거나 ON하고 모터를 움직여 축을 전개 혹은 축소할 수 있는 지령을 전달하는 기능이 있습니다. 또한 펌웨어로 미리 정의되어 있는 기능(지그재그)을 클릭하면 Outline CNC Plotter의 축이 자동적으로 움직여 지그재그로 선을 그려주는 기능이 시작됩니다. 이 기능은 모터의 직접 제어에서 오는 오차를 측정하기 위해 반복적으로 왕복운동을 하는 기능입니다. 스텝모터의 경우 1 Step당 움직이는 각이 정해져 있어 1방향 단순 제어가 용이합니다.</p>
<p>4. 펌웨어 제작과 동시에 모터제어 테스트를 진행하여 축 제어 속도 및 적정 토크를 찾아 정합니다.</p>
<p><span style="color: #99cc00"><strong>2) Windows 기반 C# Windows Form 프로그램 개발</strong></span></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2017/08/42-ict-outline-cnc-31.png" rel="lightbox[34008]"><img class="alignnone size-full wp-image-34044" alt="42 ict outline cnc (31)" src="http://www.ntrexgo.com/wp-content/uploads/2017/08/42-ict-outline-cnc-31.png" width="620" height="432" /></a></p>
<p><span style="color: #99cc00"><strong>3) 양방향 UART 시리얼 통신 구현 및 프로토콜 정의</strong></span></p>
<div class="symple-box gray none" style="text-align:left; width:100%;"> 
<p>ISR(USART0_RX_vect)<br />
{<br />
j = 0;<br />
receive = 1;<br />
data = UDR0;<br />
if (data != &#8216;p&#8217; &amp;&amp; data != &#8216;o&#8217; &amp;&amp; data != &#8216;r&#8217;)<br />
{<br />
if (serial_count &lt; 256)<br />
{<br />
serialdata[serial_count] = data;<br />
serial_count++;<br />
}<br />
else if (serial_count &gt;= 256 &amp;&amp; serial_count &lt; 512)<br />
{<br />
serialdata2[serial_count-(256)] = data;<br />
serial_count++;<br />
}<br />
else if (serial_count &gt;= 512 &amp;&amp; serial_count &lt; 768)<br />
{<br />
serialdata3[serial_count-(512)] = data;<br />
serial_count++;<br />
}<br />
else if (serial_count &gt;= 768 &amp;&amp; serial_count &lt; 1024)<br />
{<br />
serialdata4[serial_count-(768)] = data;<br />
serial_count++;<br />
}<br />
if (serial_count == SERIALSIZE)<br />
serial_count = 0;<br />
}</p>
<p>}</p>
<p>unsigned char get_data(void)<br />
{<br />
while(!(UCSR0A&amp;0&#215;80)); // 수신완료될때까지 대기<br />
return UDR0;<br />
}<br />
void send_data(unsigned char data)<br />
{<br />
while(!(UCSR0A&amp;0&#215;20)); // 송신데이터를 받을 준비가 될 때까지 대기<br />
UDR0 = data;<br />
}</p>
<p>UCSR0A = 0&#215;00; // ready flag clear<br />
UCSR0B = 0&#215;98; // rx, tx enable<br />
UCSR0C = 0&#215;06; // tx data len : 8bit</p>
<p>UBRR0H = 0;<br />
UBRR0L = 103; // boudrate 9600</p>
<p><strong>AVR코드소스 : 데이터 수신 인터럽트 및 USART 레지스터 설정</strong></p>
</div>
<p>1. 일부 문자를 제어문자로 지정하고(인쇄, 리셋, 데이터 재전송)그 이외의 문자를 지령으로 받습니다.<br />
2. PC의 C# Windows Form 프로그램에서 받은 데이터를 완수하면 완수신호를 지정하여 전송합니다.<br />
3. 최종적으로 C# Windows Form 프로그램과 ATmega128간 양방향 통신이 완성됩니다.</p>
<p><span style="color: #99cc00"><strong>4) 이미지 처리 프로그램 제작</strong></span><br />
· OpenCV를 활용한 이미지 이진화 및 케니엣지 외곽선 검출<br />
· 픽셀간 최소거리 및 연속 픽셀 추적 알고리즘 구현</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2017/08/42-ict-outline-cnc-32.png" rel="lightbox[34008]"><img class="alignnone size-full wp-image-34045" alt="42 ict outline cnc (32)" src="http://www.ntrexgo.com/wp-content/uploads/2017/08/42-ict-outline-cnc-32.png" width="620" height="492" /></a></p>
<p>&nbsp;</p>
<div class="symple-box gray none" style="text-align:left; width:100%;"> 
<p>public int PixelAccess3(IplImage src) // 픽셀 추적하는 알고리즘<br />
{<br />
if (Cv.Get2D(src, tracky &#8211; 1, trackx) == 0) // 위로한칸<br />
{<br />
//Commandbox.Text += &#8220;8&#8243;;<br />
Cv.Set2D(result, tracky &#8211; 1, trackx, 255);<br />
tracky = tracky &#8211; 1;<br />
return 8;<br />
}<br />
else if (Cv.Get2D(src, tracky &#8211; 1, trackx + 1) == 0) // 위로, 우로한칸<br />
{<br />
//Commandbox.Text += &#8220;7&#8243;;<br />
Cv.Set2D(result, tracky &#8211; 1, trackx + 1, 255);<br />
Cv.Set2D(result, tracky, trackx + 1, 255);<br />
tracky = tracky &#8211; 1;<br />
trackx = trackx + 1;<br />
return 7;<br />
}<br />
else if (Cv.Get2D(src, tracky, trackx + 1) == 0) // 우로한칸<br />
{<br />
//Commandbox.Text += &#8220;4&#8243;;<br />
Cv.Set2D(result, tracky, trackx + 1, 255);<br />
trackx = trackx + 1;<br />
return 4;<br />
}<br />
else if (Cv.Get2D(src, tracky + 1, trackx) == 0) // 아래로한칸<br />
{<br />
//Commandbox.Text += &#8220;2&#8243;;<br />
Cv.Set2D(result, tracky + 1, trackx, 255);<br />
tracky = tracky + 1;<br />
return 2;<br />
}<br />
else if (Cv.Get2D(src, tracky + 1, trackx + 1) == 0) // 우측 아래로 한칸<br />
{<br />
//Commandbox.Text += &#8220;1&#8243;;<br />
Cv.Set2D(result, tracky + 1, trackx + 1, 255);</p>
<p>Cv.Set2D(result, tracky, trackx + 1, 255);<br />
tracky = tracky + 1;<br />
trackx = trackx + 1;<br />
return 1;<br />
}<br />
else if (Cv.Get2D(src, tracky &#8211; 1, trackx &#8211; 1) == 0) // 좌측 위로 한칸<br />
{<br />
//Commandbox.Text += &#8220;9&#8243;;<br />
Cv.Set2D(result, tracky &#8211; 1, trackx &#8211; 1, 255);<br />
Cv.Set2D(result, tracky, trackx &#8211; 1, 255);<br />
tracky = tracky &#8211; 1;<br />
trackx = trackx &#8211; 1;<br />
return 9;<br />
}<br />
else if (Cv.Get2D(src, tracky, trackx &#8211; 1) == 0) // 좌로한칸<br />
{<br />
//Commandbox.Text += &#8220;6&#8243;;<br />
Cv.Set2D(result, tracky, trackx &#8211; 1, 255);<br />
trackx = trackx &#8211; 1;<br />
return 6;<br />
}<br />
else if (Cv.Get2D(src, tracky + 1, trackx &#8211; 1) == 0) // 좌측 아래로 한칸<br />
{<br />
//Commandbox.Text += &#8220;3&#8243;;<br />
Cv.Set2D(result, tracky + 1, trackx &#8211; 1, 255);<br />
Cv.Set2D(result, tracky, trackx &#8211; 1, 255);<br />
tracky = tracky + 1;<br />
trackx = trackx &#8211; 1;<br />
return 3;<br />
}<br />
else<br />
{<br />
//Commandbox.Text += &#8220;5&#8243;;<br />
return 5;<br />
}<br />
}</p>
<p><strong>C# 소스코드 : 8방향 픽셀 추적 소스코드</strong><br />
</div>
<p>조건이 True인 반복문에서, 픽셀 추적 중 중단점에 봉착시 특정 값을 반환하며 Break됩니다.</p>
<p><strong><span style="color: #99cc00">5) 프로그램 통합</span></strong><br />
· UART 양방향 통신 프로그램과 OpenCV 이미치 처리 프로그램 통합</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2017/08/42-ict-outline-cnc-33.png" rel="lightbox[34008]"><img class="alignnone size-full wp-image-34046" alt="42 ict outline cnc (33)" src="http://www.ntrexgo.com/wp-content/uploads/2017/08/42-ict-outline-cnc-33.png" width="620" height="369" /></a></p>
<p><span style="color: #008000"><strong>기타 사항</strong></span><br />
<span style="color: #99cc00"><strong>1) 회로도</strong></span></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2017/08/42-ict-outline-cnc-34.png" rel="lightbox[34008]"><img class="alignnone size-large wp-image-34047" alt="42 ict outline cnc (34)" src="http://www.ntrexgo.com/wp-content/uploads/2017/08/42-ict-outline-cnc-34-620x341.png" width="620" height="341" /></a></p>
<p><span style="color: #99cc00"><strong> 2) 참고문헌</strong></span><br />
· [ITC] AVR ATmega128 마이크로컨트롤러 &#8211; 프로그래밍과 인터페이싱<br />
· NEWTC Stepper Motor 구동모듈 (CS2P) Spec 페이지(http://www.newtc.co.kr/dpshop/shop/item.php?it_id=1314666703)<br />
· NEWTC Stepper Motor (SE-SM243) Spec 페이지(http://www.newtc.co.kr/dpshop/shop/item.php?it_id=1314664246)<br />
· ATmel ATmega128 Datasheet 페이지(http://www.atmel.com/images/doc2467.pdf)</p>
<p><span style="color: #99cc00"><strong>3) 시연영상</strong></span></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2017/08/Cap-2017-08-14-14-39-19-239.jpg" rel="lightbox[34008]"><img class="alignnone size-large wp-image-34055" alt="Cap 2017-08-14 14-39-19-239" src="http://www.ntrexgo.com/wp-content/uploads/2017/08/Cap-2017-08-14-14-39-19-239-620x310.jpg" width="620" height="310" /></a></p>
<p><a title="https://www.youtube.com/watch?v=xquj91EeptA" href="https://www.youtube.com/watch?v=xquj91EeptA"><span style="text-decoration: underline">https://www.youtube.com/watch?v=xquj91EeptA</span></a></p>
<p><a href="https://www.youtube.com/watch?v=r8UjbZxuiPQ" target="_blank"><span style="text-decoration: underline">https://www.youtube.com/watch?v=r8UjbZxuiPQ</span></a></p>
<p><a href="https://www.youtube.com/watch?v=0zRe_e5YE6g" target="_blank"><span style="text-decoration: underline">https://www.youtube.com/watch?v=0zRe_e5YE6g</span></a></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ntrexgo.com/archives/34008/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[36호]반딧불이, 센서 부착 맹인 지팡이</title>
		<link>http://www.ntrexgo.com/archives/31213</link>
		<comments>http://www.ntrexgo.com/archives/31213#comments</comments>
		<pubDate>Fri, 20 May 2016 01:11:56 +0000</pubDate>
		<dc:creator>디바이스마트 매거진</dc:creator>
				<category><![CDATA[디바이스마트 매거진]]></category>
		<category><![CDATA[특집]]></category>
		<category><![CDATA[36호]]></category>
		<category><![CDATA[Feature]]></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=31213</guid>
		<description><![CDATA[디바이스마트 매거진 36호 &#124; 기존의 지팡이는 장애물의 거리와 위치를 정확히 인지시켜 주지 못하기 때문에 충돌위험이 있고 점자블록이 있다고 하더라도 사용자가 완벽히 인지하긴 무리가 있다. 반딧불이는 시각 장애인들이 기존보다 더욱 안전하게 보행할 수 있도록 도움을 줄 것이다.]]></description>
				<content:encoded><![CDATA[<p><a href="http://www.ntrexgo.com/wp-content/uploads/2015/11/2014-ict-메인.jpg" rel="lightbox[31213]"><img class="alignnone size-large wp-image-30006" alt="2014 ict 메인" src="http://www.ntrexgo.com/wp-content/uploads/2015/11/2014-ict-메인-620x150.jpg" width="620" height="150" /></a></p>
<p><span style="font-size: large;color: #ffffff;background-color: #000000"><strong>2015 ICT 융합 프로젝트 공모전 우수상</strong></span></p>
<p><span style="font-size: xx-large"><strong>반딧불이, 센서 부착 맹인 지팡이</strong></span></p>
<p style="text-align: right">글 | 동양미래대학교 권영제, 김건희, 정원희, 정예진, 전병천, 피은영</p>
<p><span style="font-size: medium;color: #ff6600"><strong>심사평</strong></span></p>
<p><span style="color: #ffffff;background-color: #000080">펌테크</span> 아이디어가 돋보이는 제품으로 실생활에서 맹인에게 실제 도움을 줄 수 있는 제품으로 충분한 상업적 가치가 있다고 생각합니다. 완제품으로 개발 경량화 및 신뢰성 확보 부분에 관한 연구가 좀 더 진행되어야 할것 으로 생각됩니다.</p>
<p><span style="color: #ffffff;background-color: #000080">JK전자 </span>기술적으로는 구현하는데 그리 어려운 점이 없지만, 시각 장애인들에게 꼭 필요한, 굉장히 유용한 도구를 아이디어로 구현했다. 진동 모터를 이용하여 지팡이를 사용하는 사람이 다른사람을 의식하지 않고 위험 요소를 전달받을 수 있게 한 점도 좋은 아이디어이다. 다양한 실전 테스트를 거쳐 저렴하게 보급이 된다면 아주 유익한 제품임에 틀림이 없다.</p>
<p><span style="color: #ffffff;background-color: #000080">뉴티씨 </span>장애인들과 같은 사회적 약자에 대한 관심과 적극적인 도움은 항상 필요하다. 이 작품은 장애인 중 맹인들에 대한 필수 제품이라고 할 수 있겠다. 맹인들의 보조눈이 될 수 있는 제품으로, 배터리가 오래가도록 하며, 가볍게 만드는 것이 관건이라고 하겠다. 다만, 기술적으로는 크게 어려움이 없는 제품이다. 기능 면에서는 관련된 기능들이 잘 동작할 경우, 기획된 점들은 구석구석 기능을 잘 계획하였으므로 동작면에서만 실제 맹인들이 사용하도록 하여, 잘 보완하면 좋은 제품이 될 것 같다. 항상 그렇지만, 동작하는 정도에 그치는 것과 실제 사용할 수 있는 제품을 만드는 것은 하늘과 땅 차이로, 매우 많은 자본과 시간이 투여되고 구현도 어려워진다. 하지만, 이러한 점들을 잘 극복하고 좋은 제품을 만드는 것이 엔지니어들의 몫인 것 같다. 창의성과 실용성 및 완성도 등에 높은 점수를 주었다.</p>
<p><span style="color: #ffffff;background-color: #000080">칩센</span> 맹인들을 위한 제품에 대해서는 창의적인 아이디어인것 같다. 실제로 맹인들이 사용하기에는 무겁고 복잡하지 않을 까라는 생각이 든다. 사람이 많은 곳이나 장애물이 많은 곳에서는 센서동작이 항시 작용될 것으로 보인다. 배터리를 충분히 사용할 수 있도록 보안이 필요해보인다. 진동으로 감지 하는 방법 외 다른 방법으로 알림설정이 추가로 있으면 좋겠으며, 맹인들이 주위에 있다는걸 알리는 방법도 맹인들이 길을 다니기에는 조금 도움이 되지 않을까 한다.</p>
<p><span style="color: #ffffff;background-color: #000080">위드로봇 </span>작품의 컨셉, 구현 완성도가 훌륭합니다. 색상 인식의 경우 실제에서는 오염에 의한 오인식이 발생할 것이고, 이것에 대한 대처가 필요해 보입니다. 또한 장애인을 대상으로 하는 작품일 경우 어렵겠지만 장애인과 한 번 접촉하여 어떤 점이 정말 필요한 것인지 문의해 볼 필요가 있습니다. 실제 맹인의 경우 일반인이 느끼는 진동모터의 진동을 수 십배 이상으로 느끼기 때문에 해당 지팡이를 조금만 사용해도 손의 감각이 쉬 피로해지는 현상을 호소할 수 있습니다. 실제로 많은 정부 과제에서 본 작품과 비슷한 장애인용 지팡이 개발이 진행되었고 또 그에 따른 연구 결과들이 많이 공개되어 있습니다. 이런 내용을 참고하여 기존 연구와 차별성을 설명했으면 더 좋았을 것 같습니다.</p>
<p><span style="font-size: medium;color: #ff6600"><strong>작품 개요</strong></span></p>
<p>사실 이 작품을 만들게 된 계기는 간단했다. 밤늦게 집으로 가는 길에 옆으로 누군가 휙하니 지나가는데 맹인이었다. 어떤 작품을 만들지 고심하던 터였는데 혹시 구상이 떠오르지 않을까 싶어서 한참을 지켜보고 난 후 다가가 혹시 지팡이를 사용하는데 애로사항이 있는지와 다른 얘기들을 나누어 봤는데, 우리가 생각하는 것보다 불편하고 위험한 것들이 많이 있는 것을 알고 난 후, 마음이 좋지 못했다. 그래서 기존의 지팡이에 센서를 부착한다면 보다 사용하기 수월하지 않을까하는 생각에 제작에 임하였는데 의외로 이러한 것들이 외국에는 존재했지만 홍보가 부족했는지 사용자는 적었고, 국내에는 거의 전무하였다. 기존의 센서 지팡이가 있으므로 이를 모방했다는 오해를 받기 싫어 더욱 차별성을 두려고 센서의 위치와 각도에 신경을 쓰고 센서들을 추가시키는 등, 많은 신경을 써보았다.<br />
시각 장애인은 안전하게 보행하기 위해 지팡이를 사용하거나 안내견과 동행한다. 하지만 기존의 방법에는 여러 가지 문제가 있다. 먼저 안내견은 장기간의 훈련이 필요하여 많은 시간과 비용이 소모된다. 또한 기존의 지팡이는 장애물의 거리와 위치를 정확히 인지시켜 주지 못하기 때문에 충돌위험이 있고 점자블록이 있다고 하더라도 사용자가 완벽히 인지하긴 무리가 있다. 이에 시각장애인은 위험에 노출되어 있는데, 이런 문제점으로 복잡한 도심 속에서 시각 장애인이 기존의 지팡이에만 의존하여 보행하기엔 많은 어려움이 있다는 생각을 했다. 그래서 더욱 안전하게 보행할 수 있도록 도움을 줄 수 있는 장치들을 고려해 본 결과, 초음파 센서와 적외선 센서로 위험수준을 거리로 측정하고 색상 인식센서로 점자블럭의 노란색을 인지한다. 조도센서를 이용하여 터널과 같은 어두운 곳을 지날 때 LED가 자동적으로 켜지도록 조치한다. 그리고 조도센서를 제외한 센서의 지정된 값을 인식했을 때 진동모터로 전달토록 했다. 이러한 작품 (반딧불이)을 사용함으로써 안내견을 훈련시키는 사회적 복지 비용을 절감할 수 있고, 시각 장애인들이 기존보다 더욱 안전하게 보행할 수 있도록 도움을 줄 것이다.<br />
작품명은 밤하늘을 수놓는 마치 한 마리의 반딧불이와 같이 이러한 지팡이가 얼른 상용화되어 시각장애인들이 걷는 그 어두운 길을 따라 비추어주어 불편함 없이 행복하게 지내기를 고대하며 글을 마친다.</p>
<p><span style="font-size: medium;color: #ff6600"><strong>사용 부품 및 설명</strong></span></p>
<table style="border-color: #e5e5e5;border-width: 1px;;width: 620px" border="1" cellspacing="0" cellpadding="3">
<tbody>
<tr>
<td>부품사진</td>
<td>재료명</td>
<td>사용이유</td>
</tr>
<tr>
<td><a href="http://www.ntrexgo.com/wp-content/uploads/2016/05/36-ict-hyj-1.jpg" rel="lightbox[31213]"><img class="alignnone  wp-image-31215" alt="36 ict hyj (1)" src="http://www.ntrexgo.com/wp-content/uploads/2016/05/36-ict-hyj-1.jpg" width="230" /></a></td>
<td>색상 인식 센서</td>
<td>점자 블록의 노란색을 인식하여 횡단보도가 전방에 있음을 알려줘서 사용자가 위험에 노출되지 않도록 이끌어준다.</td>
</tr>
<tr>
<td><a href="http://www.ntrexgo.com/wp-content/uploads/2016/05/36-ict-hyj-2.jpg" rel="lightbox[31213]"><img class="alignnone  wp-image-31217" alt="36 ict hyj (2)" src="http://www.ntrexgo.com/wp-content/uploads/2016/05/36-ict-hyj-2.jpg" width="230" /></a></td>
<td>조도 센서</td>
<td>LED와 연결하여 주위가 어두워지면 조도센서의 저항 값이 낮아져 LED가 점등되고 주위가 밝아지면 조도센서의 저항 값이 높아지는 원리로 LED가 소등된다.<br />
터널이나 야간과 같은 어두운 공간에서 LED가 점등되도록 제어하는 역할이다.</td>
</tr>
<tr>
<td><a href="http://www.ntrexgo.com/wp-content/uploads/2016/05/36-ict-hyj-3.jpg" rel="lightbox[31213]"><img class="alignnone  wp-image-31219" alt="36 ict hyj (3)" src="http://www.ntrexgo.com/wp-content/uploads/2016/05/36-ict-hyj-3.jpg" width="230" /></a></td>
<td>적외선 센서</td>
<td>지팡이와 지면과의 거리를 감지하여<br />
비탈길이나 계단 그리고, 낭떠러지가 있음을 알리는 역할을 담당한다.</td>
</tr>
<tr>
<td><a href="http://www.ntrexgo.com/wp-content/uploads/2016/05/36-ict-hyj-4.jpg" rel="lightbox[31213]"><img class="alignnone  wp-image-31220" alt="36 ict hyj (4)" src="http://www.ntrexgo.com/wp-content/uploads/2016/05/36-ict-hyj-4.jpg" width="230" /></a></td>
<td>초음파 센서</td>
<td>초음파를 수신, 발신의 역할로 구성되어 있는 센서로 거리를 측정하여 전방과 상방의 장애물 유무를 감지하여 사용자에게 전달한다.</td>
</tr>
<tr>
<td><a href="http://www.ntrexgo.com/wp-content/uploads/2016/05/36-ict-hyj-5.jpg" rel="lightbox[31213]"><img class="alignnone  wp-image-31221" alt="36 ict hyj (5)" src="http://www.ntrexgo.com/wp-content/uploads/2016/05/36-ict-hyj-5.jpg" width="230" /></a></td>
<td>진동 모터</td>
<td>초음파 센서, 적외선 센서, 색상 인식 센서와 연동시켜 각각 다른 딜레이를 줘서 진동으로 인식한 값을 전달시켜준다.</td>
</tr>
<tr>
<td><a href="http://www.ntrexgo.com/wp-content/uploads/2016/05/36-ict-hyj-6.jpg" rel="lightbox[31213]"><img class="alignnone  wp-image-31222" alt="36 ict hyj (6)" src="http://www.ntrexgo.com/wp-content/uploads/2016/05/36-ict-hyj-6.jpg" width="230" /></a></td>
<td>LED</td>
<td>터널과 같은 어두운 공간의 조도센서는 LED를 자동적으로 점등시켜 사용자의 위치를 타인에게 알려주도록 한다..</td>
</tr>
<tr>
<td><a href="http://www.ntrexgo.com/wp-content/uploads/2016/05/36-ict-hyj-7.jpg" rel="lightbox[31213]"><img class="alignnone  wp-image-31223" alt="36 ict hyj (7)" src="http://www.ntrexgo.com/wp-content/uploads/2016/05/36-ict-hyj-7.jpg" width="230" /></a></td>
<td>Arduino UNO</td>
<td>사용되는 모든 센서를 코딩, 구동시키기 위해서 메인보드로는 UNO를 사용하였다.</td>
</tr>
<tr>
<td><a href="http://www.ntrexgo.com/wp-content/uploads/2016/05/36-ict-hyj-8.jpg" rel="lightbox[31213]"><img class="alignnone  wp-image-31224" alt="36 ict hyj (8)" src="http://www.ntrexgo.com/wp-content/uploads/2016/05/36-ict-hyj-8.jpg" width="230" /></a></td>
<td>배터리</td>
<td>Arduino UNO의 전원을 공급해주기 위해서 3.7V 리튬이온 건전지 2개를 사용하였다.</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<p><strong style="color: #ff9900">주요 동작 및 특징</strong></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/05/36-ict-hyj-9.jpg" rel="lightbox[31213]"><img class="size-full wp-image-31225 aligncenter" alt="36 ict hyj (9)" src="http://www.ntrexgo.com/wp-content/uploads/2016/05/36-ict-hyj-9.jpg" width="527" height="337" /></a></p>
<p><strong>1. 초음파 센서(3m) :</strong> 기존의 지팡이는 전방의 장애물의 유무를 미리 알기 어려워 지팡이의 아래쪽에 초음파 센서를 추가함으로써 최대 전방 3m 안의 위험 요소 여부를 손잡이의 진동으로 알린다.<br />
<br />
<strong>2. 초음파 센서(2m) :</strong> 또, 지팡이의 중반부에 추가한 초음파 센서로 낮은 천장 등 2m 내에 있는 상방의 장애물을 감지하여 진동으로 위험을 알린다.</p>
<p><strong>3. 색상인식 센서</strong>는 지팡이의 하단부에 부착되어 횡단보도 앞 점자 블록, 계단의 안내선 등 맹인을 인도하는 노란 선을 인지하고 진동 모터가 부착된 손잡이에 진동을 울려 노란 선의 여부를 알려준다.</p>
<p><strong>4. 적외선 센서</strong>는 내리막길이나 움푹 파인 도로 등 하방의 빈 공간을 인지하여 진동으로 알려준다.</p>
<p><strong>5. 조도 센서</strong>는 어두운 밤길, 안개 낀 날에 주변의 어두움을 감지하여 LED를 점등시켜 시각 장애인의 존재를 타인에게 알린다.</p>
<p><strong>6. 진동 모터</strong>는 손잡이에 부착하여 적외선 센서, 색상 인식 센서, 초음파 센서 등과 연동하여 진동으로 모든 위험을 알린다.</p>
<p><span style="color: #ff9900"><strong>기존의 지팡이와 비교</strong></span></p>
<table style="border: 1px solid #e5e5e5;width: 620px" border="1" cellspacing="0" cellpadding="3">
<tbody>
<tr>
<td width="100"></td>
<td style="text-align: center" width="260">기존의 지팡이</td>
<td style="text-align: center" width="260">진동 지팡이</td>
</tr>
<tr>
<td style="text-align: center" width="100">외형</td>
<td width="260"><a href="http://www.ntrexgo.com/wp-content/uploads/2016/05/36-ict-hyj-10.jpg" rel="lightbox[31213]"><img class="wp-image-31226 aligncenter" alt="36 ict hyj (10)" src="http://www.ntrexgo.com/wp-content/uploads/2016/05/36-ict-hyj-10-260x300.jpg" height="200" /></a></td>
<td width="260"><a href="http://www.ntrexgo.com/wp-content/uploads/2016/05/36-ict-hyj-11.jpg" rel="lightbox[31213]"><img class="wp-image-31227 aligncenter" alt="36 ict hyj (11)" src="http://www.ntrexgo.com/wp-content/uploads/2016/05/36-ict-hyj-11-300x228.jpg" height="200" /></a></td>
</tr>
<tr>
<td style="text-align: center" width="100">장애물 감지</td>
<td width="260">지팡이의 끝으로 땅을 직접 접촉하여 바닥에 위치한 장애물만 인지할 수 있기 때문에 안전성이 떨어진다.</td>
<td width="260">기존의 지팡이와 같이 땅을 직접적으로 접촉해 느낄 수 있고, 부착한 센서로 장애물을 감지하고 진동을 울리기 때문에 바닥뿐만 아니라 전방, 상방의 장애물의 유무를 미리 알고 피할 수 있다.</td>
</tr>
<tr>
<td style="text-align: center" width="100">타인에게 알림</td>
<td width="260">맹인안전지팡이는 흰색을  사용하여야하기 때문에 밝을 때는 분간이 쉽지만 어두워지면 쉽게 눈에 띄지 않아 위험하다.</td>
<td width="260">흰색 지팡이를 그대로 사용하여 본래의 목적을 보존하되, 지팡이에 두른 흰색 반사 테이프와, 조도 센서에 의해 점등되는 LED가 지팡이를 밝히기 때문에 시각장애인이 밤에 이동하거나 어두운 곳에 있을 때 타인이 맹인의 존재와 위치를 쉽게 알아차릴 수 있다.</td>
</tr>
<tr>
<td style="text-align: center" width="100">편의성</td>
<td width="260">개선 전 지팡이는 접이식   지팡이로 휴대가 용이하다.</td>
<td width="260">지팡이가 접히는 위치에 맞춰서 반사 테이프를 나눠 붙였기 때문에 접이식이 가능해 편리하게 휴대 가능하고, 지팡이에 부착한 센서 전체에 방수 스프레이를 뿌려 물과 습기로부터 부품을 보호해서 손상을 방지한다.&nbsp;</p>
<p><span style="color: #999999">(사실 지팡이에 전선을 넣고 접히는 곳에 신축성이 있는 재질의 물질을 덮으려 했지만 시간적 여유와 재정적 상황에 의해 무산되었다.)</span></td>
</tr>
</tbody>
</table>
<p><strong><span style="color: #ff9900">회로와 소스 코드</span></strong></p>
<p><strong>색상인식센서</strong></p>
<div class="symple-box yellow none" style="text-align:left; width:100%;"> 
<p>int s0=3,s1=4,s2=5,s3=6;<br />
int out=2;ㅍ<br />
int flag=0;<br />
byte counter=0;<br />
byte countR=0,countG=0,countB=0;</p>
<p>void setup()<br />
{<br />
Serial.begin(9600);<br />
pinMode(s0,OUTPUT);<br />
pinMode(s1,OUTPUT);<br />
pinMode(s2,OUTPUT);<br />
pinMode(s3,OUTPUT);</p>
<p>}</p>
<p>void TCS()<br />
{<br />
flag=0;<br />
digitalWrite(s1,HIGH);<br />
digitalWrite(s0,HIGH);<br />
digitalWrite(s2,LOW);<br />
digitalWrite(s3,LOW);<br />
attachInterrupt(0, ISR_INTO,LOW);<br />
timer0_init();<br />
}</p>
<p>void ISR_INTO()<br />
{<br />
counter++;<br />
}</p>
<p>void timer0_init(void)<br />
{<br />
TCCR2A=0&#215;00;<br />
TCCR2B=0&#215;07; // the clock frequeny source 1024 points<br />
TCNT2=100; //10 ms overflow again<br />
TIMSK2 = 0&#215;01; //allov interruput<br />
}</p>
<p>int i=0;</p>
<p>ISR(TIMER2_OVF_vect)// the timer 2,10ms interrupt overflow again.Internal<br />
// overflow interrupt excutive function</p>
<p>{<br />
TCNT2=100;<br />
flag++;<br />
if(flag==1)<br />
{<br />
countR=counter;<br />
Serial.print(&#8220;red=&#8221;);<br />
Serial.print(countR,DEC);<br />
digitalWrite(s2,HIGH);<br />
digitalWrite(s3,HIGH);<br />
}<br />
else if(flag==2)<br />
{<br />
countG=counter;<br />
Serial.print(&#8221; green=&#8221;);<br />
Serial.print(countG,DEC);<br />
digitalWrite(s2,LOW);<br />
digitalWrite(s3,HIGH);<br />
}<br />
else if(flag==3)<br />
{<br />
countB=counter;<br />
Serial.print(&#8221; blue=&#8221;);<br />
Serial.println(countB,DEC);<br />
digitalWrite(s2,LOW);<br />
digitalWrite(s3,LOW);<br />
}<br />
else if(flag==4)<br />
{<br />
flag=0;<br />
}<br />
counter=0;<br />
}</p>
<p>void loop()<br />
{<br />
TCS();<br />
while(1);<br />
}<br />
</div>
<p><strong>적외선센서</strong><br />
<strong> </strong></p>
<div class="symple-box yellow none" style="text-align:left; width:100%;"> 
<p>const int sensorPin = A1;<br />
const int M=8;</p>
<p>void setup()<br />
{<br />
Serial.begin(9600);<br />
pinMode(M,OUTPUT);<br />
pinMode(sensorPin,INPUT);<br />
}</p>
<p>void loop()<br />
{</p>
<p>long distance=0;<br />
distance = 12343.85 * pow(analogRead(sensorPin),-1.15);<br />
Serial.print(&#8220;distance : &#8220;);<br />
Serial.print(distance);<br />
Serial.println(&#8220;cm&#8221;);</p>
<p>if(0&lt;distance&lt;50)<br />
{<br />
digitalWrite(M,HIGH);<br />
}<br />
else{<br />
digitalWrite(M,LOW);<br />
}<br />
}</p>
</div>
<p><strong>조도센서</strong></p>
<div class="symple-box yellow none" style="text-align:left; width:100%;"> 
<p>const int T = 1;// T = SENSOR<br />
const int J = 0;// J = SERSOR VALUE<br />
const int L=7;<br />
void setup()<br />
{<br />
Serial.begin(9600);<br />
pinMode(T,INPUT);<br />
pinMode(L,OUTPUT);<br />
}<br />
void loop()<br />
{<br />
Serial.println(J);<br />
J = analogRead(T);<br />
if( J &gt; 300 )<br />
{<br />
digitalWrite(L,LOW);<br />
}else{<br />
digitalWrite(L,HIGH);<br />
}<br />
}<br />
</div>
<p>초음파센서 소스 코드</p>
<div class="symple-box yellow none" style="text-align:left; width:100%;"> 
<p>int ultras=A4;<br />
int ultras2=A3;<br />
const int M = 9;<br />
const int M2 = 8;<br />
const int M3 = 7;</p>
<p>void setup()<br />
{<br />
Serial.begin(9600);<br />
}<br />
void Sultras()<br />
{<br />
long td=0;<br />
float dist=0;</p>
<p>pinMode(ultras, OUTPUT);<br />
digitalWrite(ultras,LOW);<br />
delayMicroseconds(2);<br />
digitalWrite(ultras,HIGH);<br />
delayMicroseconds(5);<br />
digitalWrite(ultras, LOW);<br />
pinMode(ultras,INPUT);<br />
td = pulseIn(ultras, HIGH);</p>
<p>dist= td/29./2.;</p>
<p>if(0&lt;=dist&lt;50)<br />
{<br />
digitalWrite(M,HIGH);<br />
digitalWrite(M2,HIGH);<br />
}<br />
else if(150&gt;=dist&gt;50)<br />
{<br />
digitalWrite(M,LOW);<br />
digitalWrite(M2,HIGH);<br />
}<br />
else if (dist&gt;250)<br />
{<br />
digitalWrite(M,LOW);<br />
digitalWrite(M2,LOW);<br />
}<br />
else<br />
{<br />
digitalWrite(M, HIGH);<br />
digitalWrite(M2,LOW);<br />
}<br />
Serial.print(dist);<br />
}</p>
<p>void Sultras2()<br />
{<br />
long tds=0;<br />
float dist2=0;</p>
<p>pinMode(ultras2, OUTPUT);<br />
digitalWrite(ultras2,LOW);<br />
delayMicroseconds(2);<br />
digitalWrite(ultras2,HIGH);<br />
delayMicroseconds(5);<br />
digitalWrite(ultras2, LOW);<br />
pinMode(ultras2,INPUT);<br />
tds = pulseIn(ultras2, HIGH);</p>
<p>dist2= tds/29./2.;</p>
<p>if(0&lt;=dist2&lt;200)<br />
{<br />
digitalWrite(M3,HIGH);<br />
}else{<br />
digitalWrite(M3,LOW);<br />
}<br />
Serial.print(&#8221; &#8220;);<br />
Serial.println(dist2);<br />
}</p>
<p>void loop()<br />
{<br />
Sultras();<br />
Sultras2();<br />
}</p>
</div>
<p><span style="font-size: medium;color: #ff6600"><strong>단계별 제작 과정</strong></span><br />
<strong> </strong></p>
<p><strong style="color: #ff9900">부품 구입</strong></p>
<p><strong>(1) 초음파, 적외선, 색상 인식, 조도 센서와 기존의 역할을 담당하는 맹인 지팡이를 구입, 또한 습도에 의한 부식,고장을 방지하기 위해 방수 스프레이를 구비해두었다.</strong></p>
<p><span style="color: #ff9900"><strong>회로 구성 및 코딩 작업</strong></span><br />
<strong>(1) 각 센서마다 소스코드를 입력하여 딜레이와 일정 조건을 코딩했다.</strong></p>
<p><strong>(2) 회로도</strong></p>
<table style="width: 620px" border="0" cellspacing="0" cellpadding="2">
<tbody>
<tr>
<td><a href="http://www.ntrexgo.com/wp-content/uploads/2016/05/36-ict-hyj-13.jpg" rel="lightbox[31213]"><img class="alignnone size-large wp-image-31229" alt="36 ict hyj (13)" src="http://www.ntrexgo.com/wp-content/uploads/2016/05/36-ict-hyj-13-620x354.jpg" width="620" height="354" /></a></td>
</tr>
<tr>
<td style="text-align: center">색상 인식 센서</td>
</tr>
<tr>
<td><a href="http://www.ntrexgo.com/wp-content/uploads/2016/05/36-ict-hyj-14.jpg" rel="lightbox[31213]"><img class="alignnone size-large wp-image-31230" alt="36 ict hyj (14)" src="http://www.ntrexgo.com/wp-content/uploads/2016/05/36-ict-hyj-14-620x578.jpg" width="620" height="578" /></a></td>
</tr>
<tr>
<td style="text-align: center">초음파 센서</td>
</tr>
<tr>
<td><a href="http://www.ntrexgo.com/wp-content/uploads/2016/05/36-ict-hyj-15.jpg" rel="lightbox[31213]"><img class="alignnone size-large wp-image-31231" alt="36 ict hyj (15)" src="http://www.ntrexgo.com/wp-content/uploads/2016/05/36-ict-hyj-15-620x385.jpg" width="620" height="385" /></a></td>
</tr>
<tr>
<td style="text-align: center">적외선 센서</td>
</tr>
<tr>
<td><a href="http://www.ntrexgo.com/wp-content/uploads/2016/05/36-ict-hyj-16.jpg" rel="lightbox[31213]"><img class="alignnone size-large wp-image-31232" alt="36 ict hyj (16)" src="http://www.ntrexgo.com/wp-content/uploads/2016/05/36-ict-hyj-16-620x361.jpg" width="620" height="361" /></a></td>
</tr>
<tr>
<td style="text-align: center">조도 센서</td>
</tr>
</tbody>
</table>
<p><strong>3) 지팡이에 연결, 하드웨어 작업</strong></p>
<table style="width: 620px" border="0" cellspacing="0" cellpadding="2">
<tbody>
<tr>
<td><a href="http://www.ntrexgo.com/wp-content/uploads/2016/05/36-ict-hyj-17.jpg" rel="lightbox[31213]"><img class="alignnone size-large wp-image-31233" alt="36 ict hyj (17)" src="http://www.ntrexgo.com/wp-content/uploads/2016/05/36-ict-hyj-17-620x280.jpg" width="620" height="280" /></a></td>
</tr>
<tr>
<td style="text-align: center">(1) 초음파 센서</td>
</tr>
<tr>
<td><a href="http://www.ntrexgo.com/wp-content/uploads/2016/05/36-ict-hyj-18.jpg" rel="lightbox[31213]"><img class="alignnone size-large wp-image-31234" alt="36 ict hyj (18)" src="http://www.ntrexgo.com/wp-content/uploads/2016/05/36-ict-hyj-18-620x274.jpg" width="620" height="274" /></a></td>
</tr>
<tr>
<td style="text-align: center">(2) 진동 모터</td>
</tr>
<tr>
<td><a href="http://www.ntrexgo.com/wp-content/uploads/2016/05/36-ict-hyj-19.jpg" rel="lightbox[31213]"><img class="alignnone size-large wp-image-31235" alt="36 ict hyj (19)" src="http://www.ntrexgo.com/wp-content/uploads/2016/05/36-ict-hyj-19-620x248.jpg" width="620" height="248" /></a></td>
</tr>
<tr>
<td style="text-align: center">(3) 색상 인식 센서</td>
</tr>
<tr>
<td><a href="http://www.ntrexgo.com/wp-content/uploads/2016/05/36-ict-hyj-20.jpg" rel="lightbox[31213]"><img class="alignnone size-large wp-image-31236" alt="36 ict hyj (20)" src="http://www.ntrexgo.com/wp-content/uploads/2016/05/36-ict-hyj-20-620x360.jpg" width="620" height="360" /></a></td>
</tr>
<tr>
<td style="text-align: center">(+)납땜 작업</td>
</tr>
<tr>
<td><a href="http://www.ntrexgo.com/wp-content/uploads/2016/05/36-ict-hyj-21.jpg" rel="lightbox[31213]"><img class="alignnone size-large wp-image-31237" alt="36 ict hyj (21)" src="http://www.ntrexgo.com/wp-content/uploads/2016/05/36-ict-hyj-21-620x386.jpg" width="620" height="386" /></a></td>
</tr>
<tr>
<td style="text-align: center">(4) 연결</td>
</tr>
</tbody>
</table>
<p><strong style="color: #ff6600;font-size: medium">데이터 시트</strong><br />
<strong><span style="color: #ff9900;background-color: #ffffff">1) 조도 센서</span></strong></p>
<table style="width: 620px;border: 1px solid #dbdbdb" border="1" cellspacing="0" cellpadding="2">
<tbody>
<tr>
<td width="200"><a href="http://www.ntrexgo.com/wp-content/uploads/2016/05/36-ict-hyj-22.jpg" rel="lightbox[31213]"><img class="alignnone  wp-image-31238" alt="36 ict hyj (22)" src="http://www.ntrexgo.com/wp-content/uploads/2016/05/36-ict-hyj-22.jpg" height="200" /></a></td>
<td>1.감도<br />
빛의 파장에 따라 감도가 다름<span style="line-height: 19px">2.허용손실</span>&nbsp;</p>
<p>비교적 큰 전류를 흘릴 수 있음</p>
<p>3.암 전류<br />
빛이 없어도 약간의 전류가 흐름</p>
<p>4.명 전류<br />
빛을 비추면 흐르는 전류</p>
<p>5.응답특성<br />
빛의 세기에 따라 응답 시간 다름</td>
</tr>
<tr>
<td style="text-align: center" colspan="2">  조도센서의 구성부</td>
</tr>
</tbody>
</table>
<p><span style="color: #ff9900"><strong>2) 적외선 센서</strong></span></p>
<table style="width: 620px" border="0" cellspacing="0" cellpadding="2">
<tbody>
<tr>
<td><a href="http://www.ntrexgo.com/wp-content/uploads/2016/05/36-ict-hyj-23.jpg" rel="lightbox[31213]"><img class="size-full wp-image-31239 aligncenter" alt="36 ict hyj (23)" src="http://www.ntrexgo.com/wp-content/uploads/2016/05/36-ict-hyj-23.jpg" width="493" height="319" /></a></td>
</tr>
<tr>
<td style="text-align: center">적외선 센서의 블록다이어그램</td>
</tr>
</tbody>
</table>
<table style="width: 620px" border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td><a href="http://www.ntrexgo.com/wp-content/uploads/2016/05/36-ict-hyj-24.jpg" rel="lightbox[31213]"><img class="size-full wp-image-31240 aligncenter" alt="36 ict hyj (24)" src="http://www.ntrexgo.com/wp-content/uploads/2016/05/36-ict-hyj-24.jpg" width="495" height="191" /></a></td>
</tr>
<tr>
<td style="text-align: center">적외선 센서의 핀 연결</td>
</tr>
</tbody>
</table>
<p><strong style="color: #ff9900">3) 초음파 센서</strong></p>
<table style="width: 620px" border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td><a href="http://www.ntrexgo.com/wp-content/uploads/2016/05/36-ict-hyj-25.jpg" rel="lightbox[31213]"><img class="size-full wp-image-31241 aligncenter" alt="36 ict hyj (25)" src="http://www.ntrexgo.com/wp-content/uploads/2016/05/36-ict-hyj-25.jpg" width="255" height="170" /></a></td>
</tr>
<tr>
<td style="text-align: center">초음파 센서의 핀 연결</td>
</tr>
<tr>
<td><a href="http://www.ntrexgo.com/wp-content/uploads/2016/05/36-ict-hyj-1.png" rel="lightbox[31213]"><img class=" wp-image-31216 aligncenter" alt="36 ict hyj (1)" src="http://www.ntrexgo.com/wp-content/uploads/2016/05/36-ict-hyj-1.png" width="400" height="132" /></a></td>
</tr>
<tr>
<td style="text-align: center">초음파 센서 특성표</td>
</tr>
</tbody>
</table>
<p><strong style="color: #ff9900">4) 색상인식 센서</strong></p>
<table style="width: 620px" border="0" cellspacing="0" cellpadding="2">
<tbody>
<tr>
<td><a href="http://www.ntrexgo.com/wp-content/uploads/2016/05/36-ict-hyj-26.jpg" rel="lightbox[31213]"><img class="size-full wp-image-31242 aligncenter" alt="36 ict hyj (26)" src="http://www.ntrexgo.com/wp-content/uploads/2016/05/36-ict-hyj-26.jpg" width="505" height="174" /></a></td>
</tr>
<tr>
<td style="text-align: center">색상인식 센서의 블록다이어그램</td>
</tr>
<tr>
<td><a href="http://www.ntrexgo.com/wp-content/uploads/2016/05/36-ict-hyj-27.jpg" rel="lightbox[31213]"><img class="size-full wp-image-31243 aligncenter" alt="36 ict hyj (27)" src="http://www.ntrexgo.com/wp-content/uploads/2016/05/36-ict-hyj-27.jpg" width="504" height="158" /></a></td>
</tr>
<tr>
<td>
<p style="text-align: center">색상인식 센서의 핀 연결</p>
</td>
</tr>
</tbody>
</table>
<p><strong style="color: #ff9900">5) 진동모터</strong></p>
<table style="width: 620px" border="0">
<tbody>
<tr>
<td><a href="http://www.ntrexgo.com/wp-content/uploads/2016/05/36-ict-hyj-2.png" rel="lightbox[31213]"><img class="size-full wp-image-31218 aligncenter" alt="36 ict hyj (2)" src="http://www.ntrexgo.com/wp-content/uploads/2016/05/36-ict-hyj-2.png" width="508" height="211" /></a></td>
</tr>
<tr>
<td>
<p style="text-align: center">진동모터 특성표</p>
</td>
</tr>
</tbody>
</table>
]]></content:encoded>
			<wfw:commentRss>http://www.ntrexgo.com/archives/31213/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[36호]STM32F4의 DAC, DMA를 이용한 임의파형 발생기</title>
		<link>http://www.ntrexgo.com/archives/31047</link>
		<comments>http://www.ntrexgo.com/archives/31047#comments</comments>
		<pubDate>Fri, 20 May 2016 00:21:00 +0000</pubDate>
		<dc:creator>디바이스마트 매거진</dc:creator>
				<category><![CDATA[디바이스마트 매거진]]></category>
		<category><![CDATA[특집]]></category>
		<category><![CDATA[36호]]></category>
		<category><![CDATA[Feature]]></category>
		<category><![CDATA[ict]]></category>
		<category><![CDATA[디바이스마트]]></category>
		<category><![CDATA[매거진]]></category>
		<category><![CDATA[우수상]]></category>
		<category><![CDATA[융합]]></category>
		<category><![CDATA[프로젝트 공모전]]></category>

		<guid isPermaLink="false">http://www.ntrexgo.com/?p=31047</guid>
		<description><![CDATA[디바이스마트 매거진 36호 &#124; STM32F4 Micro Controller의 DMA와 DAC 기능을 이용하여 임의파형을 출력할 수 있는 임의파형 발생기를 제작한다. 사용자가 직접 파형을 생성하고 편집할 수 있는 윈도우 어플리케이션과 안드로이드 어플리케이션을 제작한다.]]></description>
				<content:encoded><![CDATA[<p><a href="http://www.ntrexgo.com/wp-content/uploads/2015/11/2014-ict-메인.jpg" rel="lightbox[31047]"><img class="alignnone size-large wp-image-30006" alt="2014 ict 메인" src="http://www.ntrexgo.com/wp-content/uploads/2015/11/2014-ict-메인-620x150.jpg" width="620" height="150" /></a></p>
<p><span style="font-size: x-large"><strong>ICT 융합 프로젝트 공모전 우수상</strong></span></p>
<p><strong><span style="font-size: large">STM32F4의 DAC, DMA를 이용한 임의파형 발생기</span></strong></p>
<p>글 | 단국대학교 김진우, 가천대학교 김준환</p>
<p>&nbsp;</p>
<p><span style="font-size: medium;color: #008000"><strong>심사평</strong></span><br />
<strong></strong></p>
<p><span style="color: #ffffff;background-color: #000080"><strong>펌테크</strong></span> 상업적인 목적의 저가 보급형 제품으로 출시되어도 무방할 정도의 창의적인 아이디어 제품이라고 생각됩니다. 임의파형 편집 등의 기능을 가능하도록 구현한 점 등은 인상적인 부분이라고 생각합니다. 아쉬운 점은 출품작 제작 과정에 관련된 제출 서류가 미흡하여 상세한 내용을 확인할 수 없었고 이로 인해 평가에 다소 어려운 점이 있었다는 점 입니다.<br />
<strong></strong></p>
<p><span style="color: #ffffff;background-color: #000080"><strong>뉴티씨</strong></span> 임베디드 개발자들은 경우에 따라 다양한 파형을 테스트해야 하는 경우가 생긴다. 이 어플리케이션은 그러한 개발자들의 수요를 충족시킬 수 있다는 점에서 높은 점수를 주고 싶다. 하지만 최근 각광받는 라즈베리파이 등 비 Windows 환경을 배려하지 않은 것은 아쉽다. 이 부분만 고쳐졌다면 리눅스 환경에서 개발하는 많은 임베디드 테스터에게 좋은 솔루션이 되었을 것 같다.<br />
<strong></strong></p>
<p><span style="color: #ffffff;background-color: #000080"><strong>칩센</strong></span> 높은 수준의 기술구현에 흥미롭게 읽었습니다. 본 공모전이 ICT 융합프로젝트 공모전이라는 이름을 가지고 있지 않았다면 좀 더 높은 점수를 받았을 것 같습니다. 임의로 생성된 파형을 활용한 간단한 예시도 기재가 되었으면 좀 더 좋았을 것 같습니다. 예를 들자면 연구실용이나 개발용 임의파형 발생기보다 발생된 임의파형을 활용한 무선 전자악기 같은 &#8216;융합&#8217;이라는 주제나 컨셉이 필요해 보입니다. 블루투스 오디오를 활용하여 전송할 경우 레이턴시 때문에 악기로서 문제가 되는 부분을 짧은 데이터 전송으로 딜레이를 극복한다거나 하는 것도 좋지 않을까 합니다. 그 원리도 잘 설명하였으나 디바이스마트 잡지 기재가 필요한 이상, 다른학생들처럼 해당 작품을 재현하고 따라해볼 수 있도록 STM32F4(MCU)와 ESD110v2(BT)의 연결 구성 사진과 회로도, 코드 등도 필요해 보입니다.<br />
<strong></strong></p>
<p><span style="color: #ffffff;background-color: #000080"><strong>위드로봇</strong> </span>실험 장비로 필요한 내용을 직접 임베디드로 구현하고, 사용자 편의성을 고려하여 PC 인터페이스 프로그램을 구현했을 뿐만 아니라 스마트폰을 이용하여 동일한 기능을 사용할 수 있도록 구성한 면에서 실용성이 무척 높은 작품이라 판단됩니다. 작품의 완성도도 무척 높으며 보고서 구성도 짧지만 핵심 내용이 모두 들어가 있었습니다. 아쉬운 점은 출력 파형이 얼마나 정밀하게 출력되는지에 대한 분석 자료가 없어 보고서 만으로는 &#8220;얼마나 잘 되었는지&#8221;를 정량적으로 판단할 근거가 없습니다. 이 부분이 추가된다면 무척 좋은 작품, 보고서라 생각합니다.</p>
<p><span style="font-size: medium;color: #008000"><strong>작품개요</strong></span><br />
· STM32F4 Micro Controller의 DMA와 DAC 기능을 이용하여 임의파형을 출력할 수 있는 임의파형 발생기를 제작한다.<br />
· 사용자가 직접 파형을 생성하고 편집할 수 있는 윈도우 어플리케이션과 안드로이드 어플리케이션을 제작한다.<br />
· 윈도우 어플리케이션 또는 안드로이드 어플리케이션을 통해서 사용자가 생성한 신호를 블루투스 통신을 이용하여 MCU로 전송하여 MCU의 디지털 핀을 통해서 신호를 출력한다.</p>
<p><span style="font-size: medium;color: #008000"><strong>작품 설명</strong></span><br />
<span style="color: #339966"><strong>주요 동작 및 특징</strong></span><br />
<span style="color: #33cccc"><strong>1) STM32F4의 DMA와 DAC 기능을 이용하여 신호 파형 출력</strong></span><br />
STM32F407의 DMA와 DAC 기능을 이용하여 사용자가 임의로 제작한 신호 파형을 I/O 핀을 통하여 출력할 수 있도록 한다. DAC(Digital-to-analog converter)를 이용하면 디지털 값을 0 ~ 3.3V 사이의 아날로그 신호로 출력할 수 있다. 그리고 DMA(Direct memory access)를 이용하면 Memory 영역과 Peripheral 영역과의 고속 데이터 전송을 구현할 수 있다. 즉, DMA를 통하여 CPU의 resource를 적게 소비하면서 고속으로 DAC에 필요한 데이터를 전송할 수 있다. 따라서 DMA와 DAC를 이용하여 고속의 아날로그 신호를 I/O핀을 통해 출력할 수 있다.</p>
<p><span style="color: #33cccc"><strong>2) 윈도우 및 안드로이드 어플리케이션 제작</strong></span><br />
STM32F407의 DAC와 DMA기능을 통하여 사용자가 제작한 임의 파형을 아날로그 신호로 출력할 수 있다. 하지만 사용자가 파형을 쉽게 편집하기 위해서는 UI가 구성된 어플리케이션이 필요하다. 따라서 .Net Framework 기반의 윈도우 어플리케이션을 제작한다. 기본적으로 윈도우 어플리케이션에 필요한 기능은 사용자가 신호 파형을 생성할 수 있어야 한다. 마우스 클릭을 통해서 신호의 값을 정할 수 있으며, 한 주기에 대략 200개의 데이터가 필요하기 때문에 특정한 점만 클릭 시 자동으로 신호를 생성해주는 기능을 제공한다. 또한 c파일과 csv파일로 저장할 수 있는 기능을 제공한다. 안드로이드 어플리케이션도 추가적으로 제작하여 사용자가 굳이 윈도우 환경이 아니더라도 스마트 폰을 휴대하면 어디서든 신호를 생성하고 출력할 수 있도록 한다. 윈도우 또는 안드로이드 어플리케이션과 STM32F407간의 데이터 통신은 블루투스를 통하여 무선으로 제공하도록 제작한다.</p>
<p><span style="color: #33cccc"><strong>3) 기존 함수 발생기 기능 구현</strong></span><br />
기존의 신호 발생기는 기본적으로 정현파, 톱니파, 구형파의 신호만을 제공한다. 하지만 본 과제에서 제작하는 신호 발생기는 기존의 신호 발생기에서 제공하는 정현파, 톱니파, 구형파를 포함하여 사용자가 임의로 제작한 신호 또한 출력할 수 있도록 한다. 따라서 이론상으로 모든 신호를 발생시킬 수 있다.</p>
<p><span style="color: #33cccc"><strong>4) 임의파형 자동 파형 생성 기능 구현</strong></span><br />
사용자가 임의로 제작한 신호를 출력하기 위해서는 신호를 직접 그릴 수 있는 툴이 필요하다. 따라서 .Net Framework 기반의 윈도우 어플리케이션과 안드로이드 어플리케이션을 제작한다. 두 어플리케이션 모두 사용자가 직접 신호를 제작할 수 있도록 마우스 클릭과 터치를 통하여 신호를 발생할 수 있도록 한다. 하지만 사용자가 한 주기의 임의파형을 그리기 위해서 많은 수의 점을 직접 클릭하여 그려야 한다. 이는 많은 시간이 소요되므로 사용자가 원하는 파형의 주요 변곡점만 클릭하면 그 사이는 자동으로 연결해줄 수 있는 알고리즘을 적용한다.<br />
따라서 좀 더 편하고 빠르게 파형을 생성할 수 있다. 이러한 점과 점 사이를 연결해주는 알고리즘으로 Monotone cubic interpolation과 Bezier Curve를 적용한다.</p>
<p><span style="color: #339966"><strong>전체 시스템 구성</strong></span><br />
<span style="color: #33cccc"><strong>1) 시스템 구성도</strong></span></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/05/36-ict-kimjw-9.jpg" rel="lightbox[31047]"><img class="wp-image-31184 aligncenter" alt="36 ict kimjw (9)" src="http://www.ntrexgo.com/wp-content/uploads/2016/05/36-ict-kimjw-9.jpg" width="496" height="270" /></a><br />
PC 또는 안드로이드의 블루투스를 이용하여 MCU의 블루투스 모듈로 신호 데이터를 전송 후 전송된 데이터를 파싱, DMA와 DAC를 이용하여 2채널 아날로그 신호를 출력해서 사용자가 원하는 신호를 발생시킨다. 임의파형 발생기는 2채널을 지원한다</p>
<p><span style="color: #33cccc"><strong>2) 윈도우 어플리케이션 개발</strong></span><br />
<strong>(1) 기본 UI 및 기능 설명</strong></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/05/36-ict-kimjw-10.jpg" rel="lightbox[31047]"><img class="wp-image-31185 aligncenter" alt="36 ict kimjw (10)" src="http://www.ntrexgo.com/wp-content/uploads/2016/05/36-ict-kimjw-10.jpg" width="496" height="258" /></a><br />
윈도우 어플리케이션을 실행시키면 기본적으로 위의 그림과 같이 실행된다. 최초 실행 시에는 그래프를 생성시킨 상태가 아니기 때문에 그래프가 표시되지 않는다. New 버튼을 통해서 그래프 생성을 위한 기본정보, 즉 데이터 개수와 최대 전압을 입력하면 그래프가 생성된다. 데이터 개수는 총 표현할 수 있는 점의 개수이면서 x축 인덱스의 개수가 된다. 최대 전압은 y축의 최대값이 된다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/05/36-ict-kimjw-11.jpg" rel="lightbox[31047]"><img class="wp-image-31186 aligncenter" alt="36 ict kimjw (11)" src="http://www.ntrexgo.com/wp-content/uploads/2016/05/36-ict-kimjw-11.jpg" width="496" height="258" /></a></p>
<p>New 버튼으로 데이터 개수와 최대 전압을 입력하면 입력한 정보를 기반으로 새로운 그래프가 생성된다. 그래프의 왼쪽에는 STM32F4 보드와 통신하기 위한 시리얼 통신 정보를 입력하고 시리얼 포트를 열 수 있는 메뉴들이 있다. 포트 이름, 보레이트, 데이터 비트, 스톱비트, 패리티비트 메뉴가 있다. 그 아래에는 채널 선택(기본적으로 2채널을 지원한다), 알고리즘(점과 점 사이를 이어주는 알고리즘) 선택, 그리고 주파수 입력을 위한 텍스트박스, 시리얼 통신 데이터 전송 버튼이 있다.<br />
화면의 위쪽에는 여러 메뉴들이 있는데 다음과 같다.</p>
<p>New : 데이터 개수, 최대 전압을 입력하여, 새로운 그래프를 생성한다.<br />
Open : 기존에 저장했던 그래프를 불러온다.<br />
Close : 현재 작업중인 그래프를 닫는다.<br />
Save : 현재 작업중인 그래프 데이터를 저장한다.<br />
Save As : 현재 작업중인 그래프 데이터를 새로운 이름으로 저장한다.<br />
Export to Excel : 그래프에서 생성한 파형 데이터를 엑셀파일(csv파일)로 저장한다.<br />
Export to C Code : 그래프에서 생성한 파형 데이터를 C코드(c파일)로 저장한다.<br />
Edit : Edit 모드, 그래프 화면 마우스 왼쪽 버튼 클릭 시 점 추가, 점을 마우스 왼쪽버튼 더블 클릭 시 해당 점 삭제, 마우스 휠로 확대/축소, 마우스 오른쪽 버튼으로 화면 이동을 한다.<br />
Zoom In : 확대 모드로 마우스 왼쪽 버튼 클릭 시 해당 부분을 확대 한다.<br />
Zoom Out : 축소 모드로 마우스 왼쪽 버튼 클릭 시 해당 부분을 축소 한다.<br />
Pan : 화면 이동 모드로 마우스 왼쪽버튼으로 드래그 시 화면을 이동한다. (단, 그래프 생성시 입력한 데이터 개수와 최대 전압을 넘는 범위로는 이동이 불가능하다.)<br />
Default View : 화면 배율을 기본 값으로 초기화한다.<br />
Sine Wave : 사용자가 입력한 진폭을 갖는 사인 파형 신호를 생성한다.<br />
Sawtooth Wave : 사용자가 입력한 진폭을 갖는 톱니 파형 신호를 생성한다.<br />
Square Wave : 사용자가 입력한 진폭을 갖는 사각 파형 신호를 생성한다.<br />
Waveform Generate : 사용자가 신호의 특정 변곡점만 클릭하고 Waveform Generate 버튼을 클릭시 해당 점과 점 사이를 자동으로 연결하여 그려준다. 이 때 사용하는 알고리즘은 그래프 왼쪽의 라디오 버튼을 통해 선택한다.<br />
Clear : 화면을 클리어 한다.<br />
Option : 줌 인 / 줌 아웃 배율 설정, 화면 이동시 감도 설정 등의 옵션을 설정한다.</p>
<p><strong>(2) 화면 확대 / 축소 및 이동</strong><br />
기본적으로 그래프에서 Zoom In, Zoom Out, Pan 기능이 있지만 감도 설정, 키 설정 등이 불가능 하기 때문에 직접 위의 기능들을 구현하는 방식으로 개발하였다. 그래프의 프로퍼티중 Scale Max와 Min이 있는데, 이 값을 수정하면 그래프에서 보여지는 각 축의 최대값과 최소값을 바꿀 수 있다. 따라서 이 Scale Max와 Min 값을 가지고 Zoom In, Zoom Out, Pan 기능을 구현하였다. 위의 세 기능 모두 마우스 클릭 또는 마우스 드래그, 휠 등을 이용하여 작동할 수 있도록 하기 위해서 마우스 이벤트를 이용하였다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/05/36-ict-kimjw-12.jpg" rel="lightbox[31047]"><img class="wp-image-31187 aligncenter" alt="36 ict kimjw (12)" src="http://www.ntrexgo.com/wp-content/uploads/2016/05/36-ict-kimjw-12.jpg" width="496" height="264" /></a><br />
기본적으로 마우스 클릭 이벤트 발생시에, 시스템으로부터 마우스 좌표를 얻어올 수 있다. 이 좌표는 전체 윈도우 폼을 기준으로 한 좌표이기 때문에 현재 그래프 상에서의 좌표로 환산한다. 위 그림의 붉은색 사각형처럼 마우스 좌표를 기준으로 가상의 사각형 박스의 각 꼭지점 좌표를 계산한다. (박스의 크기는 Zoom 배율의 설정 값에 따라 달라지게 된다.)<br />
마우스 클릭 이벤트가 발생했을 때 사각형 박스의 각 꼭지점 좌표를 현재 그래프의 Scale Max와 Min으로 각각 설정한다. 그리고 그래프 컨트롤을 다시 그리게 하는 Refresh 메서드를 호출하면 새로 변경된 스케일의 그래프가 다시 그려지게 된다. 따라서 Zoom In이 된 상태로 보여지게 된다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/05/36-ict-kimjw-13.jpg" rel="lightbox[31047]"><img class="wp-image-31188 aligncenter" alt="36 ict kimjw (13)" src="http://www.ntrexgo.com/wp-content/uploads/2016/05/36-ict-kimjw-13.jpg" width="496" height="267" /></a><br />
Zoom Out은 마우스 클릭 이벤트 발생시에, 현재 마우스 좌표를 기준으로 현재 그래프상에서 각 축의 Max 값과 Min 값까지의 거리 즉, 위의 그림에서 dx1, dx2, dy1, dy2를 구하고 이 길이에 Zoom 배율을 곱한 값을 새로운 그래프의 Scale Min, Max로 설정한다. Scale Max가 최대 범위를 넘거나 Scale Min이 0보다 작아질 경우에는 범위를 넘어가지 못하도록 처리를 해준다.<br />
Pan 기능은 그래프를 확대했을 때 그래프의 다른 부분을 보기 위해서 마우스 드래그로 이동하는 것을 말한다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/05/36-ict-kimjw-14.jpg" rel="lightbox[31047]"><img class="wp-image-31189 aligncenter" alt="36 ict kimjw (14)" src="http://www.ntrexgo.com/wp-content/uploads/2016/05/36-ict-kimjw-14.jpg" width="496" height="264" /></a><br />
마우스 다운 이벤트와 마우스 무브 이벤트를 이용하여 구현하였다. 마우스 클릭시 마우스 다운이벤트가 제일 먼저 발생하며, 이 때 현재 마우스 좌표를 저장해둔다. 그리고 클릭을 유지한 채 마우스를 움직이면 마우스 무브 이벤트가 발생한다. 이 때 아까 저장해 준 좌표와 현재 좌표 사이의 좌표값 차를 계산한다. 이는 위의 그림에서 dx, dy이다. 이 dx와 dy값에 일정 값(Pan 감도)을 곱하여 그래프의 Scale Max값과 Min 값에 더해주거나 빼줌으로써 그래프 화면의 이동을 구현할 수 있다.</p>
<p><strong>(3) 기본 파형 생성</strong><br />
기존의 신호발생기에서 제공하는 사인파, 삼각파, 톱니파, 구형파를 사용자가 진폭만 설정하면 자동으로 생성해주도록 구현하였다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/05/36-ict-kimjw-15.jpg" rel="lightbox[31047]"><img class="wp-image-31190 aligncenter" alt="36 ict kimjw (15)" src="http://www.ntrexgo.com/wp-content/uploads/2016/05/36-ict-kimjw-15.jpg" width="496" height="263" /></a></p>
<p>위 그림과 같이 사인파, 삼각파, 톱니파, 구형파 등의 해당 메뉴를 클릭 시 파형의 최대 전압 값을 입력받을 수 있는 창이 뜬다. 값을 입력하고 확인을 누르면 파형이 자동으로 생성되게 된다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/05/36-ict-kimjw-16.jpg" rel="lightbox[31047]"><img class="wp-image-31191 aligncenter" alt="36 ict kimjw (16)" src="http://www.ntrexgo.com/wp-content/uploads/2016/05/36-ict-kimjw-16.jpg" width="496" height="266" /></a><br />
사인파, 삼각파, 톱니파, 구형파에 해당하는 수식을 미리 저장해놓고 최대값을 입력 받으면 해당 값에 맞는 각 인덱스의 전압 값을 계산하여 그래프에 표시하도록 구현하였다.<br />
<strong>(4) 자동 파형 생성</strong><br />
Waveform Generate 는 사용자가 파형을 생성할 때 모든 점을 다 찍어서 생성할 수 있지만 너무 시간이 많이 소요되므로 특정한 변곡점 몇 개만 찍고 나머지 부분은 자동으로 생성해주는 기능이다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/05/36-ict-kimjw-17.jpg" rel="lightbox[31047]"><img class="wp-image-31192 aligncenter" alt="36 ict kimjw (17)" src="http://www.ntrexgo.com/wp-content/uploads/2016/05/36-ict-kimjw-17.jpg" width="496" height="264" /></a><br />
위 그림처럼 세 개의 점을 찍은 상태에서 Waveform Generate를 하게 되면 알고리즘 별로 아래와 같다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/05/36-ict-kimjw-18.jpg" rel="lightbox[31047]"><img class="wp-image-31193 aligncenter" alt="36 ict kimjw (18)" src="http://www.ntrexgo.com/wp-content/uploads/2016/05/36-ict-kimjw-18.jpg" width="496" height="263" /></a><br />
Bezier Curve를 이용한 파형이다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/05/36-ict-kimjw-19.jpg" rel="lightbox[31047]"><img class="wp-image-31194 aligncenter" alt="36 ict kimjw (19)" src="http://www.ntrexgo.com/wp-content/uploads/2016/05/36-ict-kimjw-19.jpg" width="496" height="262" /> </a><br />
Monotone cubic interpolation을 이용한 파형이다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/05/36-ict-kimjw-20.jpg" rel="lightbox[31047]"><img class="wp-image-31195 aligncenter" alt="36 ict kimjw (20)" src="http://www.ntrexgo.com/wp-content/uploads/2016/05/36-ict-kimjw-20.jpg" width="496" height="263" /></a><br />
각 점을 직선으로 연결한 파형이다.<br />
각각의 알고리즘은 문서의 다른 부분에서 설명한다. 점을 아예 찍지 않고 Waveform Generate 버튼을 누르게 되면 다음 그림과 같이 모든 점이 0값을 가지도록 그려진다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/05/36-ict-kimjw-21.jpg" rel="lightbox[31047]"><img class="wp-image-31196 aligncenter" alt="36 ict kimjw (21)" src="http://www.ntrexgo.com/wp-content/uploads/2016/05/36-ict-kimjw-21.jpg" width="496" height="262" /></a></p>
<p>기본적으로 파형생성을 할 때, x축 인덱스의 최소값과 최대값에서 y값이 그래프상에 그려져 있는지 아닌지 검사하고 안 그려져 있을 경우 y값이 0값을 가지도록 설정한다. 따라서 아무런 점을 찍지 않았을 때는 x=0, y=0 과 x= max_index, y=0 의 두 점이 기본적으로 자동으로 찍혀서 계산이 되기 때문에 그래프상의 모든 점에서 y값이 0으로 표시되어 생성되는 것이다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/05/36-ict-kimjw-22.jpg" rel="lightbox[31047]"><img class="wp-image-31197 aligncenter" alt="36 ict kimjw (22)" src="http://www.ntrexgo.com/wp-content/uploads/2016/05/36-ict-kimjw-22.jpg" width="496" height="262" /></a><br />
위의 그림처럼 시작 인덱스와 끝 인덱스에서 y값을 설정해주지 않으면 0값이 기본적으로 들어 가므로 생성된 파형은 시작과 끝에서 0으로 수렴하는 모양으로 생성되게 된다.</p>
<p><strong>(5) File 저장 및 불러오기</strong><br />
사용자가 작업하던 그래프를 저장하거나 불러올 수 있도록 현재 그래프의 상황을 저장하거나 불러올 수 있도록 하였다. 기본적으로 현재 그래프상에 표시되어 있는 점들의 좌표 정보를 저장하고 불러와야 한다. 따라서 그래프 상의 좌표 정보 데이터들을 하나의 객체로 감싸고 이를 직렬화하여 파일로 저장하고 불러 올 수 있도록 하였다.<br />
기본적으로 C#에서 제공하는 BinaryFormatter 클래스를 사용하여 파일로 저장할 때에는 직렬화를, 파일에서 불러올 때에는 역직렬화를 하여 현재 그래프상의 데이터들을 저장하고 불러올 수 있게 하였다.</p>
<p><strong>(6) Excel 또는 C코드로 내보내기</strong><br />
사용자가 직접 생성한 파형을 다양하게 이용할 수 있도록 엑셀 csv파일 또는 c코드 파일로 출력할 수 있도록 기능을 구현하였다.<br />
기본적으로 csv파일은 쉼표로 각 셀의 데이터를 구분하는 방식으로 표현한다. 따라서 엑셀 csv파일로 저장할 때에는 StreamWriter 클래스를 이용하여 그래프 데이터 정보를 쉼표로 구분하여 파일로 저장하도록 하였다. c코드파일로 출력할 때에는 보통 기본적으로 MCU에서 DAC를 할 때 1차원 배열로 y값 데이터 정보를 주로 사용하기 때문에 1차원 배열로 텍스트를 생성하여 저장하도록 하였다. 역시 StreamWriter 클래스를 이용하여 저장하였다.</p>
<p><span style="color: #33cccc"><strong>3) Andorid 어플리케이션 개발</strong></span><br />
<strong>(1) 기본 UI 및 기능 설명</strong></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/05/36-ict-kimjw-23.jpg" rel="lightbox[31047]"><img class="wp-image-31198 aligncenter" alt="36 ict kimjw (23)" src="http://www.ntrexgo.com/wp-content/uploads/2016/05/36-ict-kimjw-23.jpg" width="496" height="414" /></a><br />
위 그림은 처음 시작 UI이다. 1번을 클릭할 시 함수를 선택할 수 있는 리스트가 나타난다. 2는 블루투스를 켜거나 연결할 수 있고, 3, 4번은 구현한 그래프를 c, csv, txt 파일로 저장하거나 txt 파일을 불러올 수 있다. 5번은 임의 파형에서 직접 구현한 포인트를 가지고 Monotone cubic interpolation, Liner Curve, Bezier Curve 알고리즘을 이용하여 200개의 포인트를 자동으로 생성해 사용자가 쉽게 그래프를 그릴 수 있게 도와 준다. 6번은 블루투스와 연결된 임의 파형 발생기에게 200개의 임의 파형 데이터를 보내주어 임의 파형 발생기 보드에서 신호를 출력할 수 있게 해준다. 7번은 포인트를 제거 할 수 있다. 8번은 체크할 시 그래프를 수정할 수 있거나 삭제할 수 있게 해주고, 9번은 자신이 원하는 신호의 주파수를 입력 할 수 있다.</p>
<p><strong>(2) 기본 파형 생성</strong><br />
기존 신호발생기와 같이 사인파, 톱니파, 삼각파, 구형파를 제공해준다. 함수 선택 버튼을 클릭하면 총 5가지의 리스트가 띄워진다.<br />
사인파, 구형파, 톱니파, 삼각파 임의 파형 발생기를 선택할 수 있다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/05/36-ict-kimjw-24.jpg" rel="lightbox[31047]"><img class="wp-image-31199 aligncenter" alt="36 ict kimjw (24)" src="http://www.ntrexgo.com/wp-content/uploads/2016/05/36-ict-kimjw-24.jpg" width="243" height="313" /></a><br />
이 함수를 가지고 Send 버튼을 클릭하면 블루투스에 연결되어 있는 임의파형 발생기보드에 데이터를 넘겨 원하는 파형을 출력할 수 있다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/05/36-ict-kimjw-25.jpg" rel="lightbox[31047]"><img class="wp-image-31200 aligncenter" alt="36 ict kimjw (25)" src="http://www.ntrexgo.com/wp-content/uploads/2016/05/36-ict-kimjw-25.jpg" width="496" height="138" /></a></p>
<p><strong>(3) 자동 파형 생성</strong><br />
기본으로 제공된 파형뿐만 아니라 사용자가 원하는 파형을 만들어 줄 수 있게 해준다. 함수 리스트에서 Random을 선택하여 그릴 수 있다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/05/36-ict-kimjw-26.jpg" rel="lightbox[31047]"><img class="wp-image-31201 aligncenter" alt="36 ict kimjw (26)" src="http://www.ntrexgo.com/wp-content/uploads/2016/05/36-ict-kimjw-26.jpg" width="496" height="242" /></a><br />
왼쪽 그림에 보면 빈 공간이 있다. 자신이 원하는 지점에 터치하여 오른쪽 그림처럼 원하는 그래프 모양을 그릴 수 있다. 이때, 사람이 그래프모양을 정확히 다 그리기에는 힘들거나, 번거로울 수 있다. 여기서 interpolation 알고리즘을 이용하여 자동으로 그래프를 그릴 수 있게 도와준다. Creation버튼을 클릭하면 interpolation 알고리즘이 3가지 나온다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/05/36-ict-kimjw-27.jpg" rel="lightbox[31047]"><img class="wp-image-31202 aligncenter" alt="36 ict kimjw (27)" src="http://www.ntrexgo.com/wp-content/uploads/2016/05/36-ict-kimjw-27.jpg" width="347" height="463" /></a></p>
<p>여기서 자신이 원하는 그래프를 그릴 수 있는 것을 클릭하여 Yes버튼을 클릭하면 자동으로 그래프를 그려준다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/05/36-ict-kimjw-28.jpg" rel="lightbox[31047]"><img class="wp-image-31203 aligncenter" alt="36 ict kimjw (28)" src="http://www.ntrexgo.com/wp-content/uploads/2016/05/36-ict-kimjw-28.jpg" width="496" height="126" /></a><br />
왼쪽부터 사용자가 터치한 그림부터, Monotone Cubic, Liner Curve, Bezier Curve 알고리즘을 이용하여 그래프를 그릴 수 있다.</p>
<p><strong>(4) File 저장 및 불러오기</strong><br />
사용자가 필요한 그래프를 그렸을 때 자신의 그래프를 계속 사용하고 싶을 때 저장버튼을 눌러 c코드 파일, txt파일, csv파일로 저장할 수 있다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/05/36-ict-kimjw-29.jpg" rel="lightbox[31047]"><img class="wp-image-31204 aligncenter" alt="36 ict kimjw (29)" src="http://www.ntrexgo.com/wp-content/uploads/2016/05/36-ict-kimjw-29.jpg" width="496" height="282" /></a><br />
저장할 때 사용자가 원하는 파일로 지정을 하여 저장시킬 수 있다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/05/36-ict-kimjw-30.jpg" rel="lightbox[31047]"><img class="wp-image-31205 aligncenter" alt="36 ict kimjw (30)" src="http://www.ntrexgo.com/wp-content/uploads/2016/05/36-ict-kimjw-30.jpg" width="496" height="128" /></a><br />
동시에 3가지 저장도 가능하다.<br />
저장한 파일을 열어보면 함수의 그래프를 가지고 있다. csv파일을 열면 사용자가 바로 엑셀에서 그래프를 그릴 수 있게 하고, c파일은 배열에 데이터를 초기화 했다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/05/36-ict-kimjw-31.jpg" rel="lightbox[31047]"><img class="wp-image-31206 aligncenter" alt="36 ict kimjw (31)" src="http://www.ntrexgo.com/wp-content/uploads/2016/05/36-ict-kimjw-31.jpg" width="496" height="282" /></a><br />
이렇게 불러오기 버튼을 클릭하여 저장한 파일을 불러오면 저장할 때 그렸던 그래프를 다시 그려준다.</p>
<p><span style="color: #33cccc"><strong>4) STM32F의 DMA 및 DAC 기능을 이용한 신호 파형 출력</strong></span><br />
<strong>(1) 개발보드 및 블루투스 모듈 선정</strong></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/05/36-ict-kimjw-32.jpg" rel="lightbox[31047]"><img class="wp-image-31207 aligncenter" alt="36 ict kimjw (32)" src="http://www.ntrexgo.com/wp-content/uploads/2016/05/36-ict-kimjw-32.jpg" width="372" height="245" /></a><br />
개발보드로는 ST사의 STM32F407 MCU가 들어간 STM32F4DISCOVERY 보드를 사용하였다.<br />
그리고 블루투스 모듈은 칩센사의 Parani-ESD110V2 모듈을 사용하였다. STM32F4는 32비트 MCU로 시스템 클럭은 최대 168MHz로 동작한다. 12비트 DAC, 32비트 타이머, DMA 등을 내장하고 있기 때문에 우리가 만들려는 임의파형 발생기의 메인보드로써 적합하기 때문에 선정하였다.</p>
<p><strong>(2) 블루투스 통신 패킷</strong></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/05/36-ict-kimjw-1.jpg" rel="lightbox[31047]"><img class="wp-image-31176 aligncenter" alt="36 ict kimjw (1)" src="http://www.ntrexgo.com/wp-content/uploads/2016/05/36-ict-kimjw-1.jpg" width="496" height="263" /></a><br />
임의파형 발생기 개발보드와 윈도우 어플리케이션 또는 안드로이드 어플리케이션과 통신은 블루투스를 이용하여 데이터를 주고 받는다. 이 때 안드로이드 어플리케이션 또는 윈도우 어플리케이션에서 사용자가 생성한 임의 파형 데이터를 위의 그림과 같은 데이터 패킷으로 구성하여 전송하도록 구현하였다. 패킷의 각각의 항목에 대해서 설명하면 다음과 같다.</p>
<p>0xFF 0xFF : 데이터 패킷의 시작을 알리는 부분이다.</p>
<p>데이터 개수 상위 / 하위 바이트 : 시작을 알리는 0xFF, 0xFF 2바이트를 제외한 전체 데이터 패킷의 바이트 수를 나타낸다.<br />
예를 들어서, 임의 파형 데이터의 포인트 개수가 200개라고 한다면, 기본적으로 파형 데이터는 12비트의 값(0~4095)을 가지므로 상위/하위 바이트로 나누어서 전송해야 한다. 따라서 200개의 파형 데이터는 400바이트가 되고, 채널, 주파수 상위/하위 바이트, 데이터 개수 상위 /하위 바이트의 바이트 수를 합치면 405바이트가 된다. 따라서 200개의 파형 데이터를 가지는 임의 파형을 전송하기 위해서는 총 407 바이트가 필요하고 그 중 0xFF, 0xFF 2바이트를 제외한 405라는 숫자를 데이터 개수 상위/하위 바이트로 나누어서 전송한다. 2바이트로 나누어서 전송하는 이유는 1바이트로는 0~255까지의 숫자만 표현 가능하므로 2바이트의 unsigned short int 데이터 형으로 구성하여 상위 바이트/하위 바이트로 1바이트씩 나누어서 전송한다.</p>
<p>주파수 상위/하위 바이트: 주파수도 1~20000(20kHz) 사이의 값이 될 수 있으므로 데이터 개수와 마찬가지로 2바이트의 unsigned short int 데이터 형으로 구성하여 상위 바이트/하위 바이트로 1바이트씩 나누어서 전송한다.</p>
<p>채널 : 기본적으로 임의파형 발생기는 2채널을 지원하므로 어떤 채널로 출력할 데이터인지 나타내는 채널 데이터가 필요하다. 1은 1채널, 2는 2채널을 의미한다. 따라서 1 또는 2의 값을 갖는다.</p>
<p>데이터 상위/하위 바이트 : 데이터 상위/하위 바이트는 임의파형 발생기 개발보드에서 12비트 DAC로 아날로그 신호로 출력할 데이터 값이다. 12비트 데이터이기 때문에 상위/하위 바이트로 나누어서 전송한다.</p>
<p><strong>(3) 타이머를 이용한 DAC 트리거</strong><br />
DAC를 통해서 주기적인 신호를 표현하기 위해서는 DAC Conversion이 주기적으로 수행되어야 한다. 따라서 이를 위해서, 타이머의 트리거 기능을 이용한다. 우리는 STM32F4의 타이머 6/7을 이용하여 각각 채널1과 채널2의 DAC 트리거를 구현하였다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/05/36-ict-kimjw-33.jpg" rel="lightbox[31047]"><img class="size-full wp-image-31208 aligncenter" alt="36 ict kimjw (33)" src="http://www.ntrexgo.com/wp-content/uploads/2016/05/36-ict-kimjw-33.jpg" width="413" height="364" /></a><br />
타이머6을 DAC 채널1의 트리거로, 타이머7을 DAC 채널2의 트리거로 설정하였다. 타이머를 원하는 신호의 주파수로 동작하도록 프리스케일러와 카운터 레지스터를 설정하게 되면 Timer Trigger Output(TIMx_TRGO)이 원하는 주파수로 동작하고 DAC 인터페이스는 Timer Trigger Output의 Rising edge를 검출하여 DAC_DHRx 레지스터의 값을 DAC_DORx 레지스터로 전송한다. 따라서 원하는 주파수로 DAC Conversion이 수행되게 된다.기본적으로 타이머6/7의 메인 클럭은 시스템 클럭이 168MHz일 때 84MHz가 된다. 또한 타이머6/7의 프리스케일러와 카운터 레지스터는 16비트로 0~65535의 값을 갖게 된다.<br />
원하는 주파수의 신호를 DAC로 트리거 하기 위해서는 아래의 공식을 통하여 원하는 주파수에 해당하는 타이머의 프리스케일러 값과 카운터 레지스터의 값을 구해야 한다.</p>
<p>Timer Period = Timer Frequency / Timer Prescaler / Frequency / Number of Data</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/05/36-ict-kimjw-2.jpg" rel="lightbox[31047]"><img class="wp-image-31177 aligncenter" alt="36 ict kimjw (2)" src="http://www.ntrexgo.com/wp-content/uploads/2016/05/36-ict-kimjw-2.jpg" width="496" height="247" /></a><br />
Timer Period는 타이머의 카운터 레지스터의 값, Timer Frequency는 타이머의 동작 클럭으로 위의 그림에서 보듯이 타이머6/7은 시스템 클럭이 168MHz일 때 84MHz의 클럭으로 동작한다. 따라서 84000000의 고정값을 갖게 된다. Frequency는 원하는 신호의 주파수이며, Number of Data는 사용자가 편집한 파형의 데이터 개수이다.</p>
<p><strong>(4) 오실로스코프에서 출력확인</strong></p>
<table class="aligncenter" style="width: 620px" border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td><a href="http://www.ntrexgo.com/wp-content/uploads/2016/05/36-ict-kimjw-3.jpg" rel="lightbox[31047]"><img class="alignnone  wp-image-31178" alt="36 ict kimjw (3)" src="http://www.ntrexgo.com/wp-content/uploads/2016/05/36-ict-kimjw-3-300x225.jpg" width="200" /></a></td>
<td><a href="http://www.ntrexgo.com/wp-content/uploads/2016/05/36-ict-kimjw-4.jpg" rel="lightbox[31047]"><img class="alignnone  wp-image-31179" alt="36 ict kimjw (4)" src="http://www.ntrexgo.com/wp-content/uploads/2016/05/36-ict-kimjw-4-300x225.jpg" width="200" /></a></td>
<td><a href="http://www.ntrexgo.com/wp-content/uploads/2016/05/36-ict-kimjw-5.jpg" rel="lightbox[31047]"><img class="alignnone  wp-image-31180" alt="36 ict kimjw (5)" src="http://www.ntrexgo.com/wp-content/uploads/2016/05/36-ict-kimjw-5-300x225.jpg" width="200" /></a></td>
</tr>
</tbody>
</table>
<p style="text-align: center">
<p>위 그림에서 보듯이 오실로스코프에서 실제로 파형발생기와 같은 출력을 확인할 수 있다. 또한 임의그래프를 그려 실제로 출력해 보면 아래와 같이 나온다.</p>
<table style="width: 620px" border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td><a href="http://www.ntrexgo.com/wp-content/uploads/2016/05/36-ict-kimjw-6.jpg" rel="lightbox[31047]"><img class="wp-image-31181 aligncenter" alt="36 ict kimjw (6)" src="http://www.ntrexgo.com/wp-content/uploads/2016/05/36-ict-kimjw-6-262x300.jpg" height="224" /></a></td>
<td><a href="http://www.ntrexgo.com/wp-content/uploads/2016/05/36-ict-kimjw-7.jpg" rel="lightbox[31047]"><img class="size-medium wp-image-31182 aligncenter" alt="36 ict kimjw (7)" src="http://www.ntrexgo.com/wp-content/uploads/2016/05/36-ict-kimjw-7-300x224.jpg" width="300" height="224" /></a></td>
</tr>
</tbody>
</table>
<p>왼쪽 그림은 임의 그래프를 그린것이고 오른쪽 사진은 실제 출력했을 때 모습이다.</p>
<p style="text-align: left"><span style="color: #339966"><strong>개발 환경</strong></span><br />
OS: Windows 7, Windows 8.1<br />
Tool : Microsoft Visual Studio 2013, IAR Embedded Workbench, Eclipse<br />
Language : C, C#, JAVA</p>
<p style="text-align: left"><span style="font-size: medium;color: #008000"><strong>단계별 제작 과정</strong></span></p>
<p style="text-align: left"><a href="http://www.ntrexgo.com/wp-content/uploads/2016/05/36-ict-kimjw-8.jpg" rel="lightbox[31047]"><img class="wp-image-31183 aligncenter" alt="36 ict kimjw (8)" src="http://www.ntrexgo.com/wp-content/uploads/2016/05/36-ict-kimjw-8.jpg" width="496" height="218" /></a></p>
<p style="text-align: left"><span style="font-size: medium;color: #008000"><strong>기타</strong></span><br />
<strong>참고 문헌</strong><br />
1) STM32F407xx Datasheet<br />
2) STM32F407xx Reference manual<br />
3) http://developer.android.com/</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ntrexgo.com/archives/31047/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[35호]추측항법 모형 자동차</title>
		<link>http://www.ntrexgo.com/archives/30721</link>
		<comments>http://www.ntrexgo.com/archives/30721#comments</comments>
		<pubDate>Tue, 15 Mar 2016 02:39:51 +0000</pubDate>
		<dc:creator>디바이스마트 매거진</dc:creator>
				<category><![CDATA[디바이스마트 매거진]]></category>
		<category><![CDATA[특집]]></category>
		<category><![CDATA[35호]]></category>
		<category><![CDATA[Feature]]></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=30721</guid>
		<description><![CDATA[디바이스마트매거진 35호 &#124; 2015 ICT 융합 프로젝트 공모전 우수상 : 주차장에 주차되어 있는 사용자의 자동차를 자신의 앞까지 이동시킬 수 있다면 좋겠다는 생각에 어플리케이션을 통해 카메라영상에 접속하고 카메라영상 속의 모형자동차를 원하는 경로로 이동시키는 프로젝트를 진행하게 되었다. ]]></description>
				<content:encoded><![CDATA[<p><a href="http://www.ntrexgo.com/wp-content/uploads/2015/11/2014-ict-메인.jpg" rel="lightbox[30721]"><img class="alignnone size-large wp-image-30006" alt="2014 ict 메인" src="http://www.ntrexgo.com/wp-content/uploads/2015/11/2014-ict-메인-620x150.jpg" width="620" height="150" /></a></p>
<p><span style="font-size: x-large"><strong>2015 ICT 융합 프로젝트 공모전 우수상</strong></span></p>
<p><span style="font-size: medium"><strong>추측항법 모형 자동차</strong></span></p>
<p style="text-align: right">글 | 아주대학교 송광근, 단국대학교 이주명, 구동균, 경희대학교 노한민</p>
<p><span style="font-size: medium;color: #000080"><strong>심사평</strong></span></p>
<p><span style="color: #ffffff;background-color: #0000ff"><strong>위드로봇</strong></span> 자율 주행 자동차에 대한 관심이 증대되는 관점에서 DR 기술을 학부생이 직접 구현하여 작품으로 제출한 점을 높이 평가합니다. 특히 사용자의 입력을 받아 차량이 움직일 수 있는 궤적으로 바꿔 주행하는 데모 동영상은 매우 인상적입니다. 반면 핵심 기술인 DR에서 sensor drift 현상을 어떻게 해결했는지의 설명이 부족하여, 최소 1~2분 동작했을 때 어떤 현상이 발생할지 궁금합니다. 만일 센서 드리트프 현상까지도 어느 정도 해결했다면 매우 훌륭한 결과이며, 그렇지 않다면 이 내용을 좀 더 보강하면 훌륭한 작품이 될 것으로 생각합니다.</p>
<p><span style="color: #ffffff;background-color: #0000ff"><strong>칩센</strong> </span>주로 선박에서 사용하는 추측항법 기술을 자동차에 접목시킨 아이디어로 시대의 흐름과도 어느 정도 일치하는 면도 있고 시제품 완성도도 높아 매우 좋게 평가된다. 특히 장점으로는 스마트폰을 사용해 원하는 길을 그리면 자동으로 주행하는 등의 기능은 우수한 기능이라고 볼 수 있다. 아쉬운 점은 사용자가 접근 가능한 CCTV(카메라) 등이 존재하는 곳에만 적용 가능하도록 구성되어 있고 ‘자동’이라는 특수한 상황에 따른 이벤트 감지센서, 알람 등이 고려해야 할 부분이라고 본다.</p>
<p><span style="color: #ffffff;background-color: #0000ff">뉴티씨</span> GPS를 대체하는 방법은 여러가지가 있겠지만, 이미 있는 자원을 이용하여 자율 주행을 수행한다는 점에서 플러스 점수를 주고 싶다. 또한 서버 형태로 구현되어 큰 단가 절감을 실현한 것이 또 하나의 플러스 요인이다.</p>
<p><span style="color: #ffffff;background-color: #0000ff"><strong>펌테크</strong></span> 창의성이 돋보이는 출품작으로 생각된다. 핵심기술인 카메라 영상데이터를 자동차의 실제 주행 궤적경로에 적합한 데이터로 변경하여 적용하는 과정이 인상적이며, 출품자가 유튜브에 올린 출품작 관련 동작관련 동영상을 통해 일정부분 이 기술을 실제 반영한 내용을 확인할 수 있었다.</p>
<p><span style="font-size: medium;color: #000080"><strong>작품개요</strong></span><br />
미래 사회가 점점 자동화 되어가는 시기에 신체가 불편한 사람을 위해 자동항법 기술의 필요성이 증가하고 있다. 하지만 터널이나 건물 지하에서 수신이 잘 되지 않는 GPS기술의 단점을 보완하기 위한 기술이 필요하다고 판단하였다. 이러한 기술을 구현하기 위해, 전국에 CCTV의 개수가 수백만 대 이상인 점을 이용하여 카메라 영상을 통한 자동차 자동항법을 보완하기로 결정하였다. 이미 구글 및 현대모비스를 비롯한 국내외 대기업에서 무인자동차 개발이 활발히 이루어지고 있다. 이러한 트랜드에 맞추어 GPS를 대신할 수 있는 추측항법을 사용하여 무인 자율주행 모형차를 제작하게 되었다.</p>
<p><span style="font-size: medium;color: #000080"><strong>작품설명</strong></span><br />
<span style="color: #008080"><strong>주요 동작 및 특징</strong></span><br />
<span style="color: #3366ff"><strong> 프로젝트 작품설명</strong></span></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/03/35-feature-ict-17.jpg" rel="lightbox[30721]"><img class="alignnone  wp-image-30966" alt="35 feature ict (17)" src="http://www.ntrexgo.com/wp-content/uploads/2016/03/35-feature-ict-17-620x257.jpg" width="496" height="206" /></a></p>
<p>본 프로젝트는 주차장에 주차되어 있는 사용자의 자동차를 자신의 앞까지 이동시킬 수 있다면 좋겠다는 생각에 어플리케이션을 통해 카메라영상에 접속하고 카메라영상 속의 모형자동차를 원하는 경로로 이동시키는 프로젝트를 진행하게 되었다.<br />
프로젝트로 제작한 자율주행 모형자동차의 작동 원리는 크게 2가지로 나누어 볼 수 있다.<br />
첫째, 추측 항법(Dead reckoning)이다. 이는 GPS와 같은 위치를 알려주는 일체의 센서없이 스스로 자신의 위치를 계산할 수 있는 방법이다. 이 추측항법의 장점은 고가의 센서 없이 자율주행이 가능하다는 점에서 비용절감의 효과를 기대할 수 있다는 점이다.<br />
둘째, cubic Bezier curve이다. 이는 사용자가 그린 경로를 모형 자동차가 주행 가능한 곡선의 형태로 변경해주는 기술이다. 주행경로가 수직이 될 경우, 모형자동차의 최대 조향각 제한으로 인하여 모형 자동차는 주행할 수 없게 된다. 이러한 점을 극복하기 위해서 주행경로를 곡선으로 생성하고, 서보제어를 통해 모형자동차가 자율주행하게 된다.</p>
<p><span style="color: #3366ff"><strong>추측 항법(Dead reckoning)</strong></span><br />
추측 항법은 운동 모델 중 Kinematic model을 이용하여 계산하였다. 추측 항법 계산은 모형자동차의 속도(v), 축간거리(L), 차량의 진행방향(ψ), 차량의 진행방향으로부터 서보제어 각도(δ) 값을 이용한다.<br />
다음과 같은 계산으로 현재 위치 x, y값을 계산할 수 있다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/03/35-feature-ict-36.jpg" rel="lightbox[30721]"><img class="alignnone size-medium wp-image-30985" alt="35 feature ict (36)" src="http://www.ntrexgo.com/wp-content/uploads/2016/03/35-feature-ict-36-300x55.jpg" width="300" height="55" /></a></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/03/35-feature-ict-37.jpg" rel="lightbox[30721]"><img class="alignnone size-medium wp-image-30986" alt="35 feature ict (37)" src="http://www.ntrexgo.com/wp-content/uploads/2016/03/35-feature-ict-37-300x33.jpg" width="300" height="33" /></a></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/03/35-feature-ict-35.jpg" rel="lightbox[30721]"><img class="alignnone size-medium wp-image-30984" alt="35 feature ict (35)" src="http://www.ntrexgo.com/wp-content/uploads/2016/03/35-feature-ict-35-300x51.jpg" width="300" height="51" /></a></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/03/35-feature-ict-18.jpg" rel="lightbox[30721]"><img class="alignnone size-full wp-image-30967" alt="35 feature ict (18)" src="http://www.ntrexgo.com/wp-content/uploads/2016/03/35-feature-ict-18.jpg" width="406" height="306" /></a></p>
<p><strong><span style="color: #3366ff">주행경로 생성(cubic Bezier curve)</span></strong></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/03/35-feature-ict-19.jpg" rel="lightbox[30721]"><img class="alignnone size-full wp-image-30968" alt="35 feature ict (19)" src="http://www.ntrexgo.com/wp-content/uploads/2016/03/35-feature-ict-19.jpg" width="236" height="168" /></a><br />
cubic Bezier curve 계산은 경로 생성에 필요한 5가지의 점 P0, P1, P2, P3, P4을 사용한다. 다음과 같이 스마트폰에 U자 주행 궤적(빨간색 선)을 그렸다고 가정하자. 빨간색으로 그린 주행경로는 10cm 단위로 점(파란색점)을 생성한 후, 점의 좌표들을 MCU로 전송하게 된다. 전송된 좌표들은 모형자동차가 주행해야되는 지점인 웨이포인트가 된다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/03/35-feature-ict-20.jpg" rel="lightbox[30721]"><img class="alignnone size-medium wp-image-30969" alt="35 feature ict (20)" src="http://www.ntrexgo.com/wp-content/uploads/2016/03/35-feature-ict-20-300x97.jpg" width="300" height="97" /></a></p>
<p>위 그림에서 모형자동차의 현재위치(P0), 현재 위치로부터 다음 웨이포인트(P3), P3로 부터 다음 웨이포인트(P4), P0와 P3사이의 두 점 P1, P2, 현재 위치의 방향 yaw0, P3에서 P4을 바라보는 방향 yaw3을 이용하여 다음과 같이 cubic Bezier curve을 계산할 수 있다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/03/35-feature-ict-38.jpg" rel="lightbox[30721]"><img alt="35 feature ict (38)" src="http://www.ntrexgo.com/wp-content/uploads/2016/03/35-feature-ict-38-620x49.jpg" width="400" /></a></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/03/35-feature-ict-39.jpg" rel="lightbox[30721]"><img class="alignnone  wp-image-30988" alt="35 feature ict (39)" src="http://www.ntrexgo.com/wp-content/uploads/2016/03/35-feature-ict-39-300x23.jpg" width="400" /></a></p>
<p>c = 3 * ( P1 &#8211; P0)<br />
b = 3 * ( P2 &#8211; P1)<br />
a = P3 &#8211; P0 &#8211; b &#8211; c<br />
주행 궤적 = a · t3 + b · t2 + c · t + P0</p>
<p><span style="color: #008080"><strong>서보제어</strong></span></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/03/35-feature-ict-21.jpg" rel="lightbox[30721]"><img class="alignnone size-full wp-image-30970" alt="35 feature ict (21)" src="http://www.ntrexgo.com/wp-content/uploads/2016/03/35-feature-ict-21.jpg" width="462" height="267" /></a><br />
서보제어를 통해 모형 자동차가 주행 궤적을 따라 주행하도록 해야 한다. 서보제어는 모형자동차의 진행 방향에 따라 일정한 거리(Preview distance)의 지점에서 주행 궤적까지의 거리(epath)를 계산하고 epath값을 0으로 줄이도록 서보를 제어하면 된다.<br />
모형자동차가 주행궤적에 따라 주행하게 되면 서보가 미세하게 떨리는 것을 확인할 수 있다. 이러한 현상은 epath값이 완전히 0으로 수렴하지 못하거나 주행 궤적이 급격하게 변화하는 부분에서 발생한다. 이러한 현상을 줄이기 위해서 저역통과 필터(LPF)를 사용하였다.</p>
<p><span style="color: #008080"><strong>저역통과 필터(Low-Pass Filter)</strong></span><br />
저역통과 필터를 사용하는 이유는 급격한 변화 및 미세한 떨림을 줄일 수 있기 때문이다. 저역통과필터를 MCU에 사용하기 위해 코드형태로 변환하는 과정은 Tusin’s method를 사용하였다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/03/35-feature-ict-22.jpg" rel="lightbox[30721]"><img alt="35 feature ict (22)" src="http://www.ntrexgo.com/wp-content/uploads/2016/03/35-feature-ict-22-620x169.jpg" width="620" height="169" /></a></p>
<p><span style="color: #3366ff"><strong>서보 제어 각도 Plot</strong></span></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/03/35-feature-ict-23.jpg" rel="lightbox[30721]"><img class="alignnone size-large wp-image-30972" alt="35 feature ict (23)" src="http://www.ntrexgo.com/wp-content/uploads/2016/03/35-feature-ict-23-620x279.jpg" width="620" height="279" /></a><br />
※ 저역통과 필터 사용으로 인하여 서보제어의 미세한 떨림 및 급격한 변화가 줄어든 효과를 확인할 수 있다. 또한 서보제어의 빠른 동작을위하여 PI 제어기를 설계하였다.</p>
<p><span style="color: #008080"><strong>PI Controller</strong></span><br />
PI 제어기를 사용하는 이유는 빠른 서보제어를 통하여 주행 궤적에 대한 epath의 값을 효과적으로 줄이기 위해서이다. PI 제어기 역시 MCU에 사용하기 위해 코드형태로 변환하는 과정은 Tusin’s method를 사용하여 Discrete PI controller를 설계하였다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/03/35-feature-ict-24.jpg" rel="lightbox[30721]"><img class="alignnone  wp-image-30973" alt="35 feature ict (24)" src="http://www.ntrexgo.com/wp-content/uploads/2016/03/35-feature-ict-24-620x323.jpg" width="496" height="258" /></a></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/03/35-feature-ict-25.jpg" rel="lightbox[30721]"><img class="alignnone  wp-image-30974" alt="35 feature ict (25)" src="http://www.ntrexgo.com/wp-content/uploads/2016/03/35-feature-ict-25-620x465.jpg" width="558" height="419" /></a></p>
<p>※ PI 제어기 사용으로, 오버슈트는 약간 발생하였지만 Rising time 및 Settling time이 현저히 줄어든 효과를 확인할 수 있으며 에러 값(epath)이 0에 가깝게 수렴하는 것을 확인할 수 있다.</p>
<p><strong><span style="color: #008080">Simulation Program</span></strong><br />
설계한 모형자동차가 올바르게 동작하는 것을 확인하기 위하여 MATLAB Simulink를 이용하여 시뮬레이션 프로그램을 설계하였다. 시뮬레이션을 통해 성능이 검증된 후 MCU에 설계한 코드를 옮겨 프로젝트를 완료하였다.</p>
<table style="border-color: #e0e0e0;border-width: 1px;;width: 620px" border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td><a style="font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif;font-size: 13px;line-height: 19px" href="http://www.ntrexgo.com/wp-content/uploads/2016/03/35-feature-ict-26.jpg" rel="lightbox[30721]"><img class="alignnone size-large wp-image-30975" alt="35 feature ict (26)" src="http://www.ntrexgo.com/wp-content/uploads/2016/03/35-feature-ict-26-620x246.jpg" width="620" height="246" /></a></td>
</tr>
<tr>
<td style="text-align: center">전체 시뮬레이션 프로그램 구성도</td>
</tr>
<tr>
<td><a style="font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif;font-size: 13px;line-height: 19px" href="http://www.ntrexgo.com/wp-content/uploads/2016/03/35-feature-ict-27.jpg" rel="lightbox[30721]"><img class="size-full wp-image-30976 aligncenter" alt="35 feature ict (27)" src="http://www.ntrexgo.com/wp-content/uploads/2016/03/35-feature-ict-27.jpg" width="415" height="310" /></a></td>
</tr>
<tr>
<td><a style="font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif;font-size: 13px;line-height: 19px" href="http://www.ntrexgo.com/wp-content/uploads/2016/03/35-feature-ict-28.jpg" rel="lightbox[30721]"><img class="size-full wp-image-30977 aligncenter" alt="35 feature ict (28)" src="http://www.ntrexgo.com/wp-content/uploads/2016/03/35-feature-ict-28.jpg" width="458" height="360" /></a></td>
</tr>
<tr>
<td>
<p style="text-align: center">매트랩을 통한 시뮬레이션</p>
</td>
</tr>
</tbody>
</table>
<p>※ 시뮬레이션을 통해 주행경로 생성, 조향 제어각도 확인, 조향 방향, 조향각에 따른 속도 감속 등의 동작을 확인할 수 있다.</p>
<p><span style="font-size: medium;color: #000080"><strong>전체 시스템 구성</strong></span><br />
<strong><span style="color: #008080">프로젝트 구성도</span></strong><br />
<strong></strong></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/03/35-feature-ict-40.jpg" rel="lightbox[30721]"><img class="alignnone size-large wp-image-30989" alt="35 feature ict (40)" src="http://www.ntrexgo.com/wp-content/uploads/2016/03/35-feature-ict-40-620x450.jpg" width="620" height="450" /></a></p>
<p><strong><span style="color: #008080">System Architecture</span></strong><br />
<strong></strong></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/03/35-feature-ict-1.png" rel="lightbox[30721]"><img class="alignnone size-large wp-image-30945" alt="35 feature ict (1)" src="http://www.ntrexgo.com/wp-content/uploads/2016/03/35-feature-ict-1-620x359.png" width="620" height="359" /></a></p>
<p><strong><span style="color: #008080">Hardware Architecture</span></strong><br />
<strong></strong></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/03/35-feature-ict-2.png" rel="lightbox[30721]"><img class="wp-image-30947 aligncenter" alt="35 feature ict (2)" src="http://www.ntrexgo.com/wp-content/uploads/2016/03/35-feature-ict-2-620x473.png" width="496" height="378" /></a></p>
<p><strong><span style="color: #008080">Software Architecture</span></strong><br />
<strong></strong></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/03/35-feature-ict-3.png" rel="lightbox[30721]"><img class="wp-image-30949 aligncenter" alt="35 feature ict (3)" src="http://www.ntrexgo.com/wp-content/uploads/2016/03/35-feature-ict-3-620x444.png" width="496" height="355" /></a></p>
<p><strong><span style="color: #008080">Dead Reckoning</span></strong><br />
<strong></strong></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/03/35-feature-ict-4.png" rel="lightbox[30721]"><img class="wp-image-30951 aligncenter" alt="35 feature ict (4)" src="http://www.ntrexgo.com/wp-content/uploads/2016/03/35-feature-ict-4-620x172.png" width="496" height="138" /></a></p>
<p><strong><span style="color: #008080">cubic Bezier curve</span></strong><br />
<strong></strong></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/03/35-feature-ict-5.png" rel="lightbox[30721]"><img class="wp-image-30953 aligncenter" alt="35 feature ict (5)" src="http://www.ntrexgo.com/wp-content/uploads/2016/03/35-feature-ict-5-620x152.png" width="496" height="122" /></a></p>
<p><strong><span style="color: #008080">주행 알고리즘</span></strong></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/03/35-feature-ict-6.png" rel="lightbox[30721]"><img class="wp-image-30955 aligncenter" alt="35 feature ict (6)" src="http://www.ntrexgo.com/wp-content/uploads/2016/03/35-feature-ict-6-620x246.png" width="496" height="197" /></a></p>
<p><span style="font-size: medium"><strong>개발 환경</strong></span><br />
<span style="color: #008080"><strong>개발 언어</strong></span><br />
· C 언어<br />
· Java</p>
<p><span style="color: #008080"><strong>Tool</strong></span><br />
· CodeVisionAVR C Compiler<br />
· Eclipse IDE for Java EE Developers<br />
· MATLAB 2014</p>
<p><span style="color: #008080"><strong>시스템</strong></span><br />
· Dead reckoning (추측항법)<br />
※ Kinematic model을 이용한 현재 위치계산<br />
· Cubic bezier curve를 이용한 자동차가 운행 가능한 궤적 생성<br />
· PI 제어<br />
· Low-Pass filter</p>
<p><span style="font-size: medium;color: #000080"><strong>단계별 제작 과정</strong></span></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/03/35-feature-ict-2.jpg" rel="lightbox[30721]"><img class="alignnone size-large wp-image-30946" alt="35 feature ict (2)" src="http://www.ntrexgo.com/wp-content/uploads/2016/03/35-feature-ict-2-620x465.jpg" width="620" height="465" /></a></p>
<p>RC카는 시중에 판매하는 Xray사의 모델인 m18을 사용하여 제작하였다. RC카 위에 PCB판을 올려 기본적인 틀을 구성하고 PCB는 다이폴을 이용하여 나사로 고정하였다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/03/35-feature-ict-3.jpg" rel="lightbox[30721]"><img class="size-large wp-image-30948 aligncenter" alt="35 feature ict (3)" src="http://www.ntrexgo.com/wp-content/uploads/2016/03/35-feature-ict-3-620x465.jpg" width="620" height="465" /></a></p>
<p>Atmega128을 사용하기 위해 LM7805 레귤레이터와 커패시터 2개(330uF, 100uF)를 이용한 5V 전원부를 제작하였다. 또한 블루투스 (ESD200) 연결을 위해서는 3.3V로 전압 다운이 필요하여, LM1117과 커패시터 2개(100uF, 10uF)를 이용해 제작하였다.</p>
<p style="text-align: left"><a href="http://www.ntrexgo.com/wp-content/uploads/2016/03/35-feature-ict-4.jpg" rel="lightbox[30721]"><img class=" wp-image-30950 aligncenter" alt="35 feature ict (4)" src="http://www.ntrexgo.com/wp-content/uploads/2016/03/35-feature-ict-4-465x620.jpg" width="372" height="496" /></a><br />
ATmega128과 전원부, 블루투스를 연결한 모습으로 USBISP(Version 3.5)로 다운로드를 받기 위한 핀과 시리얼 통신을 위한 핀과 DC모터 구동을 위한 핀 연결을 한다.</p>
<p style="text-align: left"><a href="http://www.ntrexgo.com/wp-content/uploads/2016/03/35-feature-ict-5.jpg" rel="lightbox[30721]"><img class="wp-image-30952 aligncenter" alt="35 feature ict (5)" src="http://www.ntrexgo.com/wp-content/uploads/2016/03/35-feature-ict-5-620x465.jpg" width="496" height="372" /></a><br />
파워 서플라이를 통해 전원을 인가하여 전원부의 동작상태와 Atme ga128의 정상 동작여부를 확인하고 테스터기를 통해 안정동작 범위인지 테스트한다.</p>
<p style="text-align: left"><a href="http://www.ntrexgo.com/wp-content/uploads/2016/03/35-feature-ict-6.jpg" rel="lightbox[30721]"><img class=" wp-image-30954 aligncenter" alt="35 feature ict (6)" src="http://www.ntrexgo.com/wp-content/uploads/2016/03/35-feature-ict-6-465x620.jpg" width="372" height="496" /></a><br />
Xray사의 m18에 기본 장착 서보모터를 이용한 서보모터 제작 과정.<br />
PWM을 사용하여 기본 0도 조정부터, 최대각도를 테스트하여 안정적으로 제어 가능한 한계 각이 35도라고 판단.</p>
<p style="text-align: left"><a href="http://www.ntrexgo.com/wp-content/uploads/2016/03/35-feature-ict-7.jpg" rel="lightbox[30721]"><img class=" wp-image-30956 aligncenter" alt="35 feature ict (7)" src="http://www.ntrexgo.com/wp-content/uploads/2016/03/35-feature-ict-7-465x620.jpg" width="372" height="496" /></a></p>
<p style="text-align: left"><a href="http://www.ntrexgo.com/wp-content/uploads/2016/03/35-feature-ict-10.jpg" rel="lightbox[30721]"><img class=" wp-image-30959 aligncenter" alt="35 feature ict (10)" src="http://www.ntrexgo.com/wp-content/uploads/2016/03/35-feature-ict-10-465x620.jpg" width="372" height="496" /></a><br />
AM-DC-2D 모터드라이버를 이용한 DC모터의 연결 및 PCB에서의 위치 구성을 완료.</p>
<p style="text-align: left"><a href="http://www.ntrexgo.com/wp-content/uploads/2016/03/35-feature-ict-8.jpg" rel="lightbox[30721]"><img class="wp-image-30957 aligncenter" alt="35 feature ict (8)" src="http://www.ntrexgo.com/wp-content/uploads/2016/03/35-feature-ict-8-620x465.jpg" width="496" height="372" /></a><br />
B포트를 사용하여 PWM을 이용한 DC모터 제어를 하였고, 모터드라이버의 데이터시트에서 1번이 PWM연결, 2번이 회전방향, 3번이 Enable임을 확인하여 Atmega128과 연결.</p>
<p style="text-align: left"><a href="http://www.ntrexgo.com/wp-content/uploads/2016/03/35-feature-ict-9.jpg" rel="lightbox[30721]"><img class="size-large wp-image-30958 aligncenter" alt="35 feature ict (9)" src="http://www.ntrexgo.com/wp-content/uploads/2016/03/35-feature-ict-9-465x620.jpg" width="465" height="620" /></a><br />
우선 1차적인 하드웨어를 완성하였고, 테스트를 통해 정상 동작 여부와 전압 전류를 테스터기를 통해 체크.</p>
<p style="text-align: left"><a href="http://www.ntrexgo.com/wp-content/uploads/2016/03/35-feature-ict-11.jpg" rel="lightbox[30721]"><img class="wp-image-30960 aligncenter" alt="35 feature ict (11)" src="http://www.ntrexgo.com/wp-content/uploads/2016/03/35-feature-ict-11-620x466.jpg" width="496" height="373" /></a><br />
파워서플라이를 연결하여 모터의 회전속도와 서보모터의 방향제어 (왼쪽 35도부터 오른쪽 35도까지)를 실시.</p>
<p style="text-align: left"><a href="http://www.ntrexgo.com/wp-content/uploads/2016/03/35-ict-.jpg" rel="lightbox[30721]"><img class="size-full wp-image-30991 aligncenter" alt="35 ict" src="http://www.ntrexgo.com/wp-content/uploads/2016/03/35-ict-.jpg" width="436" height="199" /></a><br />
글로벌 카메라를 천장에 설치하여 바닥까지 연장을 하기 위해 USB연장선 3M 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/03/35-feature-ict-30.jpg" rel="lightbox[30721]"><img class="alignnone size-medium wp-image-30979" alt="35 feature ict (30)" src="http://www.ntrexgo.com/wp-content/uploads/2016/03/35-feature-ict-30-300x236.jpg" width="300" height="236" /></a></td>
<td><a href="http://www.ntrexgo.com/wp-content/uploads/2016/03/35-feature-ict-31.jpg" rel="lightbox[30721]"><img class="alignnone size-medium wp-image-30980" alt="35 feature ict (31)" src="http://www.ntrexgo.com/wp-content/uploads/2016/03/35-feature-ict-31-300x192.jpg" width="300" height="192" /></a></td>
</tr>
<tr>
<td><a href="http://www.ntrexgo.com/wp-content/uploads/2016/03/35-feature-ict-32.jpg" rel="lightbox[30721]"><img class="alignnone size-medium wp-image-30981" alt="35 feature ict (32)" src="http://www.ntrexgo.com/wp-content/uploads/2016/03/35-feature-ict-32-300x191.jpg" width="300" height="191" /></a></td>
<td><a href="http://www.ntrexgo.com/wp-content/uploads/2016/03/35-feature-ict-33.jpg" rel="lightbox[30721]"><img class="alignnone size-medium wp-image-30982" alt="35 feature ict (33)" src="http://www.ntrexgo.com/wp-content/uploads/2016/03/35-feature-ict-33-300x251.jpg" width="300" height="251" /></a></td>
</tr>
</tbody>
</table>
<p style="text-align: left">자율주행자동차가 주행을 하기위한 궤적이 필요하므로, Geogbra 라는 수학 그래프 편집 프로그램을 이용하여, 다양한 궤적들을 실제 거리에 맞추어 제작.</p>
<p style="text-align: left"><a href="http://www.ntrexgo.com/wp-content/uploads/2016/03/35-feature-ict-28.jpg" rel="lightbox[30721]"><img class="size-full wp-image-30977 aligncenter" alt="35 feature ict (28)" src="http://www.ntrexgo.com/wp-content/uploads/2016/03/35-feature-ict-28.jpg" width="458" height="360" /></a><br />
Matlab 프로그램을 이용해, 시뮬레이션을 돌려 제작한 코드에 맞추어 궤적을 생성한 주행이 제대로 이루어지는지를 테스트하여 소스를 수정.</p>
<p style="text-align: center"><a href="http://www.ntrexgo.com/wp-content/uploads/2016/03/35-feature-ict-13.jpg" rel="lightbox[30721]"><img class=" wp-image-30962 aligncenter" alt="35 feature ict (13)" src="http://www.ntrexgo.com/wp-content/uploads/2016/03/35-feature-ict-13-620x412.jpg" width="434" height="288" /></a><br />
시뮬레이션을 마친 후 궤적에 따라 실제로 자율주행자동차를 테스트하는 과정. 배터리를 아직 달지 않고, 파워서플라이를 이용하여 테스트.</p>
<p style="text-align: center"><a href="http://www.ntrexgo.com/wp-content/uploads/2016/03/35-feature-ict-16.jpg" rel="lightbox[30721]"><img class=" wp-image-30965 aligncenter" alt="35 feature ict (16)" src="http://www.ntrexgo.com/wp-content/uploads/2016/03/35-feature-ict-16-620x330.jpg" width="446" height="238" /></a></p>
<p>테스트 과정에서 모터 토크가 부족한 것을 체크하여, 토크가 강한 감속기어가 달린 DC모터로 교체하여 하드웨어를 구성.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/03/35-ict-222.jpg" rel="lightbox[30721]"><img class="size-full wp-image-30992 aligncenter" alt="35 ict 222" src="http://www.ntrexgo.com/wp-content/uploads/2016/03/35-ict-222.jpg" width="439" height="199" /></a><br />
모든 테스트들을 해보며, 파워서플라이의 선이 필요없도록 배터리 장착이 필요함을 인식하여, 배터리 장착 후에도 안정적인 속도를 얻기 위한 12V 전원부를 제작. LM2576과 커패시터 2개(100uF, 1000uF), 인덕터(100uH), 다이오드(1N5822)를 이용하여 제작.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/03/35-feature-ict-16.jpg" rel="lightbox[30721]"><img class="wp-image-30965 aligncenter" alt="35 feature ict (16)" src="http://www.ntrexgo.com/wp-content/uploads/2016/03/35-feature-ict-16-620x330.jpg" width="434" height="231" /></a><br />
최종적으로 7V Lipo배터리를 직렬로 연결하여 14V 배터리를 무게 중심에 최대한 맞추어 연결하고, 12V 전원부를 부착한 최종형태의 하드웨어 제작.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/03/35-feature-ict-1.jpg" rel="lightbox[30721]"><img class="wp-image-30944 aligncenter" alt="35 feature ict (1)" src="http://www.ntrexgo.com/wp-content/uploads/2016/03/35-feature-ict-1-620x354.jpg" width="496" height="283" /></a><br />
카메라 영상을 이용해 노트북에서 서버 역할을 하고, 어플을 통해 자율주행 자동차가 주행할 경로를 그리면, 그에 따라 자동차가 주행하며, 주행경로를 어플로 표시해주는 모습.</p>
<p>&nbsp;</p>
<p><span style="color: #000080;font-size: medium"><strong>프로젝트 영상</strong></span></p>
<p><a href="https://www.youtube.com/watch?v=g5Gi0Laz5cM&amp;feature=youtu.be" target="_blank"><span style="text-decoration: underline">https://www.youtube.com/watch?v=g5Gi0Laz5cM&amp;feature=youtu.be</span></a></p>
<p><span style="font-size: medium;color: #000080"><strong>회로도</strong></span></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/03/35-feature-ict-34.jpg" rel="lightbox[30721]"><img class="alignnone size-large wp-image-30983" alt="35 feature ict (34)" src="http://www.ntrexgo.com/wp-content/uploads/2016/03/35-feature-ict-34-620x291.jpg" width="620" height="291" /></a></p>
<p><span style="font-size: medium;color: #000080"><strong>참고문헌</strong></span><br />
· 조규상, 2002, “Bezier 곡선을 이용한 이륜 구동 로봇의 경로 생성”, 『대한전기학회』, 10-12<br />
· 이상훈 외 2명, 2011, “교차로에서의 자율주행을 위한 베지어 곡선 기반 경로 계획”, 『한국정밀공학회』, P381-382<br />
· Hye Ri Park, 2009, “A Dead Reckoning Sensor System and a Tracking Algorithm for Mobile Robot”, 『ICROS-SICE』, P18-21</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ntrexgo.com/archives/30721/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[30호]6족 보행 로봇 ‘벅벅이’</title>
		<link>http://www.ntrexgo.com/archives/29420</link>
		<comments>http://www.ntrexgo.com/archives/29420#comments</comments>
		<pubDate>Fri, 15 May 2015 07:39:59 +0000</pubDate>
		<dc:creator>디바이스마트 매거진</dc:creator>
				<category><![CDATA[디바이스마트 매거진]]></category>
		<category><![CDATA[특집]]></category>
		<category><![CDATA[30호]]></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=29420</guid>
		<description><![CDATA[디바이스마트매거진 30호 &#124; 최근 산업 현장 외에도 일상생활에서 사람을 도와줄 수 있는 로봇의 필요성이 높아지고 있다. 이러한 요구를 충족시키기 위한 로봇에 있어 이동의 기능은 필수적인 기술이 되었다. ]]></description>
				<content:encoded><![CDATA[<p><a href="http://www.ntrexgo.com/wp-content/uploads/2015/05/Cap-2015-11-30-16-24-59-922.png" rel="lightbox[29420]"><img class="alignnone size-full wp-image-29448" alt="Cap 2015-11-30 16-24-59-922" src="http://www.ntrexgo.com/wp-content/uploads/2015/05/Cap-2015-11-30-16-24-59-922.png" width="620" height="250" /></a></p>
<p><span style="color: #000080;font-size: xx-large;background-color: #ffffff"><strong>6족 보행 로봇 ‘벅벅이’</strong></span></p>
<p style="text-align: right">글 | 고려대학교 과학기술대학 제어계측공학과 류예슬</p>
<p>&nbsp;</p>
<p><span style="color: #ffffff;font-size: medium;background-color: #000080"><strong>심 사 평</strong></span></p>
<p><span style="color: #ffffff;background-color: #0000ff">싱크웍스 </span>시연동영상으로 볼때 작품의 완성도가 높았고, 학생 수준에서 구할 수 있는 재료들을 잘 사용해서 만든 것 같다. 작품을 만들면서 많은 공부가 되었을 것 같다.</p>
<p><span style="color: #ffffff;background-color: #0000ff">JK전자 </span>유선 조이스틱으로 조정하여 단순히 보행만 하는 기능 이외에 보행을 하면서 할 수 있는 부가적인 기능이 추가되었으면 더 좋았을 것 같다. 예를 들면 사람이 갈수 없는 곳을 탐사하여 영상을 전송하는 기능이나, 물건을 집어서 옮기는 기능 등이 된다면 조금 더 실용성이 높아질 것이다. 어쨌든 여러 사람이 아닌 혼자서 기구부 제작과 소프트웨어 개발까지 했다는 것은 쉬운 일은 아니었을 것이다. 마음이 맞는 좋은 파트너와 코웍을 하면 조금 더 실용성이 높은 작품이 나올것 같다.</p>
<p><span style="color: #ffffff;background-color: #0000ff">뉴티씨</span> 매우 잘만든 6족로봇 작품으로 판단된다. 다만, 빠른 이동은 좀 어려운 점이 약간 아쉽다. 미끄러움을 방지하기 위하여, 끝부분에 고무 같은 재질을 사용한 점도 좋은 점으로 착안하였다. 좀 더 잘 만든다면, 구조로봇 같은 형태로도 만들어질 수 있을 것으로 생각되며, 계단 등도 다른 작품처럼 올라갈 수 있을 것으로 생각된다. 기술적인 난이도는 매우 높지도 낮지도 않지만, 전체적인 작품의 완성도가 높은 것으로 판단되며, 기구적인 부분에서도 창의적인 아이디어로 재료 선택 등에서도 무게도 줄이고 잘 만든 것 같다. 향후, 학습하면서 좋은 작품을 만들 수 있을 것으로 기대한다.</p>
<p><span style="color: #ffffff;font-size: medium;background-color: #000080"><strong>작품 개요</strong></span></p>
<p><strong><span style="color: #0000ff">■ 프로젝트 개발 동기</span></strong><br />
최근 산업 현장 외에도 일상생활에서 사람을 도와줄 수 있는 로봇의 필요성이 높아지고 있다. 이러한 요구를 충족시키기 위한 로봇에 있어 이동의 기능은 필수적인 기술이 되었다. 특히 6족 로봇은 오프로드에서도 바퀴로 이동하는 모바일로봇 또는 다른 종류의 보행 로봇보다 안정된 보행을 할 수 있다는 장점을 가졌고, 또한 전쟁, 행성탐사, 무너진 건물 속의 인명탐사 등에 활용 될 수 있다.<br />
하드웨어 및 소프트웨어에 열정이 있는 사람들의 모임인 과 내 학술소모임 다가치(KUCIRA)에서 학술제를 목표로 보행로봇을 프로젝트로 기획하던 중, 보행 로봇에 대한 정보를 수렴한 결과 위와 같은 장점을 가진 6족 로봇이 가장 적절하다 생각되어 개발하게 되었다.</p>
<p><span style="color: #0000ff"><strong>■ 프로젝트 구현 목표</strong></span><br />
· 6족 로봇의 보행 메카니즘과 구조 이해 (전진, 후진, 회전)<br />
· Atmega 128 (MCU) 이해 및 AVR 프로그래밍 이해<br />
· 서보모터의 이해 [fast pwm제어]
· 2축 조이스틱(가변저항)을 이용한 유선제어 [AD Convertor]
<p><span style="color: #0000ff"><strong>■ 제목의 의미</strong></span><br />
이 프로젝트의 가장 큰 특징은 로봇의 다리가 6개라는 점이다. 이 점을 감안하여 6개의 다리를 가진 곤충과 관련된 이름을 지어주려고 하였는데, 첫 프로젝트인 느낌을 살리기 위해 ‘bug’의 ‘벅’을 한국식으로 바꾸어 ‘벅벅이’라 이름을 붙여주게 되었다.</p>
<p><span style="font-size: medium;color: #ffffff;background-color: #000080"><strong>작품 설명</strong></span></p>
<p><span style="color: #0000ff"><strong>■ 주요 동작 및 특징</strong></span><br />
‘벅벅이’의 주요 동작은 보행이다. 로봇의 다리는 6개이고 각 다리 당 2개의 관절을 가진 12관절 구조이다. 몸통과 가까운 모터를 ‘위 관절’이라 하고 바닥과 가까운 모터를 ‘아래 관절’이라고 칭하면, 위 관절은 가고자 하는 방향결정에 중요한 역할을 한다. 아래 관절은 위 관절이 이동을 할 때에는 발을 바닥에서 들어주고 이동을 마친 후에는 바닥으로 발을 찍어주어 바닥의 마찰을 이용하여 이동하게 해주는 역할을 한다.<br />
구현한 보행의 종류는 크게 세 가지이다. 전진, 후진, 좌/우로의 회전이다. 그리고 정육각형 형태의 프레임을 가졌기 때문에 앞뒤 구분이 필요하였다. 이를 위해 led를 삽입하였고 앞뒤 구분의 역할과 동시에 동작에 따라 led가 다른 알고리즘을 수행하게 하였다. 마지막으로 2축 조이스틱을 이용하여 조이스틱의 기울기(위치)에 따라 ‘벅벅이’를 제어하였다.</p>
<p><strong>1. 전진/후진</strong></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2015/05/30-2014-ict-1.jpg" rel="lightbox[29420]"><img class="alignnone size-full wp-image-29428" alt="30 2014 ict (1)" src="http://www.ntrexgo.com/wp-content/uploads/2015/05/30-2014-ict-1.jpg" width="400" height="313" /></a><br />
위 사진처럼 다리의 번호를 1번부터 6번까지로 표현하였다. 위 관절의 모터를 먼저 얘기하면 2번과 6번, 3번, 1번과 5번, 4번 이렇게 각각의 세트를 4개의 MCU PORT에 연결하였다. 아래 관절은 2, 3, 6번 그리고 1, 4, 5번 다리가 또 다른 2개의 PORT에 연결하였다. 이렇게 연결한 이유는 6족 로봇의 보행 매카니즘과 관련이 있다. 동영상으로 시연영상을 보면 바로 파악하기는 어려우나 자세히 보면 모터의 동작 순서는 다음과 같다.<br />
위 관절의 1번+5번 모터를 A, 4번 모터를 B, 2번+6번 모터를 C, 3번 모터를 D라 하고, 아래 관절의 1번+4번+5번 모터를 E, 2번+3번+6번 모터를 F라 하자. 정지 상태에서 위 관절의 모든 모터는 각도를 0˚부터 180˚범위에서 90˚이고, 아래 관절의 모든 모터는 40˚인 상태이다.(위 오른쪽 사진 참고) 전진을 위한 과정은 다음과 같다.</p>
<p>1) 먼저 전진을 위해서는 E모터를 90˚로 해준다. 이것은 먼저 이동할 다리를 움직일 수 있도록 발을 바닥에서 해체시켜주는 것이다. (모터의 RESET(정지)상태는 ABCD모터는 모두 90˚ 이고, EF모터는 모두 40˚이다.)<br />
2) A모터는 110˚, B모터는 75˚가 동시에 되도록 한다.<br />
3) E번 모터를 40˚로 한다. 이것은 발을 바닥으로 내려주는 역할을 한다.<br />
4) F모터를 90˚로 하여 반대편 다리를 든다. (위 관절의 한 세트라도 방향 제어를 할 경우에는 다른 반대쪽 아래 관절의 다리는 들려있어야 한다.)<br />
5) A모터를 70˚B모터는 110˚가 동시에 되도록 한다. 아래 관절의 모터로 인해 발이 바닥에 닿아 있는 상태이기 때문에 마찰에 의하여 로봇이 앞으로 움직이게 된다.<br />
6) 위와 같은 원리로 C모터는 70˚, D모터는 110˚가 동시에 되도록 한다.<br />
7) F모터를 40˚로, E모터를 90˚로 한다.<br />
8) C모터는 110˚, D모터는 80˚가 동시에 되도록 한다. 마찬가지로 F모터로 인해 마찰에 의하여 로봇이 전진하게 된다.</p>
<p>위 과정의 알고리즘은 다음과 같다. 실제 코딩(모터의 분류)은 A, B, C, D, E, F가 아닌 숫자로 되어있지만 위에 그렇게 표현하였기 때문에 바꿔 첨부하였다. Motor(int x, int y)함수는 x번 모터를 y˚만큼 각도변환 시키는 함수이다. delay를 얼마만큼 주는지에 따라 보행 속도가 결정된다.<br />
*후진은 전진과 방향만 반대일 뿐 보행 원리는 같다.</p>
<div class="symple-box gray none" style="text-align:left; width:100%;"> 
<p>void GOBACK()<br />
{<br />
PORTA=0X00;<br />
Motor(E,90); //들고(1번다리)<br />
delay_ms(230);<br />
Motor(A,110);<br />
Motor(B,75); // 1번다리 회전<br />
delay_ms(230);<br />
Motor(E,40); //1번다리 내리고<br />
delay_ms(230);<br />
Motor(f,90); // 2번다리 들고<br />
delay_ms(230);<br />
Motor(A,70);<br />
Motor(B, 110); //1번다리 반회전<br />
delay_ms(230);<br />
Motor(C,70);<br />
Motor(D,110); // 2번다리 회전<br />
delay_ms(230);<br />
Motor(F,40); //2번다리 내리고<br />
delay_ms(230);<br />
Motor(E,90); //1번다리 들고<br />
delay_ms(230);<br />
Motor(C,110);<br />
Motor(D,80); //2번다리 반회전<br />
}</p>
</div>
<p><strong>2. 좌/우 회전</strong><br />
좌/우 회전의 매카니즘 이해는 전진/후진보다 훨씬 쉽다. 간단하게 말하면 다리를 반으로 나누어 회전하고자하는 방향으로 회전을 시켜주면 된다. 내가 구현한 알고리즘은 회전시킬 다리의 아래 관절을 들고 그 다리를 회전시키고 나머지 반의 다리들도 앞과 같이 해주면 된다. 아래 관절을 이용해 발을 드는 동작과 위 관절을 이용해 다리를 회전시키는 동작 사이의 시간을 줄여줄수록 모션을 좀 더 부드럽게 제어할 수 있다.<br />
아래는 실제 알고리즘이다. 중간에 들어간 read_adc()에 대한 조건문은 뒤에서 조이스틱 파트에서 설명하기로 한다.</p>
<div class="symple-box gray none" style="text-align:left; width:100%;"> 
<p>//좌우<br />
if(read_adc(1)&gt;900 //오른쪽으로 회전<br />
{<br />
PORTA=0xf0;<br />
Motor(1,90); //들고(1번다리)<br />
delay_ms(100);<br />
Motor(3,110);<br />
Motor(4,110); //1번다리 회전<br />
delay_ms(200);<br />
Motor(1,40); //1번다리 내리고<br />
delay_ms(200);<br />
if(read_adc(1)&gt;=300 &amp;&amp; read_adc(1)&lt;=700)<br />
STOP();<br />
else if(read_adc(1)&gt;900)<br />
{</p>
<p>Motor(2,90); // 2번다리 들고<br />
delay_ms(100);<br />
Motor(3,90);<br />
Motor(4,90); //1번다리 반회전<br />
delay_ms(200);<br />
Motor(5,110);<br />
Motor(6,110); // 2번다리 회전<br />
delay_ms(100);<br />
Motor(2,40); //2번다리 내리고<br />
delay_ms(200);<br />
if (read_adc(1)&gt;=300 &amp;&amp; read_adc(1)&lt;=700)<br />
STOP();<br />
else if(read_adc(1)&gt;900)<br />
{<br />
Motor(1,90); //1번다리 들고<br />
delay_ms(100);<br />
Motor(5,90);<br />
Motor(6,90); //2번다리 반회전<br />
}<br />
</div>
<p><strong>3. 동작에 따른 LED</strong><br />
알고리즘 상의 ‘벅벅이’의 보행종류는 앞서 말했듯이 전진, 후진, 회전으로 나눠진다. 원한다면 각 동작에 다른 led제어구문을 삽입할 수 있다. 나는 로봇의 정지 상태와 동작 상태만을 구분하기 위해 정지 상태에는 8개의 LED가 방향을 바꾸어 가며 순차점등을 하도록 하였고, 동작 상태에서는 눈과 같다는 인상을 심어주기 위해 양 끝 LED만 켜지게 하였다. (이것은 ‘눈’을 연상시키게 함이다.) 실제 알고리즘은 다음과 같다.</p>
<p><strong><span style="color: #808080">정지상태의 LED 동작</span></strong><br />
좀 더 정확한 초 계산을 위해 타이머 normal 모드를 통해 LED를 제어하였다.</p>
<div class="symple-box gray none" style="text-align:left; width:100%;"> 
<p>Void STOP()<br />
{<br />
if(i&lt;8)<br />
{<br />
if(cnt1&gt;1)<br />
{<br />
PORTA=~(RLED&lt;&lt;i);<br />
i++;<br />
cnt1=0;<br />
}<br />
}<br />
else if(i==8)<br />
{<br />
if(j&lt;8)<br />
{<br />
if(cnt1&gt;1)<br />
{<br />
PORTA=~(LLED&gt;&gt;j);<br />
j++;<br />
cnt1=0;<br />
}<br />
}<br />
else i++;<br />
}<br />
else<br />
{<br />
i=0;<br />
j=0;<br />
}<br />
</div>
<p><span style="color: #808080"><strong>동작상태의 LED 동작</strong></span></p>
<div class="symple-box gray none" style="text-align:left; width:100%;"> 
EPROTA = 0x7E<br />
</div>
<p>양 끝 LED를 계속 키고 있는 상태를 코딩하는 것은 쉽다. 내가 구성한 회로의 LED의 PORT가 아닌 쪽이 Vcc와 연결되어 있기 때문에 LED와 연결된 PORT의 출력레지스터 설정을 한 후, LOW신호를 흘려주면 그 부분의 LED는 불이 들어오게 된다.<br />
우선 사용한 2축 조이스틱은 두 개의 가변저항으로 만들어진 컨트롤러이다. 먼저 한 축은 보행의 전진, 후진을 제어하고, 나머지 한 축은 좌/우로의 회전을 제어한다. 여기서 사용되는 AVR의 기능은 ADC라는 기능이다.</p>
<p>ADC란 ‘Analog Digital Convertor’라는 줄임말로 아날로그 신호를 디지털로, 혹은 디지털 신호를 아날로그 신호로 바꿔주는 기능이다. 여기서 내가 사용한 것은 아날로그 신호를 디지털 신호로 바꿔준 기능이다. 2축 조이스틱의 방향을 바꿔줄 때마다 가변저항의 값이 변한다. 이것이 바로 아날로그 신호이다. 이런 아날로그 신호를 MCU에 전달해주고 그 신호 값에 따라 코딩한 알고리즘이 구현된다. 이것이 아날로그신호가 디지털 신호로 바뀌는 과정이다. 로봇의 각 모션에 따른 알고리즘은 길기 때문에 위에서 잠깐 봤던 회전 알고리즘에서 설명을 하도록 하겠다.</p>
<p>ADC를 사용하기 위해서는 먼저 그것에 대한 초기 레지스터 설정을 해주어야 한다. 레지스터 설정은 Code Vision의 Wizard (사용하고자 하는 기능의 툴을 제공)을 사용하였다.</p>
<p><a href="http://www.ntrexgo.com/archives/29420/30-ict-05" rel="attachment wp-att-29427"><img class="alignnone  wp-image-29427" alt="30 ict 05" src="http://www.ntrexgo.com/wp-content/uploads/2015/05/30-ict-05.bmp" width="538" height="283" /></a></p>
<p>레지스터 설정은 간단하게 넘어가고, 아날로그 신호를 디지털 신호로 어떤 식으로 변환하는지에 대해서 살펴보자. 밑의 사진은 ‘좌/우 회전’ 동작에서도 봤던 알고리즘이다. 중간 중간에 read_adc(1)의 값에 따른 조건문이 삽입되어 있다. 이것이 바로 가변저항 즉, 아날로그 신호를 디지털 신호로 변환시킨 값이다.<br />
가변저항의 값에 따라 read_adc(1)의 값이 어떻게 변하는지는 보통 통신을 통해서 정확한 값을 확인한다. 하지만 정확한 값을 받아야 하는 센서를 사용하는 것이 아니고 내가 원하는 지점에서부터 작동하기만 하면 되기 때문에 처음 테스트는 read_adc(1)의 값에 따라 LED를 통해 확인했고 그 값을 토대로 알고리즘을 작성할 수 있었다.<br />
조이스틱을 오른쪽으로 기울였을 때 내가 원하는 위치에서의 adc값은 900이었다. 그 이상일 때 회전하는 알고리즘을 넣어주었고 다시 조이스틱이 가운데로 돌아왔을 때는 정지하는 내용도 중간 중간에 넣어 있다.</p>
<div class="symple-box gray none" style="text-align:left; width:100%;"> 
<p>//좌우<br />
if(read_adc(1)&gt;900 //오른쪽으로 회전<br />
{<br />
PORTA=0xf0;<br />
Motor(1,90); //들고(1번다리)<br />
delay_ms(100);<br />
Motor(3,110);<br />
Motor(4,110); //1번다리 회전<br />
delay_ms(200);<br />
Motor(1,40); //1번다리 내리고<br />
delay_ms(200);<br />
if(read_adc(1)&gt;=300 &amp;&amp; read_adc(1)&lt;=700)<br />
STOP();<br />
else if(read_adc(1)&gt;900)<br />
{</p>
<p>Motor(2,90); // 2번다리 들고<br />
delay_ms(100);<br />
Motor(3,90);<br />
Motor(4,90); //1번다리 반회전<br />
delay_ms(200);<br />
Motor(5,110);<br />
Motor(6,110); // 2번다리 회전<br />
delay_ms(100);<br />
Motor(2,40); //2번다리 내리고<br />
delay_ms(200);<br />
if (read_adc(1)&gt;=300 &amp;&amp; read_adc(1)&lt;=700)<br />
STOP();<br />
else if(read_adc(1)&gt;900)<br />
{<br />
Motor(1,90); //1번다리 들고<br />
delay_ms(100);<br />
Motor(5,90);<br />
Motor(6,90); //2번다리 반회전<br />
}<br />
</div>
<p>다른 동작들도 아래와 같은 방식의 알고리즘으로 되어있다.</p>
<p><span style="color: #0000ff"><strong>■ 전체 시스템 구성</strong></span><br />
<strong>1. 6족 보행 로봇을 만들기 위한 최소 관절(모터)의 개수 파악</strong><br />
6족 로봇으로 보행하기 위해서는 위의 매커니즘을 이해하면 알 수 있듯이 최소 다리 당 2개 즉, 12개가 필요함을 파악했다.</p>
<p><strong>2. 서보모터 각도 제어</strong><br />
서보모터의 각도를 제어하기 위해서는 모터구동의 원리를 이해할 필요가 있었다. 서보모터는 모터에 흘려주는 Pulse의 주기에 따라 각도가 제어된다. Pulse를 변형시켜주기 위해 타이머의 ‘Fast pwm’기능을 사용하였고, 프레임 제작 전 원하는 각도를 넣었을 때 그 각도가 되도록 하는 실습을 하였다.</p>
<p><strong>3. 프레임 제작 계획</strong><br />
사용하기로 한 모터의 토크는 3kg.cm은 그리 좋은 스펙은 아니다. 그러나 사람들이 만든 여러 블로그를 참고하여 프레임의 무게를 최소화할 수 있다면 문제가 될 부분은 아니었다. 그리하여 가장 프레임의 재료는 100% 포맥스로 정하였다.</p>
<p><strong>4. 보행 매카니즘 파악</strong><br />
모터의 각도제어를 실습하였고, 프레임이 완성된 후 6족 로봇의 보행 매카니즘을 파악하였다. 목표는 전진/후진/좌우로 회전이었기 때문에 제어방법을 가장 효율적으로 하고자 공통된 모터는 묶어 제어하기로 결정하였다.</p>
<p><strong>5. MCU 선정 / 회로구성</strong><br />
MCU는 쓰고자 하는 기능들(I/O, Interrupt, ADC, Timer)을 쓸 수 있는 ‘Atmega128’을 선정하였다. 회로에서는 가장 중요한 전원부는 ‘LM2576’이라는 레귤레이터를 사용하여 구성하였다. 처음에는 ‘LM7805’로 전원부를 구성했었는데, 두 레귤레이터 모두 출력전압을 5V로 바꿔준다는 특징은 같으나 output의 전류에서 차이가 있었다. 7805는 1A까지만 전류가 흐르지만 2576은 3A까지 흐를 수 있는 스펙을 갖고 있다. 그런 이유로 전원부는 시행착오를 거쳐 다시 제작하였다. 전류 값이 중요한 이유는 모터가 병렬로 연결되어 있어 전류가 조금이라도 부족하면 작동이 되지 않기 때문이다.</p>
<p><strong>6. 조이스틱의 원리이해</strong><br />
ADC를 이용하여 조이스틱의 방향에 따라 원하는 대로 제어하는 원리에 대하여 이해하였고 그것을 LED로 먼저 확인한 후, 모터에도 적용시켜 구현할 수 있었다.</p>
<p><span style="color: #0000ff"><strong>■ 개발환경</strong></span><br />
- MCU : Atmega 128<br />
- 개발 언어 : C<br />
- Tool : AVR Studio 및 Code Vision AVR</p>
<p><span style="font-size: medium;color: #ffffff;background-color: #000080"><strong>단계별 제작 과정</strong></span></p>
<p><span style="color: #0000ff"><strong>■ 프레임 제작</strong></span><br />
<strong>1. 제작 전 구상도</strong></p>
<table style="width: 620px" border="0">
<tbody>
<tr>
<td><img class="alignnone  wp-image-29431" alt="30 2014 ict (4)" src="http://www.ntrexgo.com/wp-content/uploads/2015/05/30-2014-ict-4.jpg" width="216" height="226" /></td>
<td><img class="alignnone  wp-image-29430" alt="30 2014 ict (3)" src="http://www.ntrexgo.com/wp-content/uploads/2015/05/30-2014-ict-3.jpg" width="229" height="227" /></td>
</tr>
</tbody>
</table>
<p><strong>2. 제작 과정</strong></p>
<table style="width: 620px" border="0">
<tbody>
<tr>
<td style="text-align: center"><a href="http://www.ntrexgo.com/?attachment_id=29432" rel="attachment wp-att-29432"><img alt="30 2014 ict (5)" src="http://www.ntrexgo.com/wp-content/uploads/2015/05/30-2014-ict-5.jpg" width="121" height="230" /></a></td>
<td style="text-align: center"><a href="http://www.ntrexgo.com/?attachment_id=29433" rel="attachment wp-att-29433"><img alt="30 2014 ict (6)" src="http://www.ntrexgo.com/wp-content/uploads/2015/05/30-2014-ict-6-300x225.jpg" width="300" height="225" /></a></td>
</tr>
<tr>
<td style="text-align: center">1. 재료 구매 (포맥스)</td>
<td style="text-align: center">2. 몸체 제작 (정 6각형 구조)</td>
</tr>
<tr>
<td style="text-align: center"><a href="http://www.ntrexgo.com/?attachment_id=29434" rel="attachment wp-att-29434"><img class="alignnone size-full wp-image-29434" alt="30 2014 ict (7)" src="http://www.ntrexgo.com/wp-content/uploads/2015/05/30-2014-ict-7.jpg" width="274" height="207" /></a></td>
<td style="text-align: center"><a href="http://www.ntrexgo.com/?attachment_id=29435" rel="attachment wp-att-29435"><img class="alignnone size-full wp-image-29435" alt="30 2014 ict (8)" src="http://www.ntrexgo.com/wp-content/uploads/2015/05/30-2014-ict-8.jpg" width="286" height="208" /></a></td>
</tr>
<tr>
<td style="text-align: center">3. 몸체+모터 제작</td>
<td style="text-align: center">4. 위 관절 제작</td>
</tr>
<tr>
<td style="text-align: center"><a href="http://www.ntrexgo.com/?attachment_id=29436" rel="attachment wp-att-29436"><img class="alignnone size-full wp-image-29436" alt="30 2014 ict (9)" src="http://www.ntrexgo.com/wp-content/uploads/2015/05/30-2014-ict-9.jpg" width="288" height="209" /></a></td>
<td style="text-align: center"><a href="http://www.ntrexgo.com/?attachment_id=29437" rel="attachment wp-att-29437"><img class="alignnone size-medium wp-image-29437" alt="30 2014 ict (10)" src="http://www.ntrexgo.com/wp-content/uploads/2015/05/30-2014-ict-10-300x200.jpg" width="300" height="200" /></a></td>
</tr>
<tr>
<td style="text-align: center">5. 아래관절 제작</td>
<td style="text-align: center">6. 발 제작 (충분한 마찰을 주기 위함)</td>
</tr>
<tr>
<td style="text-align: center" colspan="2"><a href="http://www.ntrexgo.com/?attachment_id=29438" rel="attachment wp-att-29438"><img class="size-full wp-image-29438 aligncenter" alt="30 2014 ict (11)" src="http://www.ntrexgo.com/wp-content/uploads/2015/05/30-2014-ict-11.jpg" width="364" height="273" /></a></td>
</tr>
<tr>
<td style="text-align: center" colspan="2">7. 프레임 전체 완성</td>
</tr>
</tbody>
</table>
<p><strong>■  하드웨어 제어부 제작</strong></p>
<table style="width: 620px" border="0">
<tbody>
<tr>
<td style="text-align: center"><a href="http://www.ntrexgo.com/?attachment_id=29439" rel="attachment wp-att-29439"><img class="alignnone size-full wp-image-29439" alt="30 2014 ict (12)" src="http://www.ntrexgo.com/wp-content/uploads/2015/05/30-2014-ict-12.jpg" width="567" height="274" /></a></td>
</tr>
<tr>
<td style="text-align: center">전원부</td>
</tr>
<tr>
<td style="text-align: center"><a href="http://www.ntrexgo.com/?attachment_id=29442" rel="attachment wp-att-29442"><img class="alignnone size-full wp-image-29442" alt="30 2014 ict (15)" src="http://www.ntrexgo.com/wp-content/uploads/2015/05/30-2014-ict-15.jpg" width="567" height="316" /></a></td>
</tr>
<tr>
<td style="text-align: center">모터부</td>
</tr>
<tr>
<td style="text-align: center"><a href="http://www.ntrexgo.com/?attachment_id=29440" rel="attachment wp-att-29440"><img class="alignnone size-full wp-image-29440" alt="30 2014 ict (13)" src="http://www.ntrexgo.com/wp-content/uploads/2015/05/30-2014-ict-13.jpg" width="370" height="296" /></a></td>
</tr>
<tr>
<td style="text-align: center">스위치</td>
</tr>
<tr>
<td style="text-align: center"><a href="http://www.ntrexgo.com/?attachment_id=29441" rel="attachment wp-att-29441"><img class="alignnone size-full wp-image-29441" alt="30 2014 ict (14)" src="http://www.ntrexgo.com/wp-content/uploads/2015/05/30-2014-ict-14.jpg" width="342" height="296" /></a></td>
</tr>
<tr>
<td style="text-align: center">LED</td>
</tr>
<tr>
<td style="text-align: center"><a href="http://www.ntrexgo.com/?attachment_id=29443" rel="attachment wp-att-29443"><img class="alignnone size-full wp-image-29443" alt="30 2014 ict (16)" src="http://www.ntrexgo.com/wp-content/uploads/2015/05/30-2014-ict-16.jpg" width="478" height="317" /></a></td>
</tr>
</tbody>
</table>
<p><strong>■  컨트롤러 제작</strong></p>
<table style="width: 620px" border="0">
<tbody>
<tr>
<td><a style="font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif;font-size: 13px;line-height: 19px" href="http://www.ntrexgo.com/?attachment_id=29444" rel="attachment wp-att-29444"><img class="alignnone size-full wp-image-29444" alt="30 2014 ict (17)" src="http://www.ntrexgo.com/wp-content/uploads/2015/05/30-2014-ict-17.jpg" width="567" height="353" /></a></td>
</tr>
<tr>
<td style="text-align: center">조이스틱</td>
</tr>
</tbody>
</table>
<p><a href="http://www.ntrexgo.com/?attachment_id=29447" rel="attachment wp-att-29447"><img class="size-full wp-image-29447 aligncenter" alt="30 2014 ict" src="http://www.ntrexgo.com/wp-content/uploads/2015/05/30-2014-ict.jpg" width="567" height="376" /></a></p>
<table style="width: 620px" border="0">
<tbody>
<tr>
<td><a href="http://www.ntrexgo.com/?attachment_id=29445" rel="attachment wp-att-29445"><img class="alignnone  wp-image-29445" alt="30 2014 ict (18)" src="http://www.ntrexgo.com/wp-content/uploads/2015/05/30-2014-ict-18.jpg" width="252" height="200" /></a></td>
<td><a href="http://www.ntrexgo.com/?attachment_id=29446" rel="attachment wp-att-29446"><img class="alignnone  wp-image-29446" alt="30 2014 ict (19)" src="http://www.ntrexgo.com/wp-content/uploads/2015/05/30-2014-ict-19.jpg" width="338" height="208" /></a></td>
</tr>
<tr>
<td style="text-align: center">조이스틱(납땜)</td>
<td style="text-align: center">조이스틱과 모드 선택 스위치</td>
</tr>
</tbody>
</table>
<p><strong>■   소스코드</strong></p>
<p><strong><span style="color: #808080">모터의 각도 제어함수</span></strong><br />
<strong></strong></p>
<p><a href="http://www.ntrexgo.com/archives/29420/%ec%86%8c%ec%8a%a4%ec%bd%94%eb%93%9c01" rel="attachment wp-att-29466"><img class="alignnone size-full wp-image-29466" alt="소스코드01" src="http://www.ntrexgo.com/wp-content/uploads/2015/05/소스코드01.jpg" width="226" height="452" /></a></p>
<p><strong><span style="color: #808080">I/O 레지스터 설정</span></strong><br />
<strong></strong></p>
<p><a href="http://www.ntrexgo.com/archives/29420/%ec%86%8c%ec%8a%a4%ec%bd%94%eb%93%9c02" rel="attachment wp-att-29467"><img class="alignnone size-full wp-image-29467" alt="소스코드02" src="http://www.ntrexgo.com/wp-content/uploads/2015/05/소스코드02.jpg" width="214" height="108" /></a></p>
<p><strong><span style="color: #808080">Interrupt 레지스터 설정</span></strong><br />
<strong></strong></p>
<p><a href="http://www.ntrexgo.com/archives/29420/%ec%86%8c%ec%8a%a4%ec%bd%94%eb%93%9c03" rel="attachment wp-att-29468"><img class="alignnone size-full wp-image-29468" alt="소스코드03" src="http://www.ntrexgo.com/wp-content/uploads/2015/05/소스코드03.jpg" width="238" height="105" /></a></p>
<p><strong><span style="color: #808080">Timer 레지스터 설정</span></strong><br />
<strong></strong></p>
<p><a href="http://www.ntrexgo.com/archives/29420/%ec%86%8c%ec%8a%a4%ec%bd%94%eb%93%9c04" rel="attachment wp-att-29469"><img class="alignnone  wp-image-29469" alt="소스코드04" src="http://www.ntrexgo.com/wp-content/uploads/2015/05/소스코드04.jpg" width="295" height="131" /></a></p>
<p><strong><span style="color: #808080">ADC 레지스터 설정</span></strong><br />
<strong></strong></p>
<p><a href="http://www.ntrexgo.com/archives/29420/%ec%86%8c%ec%8a%a4%ec%bd%94%eb%93%9c05" rel="attachment wp-att-29462"><img class="alignnone size-full wp-image-29462" alt="소스코드05" src="http://www.ntrexgo.com/wp-content/uploads/2015/05/소스코드05.jpg" width="147" height="89" /></a></p>
<p><strong><span style="color: #808080">GOSTR() 함수 : 전진</span></strong><br />
<strong></strong></p>
<p><a href="http://www.ntrexgo.com/archives/29420/%ec%86%8c%ec%8a%a4%ec%bd%94%eb%93%9c06" rel="attachment wp-att-29463"><img class="alignnone  wp-image-29463" alt="소스코드06" src="http://www.ntrexgo.com/wp-content/uploads/2015/05/소스코드06.jpg" width="257" height="313" /></a></p>
<p><strong><span style="color: #808080">GOBACK() 함수 : 후진</span></strong></p>
<p><a href="http://www.ntrexgo.com/archives/29420/%ec%86%8c%ec%8a%a4%ec%bd%94%eb%93%9c07" rel="attachment wp-att-29464"><img class="alignnone  wp-image-29464" alt="소스코드07" src="http://www.ntrexgo.com/wp-content/uploads/2015/05/소스코드07.jpg" width="256" height="315" /></a></p>
<p><strong><span style="color: #808080">STOP() 함수 : 정지</span></strong></p>
<p><a href="http://www.ntrexgo.com/archives/29420/%ec%86%8c%ec%8a%a4%ec%bd%94%eb%93%9c01" rel="attachment wp-att-29466"><img class="alignnone size-full wp-image-29466" alt="소스코드01" src="http://www.ntrexgo.com/wp-content/uploads/2015/05/소스코드01.jpg" width="226" height="452" /></a></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ntrexgo.com/archives/29420/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[30호]감시자동차</title>
		<link>http://www.ntrexgo.com/archives/29418</link>
		<comments>http://www.ntrexgo.com/archives/29418#comments</comments>
		<pubDate>Fri, 15 May 2015 07:21:02 +0000</pubDate>
		<dc:creator>디바이스마트 매거진</dc:creator>
				<category><![CDATA[디바이스마트 매거진]]></category>
		<category><![CDATA[특집]]></category>
		<category><![CDATA[30호]]></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=29418</guid>
		<description><![CDATA[디바이스마트매거진 30호 &#124; 감시자동차는 단순한 영상스트리밍 기능을 이용한 감시뿐만 아니라 사용자가 모터를 조작하여 동적으로 감시자동차가 있는 환경을 파악할 수 있다. ]]></description>
				<content:encoded><![CDATA[<p><strong><a href="http://www.ntrexgo.com/wp-content/uploads/2015/05/Cap-2015-11-30-16-24-59-922.png" rel="lightbox[29418]"><img alt="Cap 2015-11-30 16-24-59-922" src="http://www.ntrexgo.com/wp-content/uploads/2015/05/Cap-2015-11-30-16-24-59-922.png" width="620" height="250" /></a></strong></p>
<p><strong><span style="font-size: xx-large;color: #000080">감시자동차</span></strong></p>
<p style="text-align: right">글 | 광운대학교 유혜준, 김태현</p>
<p><span style="color: #ffffff;font-size: large;background-color: #000080"><strong>심사평</strong></span></p>
<p><span style="color: #ffffff;background-color: #0000ff">싱크웍스 </span>어디선가 많이 보아왔던 작품인 것 같다. 따라서 창의성에는 높은 점수를 줄수 없지만 첨부된 동영상으로 볼때 완성도가 있어 보인다. 작품을 만들면서 좋은 공부가 되었을 것 같다.</p>
<p><span style="color: #ffffff;background-color: #0000ff">JK전자 </span>감시카메라 기능과 센서들을 활용해서 로봇이 위치한 공간의 여러가지 데이터 수집과 함께 로봇 근처의 움직임을 파악하여 침입 탐지까지 가능하도록 발전시키면 괜찮을 것 같음. 아두이노를 활용한 모터제어, 리눅스를 활용한 스트리밍 전송, PC와 안드로이드 APP까지 다양한 분야의 기술들이 접목되어 있는 작품이다.</p>
<p><span style="color: #ffffff;background-color: #0000ff">뉴티씨 </span>좀 더 튼튼하게 제작하면, 사람이 쉽게 접근할 수 없는 곳에 이 차량을 투입하여 접근시켜서 근접 촬영을 하여, 보다 내부 상황을 정확하게 판단하거나 할 수 있을 것 같다. 매우 재미있는 기술로 보이며, 라즈베리파이나 아두이노의 좋은 응용으로 보인다. 좀 더 생각하여, 무엇을 할 수 있겠는지 등도 판단해 보면 보다 좋은 작품으로 문서화 되었을 것 같다. 또한, 기술 구현 쪽도 좀 더 자세히 남겼었다면 하는 아쉬움도 남는다.</p>
<p><span style="font-size: large;color: #ffffff;background-color: #000080"><strong>개요</strong></span></p>
<p><span style="color: #0000ff"><strong>■ 개요</strong></span><br />
개인 사생활 보호에서부터 공공기관의 보안에서 감시카메라는 널리 이용된다. 최근 급증하고 있는 범죄에서도 감시카메라의 역할이 중요하게 대두된다. 이런 감시카메라는 범죄예방, 출입자 확인 등과 같은 기본적인 분야에서 사용되며 분실물 탐색이나 미아확인, 대테러방지 등 그 응용분야가 점차 확대되고 있다. 기존의 감시카메라는 한 장소에 고정되어있으며 감시할 수 있는 영역이 제한적이다. 하지만 감시카메라를 움직일 수 있는 로봇위에서 동작시킬 수 있으며 원거리에서도 조작 및 감시가 가능하다면 좋을 것이라 생각하여 이 프로젝트를 진행하게 되었다.</p>
<p><a href="http://www.ntrexgo.com/archives/29418/30-%ea%b0%90%ec%8b%9c%ec%9e%90%eb%8f%99%ec%b0%a8-6-2" rel="attachment wp-att-29488"><img class="alignnone size-full wp-image-29488" alt="30 감시자동차 (6)" src="http://www.ntrexgo.com/wp-content/uploads/2015/05/30-감시자동차-6.png" width="450" height="145" /></a><br />
집 밖에서도 집안의 상황을 파악할 수 있는 로봇을 평소 제작해보고 싶었다. 이 로봇의 이름은 감시자동차로써 스마트폰 혹은 컴퓨터로 원거리에서 로봇이 있는 장소를 실시간으로 볼 수 있으며, 조종이 가능하다.<br />
감시자동차는 단순한 영상스트리밍 기능을 이용한 감시뿐만 아니라 사용자가 모터를 조작하여 동적으로 감시자동차가 있는 환경을 파악할 수 있다.</p>
<p><span style="color: #0000ff"><strong>■ 기대방안</strong></span><br />
추후 온습도센서를 부착하여 집안의 환경데이터를 수집할 수 있으며, 카메라를 활용하여 특정 상황을 인식 후 사용자에게 알림을 할 수 있다. 또한 스피커를 부착하여 집안의 사람들에게 음성출력도 추후 해보고 싶다. 감시자동차는 드라이브 레코더(교통사고 발생 전후의 차량주행정보와 운전자 운전상태 화상 및 차량 데이터를 기록하여 사고의 발생원인을 정확하게 분석 할 수 있는 시스템)라는 시스템에도 활용될 수 있다.</p>
<p><span style="font-size: large;color: #ffffff;background-color: #000080"><strong>작품설명</strong></span></p>
<p><span style="color: #0000ff"><strong>■ 주요 동작 및 특징</strong></span><br />
<strong>1. 스마트폰 외의 기기에서 감시자동차를 조종한다.</strong><br />
스마트폰의 WIFI 네트워크가 연결이 되었을 경우 감시자동차 조종이 가능하다. 노트북에서 명령코드를 라즈베리파이에게 보내고 라즈베리파이가 아두이노에게 명령코드를 보내 모터를 동작시킨다. 라즈베리파이 안에 TCP 서버와 Serial 통신모듈을 병렬로 동작하도록 구현하였다. 조종을 하기위해서 스마트폰과 컴퓨터에 TCP/IP 클라이언트를 구현을 하였다.</p>
<table style="width: 620px" border="0">
<tbody>
<tr>
<td style="text-align: center"><img class="alignnone size-full wp-image-29480" alt="30 감시자동차 (2)" src="http://www.ntrexgo.com/wp-content/uploads/2015/05/30-감시자동차-2.png" width="283" height="159" /></td>
</tr>
<tr>
<td style="text-align: center">스마트폰 어플리케이션의 실행 모습</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<p>위의 십자가 모양의 버튼을 누를 경우 DC모터를 동작시키며, 양 쪽의 버튼은 카메라의 서보모터를 제어하게 된다.</p>
<p><strong>2. VLC를 활용한 영상 스트리밍</strong><br />
VLC라는 스트리밍 상용 소프트웨어를 사용했다. 컴퓨터에서 스트리밍영상을 보기 위하여 VLC 외부라이브러리를 활용하여 플레이어 프로그램을 제작하였으며 , 안드로이드 스마트폰의 경우 내부 스트리밍 라이브러리를 활용하여 제작하였다. 초당 프레임은 25프레임으로 끊기지 않고 자연스러운 동영상을 볼 수 있다.</p>
<p><strong>3. 어디서든지 인터넷만 되면 조종 및 영상보기 가능</strong><br />
라즈베리파이에 WIFI 동글이를 붙여서 공유기의 WIFI를 잡을 수 있게 하였고 공유기의 DMZ 설정으로 라즈베리파이에 누구나 조종 및 영상을 볼 수 있도록 하였다.</p>
<p><strong>4. 아두이노 내부소스 수정</strong><br />
아두이노의 Serial 통신은 Main Loop의 딜레이가 있을 경우 즉각적으로 반응하지 못한다. 즉 움직이는 명령을 보냈는데 바로 동작하지 않는다는 것이다. 즉각적인 반응을 하기 위해서 내부 Core 소스를 분석 및 수정하였다. 아두이노 내부 USART RX INTERRUPT를 수정하였다. 인터럽트 내부에 사용자 함수를 넣어서 내가 원하는 동작이 즉각적으로 반응할 수 있도록 수정하였다.</p>
<p><a href="http://www.ntrexgo.com/archives/29418/30-%ea%b0%90%ec%8b%9c%ec%9e%90%eb%8f%99%ec%b0%a8-3" rel="attachment wp-att-29481"><img class="alignnone  wp-image-29481" alt="30 감시자동차 (3)" src="http://www.ntrexgo.com/wp-content/uploads/2015/05/30-감시자동차-3.bmp" width="518" height="74" /></a> <a href="http://www.ntrexgo.com/archives/29418/30-%ea%b0%90%ec%8b%9c%ec%9e%90%eb%8f%99%ec%b0%a8-2" rel="attachment wp-att-29478"><img class="alignnone  wp-image-29478" alt="30 감시자동차 (2)" src="http://www.ntrexgo.com/wp-content/uploads/2015/05/30-감시자동차-2.bmp" width="518" height="362" /></a></p>
<p><strong>5. DC모터, Servo모터 제어</strong><br />
DC모터의 경우 제어하기 위해 L298을 이용하여 모터드라이버를 제작하였으며 정, 역방향, PWM을 활용하여 속도 조절도 가능하도록 구현 하였다.</p>
<p><a href="http://www.ntrexgo.com/archives/29418/30-%ea%b0%90%ec%8b%9c%ec%9e%90%eb%8f%99%ec%b0%a8-1-3" rel="attachment wp-att-29477"><img class="alignnone size-full wp-image-29477" alt="30 감시자동차 (1)" src="http://www.ntrexgo.com/wp-content/uploads/2015/05/30-감시자동차-1.png" width="376" height="155" /></a></p>
<p>Servo모터의 경우 아두이노 라이브러리를 활용하였으며 내부적으로는 특정 PWM에 따라 각도 값을 조절이 가능하다.</p>
<p><a href="http://www.ntrexgo.com/archives/29418/%ec%95%84%eb%91%90%ec%9d%b4%eb%85%b8-%eb%82%b4%eb%b6%80%ec%86%8c%ec%8a%a4-%ec%88%98%ec%a0%95-03" rel="attachment wp-att-29492"><img class="alignnone size-full wp-image-29492" alt="아두이노 내부소스 수정 03" src="http://www.ntrexgo.com/wp-content/uploads/2015/05/아두이노-내부소스-수정-03.jpg" width="290" height="174" /></a></p>
<p><span style="color: #0000ff"><strong>■ 전체 시스템 구성</strong></span><br />
전체 시스템 구조도는 다음과 같다.</p>
<p><a href="http://www.ntrexgo.com/archives/29418/30-%ea%b0%90%ec%8b%9c%ec%9e%90%eb%8f%99%ec%b0%a8-7-2" rel="attachment wp-att-29490"><img class="alignnone size-full wp-image-29490" alt="30 감시자동차 (7)" src="http://www.ntrexgo.com/wp-content/uploads/2015/05/30-감시자동차-7.png" width="506" height="321" /></a><br />
스마트폰과 컴퓨터로부터 특정 명령 패킷이 공유기를 통하여 라즈베리파이로 전송된다. 이와 같이 구성한 이유는 라즈베리파이에 랜선을 꽂으면 휴대성 및 이동성에 문제가 생기므로 공유기를 활용하였으며 공유기의 DMZ기능을 활용하여 라즈베리파이를 서버로 활용하였다. 사용자로부터 명령패킷을 받은 라즈베리파이는 아두이노로 명령 패킷을 보내며 아두이노는 받은 명령패킷을 파악하여 모터를 제어하게 된다. 위의 시스템을 구성하기 위하여 라즈베리파이 내부의 TCP/IP 서버, Serial 통신을 병렬로 동작하도록 구현하였다.</p>
<p><span style="color: #0000ff"><strong>■ 개발 환경</strong></span><br />
사용 언어 : JAVA ,C, C++<br />
플랫폼 : Linux(Raspbian), Window, Android, Arduino</p>
<p><span style="color: #0000ff"><strong>■ 발전 계획</strong></span><br />
첨부된 동영상을 보면 영상 스트리밍의 경우 실제 상황보다 5초에서 10초 정도 지연된 영상이다. 이는 VLC라는 상용소프트웨어와 공개된 라이브러리를 사용했음에도 나타나는 문제점으로 추후 직접 영상 스트리밍을 구현하도록 한다. 스트리밍 외의 감시자동차를 조종의 경우에는 어디에서든지 지연없이 조종이 가능하다.<br />
카톡에서 메시지가 올 경우 Notification으로 사용자가 확인할 수 있다. 이를 Push 기능이라 한다. 추후 Google Cloud Message 기능을 이용하여 카톡과 같은 Push 기능을 구현하겠다. 이 기능은 로봇이 특정 이상 상황을 파악했을 경우 스마트폰에 PUSH 알람을 발생 시킬 수 있다.</p>
<p><span style="font-size: medium;color: #ffffff;background-color: #000080"><strong>기타</strong></span></p>
<p><span style="color: #0000ff"><strong>■ 소스코드</strong></span></p>
<div class="symple-box gray none" style="text-align:left; width:100%;"> 
<p>■ 감시자동차 모터제어 소스 ■<br />
USART RX INTERRUPT 내부에 사용자 함수를 등록 시켜 특정 값을 받았을 때 특정 변수를 바꿔주었다. 실질적인 제어는 Loop함수에서 실행된다.<br />
void setup()<br />
{<br />
Serial.begin(9600);<br />
Serial1.begin(115200);<br />
attachUsart(1,uartInt);<br />
myservo.attach(9); // attaches the servo on pin 9 to the servo object<br />
}<br />
void uartInt()<br />
{<br />
//Serial.println(“int”);<br />
Serial.print(“Receive :”);<br />
Serial.println(C_Rx);<br />
switch(C_Rx)<br />
{<br />
case ‘D’://LEFT<br />
dir=1;<br />
break;<br />
case ‘E’://UP<br />
dir=2;<br />
break;<br />
case ‘F’://DOWB<br />
dir=3;<br />
break;<br />
case ‘G’://RIGHT<br />
dir=4;<br />
break;<br />
case ‘H’:<br />
if(pos&gt;10)<br />
pos&#8211;;<br />
if(pos==10)<br />
pos=10;<br />
myservo.write(pos);<br />
break;<br />
case ‘I’:<br />
if(pos&lt;170)<br />
pos++;<br />
if(pos==170)<br />
pos=170;<br />
myservo.write(pos);<br />
break;<br />
}<br />
C_Rx=0;<br />
}</p>
<p>■ 감시자동차 모터제어 소스 ■<br />
실질적인 제어를 하는 Loop 함수 dir변수에 따라서 DC모터 or Survo 모터를 제어하게 된다.</p>
<p>void loop()<br />
{<br />
switch(dir)<br />
{<br />
case 0:<br />
break;<br />
case 1:<br />
Serial.println(“this is 1”);<br />
digitalWrite(34,LOW);<br />
digitalWrite(35,HIGH);<br />
digitalWrite(36,HIGH);<br />
digitalWrite(37,LOW);<br />
analogWrite(2,150);<br />
analogWrite(3,150);<br />
break;</p>
<p>case 2:<br />
Serial.println(“this is 2”);<br />
digitalWrite(34,HIGH);<br />
digitalWrite(35,LOW);<br />
digitalWrite(36,HIGH);<br />
digitalWrite(37,LOW);<br />
analogWrite(2,150);<br />
analogWrite(3,150);<br />
break;</p>
<p>case 3:<br />
Serial.println(“this is 3”);<br />
digitalWrite(34,LOW);<br />
digitalWrite(35,HIGH);<br />
digitalWrite(36,LOW);<br />
digitalWrite(37,HIGH);<br />
analogWrite(2,150);<br />
analogWrite(3,150);<br />
break;<br />
case 4:<br />
Serial.println(“this is 4”);<br />
digitalWrite(34,HIGH);<br />
digitalWrite(35,LOW);<br />
digitalWrite(36,LOW);<br />
digitalWrite(37,HIGH);<br />
analogWrite(2,150);<br />
analogWrite(3,150);<br />
break;</p>
<p>}<br />
dir=0;<br />
delay(100);<br />
analogWrite(2,0);<br />
analogWrite(3,0);</p>
<p>}<br />
■ 라즈베리파이 TCP 서버 및 Serial 통신 구현 ■<br />
클라이언트로부터 받은 명령패킷을 Serial로 보낸다. 그 중에서 TCP/IP 설정 및 에러가 났을 경우(연결이 끊겼을 경우) 다시 클라이언트를 받을 수 있는 상태로 만든다.</p>
<p>state=pthread_create(&amp;t_id,NULL,thread_function,NULL);<br />
TCP/IP 서버 설정<br />
serv_sock=socket(PF_INET, SOCK_STREAM, 0);<br />
if(serv_sock == -1)<br />
error_handling(“socket() error”);<br />
optlen=sizeof(option);<br />
option=1;<br />
setsockopt(serv_sock,SOL_SOCKET,SO_REUSEADDR,&amp;option,sizeof(option));<br />
memset(&amp;serv_addr, 0, sizeof(serv_addr));<br />
serv_addr.sin_family=AF_INET;<br />
serv_addr.sin_addr.s_addr=htonl(INADDR_ANY);<br />
serv_addr.sin_port=htons(atoi(argv[1]));<br />
//TCP/IP 서버 내부 에러 처리 소스<br />
while(1)<br />
{<br />
printf(“heyoo\n”);<br />
clnt_sock=accept(serv_sock, (struct sockaddr*)&amp;clnt_addr, &amp;clnt_addr_size);<br />
if(clnt_sock==-1)<br />
error_handling(“accept() error”);<br />
else<br />
printf(“accept success\n”);<br />
while(1)<br />
{<br />
//sleep(3);<br />
printf(“breakout\n”);<br />
str_len=read(clnt_sock, message, BUFSIZE);<br />
printf(“ERROR0 : %d, %s,%d\n”,errno , strerror(errno),str_len);<br />
if(errno==0)<br />
{<br />
errno00++;<br />
if(str_len==0)<br />
{<br />
close(clnt_sock);<br />
printf(“close sock\n”);<br />
break;<br />
errno00=0;<br />
}<br />
}<br />
if(errno==104)<br />
{<br />
close(clnt_sock);<br />
printf(“close sock\n”);<br />
break;<br />
}<br />
&#8230;&#8230;&#8230;..<br />
</div>
<span style="color: #0000ff"> <strong>■ 회로도</strong></span></p>
<p><a href="http://www.ntrexgo.com/archives/29418/%ed%9a%8c%eb%a1%9c%eb%8f%84" rel="attachment wp-att-29491"><img class="alignnone size-large wp-image-29491" alt="회로도" src="http://www.ntrexgo.com/wp-content/uploads/2015/05/회로도-620x439.jpg" width="620" height="439" /></a></p>
<p><span style="color: #0000ff"><strong>■ 작품사진</strong></span></p>
<table class="aligncenter" style="width: 620px" border="0">
<tbody>
<tr>
<td colspan="2"><a href="http://www.ntrexgo.com/archives/29418/30-%ea%b0%90%ec%8b%9c%ec%9e%90%eb%8f%99%ec%b0%a8-4" rel="attachment wp-att-29483"><img class="size-large wp-image-29483 aligncenter" alt="30 감시자동차 (4)" src="http://www.ntrexgo.com/wp-content/uploads/2015/05/30-감시자동차-4.bmp" /></a></td>
</tr>
<tr>
<td style="text-align: center" colspan="2">[그림 1] 라즈베리파이와 카메라</td>
</tr>
<tr>
<td><a href="http://www.ntrexgo.com/archives/29418/30-%ea%b0%90%ec%8b%9c%ec%9e%90%eb%8f%99%ec%b0%a8-5" rel="attachment wp-att-29485"><img class="alignnone size-large wp-image-29485" alt="30 감시자동차 (5)" src="http://www.ntrexgo.com/wp-content/uploads/2015/05/30-감시자동차-5.bmp" /></a></td>
<td><a href="http://www.ntrexgo.com/archives/29418/30-%ea%b0%90%ec%8b%9c%ec%9e%90%eb%8f%99%ec%b0%a8-6" rel="attachment wp-att-29487"><img class="wp-image-29487 aligncenter" alt="30 감시자동차 (6)" src="http://www.ntrexgo.com/wp-content/uploads/2015/05/30-감시자동차-6.bmp" width="138" height="231" /></a></td>
</tr>
<tr>
<td style="text-align: center" colspan="2">[그림 2] ROVER5와 제어부 실험</td>
</tr>
<tr>
<td> <a href="http://www.ntrexgo.com/archives/29418/30-%ea%b0%90%ec%8b%9c%ec%9e%90%eb%8f%99%ec%b0%a8-7" rel="attachment wp-att-29489"><img class="size-large wp-image-29489 aligncenter" alt="30 감시자동차 (7)" src="http://www.ntrexgo.com/wp-content/uploads/2015/05/30-감시자동차-7.bmp" width="252" height="189" /></a></td>
<td> <a href="http://www.ntrexgo.com/archives/29418/30-%ea%b0%90%ec%8b%9c%ec%9e%90%eb%8f%99%ec%b0%a8-5-2" rel="attachment wp-att-29486"><img class="size-full wp-image-29486 aligncenter" alt="30 감시자동차 (5)" src="http://www.ntrexgo.com/wp-content/uploads/2015/05/30-감시자동차-5.png" width="244" height="183" /></a></td>
</tr>
<tr>
<td style="text-align: center" colspan="2">[그림 3] 로버5의 하드웨어 구성</td>
</tr>
<tr>
<td> <a href="http://www.ntrexgo.com/archives/29418/30-%ea%b0%90%ec%8b%9c%ec%9e%90%eb%8f%99%ec%b0%a8-2-3" rel="attachment wp-att-29480"><img class="size-full wp-image-29480 aligncenter" alt="30 감시자동차 (2)" src="http://www.ntrexgo.com/wp-content/uploads/2015/05/30-감시자동차-2.png" width="283" height="159" /></a></td>
<td> <a href="http://www.ntrexgo.com/archives/29418/30-%ea%b0%90%ec%8b%9c%ec%9e%90%eb%8f%99%ec%b0%a8-3-2" rel="attachment wp-att-29482"><img class="size-full wp-image-29482 aligncenter" alt="30 감시자동차 (3)" src="http://www.ntrexgo.com/wp-content/uploads/2015/05/30-감시자동차-3.png" width="296" height="139" /></a></td>
</tr>
<tr>
<td style="text-align: center" colspan="2">[그림 4]영상 스트리밍 화면</td>
</tr>
<tr>
<td> <a href="http://www.ntrexgo.com/archives/29418/ict-30-%eb%8f%99%ec%98%81%ec%83%81%ec%ba%a1%ec%b3%90-%ea%b0%90%ec%8b%9c%ec%b9%b4%eb%a9%94%eb%9d%bc" rel="attachment wp-att-29497"><img class="size-medium wp-image-29497 aligncenter" alt="ict 30 동영상캡쳐 감시카메라" src="http://www.ntrexgo.com/wp-content/uploads/2015/05/ict-30-동영상캡쳐-감시카메라-300x174.jpg" width="300" height="174" /></a></td>
<td> <img class="size-medium wp-image-29498 aligncenter" alt="ict 30 동영상캡쳐 감시카메라 (1)" src="http://www.ntrexgo.com/wp-content/uploads/2015/05/ict-30-동영상캡쳐-감시카메라-1-300x170.jpg" width="300" height="170" /></td>
</tr>
<tr>
<td> <img class="size-medium wp-image-29499 aligncenter" alt="ict 30 동영상캡쳐 감시카메라 (2)" src="http://www.ntrexgo.com/wp-content/uploads/2015/05/ict-30-동영상캡쳐-감시카메라-2-300x170.jpg" width="300" height="170" /></td>
<td> <img class="size-medium wp-image-29500 aligncenter" alt="ict 30 동영상캡쳐 감시카메라 (4)" src="http://www.ntrexgo.com/wp-content/uploads/2015/05/ict-30-동영상캡쳐-감시카메라-4-300x173.jpg" width="300" height="173" /></td>
</tr>
<tr>
<td style="text-align: center" colspan="2">[그림 5]작동 화면</td>
</tr>
</tbody>
</table>
]]></content:encoded>
			<wfw:commentRss>http://www.ntrexgo.com/archives/29418/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
