<?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%9e%90%eb%8f%99%ec%b0%a8/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>[64호] 디바이스마트, 국내 온라인 유통사 유일 세계 1위 벨로다인 라이다 공급!</title>
		<link>http://www.ntrexgo.com/archives/39661</link>
		<comments>http://www.ntrexgo.com/archives/39661#comments</comments>
		<pubDate>Thu, 25 Feb 2021 04:18:05 +0000</pubDate>
		<dc:creator>디바이스마트 매거진</dc:creator>
				<category><![CDATA[디바이스마트 매거진]]></category>
		<category><![CDATA[프로덕트 뉴스]]></category>
		<category><![CDATA[64호]]></category>
		<category><![CDATA[디바이스마트]]></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=39661</guid>
		<description><![CDATA[디바이스마트 매거진 64호ㅣ디바이스마트, 국내 온라인 유통사 유일 세계 1위 벨로다인 라이다 공급!]]></description>
				<content:encoded><![CDATA[<p>&nbsp;</p>
<p><span style="color: #ffffff; background-color: #000000;"><a href="http://www.ntrexgo.com/wp-content/uploads/2021/05/라이다.jpg" rel="lightbox[39661]"><img class="aligncenter size-medium wp-image-39662" alt="라이다" src="http://www.ntrexgo.com/wp-content/uploads/2021/05/라이다-300x300.jpg" width="300" height="300" /></a>Velodyne Lidar</span></p>
<p>&nbsp;</p>
<p><span style="font-size: x-large;"><strong>디바이스마트, 국내 온라인 유통사 유일 세계 1위 벨로다인 라이다 공급!</strong></span></p>
<p>&nbsp;</p>
<p>자율주행 인기와 더불어 주식 열풍에 따라 라이다를 생산하는 벨로다인 브랜드를 접해본 독자들이 많을 거라 생각된다. 미래 산업으로 주목받는 자율주행차의 핵심 기술은 3가지로, 주변 사물을 ‘인지’하고, 해당 상황에 맞춰 스스로 ‘판단’하여 차량을 ‘제어’하는 것이다. 그 중 라이다는 인지에 필요한 기술로 자동차의 눈으로 여겨진다. 벨로다인 라이다는 기술경쟁력을 바탕으로 산업 내 1위 라이다를 생산 하는 기업으로 세계 최초로 자율주행 차량용 3D 실시간 라이다 센서 특허를 보유한 글로벌 기업이다. 디바이스마트는 온라인 쇼핑몰중 유일하게 벨로다인 라이다 제품을 공식 공급사를 통해 공급받게 되었으며, 우선적으로 벨로다인의 베스트셀러인 Puck, Puck LITE, Puck HiRes 3종이 등록되어 판매되고 있다. Puck은 동급 라이다 대비 최고의 정확도 및 보정된 강도, 100m 측정거리, 8w 전력효율을 갖춘 제 품으로 저속 자율 주행 및 ADAS 애플리케이션에 이상적인 솔루션을 제공한다. Puck LITE는 Puck과 동일한 성능이나, 더 가벼워진 무게(830g → 590g)로 드론, UAV, 백팩 및 신뢰성과 가벼운 무게가 필요한 기타 애플리케이션과 함께 사용하기에 적합하다. Puck Hi-Res는 Puck 제품군에 고해상도 옵션인 제품으로 조밀한 채널 분포를 위해 20° 의 수직 시야를 제공하여 더 높은 이미지 해상도가 필요한 ADAS, 로봇공학에 주로 사용된다. Puck 제품군 모두 특허받은 서라운드 뷰 기술이 적용되어 정확한 실시간 3D 데이터를 제공하기 위해 완전한 360도 환경보기가 제공 된다. 또한, 고성능 고가의 제품으로 주문 시 벨로다인 공식 공급사에서 직접 배송되며 사용과 관련된 상담도 함께 받을 수 있다. 특별한 사유로 제품만 공급받기 원하는 고객에게는 택배 발송도 가능하다. 세계 1위 벨로다인 라이다를 쉽게 비교하고 구매하고 싶은 고객이라면 지금 바로 디바이스마트에서 벨로다인 라이다를 확인해보자.</p>
<p>&nbsp;</p>
<p><a href="https://www.devicemart.co.kr/goods/brand?code=2312"><span style="color: #0000ff;"><strong>디바이스마트, 국내 온라인 유통사 유일 세계 1위 벨로다인 라이다 공급 제품 바로가기</strong></span></a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.ntrexgo.com/archives/39661/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>자율이동 탑승형 로봇 &#8211; 전기차</title>
		<link>http://www.ntrexgo.com/archives/3230</link>
		<comments>http://www.ntrexgo.com/archives/3230#comments</comments>
		<pubDate>Tue, 19 Mar 2013 08:50:11 +0000</pubDate>
		<dc:creator>NTRexLAB</dc:creator>
				<category><![CDATA[연구소 소식]]></category>
		<category><![CDATA[로봇]]></category>
		<category><![CDATA[무인차]]></category>
		<category><![CDATA[연구소]]></category>
		<category><![CDATA[자동차]]></category>

		<guid isPermaLink="false">http://www.ntrexgo.com/?p=3230</guid>
		<description><![CDATA[
&#160;
작년에 저희 연구소에서는 자율이동 탑승형 로봇을 개발했었습니다.
아직 완료한 것은 아니구요.
여러가지 가능성을 타진하는 것이죠&#8230;
그럼 당시 찍었던 홍보용 동영상을 보여드리겠습니다.
]]></description>
				<content:encoded><![CDATA[<p><a href="http://www.ntrexgo.com/wp-content/uploads/2013/03/19.jpg" rel="lightbox[3230]"><img class="alignnone size-large wp-image-3232" alt="1" src="http://www.ntrexgo.com/wp-content/uploads/2013/03/19-620x464.jpg" width="620" height="464" /></a></p>
<p>&nbsp;</p>
<p>작년에 저희 연구소에서는 자율이동 탑승형 로봇을 개발했었습니다.</p>
<p>아직 완료한 것은 아니구요.</p>
<p>여러가지 가능성을 타진하는 것이죠&#8230;</p>
<p>그럼 당시 찍었던 홍보용 동영상을 보여드리겠습니다.</p>

<object width="643" height="360">
<param name="allowfullscreen" value="true" />
<param name="allowscriptaccess" value="always" />
<param name="movie" value="http://www.youtube.com/v/0c7uFffmkcc?autoplay=0&loop=0&rel=0" />
<param name="wmode" value="transparent">
<embed src="http://www.youtube.com/v/0c7uFffmkcc?autoplay=0&loop=0&rel=0" type="application/x-shockwave-flash" wmode="transparent" allowfullscreen="true" allowscriptaccess="always" width="643" height="360">
</embed>
</object>


]]></content:encoded>
			<wfw:commentRss>http://www.ntrexgo.com/archives/3230/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[11호]GPS 자동차를 만들어 보자!-1</title>
		<link>http://www.ntrexgo.com/archives/5040</link>
		<comments>http://www.ntrexgo.com/archives/5040#comments</comments>
		<pubDate>Sat, 25 Feb 2012 07:13:01 +0000</pubDate>
		<dc:creator>디바이스마트 매거진</dc:creator>
				<category><![CDATA[디바이스마트 매거진]]></category>
		<category><![CDATA[특집]]></category>
		<category><![CDATA[11호]]></category>
		<category><![CDATA[GPS]]></category>
		<category><![CDATA[매거진]]></category>
		<category><![CDATA[자동차]]></category>

		<guid isPermaLink="false">http://www.ntrexgo.com/?p=5040</guid>
		<description><![CDATA[디바이스마트 매거진 11호 &#124; 최근 GPS 위성 신호가 민간에 공개된 이후 그 활용도가 사회적으로 증가하고 있고 발전 가능성이 무궁무진해서 나도 한번쯤 GPS를 활용한 작품을 만들어보고 싶었다. GPS 자동차의 개발 목적은 작품을 만들면서 마이크로프로세서와 GPS를 심도 있게 공부하고 그것을 구현해 내는 것이다.]]></description>
				<content:encoded><![CDATA[<h2><a href="http://www.ntrexgo.com/wp-content/uploads/2013/03/11FGPS038.jpg" rel="lightbox[5040]"><img class=" wp-image-5111 alignleft" alt="11FGPS038" src="http://www.ntrexgo.com/wp-content/uploads/2013/03/11FGPS038-300x230.jpg" width="185" height="142" /></a><strong><span style="color: #666699">GPS 자동차를 만들어 보자! -1</span></strong></h2>
<p>&nbsp;</p>
<p style="text-align: right">글 | 유한대 김경수(neocima3255@naver.com) 外</p>
<p><span style="text-decoration: underline"><strong>※ 상기 내용은 2010년에 진행된 유한대학과의 산학연 졸업 작품지원 프로젝트에 일환으로 작성되어진 원고임을 밝힙니다.</strong></span></p>
<p>&nbsp;</p>
<p><b><span style="color: #005557">1. 서론</span></b></p>
<p class="중간제목"><span class="가제목"><span style="color: #008e37"><strong>가. 개발동기 및 목적</strong></span></span></p>
<p class="중간제목">최근 GPS 위성 신호가 민간에 공개된 이후 그 활용도가 사회적으로 증가하고 있고 발전 가능성이 무궁무진해서 나도 한번쯤 GPS를 활용한 작품을 만들어보고 싶었다. GPS 자동차의 개발 목적은 작품을 만들면서 마이크로프로세서와 GPS를 심도 있게 공부하고 그것을 구현해 내는 것이다.</p>
<p><span class="중간제목"><span class="가제목"><span style="color: #008e37"><strong>나. 과제 해결 방안 및 과정</strong></span></span></span></p>
<p><span style="color: #47be80">1) 과제해결방안</span></p>
<p>GPS 자동차를 구성하고 있는 부품들에 대해서 충분히 공부를 하고 이해를 해서 활용할 줄 알아야 한다. 작품을 만들기전 단계별로 계획을 세우고 그 계획대로 조금씩 작품을 완성해 나간다. 우선 기본적으로 우리 조가 구상하고 있는 GPS 자동차는 지그비 모듈과 지그비 조정기를 활용해서 조정기로 수동 조작을 할수 있고, GPS 모듈을 이용하여 GPS 위성데이터를 수신해서 ATMEGA128을 통해 데이터를 필터링 하고 그 필터링한 데이터값을 이용해서 지정된 좌표로 모터를 구동해서 이동한다. 1단계로는 DC모터와 모터드라이버, ATMEGA128을 통해서 DC모터를 구동하고 지그비와 지그비 조정기를 사용해서 수동 조작을 하는 RC카 만들기이다. 2단계로는 차체에 GPS 모듈을 장착해서 GPS 데이터를 GPS 자동차가 수신받고 그 수신받은 데이터를 ATMEGA128 프로세서를 통해서 필터링한 후 지그비 통신을 통해 PC로 그 값을 확인한다. 값을 확인할 때는 PC의 하이퍼 터미널을 통해서 값을 확인한다. 3단계로는 PC에서 프로그램을 통해 목표 좌표를 지정해서 지그비로 GPS 자동차에 데이터를 송신하면 GPS 자동차의 현재 좌표와 수신받은 목표 좌표로 이동거리와 방향을 설정하고 마그네틱 컴파스 센서(나침판 센서)로 방향을 잡고 목표 좌표만큼 DC모터를 구동한다. 4단계로는 GPS 자동차에 초음파 센서를 장착하여 장애물을 탐지하고 피하는 기능을 수행한다. 각 단계별로 작품을 완성하기 위해서는 단계별로 사용된 제품의 매뉴얼이나 데이터 시트를 완벽하게 숙지하고 작품을 만들기전 각 부품을 실습 구현해서 완벽하게 그 부품을 이해하고 활용해야 한다.</p>
<p dir="ltr"><span class="숫자제목"><span style="color: #47be80">2) 과정</span></span></p>
<p>가) ATMEGA128을 활용해서 DC모터를 구동.<br />
나) DC모터 드라이버를 활용해서 DC모터를 제어.<br />
다) 지그비 모듈을 이용해서 무선송신.<br />
라) 지그비와 지그비 조정기를 사용해서 통신.<br />
마) GPS 모듈을 사용해서 어떤 데이터가 들어오는지 확인.<br />
바) GPS 데이터를 PC의 하이퍼 터미널로 표현.<br />
사) GPS 데이터를 지그비 통신을 통해 PC로 전송.<br />
아) PC에서 수신받은 GPS 데이터를 확인하고 목표 좌표 데이터를 지그비로 통신.<br />
자) 나침판 센서를 통해서 데이터를 수신받고 수신받은 데이터를 하이퍼 터미널로 구현.<br />
차) 목표 거리만큼 프로그램을 통해 DC모터 제어를 통해 이동.<br />
카) 프로그램 제어를 통해 목표좌표로 GPS 자동차 구동.</p>
<p><span class="숫자제목"><span class="중간제목"><b><span style="color: #005557">2. 제품 제작 과정</span></b></span></span></p>
<p><span class="가제목"><span style="color: #008e37"><strong>가. GPS 자동차의 전원 회로 구성</strong></span></span><br />
GPS 자동차의 차체는 디바이스마트에서 판매하는 NT-Destroyer-I 라는 제품이다.<br />
차체에 12V DC 모터가 4개 내장되어 있다. DC모터 연결 선은 커넥터로 연결되어 있다.</p>
<p><span class="숫자제목"><span style="color: #47be80">1) 모터제어 하드웨어 구성</span></span></p>
<table style="border-collapse: collapse" width="600" border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td><a href="http://www.ntrexgo.com/wp-content/uploads/2013/03/11FGPS003.jpg" rel="lightbox[5040]"><img class="alignnone  wp-image-5076" alt="11FGPS003" src="http://www.ntrexgo.com/wp-content/uploads/2013/03/11FGPS003-300x281.jpg" width="240" height="225" /></a></td>
<td><a href="http://www.ntrexgo.com/wp-content/uploads/2013/03/11FGPS014.jpg" rel="lightbox[5040]"><img class="alignnone size-medium wp-image-5087" alt="11FGPS014" src="http://www.ntrexgo.com/wp-content/uploads/2013/03/11FGPS014-300x225.jpg" width="300" height="225" /></a></td>
</tr>
<tr>
<td>1. 자동차의 차체 모습이다. 4개의 DC모터가 연결되어 있다.</td>
<td>2. 자동차의 차체 내부 모습이다.<br />
4개의 DC모터 선이 연결되어 커넥터에 연결되어 있다.</td>
</tr>
<tr>
<td><a href="http://www.ntrexgo.com/wp-content/uploads/2013/03/11FGPS025.jpg" rel="lightbox[5040]"><img class="alignnone size-medium wp-image-5098" alt="11FGPS025" src="http://www.ntrexgo.com/wp-content/uploads/2013/03/11FGPS025-300x225.jpg" width="300" height="225" /></a></td>
<td><a href="http://www.ntrexgo.com/wp-content/uploads/2013/03/11FGPS036.jpg" rel="lightbox[5040]"><img class="wp-image-5109 aligncenter" alt="11FGPS036" src="http://www.ntrexgo.com/wp-content/uploads/2013/03/11FGPS036-249x300.jpg" width="199" height="240" /></a></td>
</tr>
<tr>
<td>3. 차체에 드릴로 구멍을 뚫어서 서포터로 위에 기판을 고정한다.</td>
<td>4. 기판은 200 x 300 기판으로<br />
기판에 구멍을 뚫어서 차체와 서포터로 고정시킨다.</td>
</tr>
<tr>
<td><a href="http://www.ntrexgo.com/wp-content/uploads/2013/03/11FGPS039.jpg" rel="lightbox[5040]"><img class="alignnone size-medium wp-image-5112" alt="11FGPS039" src="http://www.ntrexgo.com/wp-content/uploads/2013/03/11FGPS039-300x225.jpg" width="300" height="225" /></a></td>
<td><a href="http://www.ntrexgo.com/wp-content/uploads/2013/03/11FGPS040.jpg" rel="lightbox[5040]"><img class="alignnone size-medium wp-image-5113" alt="11FGPS040" src="http://www.ntrexgo.com/wp-content/uploads/2013/03/11FGPS040-300x225.jpg" width="300" height="225" /></a></td>
</tr>
<tr>
<td colspan="2">5,6. 자동차의 배터리는 11.1V 2200mA의 리튬 폴리머 배터리로 ATMEGA128의 전원과 모터드라이버의 전원을 각각 하나씩 공급한다.(ATMEGA128에 한 개, 모터 드라이버에 한 개 각각 전원 공급)</td>
</tr>
<tr>
<td><a href="http://www.ntrexgo.com/wp-content/uploads/2013/03/11FGPS041.jpg" rel="lightbox[5040]"><img class="alignnone size-medium wp-image-5114" alt="11FGPS041" src="http://www.ntrexgo.com/wp-content/uploads/2013/03/11FGPS041-300x225.jpg" width="300" height="225" /></a></td>
<td><a href="http://www.ntrexgo.com/wp-content/uploads/2013/03/11FGPS042.jpg" rel="lightbox[5040]"><img class="alignnone size-medium wp-image-5115" alt="11FGPS042" src="http://www.ntrexgo.com/wp-content/uploads/2013/03/11FGPS042-300x225.jpg" width="300" height="225" /></a></td>
</tr>
<tr>
<td colspan="2">7,8. 기판에 ATmega128, 모터 드라이버를 기판에 드릴로 뚫은 후 서포터와 나사로 고정시킨다. ATmega128은 [(주)뉴티씨] ATMEGA128Pro (KD-128PRO-C) 제품으로 외부전원 12V 입력, 내부동작 5V 단일 전원을 사용하고 7805가 내장되어 있어 5V출력 단자가 많다.</td>
</tr>
<tr>
<td><a href="http://www.ntrexgo.com/wp-content/uploads/2013/03/11FGPS043.jpg" rel="lightbox[5040]"><img class="alignnone size-medium wp-image-5116" alt="11FGPS043" src="http://www.ntrexgo.com/wp-content/uploads/2013/03/11FGPS043-300x185.jpg" width="300" height="185" /></a></td>
<td><a href="http://www.ntrexgo.com/wp-content/uploads/2013/03/11FGPS004.jpg" rel="lightbox[5040]"><img class="alignnone size-medium wp-image-5077" alt="11FGPS004" src="http://www.ntrexgo.com/wp-content/uploads/2013/03/11FGPS004-300x225.jpg" width="300" height="225" /></a></td>
</tr>
<tr>
<td colspan="2">9,10. 모터 드라이버는 [(주)뉴티씨]DC 모터 구동모듈 Dual 2A (AM-DC2-2D)로 두 개의 모터를 제어할 수 있고 최대 전류는 2A 구동 전압은 5V∼45V이다. 컨트롤 신호에 10핀 커넥터로 ATmega128의 PORTC에 연결되고 전원 공급 핀에 리튬폴리머 배터리가 연결된다.</td>
</tr>
<tr>
<td><a href="http://www.ntrexgo.com/wp-content/uploads/2013/03/11FGPS005.jpg" rel="lightbox[5040]"><img class="alignnone size-medium wp-image-5078" alt="11FGPS005" src="http://www.ntrexgo.com/wp-content/uploads/2013/03/11FGPS005-300x225.jpg" width="300" height="225" /></a></td>
<td><a href="http://www.ntrexgo.com/wp-content/uploads/2013/03/11FGPS006.jpg" rel="lightbox[5040]"><img class="alignnone size-medium wp-image-5079" alt="11FGPS006" src="http://www.ntrexgo.com/wp-content/uploads/2013/03/11FGPS006-300x225.jpg" width="300" height="225" /></a></td>
</tr>
<tr>
<td><a href="http://www.ntrexgo.com/wp-content/uploads/2013/03/11FGPS007.jpg" rel="lightbox[5040]"><img class="alignnone size-medium wp-image-5080" alt="11FGPS007" src="http://www.ntrexgo.com/wp-content/uploads/2013/03/11FGPS007-300x225.jpg" width="300" height="225" /></a></td>
<td><a href="http://www.ntrexgo.com/wp-content/uploads/2013/03/11FGPS008.jpg" rel="lightbox[5040]"><img class="alignnone size-medium wp-image-5081" alt="11FGPS008" src="http://www.ntrexgo.com/wp-content/uploads/2013/03/11FGPS008-300x225.jpg" width="300" height="225" /></a></td>
</tr>
<tr>
<td colspan="2">11,12,13,14. 차체에 기판을 고정시킨다. 차체와 기판에 드릴로 구멍을 뚫고 서포터와 나사로 고정시킨다.</td>
</tr>
<tr>
<td><a href="http://www.ntrexgo.com/wp-content/uploads/2013/03/11FGPS009.jpg" rel="lightbox[5040]"><img class="alignnone size-medium wp-image-5082" alt="11FGPS009" src="http://www.ntrexgo.com/wp-content/uploads/2013/03/11FGPS009-300x225.jpg" width="300" height="225" /></a></td>
<td><a href="http://www.ntrexgo.com/wp-content/uploads/2013/03/11FGPS010.jpg" rel="lightbox[5040]"><img class="alignnone size-medium wp-image-5083" alt="11FGPS010" src="http://www.ntrexgo.com/wp-content/uploads/2013/03/11FGPS010-300x225.jpg" width="300" height="225" /></a></td>
</tr>
<tr>
<td colspan="2">15,16. 기판에 배터리를 연결시킨다. 배터리 연결 선은 연장선으로 연장하여 기판의 커넥터에 그림과 같이 연결 시킨다. 모터 커넥터 역시 그림처럼 모터 드라이브에 연결 시킨다.</td>
</tr>
</tbody>
</table>
<p><span class="숫자제목"><span style="color: #47be80">2) 모터제어 소프트웨어 구성</span></span></p>
<p>모터 드라이브의 예제 소스를 이용하여 모터를 제어한다.<br />
모터 드라이버의 핵심 구동 소스는 다음과 같다. 컴파일러는 avr studio를 사용하였다.</p>
<div class="symple-box yellow none" style="text-align:left; width:100%;"> 
<p>#include</p>
<p>#define MOTOR_PORT PORTC //모터 포트 지정<br />
#define MOTOR_DDR DDRC //해당 포트 입출력 설정<br />
#define PWM1_IN (MOTOR_PORT&amp;0&#215;01)<br />
#define PWM1_ON (MOTOR_PORT|=0&#215;01)<br />
#define PWM1_OFF (MOTOR_PORT&amp;=0xFE)<br />
#define DIR1_ON (MOTOR_PORT|=0&#215;02)<br />
#define DIR1_OFF (MOTOR_PORT&amp;=0xFD)<br />
#define ENABLE1_OFF (MOTOR_PORT|=0&#215;04)<br />
#define ENABLE1_ON (MOTOR_PORT&amp;=0xFB)<br />
#define BREAK1_ON (MOTOR_PORT|=0&#215;08)<br />
#define BREAK1_OFF (MOTOR_PORT&amp;=0xF7)<br />
#define PWM2_IN (MOTOR_PORT&amp;0&#215;10)<br />
#define PWM2_ON (MOTOR_PORT|=0&#215;10)<br />
#define PWM2_OFF (MOTOR_PORT&amp;=0xEF)<br />
#define DIR2_ON (MOTOR_PORT|=0&#215;20)<br />
#define DIR2_OFF (MOTOR_PORT&amp;=0xDF)<br />
#define ENABLE2_ON (MOTOR_PORT|=0&#215;40)<br />
#define ENABLE2_OFF (MOTOR_PORT&amp;=0xBF)<br />
void delay (int d){<br />
int i;</p>
<p>for (i=0;1</p>
<p>}</p>
<p>void main (void)<br />
{<br />
MOTOR_DDR = 0xff;      // 모터포트 초기화</p>
<p>ENABLE1_ON;            // 모터 드라이브 enable</p>
<p>while(1){<br />
// 2초 동안 전진<br />
DIR1_ON;<br />
DIR2_ON;<br />
PWM1_ON;<br />
PWM2_ON;<br />
delay(2000);<br />
PWM1_OFF;<br />
PWM2_OFF;<br />
// 2초 동안 후진<br />
DIR1_OFF;<br />
DIR2_OFF;<br />
PWM1_ON;<br />
PWM2_ON;<br />
delay(2000);<br />
PWM1_OFF;<br />
PWM2_OFF;<br />
}<br />
}</p>
</div>
<p><span class="숫자제목"><span style="color: #47be80">3) ATMEGA128 프로그램 입력</span></span></p>
<p>컴파일러 AVR STUDIO로 프로그램을 입력 후 헥사 파일을 만들어서 자동차의 ATMEGA128에 프로그램을 입력하는 과정을 나타내었다.</p>
<table style="border-collapse: collapse" width="600" border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td><a href="http://www.ntrexgo.com/wp-content/uploads/2013/03/11FGPS011.jpg" rel="lightbox[5040]"><img class="alignnone size-medium wp-image-5084" alt="11FGPS011" src="http://www.ntrexgo.com/wp-content/uploads/2013/03/11FGPS011-300x240.jpg" width="300" height="240" /></a></td>
<td><a href="http://www.ntrexgo.com/wp-content/uploads/2013/03/11FGPS012.jpg" rel="lightbox[5040]"><img class="alignnone size-medium wp-image-5085" alt="11FGPS012" src="http://www.ntrexgo.com/wp-content/uploads/2013/03/11FGPS012-300x240.jpg" width="300" height="240" /></a></td>
</tr>
<tr>
<td>17. 프로그램을 시작하면 프로그램을 저장할 위치를 지정한다.</td>
<td>18. 컴파일러할 부품을 선택한다. GPS자동차의 경우 ATMEGA128로 선택한다.</td>
</tr>
<tr>
<td><a href="http://www.ntrexgo.com/wp-content/uploads/2013/03/11FGPS013.jpg" rel="lightbox[5040]"><img class="alignnone size-medium wp-image-5086" alt="11FGPS013" src="http://www.ntrexgo.com/wp-content/uploads/2013/03/11FGPS013-300x240.jpg" width="300" height="240" /></a></td>
<td><a href="http://www.ntrexgo.com/wp-content/uploads/2013/03/11FGPS015.jpg" rel="lightbox[5040]"><img class="alignnone size-medium wp-image-5088" alt="11FGPS015" src="http://www.ntrexgo.com/wp-content/uploads/2013/03/11FGPS015-300x240.jpg" width="300" height="240" /></a></td>
</tr>
<tr>
<td>19. 프로그램 작성 화면이다. 프로그램은 C언어로 작성하였다. 프로그램이 작성되면 F7키를 눌러서 에러가 없으면 HEX파일이 생성된다.</td>
<td>20. 생성된 HEX파일을 ATMEGA128모듈에 저장하는 화면이다. Flash부분에서 저장할 HEX파일을 선택하고 Program버튼을 누르면 저장된다.</td>
</tr>
<tr>
<td><a href="http://www.ntrexgo.com/wp-content/uploads/2013/03/11FGPS016.jpg" rel="lightbox[5040]"><img class="alignnone size-medium wp-image-5089" alt="11FGPS016" src="http://www.ntrexgo.com/wp-content/uploads/2013/03/11FGPS016-300x225.jpg" width="300" height="225" /></a></td>
<td><a href="http://www.ntrexgo.com/wp-content/uploads/2013/03/11FGPS017.jpg" rel="lightbox[5040]"><img class="alignnone size-medium wp-image-5090" alt="11FGPS017" src="http://www.ntrexgo.com/wp-content/uploads/2013/03/11FGPS017-300x240.jpg" width="300" height="240" /></a></td>
</tr>
<tr>
<td>21. ATMEGA128에 프로그램을 저장하기 위해 PC와 연결된 모습이다. USB를 통해서 연결된다.</td>
<td>22. 프로그램이 ATMEGA128로 성공적으로 저장이 되면 빨간 박스안처럼 OK가 나타나고 ATMEGA128에 프로그램이 저장된다.</td>
</tr>
</tbody>
</table>
<p><span class="가제목"><span style="color: #008e37"><strong>나. 지그비 조정기를 이용하여 GPS 자동차를 RC카 제어</strong></span></span></p>
<p>지그비 조정기는 로보블럭의 지그비 조정기를 사용하였다. GPS 자동차와 지그비 조정기가 서로 무선통신을 하기 위해 지그비 조정기에서 지원하는 지그비 모듈은 사용하지 않고 Xbee pro라는 지그비 모듈을 공통적으로 사용하였다. 지그비 조정기에는 버튼에 따라 20가지 코드값이 출력되어 ATmega128에서 코드를 분석, DC모터를 제어한다.</p>
<p><span class="숫자제목"><span style="color: #47be80">1) 지그비 하드웨어 구성</span></span></p>
<p>23. 지그비 조정기의 사진이다.24. AA전지를 두 개 연결하고 서포터를 연결하기 위한 구멍을 드릴로 뚫는다.</p>
<table style="border-collapse: collapse" width="600" border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td><a href="http://www.ntrexgo.com/wp-content/uploads/2013/03/11FGPS018.jpg" rel="lightbox[5040]"><img class="alignnone size-medium wp-image-5091" alt="11FGPS018" src="http://www.ntrexgo.com/wp-content/uploads/2013/03/11FGPS018-300x225.jpg" width="300" height="225" /></a></td>
<td><a href="http://www.ntrexgo.com/wp-content/uploads/2013/03/11FGPS019.jpg" rel="lightbox[5040]"><img class="alignnone size-medium wp-image-5092" alt="11FGPS019" src="http://www.ntrexgo.com/wp-content/uploads/2013/03/11FGPS019-300x225.jpg" width="300" height="225" /></a></td>
</tr>
<tr>
<td><a href="http://www.ntrexgo.com/wp-content/uploads/2013/03/11FGPS020.jpg" rel="lightbox[5040]"><img class="alignnone size-medium wp-image-5093" alt="11FGPS020" src="http://www.ntrexgo.com/wp-content/uploads/2013/03/11FGPS020-300x225.jpg" width="300" height="225" /></a></td>
<td><a href="http://www.ntrexgo.com/wp-content/uploads/2013/03/11FGPS021.jpg" rel="lightbox[5040]"><img class="alignnone size-medium wp-image-5094" alt="11FGPS021" src="http://www.ntrexgo.com/wp-content/uploads/2013/03/11FGPS021-300x225.jpg" width="300" height="225" /></a></td>
</tr>
<tr>
<td>25. 드릴로 뚫은 구멍에 서포터를 고정한다.</td>
<td>26. 연결할 지그비 모듈을 PCB 변환기판에 연결하여 일반 기판에 고정시킨다.</td>
</tr>
<tr>
<td><a href="http://www.ntrexgo.com/wp-content/uploads/2013/03/11FGPS022.jpg" rel="lightbox[5040]"><img class="alignnone size-medium wp-image-5095" alt="11FGPS022" src="http://www.ntrexgo.com/wp-content/uploads/2013/03/11FGPS022-300x225.jpg" width="300" height="225" /></a></td>
<td><a href="http://www.ntrexgo.com/wp-content/uploads/2013/03/11FGPS023.jpg" rel="lightbox[5040]"><img class="alignnone size-medium wp-image-5096" alt="11FGPS023" src="http://www.ntrexgo.com/wp-content/uploads/2013/03/11FGPS023-300x225.jpg" width="300" height="225" /></a></td>
</tr>
<tr>
<td colspan="2">27,28. 지그비 모듈을 지그비 조정기에 설치한 모습이다. 일반 기판에도 구멍을 뚫어 서포터로 고정한다</td>
</tr>
<tr>
<td><a href="http://www.ntrexgo.com/wp-content/uploads/2013/03/11FGPS024.jpg" rel="lightbox[5040]"><img class="alignnone size-medium wp-image-5097" alt="11FGPS024" src="http://www.ntrexgo.com/wp-content/uploads/2013/03/11FGPS024-300x225.jpg" width="300" height="225" /></a></td>
<td><a href="http://www.ntrexgo.com/wp-content/uploads/2013/03/11FGPS026.jpg" rel="lightbox[5040]"><img class="alignnone size-medium wp-image-5099" alt="11FGPS026" src="http://www.ntrexgo.com/wp-content/uploads/2013/03/11FGPS026-300x225.jpg" width="300" height="225" /></a></td>
</tr>
<tr>
<td colspan="2">29,30. 지그비 모듈은 Xbee pro라는 모듈로 3.3V에서 동작을 하고 무선 통신 최대 거리 1.6km에 2mm 핀 간격을 가진 모델이다. 자동차에 설치된 기판은 2.5mm 기판이므로 2mm 핀간격을 2.5mm 기판에 부착하기 위해 간단한 PCB를 제작하여 GPS 자동차에 설치하였다.</td>
</tr>
<tr>
<td><a href="http://www.ntrexgo.com/wp-content/uploads/2013/03/11FGPS027.jpg" rel="lightbox[5040]"><img class="alignnone size-medium wp-image-5100" alt="11FGPS027" src="http://www.ntrexgo.com/wp-content/uploads/2013/03/11FGPS027-300x225.jpg" width="300" height="225" /></a></td>
<td><a href="http://www.ntrexgo.com/wp-content/uploads/2013/03/11FGPS028.jpg" rel="lightbox[5040]"><img class="alignnone size-medium wp-image-5101" alt="11FGPS028" src="http://www.ntrexgo.com/wp-content/uploads/2013/03/11FGPS028-300x225.jpg" width="300" height="225" /></a></td>
</tr>
<tr>
<td colspan="2">31,32. PC에도 똑같은 지그비 모듈인 Xbee pro를 사용하는데 PC와 지그비 모듈을 연결하기 위해 역시 지그비 인터페이스 보드가 필요하다. 지그비 인터페이스 보드는 usb연결로 usb케이블을 통해 연결된다.</td>
</tr>
<tr>
<td colspan="2" align="center"><a href="http://www.ntrexgo.com/wp-content/uploads/2013/03/11FGPS029.jpg" rel="lightbox[5040]"><img class="alignnone size-full wp-image-5102" alt="11FGPS029" src="http://www.ntrexgo.com/wp-content/uploads/2013/03/11FGPS029.jpg" width="522" height="220" /></a></td>
</tr>
<tr>
<td colspan="2">33. 지그비가 통신을 하기 위해서는 3.3V의 전압이 인가되어야 한다. 하지만 ATMEGA128의 출력 전압은 5V라서 레귤레이터를 통해 5V를 3.3V로 전압을 바꿔줘야 한다. 필자는 레귤레이터를 LM-1117-3.3 LS라는 레귤레이터를 사용했다. 위 그림은 LM-1117의 데이터 시트이다.LM-1117을 Vin과 Vout 단자에 병렬로 캐패시터가 하나씩 필요하다는 것을 알 수 있다.</td>
</tr>
<tr>
<td colspan="2" align="center"><a href="http://www.ntrexgo.com/wp-content/uploads/2013/03/11FGPS030.jpg" rel="lightbox[5040]"><img class="alignnone  wp-image-5103" alt="11FGPS030" src="http://www.ntrexgo.com/wp-content/uploads/2013/03/11FGPS030-620x465.jpg" width="496" height="372" /></a></td>
</tr>
<tr>
<td colspan="2">34. 실제 자동차에서 레귤레이터 회로를 구성한 모습. 위와 같이 회로를 구성하면 자동차의 지그비에 3.3V가 인가되어 지그비 통신이 가능하다. ATmega128과 지그비 통신은 UART1로 통신을 한다.</td>
</tr>
</tbody>
</table>
<p>아래 코드는 지그비 조정기의 버튼이 출력하는 코드를 나타낸 표이다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2012/02/11FGPS056.jpg" rel="lightbox[5040]"><img class="alignnone  wp-image-5234" alt="11FGPS056" src="http://www.ntrexgo.com/wp-content/uploads/2012/02/11FGPS056-517x620.jpg" width="362" height="434" /></a></p>
<p>&nbsp;</p>
<p><span style="color: #47be80">2) 지그비 소프트웨어 구성</span></p>
<p>아래 소스를 자동차의 ATmega128에 적용하면 버튼이 눌림에 따라 코드값을 지그비로 받아서 Switch, Case문으로 각 코드마다 구별하여 모터를 구동한다.</p>
<div class="symple-box yellow none" style="text-align:left; width:100%;"> 
<p>#include</p>
<p>#include</p>
<p>int putchar(int data);<br />
int getchar(void);<br />
int seg();<br />
#define MOTOR_PORT PORTC<br />
#define MOTOR_DDR DDRC<br />
#define PWM1_IN (MOTOR_PORT&amp;0&#215;01)<br />
#define PWM1_ON (MOTOR_PORT|=0&#215;01)<br />
#define PWM1_OFF (MOTOR_PORT&amp;=0xFE)<br />
#define DIR1_ON (MOTOR_PORT|=0&#215;02)<br />
#define DIR1_OFF (MOTOR_PORT&amp;=0xFD)<br />
#define ENABLE1_OFF (MOTOR_PORT|=0&#215;04)<br />
#define ENABLE1_ON (MOTOR_PORT&amp;=0xFB)<br />
#define BREAK1_ON (MOTOR_PORT|=0&#215;08)<br />
#define BREAK1_OFF (MOTOR_PORT&amp;=0xF7)<br />
#define PWM2_IN (MOTOR_PORT&amp;0&#215;10)<br />
#define PWM2_ON (MOTOR_PORT|=0&#215;10)<br />
#define PWM2_OFF (MOTOR_PORT&amp;=0xEF)<br />
#define DIR2_ON (MOTOR_PORT|=0&#215;20)<br />
#define DIR2_OFF (MOTOR_PORT&amp;=0xDF)<br />
#define ENABLE2_ON (MOTOR_PORT|=0&#215;40)<br />
#define ENABLE2_OFF (MOTOR_PORT&amp;=0xBF)<br />
void main (void)<br />
{<br />
MOTOR_DDR = 0xff; // 모터포트 초기화<br />
ENABLE1_ON;<br />
DDRE=0&#215;02; //UART1로 통신을 위한 입출력 설정</p>
<p>&nbsp;</p>
<p>UBRR1H=0; //UART1로 통신을 위한 초기 설정<br />
UBRR1L=103;<br />
UCSR1A = 0&#215;00;<br />
UCSR1B=0X18;<br />
UCSR1C = 0&#215;06;<br />
while(1){<br />
putchar(getchar()); //UART1로 데이터를 받아서 모터 구동<br />
}<br />
}<br />
int putchar(int data)<br />
{<br />
while(!(UCSR1A&amp;0X20));<br />
UDR1=data;<br />
seg(); //모터 구동 함수<br />
}<br />
int getchar(void)<br />
{<br />
while(!(UCSR1A&amp;0X80));<br />
return UDR1;<br />
}<br />
int seg() //모터 구동 함수<br />
{<br />
switch(UDR1)<br />
{<br />
case 0&#215;01: BREAK1_OFF; // 전진<br />
DIR1_ON;<br />
DIR2_ON;<br />
PWM1_ON;</p>
<p>PWM2_ON;</p>
<p>delay(1000);<br />
BREAK1_ON;<br />
PWM1_OFF;<br />
PWM2_OFF;<br />
break;</p>
</div>
<p>&nbsp;</p>
<p><a href="http://www.ntrexgo.com/archives/5258" target="_blank"><strong style="font-size: 13px;line-height: 19px">2부에서 계속 이어집니다.</strong></a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.ntrexgo.com/archives/5040/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[11호]GPS 자동차를 만들어 보자!-2</title>
		<link>http://www.ntrexgo.com/archives/5258</link>
		<comments>http://www.ntrexgo.com/archives/5258#comments</comments>
		<pubDate>Sat, 25 Feb 2012 05:32:37 +0000</pubDate>
		<dc:creator>디바이스마트 매거진</dc:creator>
				<category><![CDATA[디바이스마트 매거진]]></category>
		<category><![CDATA[특집]]></category>
		<category><![CDATA[11호]]></category>
		<category><![CDATA[GPS]]></category>
		<category><![CDATA[매거진]]></category>
		<category><![CDATA[자동차]]></category>

		<guid isPermaLink="false">http://www.ntrexgo.com/?p=5258</guid>
		<description><![CDATA[디바이스마트 매거진 11호 &#124; 최근 GPS 위성 신호가 민간에 공개된 이후 그 활용도가 사회적으로 증가하고 있고 발전 가능성이 무궁무진해서 나도 한번쯤 GPS를 활용한 작품을 만들어보고 싶었다. GPS 자동차의 개발 목적은 작품을 만들면서 마이크로프로세서와 GPS를 심도 있게 공부하고 그것을 구현해 내는 것이다.]]></description>
				<content:encoded><![CDATA[<h2><a href="http://www.ntrexgo.com/wp-content/uploads/2013/03/11FGPS038.jpg" rel="lightbox[5258]"><img class=" wp-image-5111 alignleft" alt="11FGPS038" src="http://www.ntrexgo.com/wp-content/uploads/2013/03/11FGPS038-300x230.jpg" width="185" height="142" /></a><strong><span style="color: #666699">GPS 자동차를 만들어 보자!-2</span></strong></h2>
<p>&nbsp;</p>
<p style="text-align: right">글 | 유한대 김경수(neocima3255@naver.com) 外</p>
<p><span style="text-decoration: underline"><strong>※ 상기 내용은 2010년에 진행된 유한대학과의 산학연 졸업 작품지원 프로젝트에 일환으로 작성되어진 원고임을 밝힙니다.</strong></span></p>
<p>&nbsp;</p>
<p><a href="http://www.ntrexgo.com/archives/5040" target="_blank">1부 보러가기</a></p>
<p><strong><span style="color: #008080">다. 지그비 무선 통신을 통해 PC의 하이퍼 터미널로 GPS 데이터 값을 확인</span></strong></p>
<p>GPS 데이터를 받기위해 사용한 GPS 모듈은 유아이구즈의 UIGGUB02-ROO1이라는 모델이다. 이 GPS 모듈은 안테나 일체형으로 USB로 PC와 연결이 가능해 간단하게 PC로 GPS 데이터를 확인할 수 있고 UART을 통해 간편하게 GPS 데이터를 받아 올수 있다. 아래 그림은 GPS 데이터의 연결 핀과 자동차에 GPS 모듈을 설치한 모습이다.</p>
<table>
<tbody>
<tr>
<td><img class="alignnone  wp-image-5264" alt="11FGPS059" src="http://www.ntrexgo.com/wp-content/uploads/2013/03/11FGPS059-620x156.jpg" width="312" height="79" /></td>
<td><img class="alignnone  wp-image-5235" alt="11FGPS057" src="http://www.ntrexgo.com/wp-content/uploads/2012/02/11FGPS057-620x240.jpg" width="260" height="101" /></td>
</tr>
</tbody>
</table>
<p><img class="alignnone  wp-image-5263" alt="11FGPS058" src="http://www.ntrexgo.com/wp-content/uploads/2013/03/11FGPS058-620x335.jpg" width="321" height="174" /></p>
<p>GPS 모듈은 자동차의 ATMEGA128의 UART0에 연결되어 있어 전원이 켜지면 지속적으로 위성으로부터 GPS 데이터를 받아 ATMEGA128로 저장 시킨다.</p>
<p><span style="color: #339966">1) 지그비 소프트웨어 구성</span><br />
GPS 모듈을 연결 했으면 이제 UART0통신으로 GPS 데이터를 ATMEGA128에 받아와야 한다. 아래의 소스는 GPS 데이터를 이제 UART0통신으로 ATMEGA128에 저장해 GPS 데이터를 지그비로 PC에 송신해 하이퍼 터미널로 확인하는 소스이다. GPS모듈은 UART0통신을 지그비는 UART1통신을 각각 한다.<br />
위 소스를 자동차의 ATMEGA128에 입력하면 지속적으로 GPS 데이터를 수신 받아서 지그비를 통해 PC로 GPS 데이터를 송신한다. GPS 모듈과 지그비 모듈은 모두 9600 보레이트의 통신 속도로 통신을 한다.</p>
<div class="symple-box yellow none" style="text-align:left; width:100%;"> 
<p>#include</p>
<p>#include</p>
<p>void main (void)<br />
{</p>
<p>DDRE = 0&#215;02; //통신 초기화 설정<br />
PORTE = 0&#215;00;<br />
DDRD = 0&#215;08;<br />
PORTD = 0&#215;00;<br />
usart0_init();<br />
usart1_init();</p>
<p>while(1)<br />
{<br />
put_char1(get_char0());<br />
//GPS 데이터를 usart0통신으로 받아서 지그비로 usart1 통신으로 PC에 GPS 데이터를 송신한다.<br />
}<br />
}<br />
void usart0_init(void) // usart0통신 설정<br />
{<br />
UBRR0H = 0;<br />
UBRR0L = 103;</p>
<p>UCSR0A = 0&#215;00;<br />
UCSR0B = 0&#215;18;<br />
UCSR0C = 0&#215;06;<br />
}<br />
void usart1_init(void) // usart1통신 설정<br />
{<br />
UBRR1H = 0;<br />
UBRR1L = 103;<br />
UCSR1A = 0&#215;00;<br />
UCSR1B = 0&#215;18;<br />
UCSR1C = 0&#215;06;<br />
}<br />
unsigned char get_char0(void)<br />
{<br />
while((UCSR0A &amp; 0&#215;80) == 0&#215;00);<br />
return UDR0;<br />
}<br />
void put_char0(unsigned char gps)<br />
{<br />
while((UCSR0A &amp; 0&#215;20) == 0&#215;00);<br />
UDR0 = gps;<br />
}<br />
unsigned char get_char1(void)<br />
{<br />
while((UCSR1A &amp; 0&#215;80) == 0&#215;00);<br />
return UDR1;<br />
}</p>
<p>void put_char1(unsigned char xbee)<br />
{<br />
while((UCSR1A &amp; 0&#215;20) == 0&#215;00);<br />
UDR1 = xbee;<br />
}<br />
void delay (int d){<br />
int i;<br />
for (i=0;i</p>
<p>}</p>
</div>
<p>&nbsp;</p>
<table style="border-collapse: collapse" width="600" border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td><a href="http://www.ntrexgo.com/wp-content/uploads/2013/03/11FGPS031.jpg" rel="lightbox[5258]"><img class="alignnone size-medium wp-image-5104" alt="11FGPS031" src="http://www.ntrexgo.com/wp-content/uploads/2013/03/11FGPS031-300x240.jpg" width="300" height="240" /></a></td>
<td><a href="http://www.ntrexgo.com/wp-content/uploads/2013/03/11FGPS032.jpg" rel="lightbox[5258]"><img class="alignnone size-medium wp-image-5105" alt="11FGPS032" src="http://www.ntrexgo.com/wp-content/uploads/2013/03/11FGPS032-300x211.jpg" width="300" height="211" /></a></td>
</tr>
<tr>
<td>35. 시작 → 모든 프로그램 → 보조프로그램 → 통신 → 하이퍼 터미널 순으로 프로그램을 실행한다.</td>
<td>36. 하이퍼 터미널의 이름을 입력한다.</td>
</tr>
<tr>
<td><a href="http://www.ntrexgo.com/wp-content/uploads/2013/03/11FGPS033.jpg" rel="lightbox[5258]"><img class="alignnone size-medium wp-image-5106" alt="11FGPS033" src="http://www.ntrexgo.com/wp-content/uploads/2013/03/11FGPS033-300x211.jpg" width="300" height="211" /></a></td>
<td><a href="http://www.ntrexgo.com/wp-content/uploads/2013/03/11FGPS034.jpg" rel="lightbox[5258]"><img class="alignnone size-medium wp-image-5107" alt="11FGPS034" src="http://www.ntrexgo.com/wp-content/uploads/2013/03/11FGPS034-300x211.jpg" width="300" height="211" /></a></td>
</tr>
<tr>
<td>37. ATMEGA128이 연결된 포트를 지정한다.</td>
<td>38. 포트의 등록정보를 위와 같이 설정한다.</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<p><strong><span style="color: #008000"> 라. GPS 파싱</span></strong></p>
<p><span style="color: #33cccc">2) 실제 GPS 데이터 확인 과정</span></p>
<p>GPS 데이터를 수신했으면 수신받은 GPS 데이터에서 내가 필요한 정보만 따로 저장을 해야 한다. GPS 데이터에서 필요한 정보만 저장하는 것을 ‘GPS 파싱’이라고 한다. 아래 그림은 통신 프로그램을 통해 GPS 데이터가 파싱되어 나타내는 것을 확인할수 있다.<br />
<a href="http://www.ntrexgo.com/wp-content/uploads/2013/03/11FGPS052.jpg" rel="lightbox[5258]"><img class="alignnone size-large wp-image-5125" alt="11FGPS052" src="http://www.ntrexgo.com/wp-content/uploads/2013/03/11FGPS052-620x396.jpg" width="620" height="396" /></a></p>
<p>GPS 자동차에서 필요한 데이터는 ‘$GPRMC’라는 문장에서 나오는데 이 문장을 분석하면,<br />
$GPRMC,155720.00.A,3729.18282,N,12649.27524,E,0.754,322.10,071010,,,A*69</p>
<p>155720 : 현재 시간<br />
A : 데이터의 신용정도<br />
3729.18282 : 위도<br />
12649.27524 : 경도</p>
<p>여기에서 위도 : 3729.18282 와 경도 : 12649.27524 의 데이터를 파싱하여 따로 변수에 저장해야 하는 것이다. 또한 위 데이터는 좌표 정보가 ddmm.mmmm 형식으로 되어 있다.<br />
여기서 dd는 경, 위도의 도(degree)단위를 말하고 크기는 0 ∼ 360도로 나타낸다. mm은 분(minute)을 말한다. 60분은 1도에 해당하며 .mmmm은 분(min)의 소수점이하 수치로서 10진법이 적용된다. 이 데이터를 GPS 항법 계산에 사용하려면 ddmm.mmmm 형식의 좌표를 dd.dddd형식의 십진법 좌표로 변환 하여야 한다. 여기서 변환법은 dd + mm.mmmm/60을 하면 dd.dddd형식의 십진법 좌표로 변환된다. 위의 좌표를 대입해 보면 위도 경도가 ddmm.mmmm 형식 3729.18282 , 12649.27524 이면 이것을 dd.dddd형식으로 변환하기 위해 위도 : 37+29.18282/60 , 경도 126+49.27524/60을 해주면 된다. 위의 식을 적용하면 위도 : 37.48638033 , 경도 : 126.821254 값이 된다. 이 값을 구글 어스에 넣어 보면 현재 위치를 지도상으로 표시할 수 있다.<br />
다음 그림은 구글 어스를 통해 dd.dddd형식 좌표를 지도상으로 확인한 그림이다.<br />
<a href="http://www.ntrexgo.com/wp-content/uploads/2013/03/11FGPS002.jpg" rel="lightbox[5258]"><img class="alignnone size-large wp-image-5075" alt="11FGPS002" src="http://www.ntrexgo.com/wp-content/uploads/2013/03/11FGPS002-620x395.jpg" width="620" height="395" /></a></p>
<p><span style="color: #33cccc">1) GPS 파싱 소프트웨어 구성</span><br />
다음 소스에서는 GPS 데이터를 파싱하여 위도, 경도를 따로 추출하고 추출된 위도 경도 값을 dd.dddd 형식으로 변환하여 그 값을 지그비를 통해 PC의 하이퍼 터미널로 확인하는 소스 중 일부이다.</p>
<div class="symple-box yellow none" style="text-align:left; width:100%;"> 
#include &lt;avr/io.h&gt;<br />
#include &lt;avr/interrupt.h&gt;<br />
#include<br />
#include<br />
#include</p>
<p>unsigned char GPSflag=0; // 데이터 파싱에서 쓰이는 변수,$로 시작할 때 1저장<br />
unsigned char GPScnt=0; // data parsing 할 때 사용<br />
unsigned char GPSDATA[100]; // GPS receiver부터 받은 모든 정보 저장할 변수<br />
unsigned char time[15]; // Time 정보 저장할 변수<br />
unsigned char lat2[10]; // 위도 정보 저장(mm.mmmm)<br />
unsigned char lon2[10]; // 경도 정보 저장(mm.mmmm)<br />
unsigned char lat1[5]; // 위도 정보 저장(dd)<br />
unsigned char lon1[5]; // 경도 정보 저장(dd)<br />
double latitude=0; // dd.dddd로 변환된 위도값 저장<br />
double longitude=0; // dd.dddd로 변환된 경도값 저장</p>
<p>// 1us 딜레이<br />
void delay_us(unsigned char time_us)<br />
{<br />
register unsigned char i;<br />
for(i=0; i&lt;time_us; i++) {<br />
asm volatile(“PUSH R0”);<br />
asm volatile(“POP R0”);<br />
asm volatile(“PUSH R0”);<br />
asm volatile(“POP R0”);<br />
asm volatile(“PUSH R0”);<br />
asm volatile(“POP R0”);<br />
}<br />
}</p>
<p>//1ms 딜레이<br />
void delay_ms(unsigned int time_ms) {<br />
register unsigned int i;<br />
for(i=0; i&lt;time_ms; i++) {<br />
delay_us(250);<br />
delay_us(250);<br />
delay_us(250);<br />
delay_us(250);<br />
}<br />
}</p>
<p>void usart0_init(void) //usart0 통신 설정 gps 데이터가 들어올때 인터럽트 발생<br />
{<br />
UBRR0H = 0;<br />
UBRR0L = 103;</p>
<p>UCSR0A = 0&#215;00;<br />
UCSR0B = 0&#215;98;<br />
UCSR0C = 0&#215;06;<br />
}<br />
</div>
위 소스를 자동차에 입력하고 자동차의 ATmega128에서 GPS 데이터가 지속적으로 들어오면 인터럽트가 발생해서 GPS 데이터를 파싱하고 위도, 경도 변수에 위도, 경도값을 저장한다. 저장된 위도, 경도값을 1초마다 지그비를 통하여 무선 송신하면 PC의 하이퍼 터미널을 통해 dd.dddd값으로 변환된 위도, 경도값만 확인 할 수 있다. 아래 그림은 실제 GPS 자동차에서 GPS 데이터를 파싱한 값을 하이퍼터미널로 확인한 그림이다.<br />
<a href="http://www.ntrexgo.com/wp-content/uploads/2013/03/11FGPS045.jpg" rel="lightbox[5258]"><img class="alignnone size-large wp-image-5118" alt="11FGPS045" src="http://www.ntrexgo.com/wp-content/uploads/2013/03/11FGPS045-620x431.jpg" width="620" height="431" /></a></p>
<p><strong><span style="color: #008000">마. 추출된 위도, 경도값을 이용하여 수식을 통해 목표 좌표까지 거리, 방향각 값을 계산</span></strong><br />
GPS 데이터에서 추출된 위도, 경도값으로 목표 위도, 경도값까지의 이동거리, 방향각을 구하려면 우선 위도, 경도 값을 라디안 각도로 변환해야 한다. 위도나 경도는 지구 중심을 기반으로 하는 각도이기 때문에 라디안 각도로 변환할 수가 있는 것이다. 위도와 경도를 라디안 값으로 변환하는 식은 dd.dddd형식의 좌표를 57.2957795(1라디안에 해당하는 각도; 180/π)으로 나누거나 (π/180)을 곱하면 라디안 각도로 변환할 수 있다.</p>
<p><span style="color: #33cccc">1) 위도와 경도의 라디안 값을 구하는 식</span><br />
가) 위도 * (3.141592/180) = 라디안 위도값<br />
나) 경도 * (3.141592/180) = 라디안 경도값</p>
<p><span style="color: #33cccc">2) 목표까지의 라디안 거리 값을 구하는 공식</span><br />
가) 라디안 거리값 = acos(sin(현재 라디안 위도)*sin(목표 라디안 위도)+cos(현재 라디안 위도)*cos(목표 라디안 위도)*cos(현재 라디안 경도-목표 라디안 경도));</p>
<p><span style="color: #33cccc">3) 실제 M단위로 된 거리값을 구하는 계산식</span><br />
가) 실제 거리값(M) = 라디안 거리값 * 3437.7387 * 1852</p>
<p><span style="color: #33cccc">4) 목표 방위각을 구하는 계산식</span><br />
가) 라디안 방위각 = acos((sin(목표 라디안 위도) &#8211; sin(현재 라디안 위도) x cos(라디안 거리)) / (cos(현재 라디안 위도) x sin(라디안 거리)))</p>
<p><span style="color: #33cccc">5) 라디안 방위각 값을 항법에 적용할 방위각 값을 변환하는 공식</span><br />
가) 실제 방위각 = 라디안 방위각 * (180 / 3.141592)</p>
<p><span style="color: #33cccc">6) 만약 현재 경도가 목표 경도보다 값이 크다면 실제 방위각 값을 구하는 공식</span><br />
가) 실제 방위각 = 360 &#8211; (라디안 방위각 * (180 /3.141592))</p>
<p>위의 공식들을 사용하여 GPS 자동차는 목표 좌표까지 이동할 거리, 방위각을 계산하여 목표 방위각만큼 방향을 틀고 이동할 거리만큼 모터를 움직이면 원하는 좌표로 GPS 자동차를 무인 조정할 수 있는 것이다. 다음은 실제 좌표를 위의 공식들에 대입해서 목표 좌표로 이동할 거리와 방위각이 정확히 나오는지 구글 어스를 통해 확인한다. 현재 좌표를 현재위도 : 37.48638033 현재경도 : 126.821254 으로 설정하고 목표 좌표를‘목표위도 : 37.48738033 목표경도 : 126.822254’으로 설정하고 구글 어스를 통해 이동할 거리와 방위각을 구하면 아래 그림과 같다.<br />
<a href="http://www.ntrexgo.com/wp-content/uploads/2013/03/11FGPS046.jpg" rel="lightbox[5258]"><img class="alignnone size-large wp-image-5119" alt="11FGPS046" src="http://www.ntrexgo.com/wp-content/uploads/2013/03/11FGPS046-620x321.jpg" width="620" height="321" /></a></p>
<p>이동할 거리는 141.85미터 , 방위각은 38.43도이다. 이제 위의 공식을 통해 계산하면,</p>
<p>현재 라디안 위도 = 37.48638033*(3.141592/180)<br />
= 0.6542606253<br />
현재 라디안 경도 = 126.821254*(3.141592/180)<br />
= 2.213447983<br />
목표 라디안 위도 = 37.48738033*(3.141592/180)<br />
= 0.6542780786<br />
목표 라디안 경도 = 126.822254*(3.141592/180)<br />
= 2.213465437<br />
라디안 거리 = acos(sin(0.6542606253) * sin(0.6542780786)<br />
+ cos(0.6542606253) * cos(0.6542780786) *<br />
cos(2.213447983 &#8211; 2.213465437))<br />
= 0.00002228070345<br />
실제 거리 = 0.00002228070345 * 3437.7387 * 1852<br />
= 141.854378(M)<br />
라디안 방위각=acos((sin(0.6542780786) &#8211; sin(0.6542606253)<br />
* cos(0.00002228070345)) / (cos(0.6542606253)<br />
* sin(0.00002228070345))) = 0.6707747395<br />
실제 방위각 = (0.6707747395 * (180 / 3.141592))<br />
= 38.43256957</p>
<p>7) 지그비를 통해 PC의 하이퍼 터미널로 표현하는 소스 중 일부이다.</p>
<div class="symple-box yellow none" style="text-align:left; width:100%;"> 
<p>#include &lt;avr/io.h&gt;<br />
#include &lt;avr/interrupt.h&gt; //인터럽트 헤더파일 선언<br />
#include &lt;stdio.h&gt;<br />
#include &lt;stdlib.h&gt;<br />
#include &lt;math.h&gt; // 수함 함수 헤더파일 선언</p>
<p>unsigned char GPSflag=0; // 데이터 파싱에서 쓰이는 변수, $로 시작할 때 1저장<br />
unsigned char GPScnt=0; // data parsing 할 때 사용<br />
unsigned char GPSDATA[100]; // GPS receiver부터 받은 모든 정보 저장할 변수<br />
unsigned char time[15]; // Time 정보 저장할 변수<br />
unsigned char lat2[10];<br />
unsigned char lon2[10];<br />
unsigned char lat1[5];<br />
unsigned char lon1[5];</p>
<p>double latitude=0; //dd.dddd로 변환된 위도<br />
double longitude=0; //dd.dddd로 변환된 경도<br />
double d_latitude=37.48738033; // 목표 위도<br />
double d_longitude=126.822254; // 목표 경도<br />
double Cur_Lat_radian=0; // 현재 라디안 위도<br />
double Cur_Lon_radian=0; // 현재 라디안 경도<br />
double Dest_Lat_radian=0; // 목표 라디안 위도<br />
double Dest_Lon_radian=0; // 목표 라디안 경도<br />
double radian_distance=0; // 라디안 거리<br />
double radian_bearing=0; // 라디안 방위각<br />
double true_bearing=0; // 실제 방위각<br />
double distance=0; // 실제 거리</p>
<p>// 1us 딜레이<br />
void delay_us(unsigned char time_us)<br />
{<br />
register unsigned char i;<br />
for(i=0; i&lt;time_us; i++) {<br />
asm volatile(“PUSH R0”);<br />
asm volatile(“POP R0”);<br />
asm volatile(“PUSH R0”);<br />
asm volatile(“POP R0”);<br />
asm volatile(“PUSH R0”);<br />
asm volatile(“POP R0”);<br />
}<br />
}</p>
<p>//1ms 딜레이<br />
void delay_ms(unsigned int time_ms) {<br />
register unsigned int i;<br />
for(i=0; i&lt;time_ms; i++) {<br />
delay_us(250);<br />
delay_us(250);<br />
delay_us(250);<br />
delay_us(250);<br />
}<br />
}</p>
<p>void usart0_init(void)<br />
{<br />
UBRR0H = 0;<br />
UBRR0L = 103;</p>
<p>UCSR0A = 0&#215;00;<br />
UCSR0B = 0&#215;18;<br />
UCSR0C = 0&#215;06;<br />
}</p>
<p>void usart1_init(void)<br />
{<br />
UBRR1H = 0;<br />
UBRR1L = 103;<br />
UCSR1A = 0&#215;00;<br />
</div>
<p style="text-align: right">※ 전체 소스는 www.devicezine.co.kr에서 확인할 수 있다.</p>
<p><span style="color: #33cccc">8) 실제 이동할 거리, 방위각을 하이퍼 터미널로 나타낸 그림</span></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2013/03/11FGPS060.jpg" rel="lightbox[5258]"><img class="alignnone  wp-image-5281" alt="11FGPS060" src="http://www.ntrexgo.com/wp-content/uploads/2013/03/11FGPS060-620x295.jpg" width="496" height="236" /></a></p>
<p>&nbsp;</p>
<p><strong><span style="color: #008000">바. 마그네틱 컴파스 센서(나침판 센서)를 사용하여 GPS 자동차의 현재 방위각을 구한다.</span></strong></p>
<p>마그네틱 컴파스센서(나침판 센서)는 모델명이 CMPS03이며 진북 방향을 기준으로 현재 방위각 값을 지속적으로 출력한다. CMPS03의 그림과 핀번호는 다음과 같다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2013/03/11FGPS047.jpg" rel="lightbox[5258]"><img class="alignnone  wp-image-5120" alt="11FGPS047" src="http://www.ntrexgo.com/wp-content/uploads/2013/03/11FGPS047-620x288.jpg" width="434" height="202" /></a><br />
GPS 자동차의 ATMEGA128과 연결해야 될 핀은 1,2,3,9번 핀이다. 1,9번핀은 전원 핀이고 2,3번 핀은 TWI통신 핀(I2C 통신)으로 CMPS03은 I2C통신을 통해 ATMEGA128과 통신을 하면서 현재 방위각 값을 출력한다. GPS 자동차와 CPMS03의 설치는 아래 그림과 같다.</p>
<table>
<tbody>
<tr>
<td><a href="http://www.ntrexgo.com/wp-content/uploads/2013/03/11FGPS035.jpg" rel="lightbox[5258]"><img class="alignnone  wp-image-5108" alt="11FGPS035" src="http://www.ntrexgo.com/wp-content/uploads/2013/03/11FGPS035-620x465.jpg" width="268" height="201" /></a></td>
<td><a href="http://www.ntrexgo.com/wp-content/uploads/2013/03/11FGPS037.jpg" rel="lightbox[5258]"><img class="alignnone  wp-image-5110" alt="11FGPS037" src="http://www.ntrexgo.com/wp-content/uploads/2013/03/11FGPS037-620x465.jpg" width="268" height="201" /></a></td>
</tr>
</tbody>
</table>
<p>TWI통신을 할때는 통신하는 핀 SCL과 SDA핀에 각각 풀업 저항을 해줘야 한다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2013/03/11FGPS001.jpg" rel="lightbox[5258]"><img class="alignnone  wp-image-5074" alt="11FGPS001" src="http://www.ntrexgo.com/wp-content/uploads/2013/03/11FGPS001-620x281.jpg" width="434" height="197" /></a></p>
<p>&nbsp;</p>
<p><span style="color: #33cccc">1) 지그비를 통해 방위각을 하이퍼 터미널로 확인하는 소스 중 일부이다.</span></p>
<div class="symple-box yellow none" style="text-align:left; width:100%;"> 
<p>#include &lt;avr/io.h&gt;<br />
#include &lt;util/delay.h&gt;<br />
#include &lt;stdio.h&gt;<br />
#include &lt;avr/interrupt.h&gt;</p>
<p>unsigned char s[21];</p>
<p>void i2c_transmit(char,char,char); //TWI 통신 함수 선언<br />
char i2c_read(char,char); //TWI 통신 함수 선언</p>
<p>char i2c_read(char address, char reg) { //TWI 통신 함수<br />
char read_data = 0;</p>
<p>TWCR = 0xA4; // send a start bit on i2c bus<br />
while(!(TWCR &amp; 0&#215;80)); // wait for confirmation of transmit<br />
TWDR = address; // load address of i2c device<br />
TWCR = 0&#215;84; // transmit<br />
while(!(TWCR &amp; 0&#215;80)); // wait for confirmation of transmit<br />
TWDR = reg; // send register number to read from<br />
TWCR = 0&#215;84; // transmit<br />
while(!(TWCR &amp; 0&#215;80)); // wait for confirmation of transmit</p>
<p>TWCR = 0xA4; // send repeated start bit<br />
while(!(TWCR &amp; 0&#215;80)); // wait for confirmation of transmit<br />
TWDR = address+1; // transmit address of i2c device with readbit set<br />
TWCR = 0xC4; // clear transmit interupt flag<br />
while(!(TWCR &amp; 0&#215;80)); // wait for confirmation of transmit<br />
TWCR = 0&#215;84; // transmit, nack (last byte request)<br />
while(!(TWCR &amp; 0&#215;80)); // wait for confirmation of transmit<br />
read_data = TWDR; // and grab the target data<br />
TWCR = 0&#215;94; // send a stop bit on i2c bus<br />
return read_data;</p>
<p>}</p>
<p>void i2c_transmit(char address, char reg, char data) { //TWI 통신 함수<br />
TWCR = 0xA4; // send a start bit on i2c bus<br />
while(!(TWCR &amp; 0&#215;80)); // wait for confirmation of transmit<br />
TWDR = address; // load address of i2c device<br />
TWCR = 0&#215;84; // transmit<br />
while(!(TWCR &amp; 0&#215;80)); // wait for confirmation of transmit<br />
TWDR = reg;<br />
TWCR = 0&#215;84; // transmit<br />
while(!(TWCR &amp; 0&#215;80)); // wait for confirmation of transmit<br />
TWDR = data;<br />
TWCR = 0&#215;84; // transmit<br />
while(!(TWCR &amp; 0&#215;80)); // wait for confirmation of transmit<br />
TWCR = 0&#215;94; // stop bit<br />
}</p>
<p>void usart0_init(void)<br />
{<br />
UBRR0H = 0;<br />
UBRR0L = 103;</p>
<p>UCSR0A = 0&#215;00;<br />
UCSR0B = 0&#215;18;<br />
UCSR0C = 0&#215;06;<br />
}</p>
<p>void usart1_init(void)<br />
{<br />
UBRR1H = 0;<br />
UBRR1L = 103;</p>
<p>UCSR1A = 0&#215;00;<br />
UCSR1B = 0&#215;18;<br />
UCSR1C = 0&#215;06;<br />
}</p>
<p><span style="font-size: 13px;line-height: 19px"></div></span></p>
<p>위 소스를 실제 GPS 자동차에 적용하여 방위각을 하이퍼 터미널로 확인하면 다음과 같다. 끝의 한자리는 소수점 자리를 나타낸다(ex : 3565 : 356.5도)</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2013/03/11FGPS044.jpg" rel="lightbox[5258]"><img class="alignnone  wp-image-5117" alt="11FGPS044" src="http://www.ntrexgo.com/wp-content/uploads/2013/03/11FGPS044-620x385.jpg" width="397" height="246" /></a></p>
<p><strong><span style="color: #008000">사. 방위각의 비교와 모터를 구동하여 목표 좌표로 GPS 자동차를 이동</span></strong><br />
마지막 단계로 CMPS03에서 추출된 현재 방위각과 GPS 거리계산 공식으로 나온 방위각이 일치하도록 모터를 돌려주고 GPS 거리 계산 공식으로 나온 이동거리가 1보다 작을때까지 모터를 직진하면 GPS 자동차는 목표 좌표로 이동하게 된다.<br />
GPS 자동차는 좌회전 하면 현재 방위각이 작아지고 우회전을 하면 현재 방위각 값이 커진다. 따라서 현재 방위각이 목표 방위각 보다 크면 좌회전, 현재 방위각이 목표 방위각보다 작으면 우회전을 시키고 현재 방위각과 목표 방위각이 일치하면 이동거리만큼 직진해서 목표 좌표로 이동하면 된다.</p>
<p><span style="color: #33cccc">1) 목표 좌표를 입력하면 목표 좌표로 GPS 자동차가 무인제어하는 소스</span><br />
다음 소스는 CMPS03의 방위각을 TWI통신을 통해 수신, GPS 데이터를 통해 이동 거리와 방위각을 구하고 현재 방위각과 목표 방위각을 비교하여 방향을 잡은 후 목표 이동 거리만큼 모터를 직진하고 목표 이동거리로 이동하면 멈추는 소스이다.</p>
<div class="symple-toggle"><h3 class="symple-toggle-trigger">목표 좌표를 입력하면 목표 좌표로 GPS 자동차가 무인제어하는 소스</h3><div class="symple-toggle-container">
<p>#include &lt;avr/io.h&gt;<br />
#include &lt;avr/interrupt.h&gt;<br />
#include &lt;stdio.h&gt;<br />
#include &lt;stdlib.h&gt;<br />
#include &lt;math.h&gt;</p>
<p>unsigned char GPSflag=0; // 데이터 파싱에서 쓰이는 변수, $로 시작 할 때 1저장할꺼임<br />
unsigned char GPScnt=0; // data parsing 할 때 사용<br />
unsigned char GPSDATA[100]; // GPS receiver부터 받은 모든 정보 저장할 변수<br />
unsigned char time[15]; // Time 정보 저장할 변수<br />
unsigned char lat2[10];<br />
unsigned char lon2[10];<br />
unsigned char lat1[5];<br />
unsigned char lon1[5];</p>
<p>double latitude=0;<br />
double longitude=0;<br />
double d_latitude=37.488499;<br />
double d_longitude=126.821250;<br />
double radian_distance=0;<br />
double radian_bearing=0;<br />
double distance=0;<br />
double rad_distance=0;<br />
double dis_lat=0;<br />
double dis_lon=0;<br />
double dis=0;<br />
double bea=0;<br />
double true_bea=0;<br />
unsigned char exam=0;</p>
<p>#define MOTOR_PORT PORTC<br />
#define MOTOR_DDR DDRC<br />
#define PWM1_IN (MOTOR_PORT&amp;0&#215;01)<br />
#define PWM1_ON (MOTOR_PORT|=0&#215;01)<br />
#define PWM1_OFF (MOTOR_PORT&amp;=0xFE)<br />
#define DIR1_ON (MOTOR_PORT|=0&#215;02)<br />
#define DIR1_OFF (MOTOR_PORT&amp;=0xFD)<br />
#define ENABLE1_OFF (MOTOR_PORT|=0&#215;04)<br />
#define ENABLE1_ON (MOTOR_PORT&amp;=0xFB)<br />
#define BREAK1_ON (MOTOR_PORT|=0&#215;08)<br />
#define BREAK1_OFF (MOTOR_PORT&amp;=0xF7)<br />
#define PWM2_IN (MOTOR_PORT&amp;0&#215;10)<br />
#define PWM2_ON (MOTOR_PORT|=0&#215;10)<br />
#define PWM2_OFF (MOTOR_PORT&amp;=0xEF)<br />
#define DIR2_ON (MOTOR_PORT|=0&#215;20)<br />
#define DIR2_OFF (MOTOR_PORT&amp;=0xDF)<br />
#define ENABLE2_ON (MOTOR_PORT|=0&#215;40)<br />
#define ENABLE2_OFF (MOTOR_PORT&amp;=0xBF)</p>
<p>void i2c_transmit(char,char,char);<br />
char i2c_read(char,char);</p>
<p>// 1us 딜레이<br />
void delay_us(unsigned char time_us)<br />
{<br />
register unsigned char i;<br />
for(i=0; i&lt;time_us; i++) {<br />
asm volatile(“PUSH R0”);<br />
asm volatile(“POP R0”);<br />
asm volatile(“PUSH R0”);<br />
asm volatile(“POP R0”);<br />
asm volatile(“PUSH R0”);<br />
asm volatile(“POP R0”);<br />
}<br />
}</p>
<p>//1ms 딜레이<br />
void delay_ms(unsigned int time_ms) {<br />
register unsigned int i;<br />
for(i=0; i&lt;time_ms; i++) {<br />
delay_us(250);<br />
delay_us(250);<br />
delay_us(250);<br />
delay_us(250);<br />
}<br />
}<br />
char i2c_read(char address, char reg) { //TWI 통신 함수<br />
char read_data = 0;</p>
<p>TWCR = 0xA4; // send a start bit on i2c bus<br />
while(!(TWCR &amp; 0&#215;80)); // wait for confirmation of transmit<br />
TWDR = address; // load address of i2c device<br />
TWCR = 0&#215;84; // transmit<br />
while(!(TWCR &amp; 0&#215;80)); // wait for confirmation of transmit<br />
TWDR = reg; // send register number to read from<br />
TWCR = 0&#215;84; // transmit<br />
while(!(TWCR &amp; 0&#215;80)); // wait for confirmation of transmit</p>
<p>TWCR = 0xA4; // send repeated start bit<br />
while(!(TWCR &amp; 0&#215;80)); // wait for confirmation of transmit<br />
TWDR = address+1; // transmit address of i2c device with readbit set<br />
TWCR = 0xC4; // clear transmit interupt flag<br />
while(!(TWCR &amp; 0&#215;80)); // wait for confirmation of transmit<br />
TWCR = 0&#215;84; // transmit, nack (last byte request)<br />
while(!(TWCR &amp; 0&#215;80)); // wait for confirmation of transmit<br />
read_data = TWDR; // and grab the target data<br />
TWCR = 0&#215;94; // send a stop bit on i2c bus<br />
return read_data;</p>
<p>}</p>
<p>void i2c_transmit(char address, char reg, char data) { //TWI 통신 함수<br />
TWCR = 0xA4; // send a start bit on i2c bus<br />
while(!(TWCR &amp; 0&#215;80)); // wait for confirmation of transmit<br />
TWDR = address; // load address of i2c device<br />
TWCR = 0&#215;84; // transmit<br />
while(!(TWCR &amp; 0&#215;80)); // wait for confirmation of transmit<br />
TWDR = reg;<br />
TWCR = 0&#215;84; // transmit<br />
while(!(TWCR &amp; 0&#215;80)); // wait for confirmation of transmit<br />
TWDR = data;<br />
TWCR = 0&#215;84; // transmit<br />
while(!(TWCR &amp; 0&#215;80)); // wait for confirmation of transmit<br />
TWCR = 0&#215;94; // stop bit<br />
}</p>
<p>void parsing(void)<br />
{<br />
unsigned char temp=6; // time position<br />
unsigned char temp1=0;<br />
unsigned char temp3=20; // latitude position<br />
unsigned char temp4=0;<br />
unsigned char temp5=34; // longitude position<br />
unsigned char temp6=0;<br />
unsigned char temp7=18; // latitude position<br />
unsigned char temp8=0;<br />
unsigned char temp9=31; // longitude position<br />
unsigned char temp10=0;<br />
int i;</p>
<p>if(GPSflag)<br />
{<br />
if(GPSDATA[0]==‘G’)<br />
{<br />
if(GPSDATA[2]==‘R’ &amp;&amp; GPSDATA[3]==‘M’)<br />
{<br />
while(GPSDATA[temp]!=‘,’)<br />
{<br />
time[temp1]=GPSDATA[temp];<br />
temp++;<br />
temp1++;<br />
}<br />
while(GPSDATA[temp3]!=‘,’)<br />
{<br />
lat2[temp4]=GPSDATA[temp3];<br />
temp3++;<br />
temp4++;<br />
}<br />
while(GPSDATA[temp5]!=‘,’)<br />
{<br />
lon2[temp6]=GPSDATA[temp5];<br />
temp5++;<br />
temp6++;<br />
}<br />
for(i=0; i&lt;2; i++)<br />
{<br />
lat1[temp8]=GPSDATA[temp7];<br />
temp7++;<br />
temp8++;<br />
}<br />
for(i=0; i&lt;3; i++)<br />
{<br />
lon1[temp10]=GPSDATA[temp9];<br />
temp9++;<br />
temp10++;<br />
}<br />
}<br />
}<br />
}<br />
}</p>
<p>void way_point(void)<br />
{<br />
latitude = (atoi(lat1)+(atof(lat2)/60));<br />
longitude = (atoi(lon1)+(atof(lon2)/60));</p>
<p>dis_lat=69.1*(d_latitude-latitude);<br />
dis_lon=69.1*(d_longitude-longitude)*cos(latitude*3.141592/180);<br />
// pi = 3.141592<br />
rad_distance=sqrt(dis_lat*dis_lat+dis_lon*dis_lon);<br />
distance=rad_distance*1610; //1.61-&gt;1610 =&gt;km를 m단위로 계산</p>
<p>dis=distance/6366690.2;<br />
bea = acos(((sin(d_latitude*3.141592/180)-sin(latitude*3.141592/<br />
180) *cos(dis)) / (cos(latitude*3.141592/180)*sin(dis))));</p>
<p>if(sin(d_longitude-longitude)&lt;0)<br />
{<br />
true_bea = 3600 &#8211; bea*(180/3.141592) * 10;<br />
}<br />
else<br />
{<br />
true_bea = bea * (180/3.141592) * 10;<br />
}<br />
}</p>
<p>// 메인함수의 시작<br />
int main(){<br />
unsigned int angle;</p>
<p>DDRE = 0&#215;02;<br />
PORTE = 0&#215;00;<br />
DDRD = 0&#215;08;<br />
PORTD = 0&#215;00;<br />
usart0_init();<br />
usart1_init();<br />
fdevopen(put_char1,0);<br />
MOTOR_DDR = 0xff; // 모터포트 초기화<br />
ENABLE1_ON;</p>
<p>TWBR = 72;<br />
TWSR = 0&#215;00;<br />
TWCR = 0&#215;04;<br />
delay_ms(1000);</p>
<p>asm(“SEI”); // SREG 의 global interrupt enable 1로 set</p>
<p>while(1) { // 목표 좌표로 모터 제어 시작<br />
while(exam!=1)<br />
{<br />
angle = i2c_read(0xC0,2) &lt;&lt;8;// read cmps03 angle, high byte angle += i2c_read(0xC0,3);<br />
way_point();</p>
<p>BREAK1_ON; // STOP<br />
PWM1_OFF;<br />
PWM2_OFF;<br />
if(angle &gt; true_bea+100) //현재 방위각이 목표 방위각 보다 크면<br />
{<br />
BREAK1_OFF; // 좌회전<br />
DIR1_ON;<br />
DIR2_OFF;<br />
PWM1_ON;<br />
PWM2_ON;<br />
}</p>
<p>else if(angle &lt; true_bea-100) // 현재 방위각이 목표 방위각보다 작으면<br />
{<br />
BREAK1_OFF; // 우회전<br />
DIR1_OFF;<br />
DIR2_ON;<br />
PWM1_ON;<br />
PWM2_ON;<br />
}<br />
else if(true_bea-100 &gt; angle &lt; true_bea+100) // 현재 방위각과 목표 방위각이 같으면<br />
{<br />
exam = 1;<br />
}<br />
}<br />
while(exam!=0)<br />
{<br />
angle = i2c_read(0xC0,2) &lt;&lt;8; // read cmps03 angle, high byte<br />
angle += i2c_read(0xC0,3);<br />
way_point();</p>
<p>if(angle &gt; true_bea+100)<br />
{<br />
exam = 0;<br />
}</p>
<p>else if(angle &lt; true_bea-100)<br />
{<br />
exam = 0;<br />
}</p>
<p>else if(distance &gt; 1) //목표 이동거리가 1보다 크면<br />
{<br />
BREAK1_OFF; // 전진<br />
DIR1_ON;<br />
DIR2_ON;<br />
PWM1_ON;<br />
PWM2_ON;<br />
}</p>
<p>else if(distance &lt; 1) //목표 이동거리가 1보다 작으면<br />
{<br />
BREAK1_ON; // STOP<br />
PWM1_OFF;<br />
PWM2_OFF;<br />
}<br />
}<br />
}<br />
return 0;<br />
}</p>
<p>SIGNAL(SIG_USART0_RECV)<br />
{<br />
asm(“CLI”);<br />
unsigned char ch;<br />
ch = UDR0; // 수신된 데이터를 ch 변수에 저장합니다.<br />
if(ch==’$’) // 수신된 캐릭터가 $ 이면 한줄의 시작이므로<br />
{<br />
GPSflag=1;<br />
GPScnt=0; // 데이터파싱을 위한 카운트 변수도 0으로 초기화<br />
}else{<br />
GPSDATA[GPScnt]=ch; // $가 아니리면 GPSDATA에 계속 저장<br />
if(GPSDATA[GPScnt]==0x0A &amp;&amp; GPSDATA[GPScnt-1]==0x0D)<br />
{<br />
parsing();<br />
way_point();<br />
GPSflag=0;<br />
}<br />
GPScnt++;<br />
}<br />
asm(“SEI”;<br />
}</p>
<p><span style="font-size: 13px;line-height: 19px"></div></div></span></p>
<p><span style="font-size: 13px;line-height: 19px">마지막 소스에서 보면 GPS 거리 계산 공식이 전에 설명한 소스와 약간 다를 것이다. 이유는 전의 GPS 거리 계산 소스는 현재 AVR STUDIO 컴파일러에서는 정밀한 계산이 불가능하여 현재 좌표와 목표 좌표가 가까울때 계산을 정확히 하지 못하기 때문이다. 그 이유는 AVR STUDIO는 실수형 변수 double이 4 바이트로 C 컴파일러는 비주얼 C++보다 성능이 떨어진다.(비주얼 C++ 컴파일러는 실수형 변수 double이 8 바이트로 GPS 거리계산 공식을 정확하게 계산한다.) 전의 GPS 거리 계산 공식은 정밀한 계산이 필요한데(예를 들어 0.999999994 를 AVR STUDIO는 실수형 변수를 최대 4 바이트밖에 인식하지 못해 1로 인식) AVR STUDIO 컴파일러는 그 계산을 정확히 하지 못한다.</span></p>
<p>후에 필자는 마지막 소스에서와 같이 다른 공식을 찾았고 AVR STUDIO 컴파일러에서도 정상적으로 목표이동거리와 방위각을 계산할 수 있었다. 또 목표 방위각으로 모터를 돌릴때 IF문에 true_bea(목표 방위각)에 +-100을 해준 이유는 +-100의 오차를 주지 않으면 모터가 정밀하게 움직이지 못하여 방향을 못잡아서이다. 위의 소스처럼 오차범위를 주면 자동차는 목표 방위각으로 방향을 틀때 헤매지 않고 바로 방향을 잡을 수 있을 것이다.(방위각의 오차는 조금 있을 것이다.)</p>
<p><strong><span style="color: #003366">3. 제작 후기</span></strong></p>
<p>이번 GPS 자동차를 제작하면서 정말 많은 것을 배울 수 있었다. 사실 이번 졸업 프로젝트를 하기 전까지는 GPS라는게 뭔지도 몰랐지만 이번 프로젝트를 통해서 GPS의 원리, 응용, 항법에 대해서 자세히 알 수 있었고 혼자서는 감히 엄두도 못낼 가격의 자동차를 만들 수 있게 되었다.<br />
디바이스마트에서 아낌없이 부품을 지원해준 덕분에 많은 소자와 센서, 부품들을 다뤄볼 수 있었고 많은 것을 공부할 수 있었다. 아직 GPS 자동차는 완성된 것이 아니다. 시간이 조금 더 주어 진다면 LAB VIEW로 프로그램 작성을 해서 노트북으로 실시간 GPS 자동차의 모든 상태를 지그비를 통해서 볼 수 있고 노트북에서 목표 좌표를 지정해서 실시간으로 GPS 자동차를 무인제어할 수 있도록 할 것이다. 또 초음파 센서를 장착해서 4방위의 장애물을 감지하고 GPS 자동차 무인 제어시 초음파 센서를 통해 장애물을 회피할 수 있도록 하는것이 최종 목표이다.<br />
아낌없는 지원을 해 줘서 이런 좋은 기회를 갖게 해준 디바이스마트에 감사하고 이번 프로젝트를 하는 동안 많은 도움을 주신 유한대 김진선 교수님께 감사의 뜻을 전하고 싶습니다. 지금까지 보고서를 읽어주셔서 감사합니다. 만약 이 보고서에 틀린 점이 있다면 많은 지적 부탁드립니다.</p>
<p><strong><span style="color: #008000">가. 최종 완성 작품</span></strong></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2013/03/11FGPS038.jpg" rel="lightbox[5258]"><img class="alignnone  wp-image-5111" alt="11FGPS038" src="http://www.ntrexgo.com/wp-content/uploads/2013/03/11FGPS038-620x475.jpg" width="347" height="266" /></a></p>
<p><strong><span style="color: #008000">나. GPS자동차 동영상</span></strong></p>
<p><strong></strong><a href="http://cafe.naver.com/carroty.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=116671" target="_blank">동영상보러가기</a></p>
<p><strong><span style="color: #008000"> 다. 부품 목록</span></strong></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2013/03/11FGPS061.jpg" rel="lightbox[5258]"><img class="alignnone  wp-image-5319" alt="11FGPS061" src="http://www.ntrexgo.com/wp-content/uploads/2013/03/11FGPS061-601x620.jpg" width="354" height="365" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.ntrexgo.com/archives/5258/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
