<?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%95%88%eb%93%9c%eb%a1%9c%ec%9d%b4%eb%93%9c/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>[21호]안드로이드 인터페이스 CAN모듈 출시!</title>
		<link>http://www.ntrexgo.com/archives/21365</link>
		<comments>http://www.ntrexgo.com/archives/21365#comments</comments>
		<pubDate>Fri, 01 Nov 2013 08:39:18 +0000</pubDate>
		<dc:creator>디바이스마트 매거진</dc:creator>
				<category><![CDATA[디바이스마트 매거진]]></category>
		<category><![CDATA[프로덕트 뉴스]]></category>
		<category><![CDATA[21호]]></category>
		<category><![CDATA[뉴스]]></category>
		<category><![CDATA[디바이스마트]]></category>
		<category><![CDATA[매거진]]></category>
		<category><![CDATA[안드로이드]]></category>
		<category><![CDATA[프로덕트]]></category>

		<guid isPermaLink="false">http://www.ntrexgo.com/?p=21365</guid>
		<description><![CDATA[디바이스마트 매거진 21호 &#124; 힉스코리아에서 출시된 CAN2BT(ICT-1112-00)은 안드로이드 기반의 모발일 기기에서 Bluetooth 통신을 이용하여 CAN 버스와 손쉽게 인터페이스 할 수 있는 CAN to Bluetooth 모듈이다.]]></description>
				<content:encoded><![CDATA[<p><a href="http://www.ntrexgo.com/wp-content/uploads/2013/11/힉스코리아-안드로이드.jpg" rel="lightbox[21365]"><img class="wp-image-21391 aligncenter" alt="힉스코리아-안드로이드" src="http://www.ntrexgo.com/wp-content/uploads/2013/11/힉스코리아-안드로이드-620x465.jpg" width="434" height="326" /></a></p>
<p>힉스코리아에서 출시된 CAN2BT(ICT-1112-00)은 안드로이드 기반의 모발일 기기에서 Bluetooth 통신을 이용하여 CAN 버스와 손쉽게 인터페이스 할 수 있는 CAN to Bluetooth 모듈이다. 대부분의 CAN은 멀티마스터 버스 통신으로 자동차, 선박등 기타 산업현장에서 활용되고 있으나 지역 및 공간적 한계를 극복하지 못하는 단점이 있다. CAN2BT(ICT-1112-00)는 안드로이드 기반의 모바일 기기에서 CAN 통신을 제어할 수 있도록 설계되어 지역, 공간적 한계의 극복뿐만 아니라 별도의 부가장비 없이 사용자가 항상 휴대하는 Tablets, Smartphone에서 제어가 가능하다.</p>
<p><img class="aligncenter" style="border: 0px" alt="" src="http://www.devicemart.co.kr/data/temp/789422.jpg" width="454" height="438" border="0" /></p>
<p>기본으로 제공되는 안드로이드 기반 모니터링 애플리케이션은 CAN Bus 데이터를 송·수신 하며 각종 옵션변경 설정 메뉴를 통해 CAN 통신설정 변경, CAN 프로토콜 변경, CAN 필터설정, 펌웨어 업그레이드 기능을 제공한다. 데이터 표출과 관련해서는 직관적인 제어가 가능한 단축아이콘을 배치하여 손쉬운 제어가 이루어질 수 있도록 구성되었다.<br />
자세한 사항은 디바이스마트에서 확인 가능하며 출시 할인 이벤트 가격으로 구매할 수 있다.<br />
<span style="color: #3366ff"><strong>■ 제품 특징■</strong></span></p>
<p>· CAN 2.0A, CAN 2.0B 지원<br />
· 최대 속도 1Mbps 지원<br />
· 전원 및 상태 LED 제공<br />
· DC 5V 어댑터 제공- D-Sub 9Pin Male Connector 실장<br />
· 안드로이드 기반 모니터링 어플리케이션 제공<br />
· 안드로이드 환경에서 부트로더를 이용한 펌웨어 업데이트 제공<br />
· 안드로이드 오픈 예제소스 제공 : CAN2BT_Sample, CAN2BT_Gauge</p>
<p>&nbsp;</p>
<p><a title="제품구매하러가기" href="http://www.devicemart.co.kr/goods/view.php?seq=1077495" target="_blank">제품구매하러가기</a></p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ntrexgo.com/archives/21365/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>개발자에게 도움을 줄 수 있을까? BeagleBoard 비글보드 소개</title>
		<link>http://www.ntrexgo.com/archives/14437</link>
		<comments>http://www.ntrexgo.com/archives/14437#comments</comments>
		<pubDate>Mon, 10 Jun 2013 04:09:20 +0000</pubDate>
		<dc:creator>NTRexLAB</dc:creator>
				<category><![CDATA[blog-posts]]></category>
		<category><![CDATA[제품 리뷰]]></category>
		<category><![CDATA[beagle]]></category>
		<category><![CDATA[beaglebone]]></category>
		<category><![CDATA[black]]></category>
		<category><![CDATA[리눅스]]></category>
		<category><![CDATA[블랙]]></category>
		<category><![CDATA[비글보드]]></category>
		<category><![CDATA[비글본]]></category>
		<category><![CDATA[안드로이드]]></category>

		<guid isPermaLink="false">http://www.ntrexgo.com/?p=14437</guid>
		<description><![CDATA[(본 글은 pinkwink.kr에 동시 기고되는 글입니다.)
요즘 너무도 갑자기 더워지기 시작했네요. 비가 온다는 소식도 있긴 하던데 말이죠. 오늘은 살짝 재미난 보드를 하나 소개할려고 합니다. 이름하여 비글보드 -Beagle Board- 그 중에서 Black버젼이에요.

&#160;
이렇게 말썽꾸러기 비글 강아지 캐릭터가 있는 박스 포장의 제품입니다. BeagleBone Black이지요.

&#160;
참으로 간단한 메뉴얼??과 함께 있습니다. 그냥 웹페이지 주소와 간단한 설치 단계가 적혀있어요.

&#160;
뭐 간단하죠? 요런 포장은 이제 애플 덕분에 우리에게도 꽤 익숙한 방식이죠^^

&#160;
동봉된 USB 케이블을 PC와 연결해주면 됩니다.

&#160;
혼돈될건 없습니다. 이렇게 연결하면 PC와 바로 연결이 됩니다.

&#160;
탐색기에서 확인해보시면, 저렇게 BeagleBone Getting Started라고 잡힙니다. 여기서 살짝 들어가보면

&#160;
이렇게 문서들이 뜨죠. START.html을 더블클릭으로 실행하시면 됩니다. 아~ 중간에 다시 메세지가 뜹니다만, 익스플로러로 접근하면 안됩니다. 구글 크롬으로 접근하셔야합니다.

&#160;
여기서 잠시~~...]]></description>
				<content:encoded><![CDATA[<p>(본 글은 pinkwink.kr에 동시 기고되는 글입니다.)</p>
<p>요즘 너무도 갑자기 더워지기 시작했네요. 비가 온다는 소식도 있긴 하던데 말이죠. 오늘은 살짝 재미난 보드를 하나 소개할려고 합니다. 이름하여 비글보드 -Beagle Board- 그 중에서 Black버젼이에요.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2013/06/DSC02815.jpg" rel="lightbox[14437]"><img class="aligncenter size-full wp-image-14448" alt="DSC02815" src="http://www.ntrexgo.com/wp-content/uploads/2013/06/DSC02815.jpg" width="600" height="400" /></a></p>
<p>&nbsp;</p>
<p>이렇게 말썽꾸러기 비글 강아지 캐릭터가 있는 박스 포장의 제품입니다. BeagleBone Black이지요.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2013/06/DSC02816.jpg" rel="lightbox[14437]"><img class="aligncenter size-full wp-image-14449" alt="DSC02816" src="http://www.ntrexgo.com/wp-content/uploads/2013/06/DSC02816.jpg" width="600" height="400" /></a></p>
<p>&nbsp;</p>
<p>참으로 간단한 메뉴얼??과 함께 있습니다. 그냥 웹페이지 주소와 간단한 설치 단계가 적혀있어요.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2013/06/DSC02817.jpg" rel="lightbox[14437]"><img class="aligncenter size-full wp-image-14450" alt="DSC02817" src="http://www.ntrexgo.com/wp-content/uploads/2013/06/DSC02817.jpg" width="600" height="400" /></a></p>
<p>&nbsp;</p>
<p>뭐 간단하죠? 요런 포장은 이제 애플 덕분에 우리에게도 꽤 익숙한 방식이죠^^</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2013/06/DSC03276.jpg" rel="lightbox[14437]"><img class="aligncenter size-full wp-image-14451" alt="DSC03276" src="http://www.ntrexgo.com/wp-content/uploads/2013/06/DSC03276.jpg" width="600" height="400" /></a></p>
<p>&nbsp;</p>
<p>동봉된 USB 케이블을 PC와 연결해주면 됩니다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2013/06/DSC03277.jpg" rel="lightbox[14437]"><img class="aligncenter size-full wp-image-14452" alt="DSC03277" src="http://www.ntrexgo.com/wp-content/uploads/2013/06/DSC03277.jpg" width="600" height="400" /></a></p>
<p>&nbsp;</p>
<p>혼돈될건 없습니다. 이렇게 연결하면 PC와 바로 연결이 됩니다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2013/06/001.jpg" rel="lightbox[14437]"><img class="aligncenter size-full wp-image-14438" alt="001" src="http://www.ntrexgo.com/wp-content/uploads/2013/06/001.jpg" width="544" height="269" /></a></p>
<p>&nbsp;</p>
<p>탐색기에서 확인해보시면, 저렇게 BeagleBone Getting Started라고 잡힙니다. 여기서 살짝 들어가보면</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2013/06/002.jpg" rel="lightbox[14437]"><img class="aligncenter size-full wp-image-14439" alt="002" src="http://www.ntrexgo.com/wp-content/uploads/2013/06/002.jpg" width="608" height="251" /></a></p>
<p>&nbsp;</p>
<p>이렇게 문서들이 뜨죠. START.html을 더블클릭으로 실행하시면 됩니다. 아~ 중간에 다시 메세지가 뜹니다만, 익스플로러로 접근하면 안됩니다. 구글 크롬으로 접근하셔야합니다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2013/06/003.jpg" rel="lightbox[14437]"><img class="aligncenter size-full wp-image-14440" alt="003" src="http://www.ntrexgo.com/wp-content/uploads/2013/06/003.jpg" width="911" height="770" /></a></p>
<p>&nbsp;</p>
<p>여기서 잠시~~ 비글보드가 뭔지 말씀드려야겠네요. 저도 이제 막 접하는 아이라 잘 모릅니다. 일단 BeagleBone Black은 Cortex-A8 CPU를 장착하고 있는 작은 보드입니다. 안드로이드 OS나 리눅스 Ubuntu의 포팅이 가능하도록 지원되고 있고, Ethernet, USB, HDMI, MicroSD 카드등을 지원합니다. 인터넷의 자료나 User&#8217;s Manual을 읽어보면, 이 보드에 HDMI 지원되는 모니터를 연결하고, 키보드 마우스를 연결해서 하나의 PC처럼 사용하는 경우도 있습니다. 처음 구매하면 Angstrom Linux가 설치되어서 배송됩니다. 이런 아이가 가격이 놀랍게도 45$입니다. 5만원도 안되는 돈이죠. 매력적입니다. 물론 선적료 등때문에 국내 판매가는 6만원인걸로 알고 있습니다만, 그럼에도 불구하고, 꽤 매력있죠.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2013/06/004.jpg" rel="lightbox[14437]"><img class="aligncenter size-full wp-image-14441" alt="004" src="http://www.ntrexgo.com/wp-content/uploads/2013/06/004.jpg" width="974" height="787" /></a></p>
<p>&nbsp;</p>
<p>다시 아까의 START.htm을 실행하면 위 화면이 뜹니다. 왼쪽에 있는 것 처럼 Step을 밟아가면 됩니다. Install Drivers에서도 PC에 맞게 맞춰가시면 되구요</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2013/06/005.jpg" rel="lightbox[14437]"><img class="aligncenter size-full wp-image-14442" alt="005" src="http://www.ntrexgo.com/wp-content/uploads/2013/06/005.jpg" width="213" height="281" /></a></p>
<p>&nbsp;</p>
<p>그리고, Step3까지 가시면 됩니다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2013/06/006.jpg" rel="lightbox[14437]"><img class="aligncenter size-full wp-image-14443" alt="006" src="http://www.ntrexgo.com/wp-content/uploads/2013/06/006.jpg" width="869" height="421" /></a></p>
<p>&nbsp;</p>
<p>거기서 접속하라는 IP가 뜨는데요. 그걸 클릭하시면 됩니다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2013/06/007.jpg" rel="lightbox[14437]"><img class="aligncenter size-full wp-image-14444" alt="007" src="http://www.ntrexgo.com/wp-content/uploads/2013/06/007.jpg" width="935" height="852" /></a></p>
<p>&nbsp;</p>
<p>일단, Your board is connected라는 메세지가 뜨면 다 정상입니다. 왼쪽에서 각 종 Hardware 적인 회로나 Pin-Map 등을 확인하실 수 있습니다. 좋죠^^</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2013/06/008.jpg" rel="lightbox[14437]"><img class="aligncenter size-full wp-image-14445" alt="008" src="http://www.ntrexgo.com/wp-content/uploads/2013/06/008.jpg" width="654" height="476" /></a></p>
<p>&nbsp;</p>
<p>작은 보드지만, 있어야할 건 다 있답니다.^^.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2013/06/009.jpg" rel="lightbox[14437]"><img class="aligncenter size-full wp-image-14446" alt="009" src="http://www.ntrexgo.com/wp-content/uploads/2013/06/009.jpg" width="747" height="475" /></a></p>
<p>&nbsp;</p>
<p>이건 간단히 하드웨어적인 부분들을 확인하실 수 있는 예제들이 지원됩니다. 위 예제는 0번 LED를 끄거나 겨볼 수 있는 건데요.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2013/06/010.jpg" rel="lightbox[14437]"><img class="aligncenter size-full wp-image-14447" alt="010" src="http://www.ntrexgo.com/wp-content/uploads/2013/06/010.jpg" width="562" height="261" /></a></p>
<p>&nbsp;</p>
<p>이렇게 LED 번호를 바꿔가면서 사용해보실 수 있습니다. 이런 코드예제 부터, Cloud9IDE를 통해 직접 비글보드를 엑세스할 수도 있습니다. 물론 비글보드를 사용하는 분들은 대부분 리눅스나 안드로이드를 포팅해서 사용합니다. 저도 해볼려구요^^. 뭐 아무튼 간단히 비글보드를 소개해봤습니다.</p>
<p>좋아요. 이렇게 좋은 가격에 나온 보드라면 요즘 제가 할려는 여러 제품의 Control Tower를 맡겨도 되겠다 싶더라구요^^. 아무튼 또 계속 이 아이와 친해지는 대로 글을 올릴께용^^</p>
<div class="symple-box blue none" style="text-align:center; width:100%;"> 
<a href="http://devicemart.co.kr/goods/view.php?seq=1064106" target="_blank">판매페이지바로가기</a><br />
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.ntrexgo.com/archives/14437/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[14호] 안드로이드를 이용한 탱크 조종</title>
		<link>http://www.ntrexgo.com/archives/2049</link>
		<comments>http://www.ntrexgo.com/archives/2049#comments</comments>
		<pubDate>Sat, 25 Aug 2012 04:12:13 +0000</pubDate>
		<dc:creator>디바이스마트 매거진</dc:creator>
				<category><![CDATA[디바이스마트 매거진]]></category>
		<category><![CDATA[프로젝트]]></category>
		<category><![CDATA[16호]]></category>
		<category><![CDATA[diy]]></category>
		<category><![CDATA[Project To Build]]></category>
		<category><![CDATA[매거진]]></category>
		<category><![CDATA[안드로이드]]></category>

		<guid isPermaLink="false">http://www.ntrexgo.com/?p=2049</guid>
		<description><![CDATA[디바이스마트 매거진 14호 &#124; 안드로이드를 이용한 탱크 조종을 하고자 하였다. 통신 방식은 블루투스를 이용하고 탱크측 제어는 Attiny2313를 이용하였고, 단순 전후진만이 아닌 다른 동작들을 추가 하였다.]]></description>
				<content:encoded><![CDATA[<h3><a href="http://www.ntrexgo.com/wp-content/uploads/2013/03/14ptband03.jpg" rel="lightbox[2049]"><img class=" wp-image-2071 alignleft" alt="14ptband03" src="http://www.ntrexgo.com/wp-content/uploads/2013/03/14ptband03-300x221.jpg" width="216" height="159" /></a>2012 DIY 프로젝트 작품 공모전 &#8211; 도전상</h3>
<h2><strong><span style="color: #008080">안드로이드를 이용한 </span></strong></h2>
<h2><strong><span style="color: #008080">탱크 조종</span></strong></h2>
<p style="padding-left: 420px">글 | 김종욱 bear1215@korea.com</p>
<p style="padding-left: 420px">
<p style="padding-left: 420px">
<p>&nbsp;</p>
<p><strong style="color: #008000">심사평</strong></p>
<p style="padding-left: 30px">근래 관심을 받는 안드로이드와 일반 주행 로봇을 결합한 작품이다. 무선조종기 대신 안드로이드 OS를 이용하여 해당 OS가 설치된 장비(폰, 태블릿 등)에서 로봇을 조종할 수 있도록 되어있다. 일반 사용자의 DIY 컨셉에 맞춰 본다면 쉽게 접근할 수 있는 내용이다. 단, 안드로이드 측 프로그램에 대한 구현방법에 대한 설명 등이 문서상 미흡한 것이 아쉬움으로 남는다.</p>
<p><span style="color: #008000"><strong>개발 동기 및 목적</strong></span></p>
<p style="padding-left: 30px">안드로이드를 이용한 탱크 조종을 하고자 하였다. 통신 방식은 블루투스를 이용하고 탱크측 제어는 Attiny2313를 이용하였고, 단순 전후진만이 아닌 다른 동작들을 추가 하였다. 1.전후진, 2.좌회전, 3.우회전, 4.좌후진, 5.우후진, 6.포탑 회전(좌우), 7.포신의 상하 이동, 8.포탄 발사(BB탄 발사), 9.전조등/후미등 켜기</p>
<p>&nbsp;</p>
<p><span style="color: #008000"><strong>단계별 과정</strong></span></p>
<p><strong><span style="color: #33cccc">1. 구조도(상세 블럭도 및 회로도 참조)</span></strong></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2013/03/14ptband.jpg" rel="lightbox[2049]"><img class="alignnone size-medium wp-image-2082" alt="구조도" src="http://www.ntrexgo.com/wp-content/uploads/2013/03/14ptband-241x300.jpg" width="241" height="300" /></a><br />
<strong><span style="color: #33cccc">2. 전원</span></strong></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2013/03/14ptband01.jpg" rel="lightbox[2049]"><img class="alignnone size-medium wp-image-2083" alt="14ptband01" src="http://www.ntrexgo.com/wp-content/uploads/2013/03/14ptband01-300x142.jpg" width="300" height="142" /></a></p>
<p>전원은 기존의 밧데리를 이용한다. (9.7V 1000mA)<br />
정전원 변환은 LM2575-5.0를 사용하였다. 전원은 9.7V를 모터 구동 전원으로 사용하고 제어부인 Attiny2313은 5.0V 전원을 사용한다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2013/03/14ptband02.jpg" rel="lightbox[2049]"><img class="alignnone size-medium wp-image-2084" alt="14ptband02" src="http://www.ntrexgo.com/wp-content/uploads/2013/03/14ptband02-300x135.jpg" width="300" height="135" /></a><br />
탱크부 구성<br />
기존의 RF 제어부를 제거하고 모터, 밧데리 등은 그대로 사용한다. 탱크의 구성은 아래의 표와 같다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2013/03/14ptband014.jpg" rel="lightbox[2049]"><img class="alignnone size-medium wp-image-2096" alt="14ptband014" src="http://www.ntrexgo.com/wp-content/uploads/2013/03/14ptband014-300x125.jpg" width="300" height="125" /></a><br />
<strong><span style="color: #33cccc">3. 탱크 제어부 구성</span></strong></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2013/03/14ptband03.jpg" rel="lightbox[2049]"><img class="alignnone size-medium wp-image-2071" alt="14ptband03" src="http://www.ntrexgo.com/wp-content/uploads/2013/03/14ptband03-300x221.jpg" width="300" height="221" /></a><br />
탱크 제어는 Attiny2313을 사용한다.<br />
가. MPU : Attiny2313<br />
나. 주모터 제어 : L293B(정역 회전용 2set)<br />
다. 포탑 모터 : LB1630(정역 회전용 1set)<br />
라. 포신 모터 : ULN2803(1/8)<br />
마. 포 발사 모터 : ULN2803(1/8)<br />
바. 전조등 : ULN2803(1/8)<br />
사. 후미등 : ULN2803(1/8)</p>
<p><strong><span style="color: #33cccc">4. 탱크 제어부 통신 모듈</span></strong><br />
탱크 제어부와 안드로이드 폰 연결은 bluetooth모듈을 사용하였다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2013/03/14ptband04.jpg" rel="lightbox[2049]"><img class="alignnone size-medium wp-image-2072" alt="14ptband04" src="http://www.ntrexgo.com/wp-content/uploads/2013/03/14ptband04-300x161.jpg" width="300" height="161" /></a></p>
<p><a href="http://www.devicemart.co.kr/goods/view.php?seq=15592" target="_blank">my Bluetooth-EX 모듈 구입하러 가기</a></p>
<p><strong><span style="color: #33cccc">5. 안드로이드 프로그램</span></strong><br />
<span style="color: #666699"><strong>Program : android측</strong></span><br />
<span style="color: #666699"><strong> tankControl.java</strong></span></p>
<div class="symple-toggle"><h3 class="symple-toggle-trigger">tankControl.java 소스보기</h3><div class="symple-toggle-container">
<p>package kr.sunejune;</p>
<p>import android.R;<br />
import android.app.Activity;<br />
import android.bluetooth.BluetoothAdapter;<br />
import android.bluetooth.BluetoothDevice;<br />
import android.content.Intent;<br />
import android.os.Bundle;<br />
import android.os.Handler;<br />
import android.os.Message;<br />
import android.util.Log;<br />
import android.view.Gravity;<br />
import android.view.Menu;<br />
import android.view.MenuInflater;<br />
import android.view.MenuItem;<br />
import android.view.View;<br />
import android.view.ViewGroup;<br />
import android.widget.Button;<br />
import android.widget.TextView;<br />
import android.widget.Toast;<br />
import android.view.View.OnClickListener;</p>
<p>public class TankControl extends Activity implements OnClickListener {</p>
<p>private static final String TAG = &#8220;TankControl&#8221;;<br />
private static final boolean D = false;</p>
<p>// Message types sent from the BluetoothChartService Handler<br />
public static final int MESSAGE_STATE_CHANGE = 1;<br />
public static final int MESSAGE_READ = 2;<br />
public static final int MESSAGE_DEVICE_NAME = 4;<br />
public static final int MESSAGE_TOAST = 5;</p>
<p>// Key names received from the BluetoothChartService Handler<br />
public static final String DEVICE_NAME = &#8220;device_name&#8221;;<br />
public static final String TOAST = &#8220;toast&#8221;;</p>
<p>// Name of the connected device<br />
private String mConnectedDeviceName = null;</p>
<p>// Intent request codes<br />
private static final int REQUEST_CONNECT_DEVICE = 1;<br />
private static final int REQUEST_ENABLE_BT = 2;</p>
<p>// Local Bletooth adapetr<br />
private BluetoothAdapter mBluetoothAdapter = null;<br />
// Member object for the chat services<br />
private SvrServer mSvcServer = null;</p>
<p>private TextView mStatus;</p>
<p>finish();<br />
/*<br />
// Called when the activity is first created.<br />
static final int[] BUTTONS = {<br />
R.id.ball,<br />
R.id.turrent_left,<br />
R.id.turrent_stop,<br />
R.id.turrent_right,<br />
R.id.f_center,<br />
R.id.f_left,<br />
R.id.f_right,<br />
R.id.t_center,<br />
R.id.t_left,<br />
R.id.t_right,<br />
R.id.c_center,<br />
R.id.c_left,<br />
R.id.c_right,<br />
R.id.gun_up,<br />
R.id.gun_dn,<br />
R.id.gun_stop<br />
};<br />
*/<br />
int ball_f = 0;<br />
TextView _out1 = null;<br />
TextView _out2 = null;<br />
TextView _out3 = null;</p>
<p>@Override<br />
public void onCreate(Bundle savedInstanceState) {</p>
<p>// TODO Auto-generated method stub<br />
super.onCreate(savedInstanceState);<br />
setContentView(R.layout.tankcontrol);<br />
setOnClickListener((ViewGroup)findViewById(R.id.tblButtons));</p>
<p>mStatus = (TextView)findViewById(R.id.txtStatus);</p>
<p>mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();</p>
<p>if( mBluetoothAdapter == null){<br />
Toast.makeText(this, &#8220;Bluetooth is not available&#8221;, Toast.LENGTH_SHORT).show();<br />
finish();<br />
return;<br />
}</p>
<p>_out1 = (TextView)findViewById(R.id.text1);<br />
_out2 = (TextView)findViewById(R.id.text2);<br />
_out3 = (TextView)findViewById(R.id.text3);</p>
<p>_out1.setText(&#8220;Hello&#8221;);<br />
_out1.setBackgroundColor(0xFFFFFF00);<br />
_out1.setGravity(Gravity.CENTER);</p>
<p>_out2.setText(&#8220;멈춤&#8221;);<br />
_out2.setBackgroundColor(0xFFFF00FF);<br />
_out2.setGravity(Gravity.CENTER);</p>
<p>_out3.setText(&#8220;멈춤&#8221;);<br />
_out3.setBackgroundColor(0xFF00FFFF);<br />
_out3.setGravity(Gravity.CENTER);</p>
<p>}</p>
<p>@Override<br />
protected void onStart() {<br />
// TODO Auto-generated method stub<br />
super.onStart();<br />
/*<br />
if(D) Log.e(TAG,&#8221;++ ON START ++&#8221;);</p>
<p>if( !mBluetoothAdapter.isEnabled() ) {<br />
Intent enableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);<br />
startActivityForResult(enableIntent, REQUEST_ENABLE_BT );<br />
}<br />
else {<br />
if(mSvcServer == null) {<br />
mSvcServer = new SvrServer(this, mHandler);<br />
}<br />
}<br />
*/<br />
}</p>
<p>@Override<br />
public boolean onCreateOptionsMenu(Menu menu) {<br />
MenuInflater inflater = getMenuInflater();<br />
inflater.inflate(R.menu.option_menu, menu);<br />
return true;<br />
}<br />
@Override<br />
public boolean onOptionsItemSelected(MenuItem item) {<br />
switch(item.getItemId()){<br />
case R.id.scan :<br />
/*<br />
Intent serverIntent = new Intent(this, DeviceListActivity.class);<br />
startActivityForResult(serverIntent, REQUEST_CONNECT_DEVICE);<br />
*/</p>
<p>Intent serverIntent = new Intent(this, DeviceListActivity.class);<br />
startActivityForResult(serverIntent , REQUEST_CONNECT_DEVICE);<br />
return true;<br />
}<br />
return false;<br />
}<br />
@Override<br />
protected void onActivityResult(int requestCode, int resultCode, Intent data) {<br />
if(D) Log.d(TAG,&#8221;onActivityResult&#8221;+resultCode);</p>
<p>switch(requestCode){<br />
case REQUEST_CONNECT_DEVICE :<br />
if(resultCode == Activity.RESULT_OK){<br />
String address = data.getExtras().getString(DeviceListActivity.EXTRA_DEVICE_ADDRESS);<br />
BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(address);<br />
mSvcServer.connect(device);<br />
}<br />
break;<br />
case REQUEST_ENABLE_BT :<br />
if(resultCode == Activity.RESULT_OK){<br />
if(mSvcServer == null) {<br />
mSvcServer = new SvrServer(this, mHandler);<br />
}<br />
}<br />
else {<br />
Log.d(TAG,&#8221;BT not enable&#8221;);<br />
Toast.makeText(this, R.string.bt_not_enabled_leaving, Toast.LENGTH_SHORT).show();<br />
finish();<br />
}<br />
break;<br />
}<br />
}</p>
<p>public void onInit(int status) {<br />
if(D) Log.d(TAG, &#8220;onInit&#8221;);<br />
}</p>
<p>private View[] getChildViews(ViewGroup group){<br />
int childCount = group.getChildCount();<br />
final View[] childViews = new View[childCount];<br />
for(int index = 0; index &lt; childCount; index++) {<br />
childViews[index] = group.getChildAt(index);<br />
}<br />
return childViews;<br />
}</p>
<p>private void setOnClickListener(ViewGroup group){<br />
View[] childViews = getChildViews(group);<br />
for(View view:childViews){<br />
if(view instanceof Button) {<br />
view.setOnClickListener(this);<br />
}<br />
else if(view instanceof ViewGroup) {<br />
setOnClickListener((ViewGroup) view);<br />
}<br />
}<br />
}</p>
<p>private int sendToQue(String data){<br />
if(mSvcServer.getState() != SvrServer.STATE_CONNECTED) {<br />
Toast.makeText(this, R.string.not_connected, Toast.LENGTH_SHORT).show();<br />
return -1;<br />
}<br />
return mSvcServer.toQue(data);<br />
}</p>
<p>private final Handler mHandler = new Handler() {<br />
@Override<br />
public void handleMessage(Message msg) {<br />
switch (msg.what) {<br />
case MESSAGE_STATE_CHANGE:<br />
if (D)<br />
Log.i(TAG, &#8220;MESSAGE_STATE_CHANGE: &#8221; + msg.arg1);<br />
switch (msg.arg1) {<br />
case SvrServer.STATE_CONNECTED:<br />
mStatus.setText(R.string.status_connected_to);<br />
mStatus.append(mConnectedDeviceName);<br />
break;<br />
case SvrServer.STATE_CONNECTING:<br />
mStatus.setText(R.string.status_connecting);<br />
break;<br />
case SvrServer.STATE_LISTEN:<br />
case SvrServer.STATE_NONE:<br />
mStatus.setText(R.string.status_not_connected);<br />
break;<br />
}<br />
break;<br />
// TODO: remove MESSAGE_READ<br />
case MESSAGE_READ:<br />
byte[] readBuf = (byte[]) msg.obj;<br />
// construct a string from the valid bytes in the buffer<br />
String readMessage = new String(readBuf, 0, msg.arg1);<br />
// mConversationArrayAdapter.add(mConnectedDeviceName+&#8221;: &#8221; +<br />
// readMessage);<br />
break;<br />
case MESSAGE_DEVICE_NAME:<br />
// save the connected device&#8217;s name<br />
mConnectedDeviceName = msg.getData().getString(DEVICE_NAME);<br />
Toast.makeText(getApplicationContext(),<br />
&#8220;Connected to &#8221; + mConnectedDeviceName,<br />
Toast.LENGTH_SHORT).show();<br />
break;<br />
case MESSAGE_TOAST:<br />
Toast.makeText(getApplicationContext(),<br />
msg.getData().getString(TOAST), Toast.LENGTH_SHORT)<br />
.show();<br />
break;<br />
}<br />
}<br />
};</p>
<p>public void gun_text()<br />
{<br />
Button b_up = (Button)findViewById(R.id.gun_up);<br />
Button b_dn = (Button)findViewById(R.id.gun_dn);<br />
Button b_st = (Button)findViewById(R.id.gun_stop);<br />
b_up.setText(&#8220;포신 UP&#8221;);<br />
b_dn.setText(&#8220;포신 DN&#8221;);<br />
b_st.setText(&#8220;포멈춤&#8221;);<br />
}</p>
<p>public void turrent_text()<br />
{<br />
Button b_up = (Button)findViewById(R.id.turrent_left);<br />
Button b_dn = (Button)findViewById(R.id.turrent_right);<br />
Button b_st = (Button)findViewById(R.id.turrent_stop);<br />
b_up.setText(&#8220;포탑_좌&#8221;);<br />
b_dn.setText(&#8220;포탑_우&#8221;);<br />
b_st.setText(&#8220;포탑멈춤&#8221;);<br />
}<br />
public void move_text()<br />
{<br />
Button b1_1 = (Button)findViewById(R.id.f_left);<br />
Button b1_2 = (Button)findViewById(R.id.f_center);<br />
Button b1_3 = (Button)findViewById(R.id.f_right);<br />
b1_1.setText(&#8220;전_좌&#8221;);<br />
b1_2.setText(&#8220;전_전&#8221;);<br />
b1_3.setText(&#8220;전_우&#8221;);<br />
Button b2_1 = (Button)findViewById(R.id.c_left);<br />
Button b2_2 = (Button)findViewById(R.id.c_center);<br />
Button b2_3 = (Button)findViewById(R.id.c_right);<br />
b2_1.setText(&#8220;좌_좌&#8221;);<br />
b2_2.setText(&#8220;멈춤&#8221;);<br />
b2_3.setText(&#8220;우_우&#8221;);<br />
Button b3_1 = (Button)findViewById(R.id.t_left);<br />
Button b3_2 = (Button)findViewById(R.id.t_center);<br />
Button b3_3 = (Button)findViewById(R.id.t_right);<br />
b3_1.setText(&#8220;후_좌&#8221;);<br />
b3_2.setText(&#8220;후_후&#8221;);<br />
b3_3.setText(&#8220;후_우&#8221;);<br />
}</p>
<p>@Override<br />
public void onClick(View v){<br />
if(v instanceof Button) {<br />
int btn_id = v.getId();<br />
Button btn = (Button)findViewById( btn_id );<br />
switch ( btn_id ) {<br />
case R.id.ball :<br />
if( ball_f == 0 ) {<br />
if(sendToQue(&#8220;A&#8221;)==0) {<br />
btn.setText(&#8220;발사중(A)&#8221;);<br />
_out1.setText(&#8220;포 발사&#8221;);<br />
ball_f = 1;<br />
}<br />
}<br />
else {<br />
sendToQue(&#8220;B&#8221;);<br />
btn.setText(&#8220;발사대기(B)&#8221;);<br />
_out1.setText(&#8220;Hello&#8221;);<br />
ball_f = 0;<br />
}<br />
break;<br />
case R.id.gun_up :<br />
if(sendToQue(&#8220;C&#8221;) == 0) {<br />
gun_text();<br />
btn.setText(&#8220;..ing(C)&#8221;);<br />
_out1.setText(&#8220;포신 UP&#8221;);<br />
}<br />
break;<br />
case R.id.gun_dn :<br />
if(sendToQue(&#8220;E&#8221;) == 0) {<br />
gun_text();<br />
btn.setText(&#8220;..ing(E)&#8221;);<br />
_out1.setText(&#8220;포신 DOWN&#8221;);<br />
}<br />
break;<br />
case R.id.gun_stop :<br />
if(sendToQue(&#8220;D&#8221;) == 0) {<br />
gun_text();<br />
btn.setText(&#8220;STOP(D)&#8221;);<br />
_out1.setText(&#8220;포신 STOP&#8221;);<br />
}<br />
break;<br />
case R.id.turrent_left :<br />
if(sendToQue(&#8220;F&#8221;) == 0) {<br />
turrent_text();<br />
btn.setText(&#8220;..ing(F)&#8221;);<br />
_out2.setText(&#8220;좌&#8221;);<br />
}<br />
break;<br />
case R.id.turrent_right :<br />
if(sendToQue(&#8220;H&#8221;) == 0) {<br />
turrent_text();<br />
btn.setText(&#8220;..ing(H)&#8221;);<br />
_out2.setText(&#8220;우&#8221;);<br />
}<br />
break;<br />
case R.id.turrent_stop :<br />
if(sendToQue(&#8220;G&#8221;) == 0) {<br />
turrent_text();<br />
btn.setText(&#8220;STOP(G)&#8221;);<br />
_out2.setText(&#8220;멈춤&#8221;);<br />
}<br />
break;<br />
case R.id.f_left :<br />
if(sendToQue(&#8220;I&#8221;) == 0) {<br />
move_text();<br />
btn.setText(&#8220;..ing(I)&#8221;);<br />
_out3.setText(&#8220;전_좌 &#8220;);<br />
}<br />
break;<br />
case R.id.f_center :<br />
if(sendToQue(&#8220;J&#8221;) == 0) {<br />
move_text();<br />
btn.setText(&#8220;..ing(J)&#8221;);<br />
_out3.setText(&#8220;전_전 &#8220;);<br />
}<br />
break;<br />
case R.id.f_right :<br />
if(sendToQue(&#8220;K&#8221;) == 0) {<br />
move_text();<br />
btn.setText(&#8220;..ing(K)&#8221;);<br />
_out3.setText(&#8220;전_우 &#8220;);<br />
}<br />
break;<br />
case R.id.c_left :<br />
if(sendToQue(&#8220;L&#8221;) == 0) {<br />
move_text();<br />
btn.setText(&#8220;..ing(L)&#8221;);<br />
_out3.setText(&#8220;좌_좌 &#8220;);<br />
}<br />
break;<br />
case R.id.c_center :<br />
if(sendToQue(&#8220;M&#8221;) == 0) {<br />
move_text();<br />
btn.setText(&#8220;STOP(M)&#8221;);<br />
_out3.setText(&#8220;멈춤&#8221;);<br />
}<br />
break;<br />
case R.id.c_right :<br />
if(sendToQue(&#8220;N&#8221;) == 0) {<br />
move_text();<br />
btn.setText(&#8220;..ing(N)&#8221;);<br />
_out3.setText(&#8220;우_우 &#8220;);<br />
}<br />
break;<br />
case R.id.t_left :<br />
if(sendToQue(&#8220;O&#8221;) == 0) {<br />
move_text();<br />
btn.setText(&#8220;..ing(O)&#8221;);<br />
_out3.setText(&#8220;후_좌 &#8220;);<br />
}<br />
break;<br />
case R.id.t_center :<br />
if(sendToQue(&#8220;P&#8221;) == 0) {<br />
move_text();<br />
btn.setText(&#8220;..ing(P)&#8221;);<br />
_out3.setText(&#8220;후_후&#8221;);<br />
}<br />
break;<br />
case R.id.t_right :<br />
if(sendToQue(&#8220;Q&#8221;) == 0) {<br />
move_text();<br />
btn.setText(&#8220;..ing(Q)&#8221;);<br />
_out3.setText(&#8220;후_우 &#8220;);<br />
}<br />
break;<br />
}<br />
}<br />
}</p>
<p>}<br />
</div></div>
<p><strong><span style="color: #666699">Program : android측</span></strong><br />
<strong><span style="color: #666699">SvrServer.java</span></strong></p>
<div class="symple-toggle"><h3 class="symple-toggle-trigger">SvrServer.java 소스보기</h3><div class="symple-toggle-container">
<p>package kr.sunejune;</p>
<p>import java.util.UUID;<br />
import java.io.IOException;<br />
import java.io.InputStream;<br />
import java.io.OutputStream;</p>
<p>import android.bluetooth.BluetoothAdapter;<br />
import android.bluetooth.BluetoothDevice;<br />
import android.bluetooth.BluetoothServerSocket;<br />
import android.bluetooth.BluetoothSocket;<br />
import android.content.Context;<br />
import android.os.Handler;<br />
import android.os.Bundle;<br />
import android.os.Message;<br />
import android.util.Log;</p>
<p>public class SvrServer {<br />
// Debug<br />
private static final String TAG = &#8220;SvrServer&#8221;;<br />
private static final boolean D = false;</p>
<p>// Name for the SDP record when creating server socket<br />
private static final String NAME =&#8221;TankCon&#8221;;</p>
<p>// Generic UUID for SPP<br />
private static final UUID MY_UUID = UUID.fromString(&#8220;00001101-0000-1000-8000-00805F9B34FB&#8221;);</p>
<p>private final BluetoothAdapter mAdapter;<br />
private final Handler mHandler;<br />
private AcceptThread mAccepThread;<br />
private ConnectThread mConnectThread;<br />
private ConnectedThread mConnectedThread;<br />
private int mState;</p>
<p>// Constants that indicate the current connection state<br />
public static final int STATE_NONE = 0;<br />
public static final int STATE_LISTEN = 1;<br />
public static final int STATE_CONNECTING = 2;<br />
public static final int STATE_CONNECTED = 3;</p>
<p>public SvrServer(Context context, Handler handler) {<br />
mAdapter = BluetoothAdapter.getDefaultAdapter();<br />
mState = STATE_NONE;<br />
mHandler = handler;<br />
}</p>
<p>private synchronized void setState(int state) {<br />
if( D ) Log.d(TAG, &#8220;setState()&#8221;+mState+&#8221;==&gt;&#8221;+state);<br />
mState = state;</p>
<p>mHandler.obtainMessage(TankControl.MESSAGE_STATE_CHANGE, state, -1).sendToTarget();<br />
}</p>
<p>public synchronized int getState() {<br />
return mState;<br />
}</p>
<p>public synchronized void start() {<br />
if(D) Log.d(TAG, &#8220;start&#8221; );<br />
if(mConnectThread != null) { mConnectThread.cancel(); mConnectThread = null; }<br />
if(mConnectedThread != null) { mConnectedThread.cancel(); mConnectedThread = null; }<br />
if(mAccepThread == null) { mAccepThread = new AcceptThread(); mAccepThread.start(); }<br />
setState(STATE_LISTEN);<br />
}</p>
<p>public synchronized void connect(BluetoothDevice device){<br />
if(D) Log.d(TAG,&#8221;connect to:&#8221; + device);</p>
<p>if(mState == STATE_CONNECTING) {<br />
if(mConnectThread != null) { mConnectThread.cancel(); mConnectThread = null; }<br />
}</p>
<p>if(mConnectedThread != null) { mConnectedThread.cancel(); mConnectedThread = null; }</p>
<p>mConnectThread = new ConnectThread(device);<br />
mConnectThread.start();<br />
setState(STATE_CONNECTING);<br />
}</p>
<p>public synchronized void connected(BluetoothSocket socket, BluetoothDevice device) {<br />
if(D) Log.d(TAG, &#8220;connected&#8221;);</p>
<p>if(mConnectThread != null) { mConnectThread.cancel(); mConnectThread = null; }<br />
if(mConnectedThread != null) { mConnectedThread.cancel(); mConnectThread = null; }<br />
if(mAccepThread != null) { mAccepThread.cancel(); mAccepThread = null; }</p>
<p>mConnectedThread = new ConnectedThread(socket);<br />
mConnectedThread.start();</p>
<p>Message msg = mHandler.obtainMessage( TankControl.MESSAGE_DEVICE_NAME );<br />
Bundle bundle = new Bundle();<br />
bundle.putString( TankControl.DEVICE_NAME, device.getName() );<br />
msg.setData(bundle);<br />
mHandler.sendMessage(msg);</p>
<p>setState(STATE_CONNECTED);</p>
<p>}</p>
<p>public synchronized void stop() {<br />
if(D) Log.d(TAG,&#8221;stop&#8221;);<br />
if(mConnectThread != null) { mConnectThread.cancel(); mConnectThread = null; }<br />
if(mConnectedThread != null) { mConnectedThread.cancel(); mConnectedThread = null; }<br />
if(mAccepThread != null) { mAccepThread.cancel(); mAccepThread = null; }<br />
setState(STATE_NONE);<br />
}</p>
<p>public int toQue(String data) {<br />
ConnectedThread r; // temp<br />
synchronized(this) {<br />
if(mState != STATE_CONNECTED ) return -1;<br />
r = mConnectedThread;<br />
}<br />
return r.toQue(data);<br />
}</p>
<p>private void connectionFail() {<br />
if(D) Log.d(TAG,&#8221;connectionFail&#8221;);<br />
setState(STATE_LISTEN);</p>
<p>Message msg = mHandler.obtainMessage( TankControl.MESSAGE_TOAST );<br />
Bundle bundle = new Bundle();<br />
bundle.putString(TankControl.TOAST, &#8220;Unable to connect device&#8221;);<br />
msg.setData(bundle);<br />
mHandler.sendMessage(msg);<br />
}</p>
<p>private void connectionLost() {<br />
if(D) Log.d(TAG, &#8220;connectionLost&#8221;);<br />
setState(STATE_LISTEN);</p>
<p>Message msg = mHandler.obtainMessage(TankControl.MESSAGE_TOAST);<br />
Bundle bundle = new Bundle();<br />
bundle.putString(TankControl.TOAST, &#8220;Device connection was lost&#8221;);<br />
msg.setData(bundle);<br />
mHandler.sendMessage(msg);<br />
}<br />
private class AcceptThread extends Thread {<br />
private final BluetoothServerSocket mmServerSocket;</p>
<p>public AcceptThread() {<br />
BluetoothServerSocket tmp = null;</p>
<p>try {<br />
tmp = mAdapter.listenUsingRfcommWithServiceRecord(NAME, MY_UUID);<br />
} catch ( IOException e ) {<br />
Log.e(TAG, &#8220;listen() failed&#8221;, e);<br />
}<br />
mmServerSocket = tmp;<br />
}</p>
<p>@Override<br />
public void run() {<br />
if(D) Log.d(TAG, &#8220;BEGIN mAcceptThread&#8221;+this);<br />
setName(&#8220;AcceptThread&#8221;);<br />
BluetoothSocket socket = null;</p>
<p>while( mState != STATE_CONNECTED ) {<br />
try {<br />
socket = mmServerSocket.accept();<br />
} catch (IOException e) {<br />
Log.e(TAG, &#8220;accept() failed&#8221;, e);<br />
break;<br />
}</p>
<p>if(socket != null) {<br />
synchronized ( SvrServer.this ) {<br />
switch(mState) {<br />
case STATE_LISTEN :<br />
case STATE_CONNECTING :<br />
connected(socket, socket.getRemoteDevice());<br />
break;<br />
case STATE_NONE :<br />
case STATE_CONNECTED :<br />
try {<br />
socket.close();<br />
}catch (IOException e) {<br />
Log.e(TAG,&#8221;Could not close unwanted socket&#8221;, e);<br />
}<br />
break;<br />
}<br />
}<br />
}<br />
}<br />
if(D) Log.d(TAG,&#8221;END mAcceptThread&#8221;);<br />
}</p>
<p>public void cancel() {<br />
if(D) Log.d(TAG,&#8221;cancel&#8221;+this);<br />
try {<br />
mmServerSocket.close();<br />
}catch(IOException e) {<br />
Log.e(TAG,&#8221;close() of server failed&#8221;,e);<br />
}<br />
}<br />
}</p>
<p>private class ConnectThread extends Thread {<br />
private final BluetoothSocket mmSocket;<br />
private final BluetoothDevice mmDevice;</p>
<p>public ConnectThread(BluetoothDevice device) {<br />
mmDevice = device;<br />
BluetoothSocket tmp = null;</p>
<p>try {<br />
tmp = device.createRfcommSocketToServiceRecord(MY_UUID);<br />
}catch(IOException e) {<br />
Log.e(TAG,&#8221;create() failed&#8221;, e);<br />
}<br />
mmSocket = tmp;<br />
}</p>
<p>@Override<br />
public void run() {<br />
Log.i(TAG,&#8221;BEGIN ConnectThrtead&#8221;);<br />
setName(&#8220;ConnectThread&#8221;);</p>
<p>mAdapter.cancelDiscovery();</p>
<p>try{<br />
mmSocket.connect();<br />
}catch(IOException e1) {<br />
connectionFail();<br />
try {<br />
mmSocket.close();<br />
}catch (IOException e2) {<br />
Log.e(TAG,&#8221;unable to close() socket during connection failure&#8221;, e2);<br />
}<br />
SvrServer.this.start();<br />
return;<br />
}</p>
<p>synchronized ( SvrServer.this ) {<br />
mConnectThread = null;<br />
}</p>
<p>connected(mmSocket, mmDevice );<br />
}</p>
<p>public void cancel() {<br />
try {<br />
mmSocket.close();<br />
}catch(IOException e) {<br />
Log.e(TAG,&#8221;close() of connect socket failed&#8221;, e);<br />
}<br />
}<br />
}</p>
<p>private class ConnectedThread extends Thread {<br />
private final BluetoothSocket mmSocket;<br />
private final InputStream mmInStream;<br />
private final OutputStream mmOutStream;</p>
<p>public ConnectedThread(BluetoothSocket socket) {<br />
Log.d(TAG, &#8220;create ConnectedThread&#8221;);<br />
mmSocket = socket;<br />
InputStream tmpIn = null;<br />
OutputStream tmpOut = null;</p>
<p>// Get the BluetoothSocket input and output streams<br />
try {<br />
tmpIn = socket.getInputStream();<br />
tmpOut = socket.getOutputStream();<br />
} catch (IOException e) {<br />
Log.e(TAG, &#8220;temp sockets not created&#8221;, e);<br />
}</p>
<p>mmInStream = tmpIn;<br />
mmOutStream = tmpOut;<br />
}</p>
<p>@Override<br />
public void run() {<br />
Log.i(TAG, &#8220;BEGIN mConnectedThread&#8221;);<br />
byte[] buffer = new byte[1024];<br />
int bytes;</p>
<p>// Keep listening to the InputStream while connected<br />
while (true) {<br />
try {<br />
// Read from the InputStream<br />
// TODO: add dogkick!!<br />
bytes = mmInStream.read(buffer);</p>
<p>// Send the obtained bytes to the UI Activity<br />
mHandler.obtainMessage(TankControl.MESSAGE_READ, bytes, -1, buffer).sendToTarget();<br />
} catch (IOException e) {<br />
Log.e(TAG, &#8220;disconnected&#8221;, e);<br />
connectionLost();<br />
break;<br />
}<br />
}<br />
}</p>
<p>public int toQue(String in_data) {<br />
int ret = 0;<br />
try {<br />
String data = in_data;<br />
/*<br />
if (0 &lt; left) data += &#8216;F&#8217;;<br />
else if (0 &gt; left) {data += &#8216;B&#8217;; left = -left;}<br />
else data +=&#8217;H';<br />
if (0 &lt; right) data += &#8216;F&#8217;;<br />
else if (0 &gt; right) {data += &#8216;B&#8217;; right = -right;}<br />
else data +=&#8217;H';</p>
<p>if (left != 0) data += (char)(left&amp;0xff);<br />
if (right != 0) data += (char)(right&amp;0xff);<br />
*/<br />
mmOutStream.write(data.getBytes());<br />
ret = 0;<br />
} catch (IOException e) {<br />
Log.e(TAG, &#8220;Exception during write&#8221;, e);<br />
ret = -1;<br />
}<br />
return ret;<br />
}</p>
<p>public void cancel() {<br />
try {<br />
mmSocket.close();<br />
} catch (IOException e) {<br />
Log.e(TAG, &#8220;close() of connect socket failed&#8221;, e);<br />
}<br />
}</p>
<p>}</p>
<p>}<br />
</div></div>
<p><span style="color: #666699"><strong>Program : android측</strong></span><br />
<span style="color: #666699"><strong>DeviceListActivity.java</strong></span></p>
<div class="symple-toggle"><h3 class="symple-toggle-trigger">DeviceListActivity.java 소스보기</h3><div class="symple-toggle-container">
<p>/*</p>
<p>* Copyright (C) 2009 The Android Open Source Project<br />
*<br />
* Licensed under the Apache License, Version 2.0 (the &#8220;License&#8221;);<br />
* you may not use this file except in compliance with the License.<br />
* You may obtain a copy of the License at<br />
*<br />
* http://www.apache.org/licenses/LICENSE-2.0<br />
*<br />
* Unless required by applicable law or agreed to in writing, software<br />
* distributed under the License is distributed on an &#8220;AS IS&#8221; BASIS,<br />
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.<br />
* See the License for the specific language governing permissions and<br />
* limitations under the License.<br />
*/</p>
<p>package kr.sunejune;</p>
<p>import java.util.Set;</p>
<p>import android.app.Activity;<br />
import android.bluetooth.BluetoothAdapter;<br />
import android.bluetooth.BluetoothDevice;<br />
import android.content.BroadcastReceiver;<br />
import android.content.Context;<br />
import android.content.Intent;<br />
import android.content.IntentFilter;<br />
import android.os.Bundle;<br />
import android.util.Log;<br />
import android.view.View;<br />
import android.view.Window;<br />
import android.view.View.OnClickListener;<br />
import android.widget.AdapterView;<br />
import android.widget.ArrayAdapter;<br />
import android.widget.Button;<br />
import android.widget.ListView;<br />
import android.widget.TextView;<br />
import android.widget.AdapterView.OnItemClickListener;</p>
<p>/**<br />
* This Activity appears as a dialog. It lists any paired devices and<br />
* devices detected in the area after discovery. When a device is chosen<br />
* by the user, the MAC address of the device is sent back to the parent<br />
* Activity in the result Intent.<br />
*/<br />
public class DeviceListActivity extends Activity {<br />
// Debugging<br />
private static final String TAG = &#8220;DeviceListActivity&#8221;;<br />
private static final boolean D = false;</p>
<p>// Return Intent extra<br />
public static String EXTRA_DEVICE_ADDRESS = &#8220;device_address&#8221;;</p>
<p>// Member fields<br />
private BluetoothAdapter mBtAdapter;<br />
private ArrayAdapter&lt;String&gt; mPairedDevicesArrayAdapter;<br />
private ArrayAdapter&lt;String&gt; mNewDevicesArrayAdapter;</p>
<p>@Override<br />
protected void onCreate(Bundle savedInstanceState) {<br />
super.onCreate(savedInstanceState);</p>
<p>// Setup the window<br />
requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);<br />
setContentView(R.layout.device_list);</p>
<p>// Set result CANCELED incase the user backs out<br />
setResult(Activity.RESULT_CANCELED);</p>
<p>// Initialize the button to perform device discovery<br />
Button scanButton = (Button) findViewById(R.id.button_scan);<br />
scanButton.setOnClickListener(new OnClickListener() {<br />
public void onClick(View v) {<br />
doDiscovery();<br />
v.setVisibility(View.GONE);<br />
}<br />
});</p>
<p>// Initialize array adapters. One for already paired devices and<br />
// one for newly discovered devices<br />
mPairedDevicesArrayAdapter = new ArrayAdapter&lt;String&gt;(this, R.layout.device_name);<br />
mNewDevicesArrayAdapter = new ArrayAdapter&lt;String&gt;(this, R.layout.device_name);</p>
<p>// Find and set up the ListView for paired devices<br />
ListView pairedListView = (ListView) findViewById(R.id.paired_devices);<br />
pairedListView.setAdapter(mPairedDevicesArrayAdapter);<br />
pairedListView.setOnItemClickListener(mDeviceClickListener);</p>
<p>// Find and set up the ListView for newly discovered devices<br />
ListView newDevicesListView = (ListView) findViewById(R.id.new_devices);<br />
newDevicesListView.setAdapter(mNewDevicesArrayAdapter);<br />
newDevicesListView.setOnItemClickListener(mDeviceClickListener);</p>
<p>// Register for broadcasts when a device is discovered<br />
IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);<br />
this.registerReceiver(mReceiver, filter);</p>
<p>// Register for broadcasts when discovery has finished<br />
filter = new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);<br />
this.registerReceiver(mReceiver, filter);</p>
<p>// Get the local Bluetooth adapter<br />
mBtAdapter = BluetoothAdapter.getDefaultAdapter();</p>
<p>// Get a set of currently paired devices<br />
Set&lt;BluetoothDevice&gt; pairedDevices = mBtAdapter.getBondedDevices();</p>
<p>// If there are paired devices, add each one to the ArrayAdapter<br />
if (pairedDevices.size() &gt; 0) {<br />
findViewById(R.id.title_paired_devices).setVisibility(View.VISIBLE);<br />
for (BluetoothDevice device : pairedDevices) {<br />
mPairedDevicesArrayAdapter.add(device.getName() + &#8220;\n&#8221; + device.getAddress());<br />
}<br />
} else {<br />
String noDevices = getResources().getText(R.string.none_paired).toString();<br />
mPairedDevicesArrayAdapter.add(noDevices);<br />
}<br />
}</p>
<p>@Override<br />
protected void onDestroy() {<br />
super.onDestroy();</p>
<p>// Make sure we&#8217;re not doing discovery anymore<br />
if (mBtAdapter != null) {<br />
mBtAdapter.cancelDiscovery();<br />
}</p>
<p>// Unregister broadcast listeners<br />
this.unregisterReceiver(mReceiver);<br />
}</p>
<p>/**<br />
* Start device discover with the BluetoothAdapter<br />
*/<br />
private void doDiscovery() {<br />
if (D) Log.d(TAG, &#8220;doDiscovery()&#8221;);</p>
<p>// Indicate scanning in the title<br />
setProgressBarIndeterminateVisibility(true);<br />
setTitle(R.string.scanning);</p>
<p>// Turn on sub-title for new devices<br />
findViewById(R.id.title_new_devices).setVisibility(View.VISIBLE);</p>
<p>// If we&#8217;re already discovering, stop it<br />
if (mBtAdapter.isDiscovering()) {<br />
mBtAdapter.cancelDiscovery();<br />
}</p>
<p>// Request discover from BluetoothAdapter<br />
mBtAdapter.startDiscovery();<br />
}</p>
<p>// The on-click listener for all devices in the ListViews<br />
private OnItemClickListener mDeviceClickListener = new OnItemClickListener() {<br />
public void onItemClick(AdapterView&lt;?&gt; av, View v, int arg2, long arg3) {<br />
// Cancel discovery because it&#8217;s costly and we&#8217;re about to connect<br />
if (mBtAdapter.isDiscovering()) {<br />
mBtAdapter.cancelDiscovery();<br />
}</p>
<p>// Get the device MAC address, which is the last 17 chars in the View<br />
String info = ((TextView) v).getText().toString();<br />
String address = info.substring(info.length() &#8211; 17);</p>
<p>// Create the result Intent and include the MAC address<br />
Intent intent = new Intent();<br />
intent.putExtra(EXTRA_DEVICE_ADDRESS, address);</p>
<p>// Set result and finish this Activity<br />
setResult(Activity.RESULT_OK, intent);<br />
finish();<br />
}<br />
};</p>
<p>// The BroadcastReceiver that listens for discovered devices and<br />
// changes the title when discovery is finished<br />
private final BroadcastReceiver mReceiver = new BroadcastReceiver() {<br />
@Override<br />
public void onReceive(Context context, Intent intent) {<br />
String action = intent.getAction();</p>
<p>// When discovery finds a device<br />
if (BluetoothDevice.ACTION_FOUND.equals(action)) {<br />
// Get the BluetoothDevice object from the Intent<br />
BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);<br />
// If it&#8217;s already paired, skip it, because it&#8217;s been listed already<br />
if (device.getBondState() != BluetoothDevice.BOND_BONDED) {<br />
mNewDevicesArrayAdapter.add(device.getName() + &#8220;\n&#8221; + device.getAddress());<br />
}<br />
// When discovery is finished, change the Activity title<br />
} else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) {<br />
setProgressBarIndeterminateVisibility(false);<br />
setTitle(R.string.select_device);<br />
if (mNewDevicesArrayAdapter.getCount() == 0) {<br />
String noDevices = getResources().getText(R.string.none_found).toString();<br />
mNewDevicesArrayAdapter.add(noDevices);<br />
}<br />
}<br />
}<br />
};</p>
<p>}<br />
</div></div>
<p><strong><span style="color: #33cccc">6. AVR 프로그램</span></strong><br />
<strong><span style="color: #666699">Program : ATTINY2313측</span></strong></p>
<div class="symple-toggle"><h3 class="symple-toggle-trigger">Program : ATTINY2313측 소스보기</h3><div class="symple-toggle-container">
<p>/*</p>
<p><em id="__mceDel"> Project : USART TEST1<br />
tiny2313_uart1.c<br />
Date : 2008-05-23<br />
Company : AvrMall.com<br />
Chip type : ATtiny2313-10SI<br />
Clock : 12.000000 MHz<br />
Comment : ATTINY2313으로 UART송수신 테스트 프로그램<br />
Used with AVRSTUDIO V4.14 (WINAVR) .<br />
*/</em></p>
<p>#include &lt;avr/io.h&gt;</p>
<p>#define F_CPU 12000000UL // 16 MHz<br />
//#define F_CPU 14.7456E6<br />
//#include &lt;util/delay.h&gt;<br />
// Common Functions.<br />
void Delay_us(unsigned int time_us);<br />
void Delay_ms(unsigned int time_ms);</p>
<p>void USART_Init(void);<br />
void putchar_0(char data);<br />
void com_puts(char sbuf[]);<br />
void putchar_0(char data);<br />
int getchar_0(void);<br />
void cpu_setup(void);<br />
void Delay_us(unsigned int time_us)<br />
{<br />
unsigned int i;</p>
<p>for(i=0; i&lt;time_us; i++) // 4 cycle +<br />
{<br />
asm(&#8220;PUSH R0&#8243;); // 2 cycle +<br />
asm(&#8220;POP R0&#8243;); // 2 cycle +<br />
asm(&#8220;PUSH R0&#8243;); // 2 cycle +<br />
asm(&#8220;POP R0&#8243;); // 2 cycle + =12 cycle for 11.0592MHZ<br />
//asm(&#8220;PUSH R0&#8243;); // 2 cycle +<br />
//asm(&#8220;POP R0&#8243;); // 2 cycle = 16 cycle = 1us for 16MHz<br />
}<br />
}</p>
<p>void Delay_ms(unsigned int time_ms)<br />
{<br />
unsigned int i;</p>
<p>for(i=0; i&lt;time_ms;i++)<br />
Delay_us(1000);<br />
}<br />
void USART_Init(void)<br />
{<br />
// 9600Bps, 8Data, 1 Stop, No Parity<br />
UCSRA=0&#215;00;<br />
UCSRB=0&#215;18;<br />
UCSRC=0&#215;06;<br />
UBRRH=0&#215;00;<br />
UBRRL=0&#215;12;<br />
}<br />
// COM1 스트링 송신 //<br />
void com_puts(char sbuf[])<br />
{<br />
char ch;<br />
int i = 0;</p>
<p>ch = sbuf[i++]; // 전송할 데이터<br />
while(ch != 0){<br />
putchar_0(ch); // 1바이트 송신<br />
ch = sbuf[i++]; // 전송할 데이터<br />
}<br />
}</p>
<p>void putchar_0(char data)<br />
{<br />
/* Wait for empty transmit buffer */<br />
while (!((UCSRA) &amp; (1&lt;&lt;UDRE)));</p>
<p>/* Put data into buffer, sends the data */<br />
UDR = data;<br />
}</p>
<p>int getchar_0(void)<br />
{<br />
/* Wait for data to be received */<br />
while ( !(UCSRA &amp; (1&lt;&lt;RXC)) );</p>
<p>/* Get and return received data from buffer */<br />
return(UDR);<br />
}</p>
<p>void cpu_setup(void)<br />
{<br />
USART_Init();//USART 초기화<br />
DDRB = 0b01111111; // Port B IO mode : b7 (Input), b6-b0(Output)<br />
DDRD &amp;= 0b01111100; // Port B IO mode : d0-1 (UART), b6-b2(Output)<br />
}<br />
int main(void)<br />
{<br />
unsigned char cmd;<br />
unsigned char i_h=0;<br />
unsigned char i_t=0;<br />
unsigned char i_f=0;<br />
unsigned char i_u=0;</p>
<p>cpu_setup(); // cpu 초기화</p>
<p>com_puts(&#8220;\r\n&#8221;);<br />
com_puts(&#8220;- ATTINY2313 USART TEST -\r\n&#8221;);<br />
com_puts(&#8220;Press a or b \r\n&#8221;);</p>
<p>while(1)<br />
{<br />
cmd = getchar_0();//PC로부터 받은 값을 d에 저장한다.</p>
<p>switch (cmd) {<br />
case &#8216;i&#8217; :<br />
PORTB = 0b00000000;<br />
break;</p>
<p>// 전조등(h:4) / 후미등(t:5) , off(o)<br />
case &#8216;h&#8217; :<br />
case &#8216;R&#8217; :<br />
if(i_h == 1) {<br />
PORTB &amp;= 0b11001111;<br />
i_h=0;<br />
}<br />
else {<br />
PORTB |= 0b00010000;<br />
i_h=1;<br />
}<br />
break;<br />
case &#8216;t&#8217; :<br />
case &#8216;S&#8217; :<br />
if(i_t == 0) {<br />
PORTB |= 0b00100000;<br />
i_t=1;<br />
}<br />
else {<br />
PORTB &amp;= 0b11001111;<br />
i_t=0;<br />
}<br />
break;</p>
<p>case &#8216;o&#8217; :<br />
case &#8216;T&#8217; :<br />
PORTB &amp;= 0b11001111;<br />
break;<br />
// 포탄 발사(f:3:A) off(w:B)<br />
case &#8216;f&#8217; :<br />
case &#8216;A&#8217; :<br />
if(i_f == 0) {<br />
PORTB |= 0b00001000;<br />
i_f=1;<br />
}<br />
else {<br />
PORTB &amp;= 0b11110111;<br />
i_f=0;<br />
}<br />
break;<br />
case &#8216;B&#8217; :<br />
case &#8216;q&#8217; :<br />
PORTB &amp;= 0b11110111;<br />
break;<br />
// 포신 동작(u:2) off(c)<br />
case &#8216;u&#8217; :<br />
case &#8216;C&#8217; :<br />
PORTB |= 0b00000100;<br />
i_u=1;<br />
break;<br />
case &#8216;E&#8217; :<br />
PORTB &amp;= 0b11111011;<br />
i_u=0;<br />
break;<br />
case &#8216;c&#8217; :<br />
case &#8216;D&#8217; :<br />
PORTB &amp;= 0b11111011;<br />
break;</p>
<p>// 포탑 좌(l:0) 우(r:1) , off(m)<br />
case &#8216;l&#8217; :<br />
case &#8216;F&#8217; :<br />
PORTB &amp;= 0b11111100;<br />
PORTB |= 0b00000001;<br />
break;<br />
case &#8216;r&#8217; :<br />
case &#8216;H&#8217; :<br />
PORTB &amp;= 0b11111100;<br />
PORTB |= 0b00000010;<br />
break;<br />
case &#8216;m&#8217; :<br />
case &#8216;G&#8217; :<br />
PORTB &amp;= 0b11111100;<br />
break;</p>
<p>// 이동 전진(w:2-1,3-0 , 4-1,5-0) 후진(x:2-0,3-1 , 4-0,5-1)<br />
// 전좌(a:2-0,3-0 , 4-1,5-0) 전우(d:2-1,3-0 , 4-0,5-0) ,<br />
// 후좌(a:2-0,3-1 , 4-0,5-0) 후우(d:2-0,3-0 , 4-1,5-0) ,<br />
// off(s)<br />
case &#8216;O&#8217; : // 후좌<br />
PORTD &amp;= 0b10000011;<br />
PORTD |= 0b01001000;<br />
break;<br />
case &#8216;Q&#8217; : // 후우<br />
PORTD &amp;= 0b10000011;<br />
PORTD |= 0b01010000;<br />
break;<br />
case &#8216;w&#8217; :<br />
case &#8216;J&#8217; : // 전_전<br />
PORTD &amp;= 0b10000011;<br />
PORTD |= 0b01010100;<br />
break;<br />
case &#8216;x&#8217; :<br />
case &#8216;P&#8217; : // 후_후<br />
PORTD &amp;= 0b10000011;<br />
PORTD |= 0b01101000;<br />
break;<br />
case &#8216;a&#8217; :<br />
case &#8216;I&#8217; : // 전_좌<br />
PORTD &amp;= 0b10000011;<br />
PORTD |= 0b01010000;<br />
break;<br />
case &#8216;d&#8217; :<br />
case &#8216;K&#8217; : // 전우<br />
PORTD &amp;= 0b10000011;<br />
PORTD |= 0b01000100;<br />
break;<br />
case &#8216;s&#8217; :<br />
case &#8216;M&#8217; : // 멈춤<br />
PORTD &amp;= 0b10000011;<br />
break;<br />
default :<br />
;<br />
// putchar_0(&#8216;c&#8217;);<br />
}<br />
Delay_ms(100);<br />
}<br />
}<br />
</div></div>
<p><strong><span style="color: #33cccc">7. 관련 회로도</span></strong></p>
<p><span style="color: #339966">7.1 전체 Block</span></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2013/03/14ptband06.jpg" rel="lightbox[2049]"><img class="alignnone size-medium wp-image-2074" alt="14ptband06" src="http://www.ntrexgo.com/wp-content/uploads/2013/03/14ptband06-300x249.jpg" width="300" height="249" /></a><br />
<span style="color: #339966">7.2 ATTINY2313 Board V1.2 회로도</span></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2013/03/14ptband07.jpg" rel="lightbox[2049]"><img class="alignnone size-medium wp-image-2075" alt="14ptband07" src="http://www.ntrexgo.com/wp-content/uploads/2013/03/14ptband07-300x224.jpg" width="300" height="224" /></a><br />
<span style="color: #339966">7.3 L293B : 전후진용 주 모터 (좌우, 정, 역 회전 : 양방향)</span></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2013/03/14ptband08.jpg" rel="lightbox[2049]"><img class="alignnone size-medium wp-image-2076" alt="14ptband08" src="http://www.ntrexgo.com/wp-content/uploads/2013/03/14ptband08-300x95.jpg" width="300" height="95" /></a></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2013/03/14ptband09.jpg" rel="lightbox[2049]"><img class="alignnone size-medium wp-image-2077" alt="14ptband09" src="http://www.ntrexgo.com/wp-content/uploads/2013/03/14ptband09-300x241.jpg" width="300" height="241" /></a><br />
<span style="color: #339966"> 7.4 LB1630 : 포탑 (정. 역 회전 : 양방향)</span></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2013/03/14ptband010.jpg" rel="lightbox[2049]"><img class="alignnone size-full wp-image-2078" alt="14ptband010" src="http://www.ntrexgo.com/wp-content/uploads/2013/03/14ptband010.jpg" width="297" height="132" /></a><br />
<span style="color: #339966"> 7.5 ULN2803 : 포신, 포발사, 전조등, 후미등 (정회전:단방향)</span></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2013/03/14ptband011.jpg" rel="lightbox[2049]"><img class="alignnone size-full wp-image-2079" alt="14ptband011" src="http://www.ntrexgo.com/wp-content/uploads/2013/03/14ptband011.jpg" width="231" height="205" /></a><br />
<span style="color: #339966"> 7.6 bluetooth : myBluetooh-EX 모듈</span></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2013/03/14ptband012.jpg" rel="lightbox[2049]"><img class="alignnone size-medium wp-image-2080" alt="14ptband012" src="http://www.ntrexgo.com/wp-content/uploads/2013/03/14ptband012-300x100.jpg" width="300" height="100" /></a></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2013/03/14ptband013.jpg" rel="lightbox[2049]"><img class="alignnone size-medium wp-image-2081" alt="14ptband013" src="http://www.ntrexgo.com/wp-content/uploads/2013/03/14ptband013-300x148.jpg" width="300" height="148" /></a><br />
<strong><span style="color: #33cccc">8. 완성</span></strong></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2013/03/14ptband05.jpg" rel="lightbox[2049]"><img class="alignnone size-medium wp-image-2073" alt="14ptband05" src="http://www.ntrexgo.com/wp-content/uploads/2013/03/14ptband05-300x114.jpg" width="300" height="114" /></a></p>
<p><strong><span style="color: #008000">소요비용</span></strong></p>
<p>탱크 : 75,000원<br />
Attiny2313 보드 : 11,000원<br />
제어 보드 제작 : 약 20,000원(손실까지)<br />
블루투스 모듈 : 26,300원<br />
전체 : 132,300원</p>
<p><strong><span style="color: #008000">참고 웹사이트</span></strong></p>
<p><strong>참고 Site</strong></p>
<p><a title="탱크조립보러가기" href="http://web.suapapa.net:8080/wordpress/?p=471" target="_blank">탱크 조립</a></p>
<p><a title="아두이노 모터 컨트롤 보드 만들기" href="http://web.suapapa.net:8080/wordpress/?p=473" target="_blank" rel="bookmark">아두이노 모터 컨트롤 보드 만들기</a></p>
<p><a title="아두이노+블루투스+안드로이드" href="http://web.suapapa.net:8080/wordpress/?p=474" target="_blank" rel="bookmark">아두이노+블루투스+안드로이드</a></p>
<p><a href="http://cafe.naver.com/carroty.cafe?iframe_url=/ArticleRead.nhn%3Fclubid=10750951%26page=1%26menuid=0%26inCafeSearch=true%26searchBy=1%26query=%C5%CA%C5%A9%26includeAll=%26exclude=%26include=%26exact=%26searchdate=all%26media=0%26sortBy=date%26articleid=130057%26referrerAllArticles=true" target="_blank"><strong>완성후 게시물</strong></a></p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ntrexgo.com/archives/2049/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
