<?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; feture</title>
	<atom:link href="http://www.ntrexgo.com/archives/tag/feture/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>[38호]기울기 방식의 조종기를 적용한 쿼드콥터</title>
		<link>http://www.ntrexgo.com/archives/31919</link>
		<comments>http://www.ntrexgo.com/archives/31919#comments</comments>
		<pubDate>Sun, 25 Sep 2016 02:19:01 +0000</pubDate>
		<dc:creator>디바이스마트 매거진</dc:creator>
				<category><![CDATA[디바이스마트 매거진]]></category>
		<category><![CDATA[특집]]></category>
		<category><![CDATA[38호]]></category>
		<category><![CDATA[feture]]></category>
		<category><![CDATA[ict]]></category>
		<category><![CDATA[공모전]]></category>
		<category><![CDATA[디바이스마트]]></category>
		<category><![CDATA[매거진]]></category>
		<category><![CDATA[융합]]></category>
		<category><![CDATA[참가상]]></category>
		<category><![CDATA[프로젝트]]></category>

		<guid isPermaLink="false">http://www.ntrexgo.com/?p=31919</guid>
		<description><![CDATA[디바이스마트 매거진 38호 &#124; 조종기의 움직임과 Quad Copter의 움직임이 같기 때문에 직관적인
조종으로 보다 빠르게 대처할 수 있다.]]></description>
				<content:encoded><![CDATA[<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/05/2016-ictmain.png" rel="lightbox[31919]"><img class="alignnone size-large wp-image-31056" alt="2016 ictmain" src="http://www.ntrexgo.com/wp-content/uploads/2016/05/2016-ictmain-620x156.png" width="620" height="156" /></a></p>
<p><span style="font-size: medium;background-color: #ffff00"><strong>2016  ICT 융합 프로젝트 공모전 참가상</strong></span></p>
<p><span style="font-size: x-large"><strong>기울기 방식의 조종기를 적용한 쿼드콥터</strong></span></p>
<p style="text-align: right">글 | 한국교통대학교 임성묵, 전동흡, 박재호, 오성석, 신민철</p>
<p style="text-align: right">
<p><span style="color: #008000"><strong>심사평</strong></span></p>
<p><span style="color: #0000ff"><strong>뉴티씨</strong></span> 재미있는 아이템인 쿼드콥터에서 센서 등을 이용해 상보필터로 이를 보상한 결과를 적용, 쿼드콥터 조정 시에 생길 수 있는 균형잡는 부분의 문제를 해결하려고 한 점 등, 매우 고생하며 만든 노력의 흔적이 보이지만 구현이 완료되지 않아 아쉬움이 남는다. 다음에 좀 더 보완하여 다시 도전하여 좋은 작품으로 만나고 싶다.</p>
<p><span style="color: #0000ff"><strong>칩센</strong></span> 학생들이 같이 도전해서 재미있게 즐길만한 주제다. 사실 유사한 형태를 본 적은 있지만 상세한 설명으로 따라하기 쉬울 것 같다.</p>
<p><span style="color: #0000ff"><strong>위드로봇</strong></span> 구현한 시스템에 대한 결과 분석이 부족한 부분이 아쉽다. 또한 기울기를 검출하는데 있어 상보 필터를 적용한 내용이 잘 동작하고 있는지에 대한 면밀한 분석이 있으면 더 좋겠다. 하드웨어 제작에 많은 고생을 했을 것으로 보이며, 제어기 부분을 좀 더 학습하면 많은 도움이 될 것이다.</p>
<p><span style="color: #008000"><strong>작품 개요</strong></span><br />
<span style="color: #339966"><strong>작품 소개</strong></span><br />
기울기 방식의 조종기(조종기의 기울어짐에 따라 제어하는 조종기)를 적용한 Quad Copter로, 기존 시중에 나와 있는 RC 조종기와 수신기를 사용하지 않고 직접 제작하였습니다. 기존의 Scrolling Stick조종방식을 이용한 Quad Copter와 다르게 조종기의 움직임과 Quad Copter의 움직임이 같기 때문에 직관적인 조종으로 보다 빠르게 대처할 수 있으며 초심자의 경우 조종법을 쉽게 익힐 수 있습니다.</p>
<p><span style="color: #339966"><strong>작품의 개발 배경</strong></span><br />
드론(Quad Copter)이 큰 인기를 얻은 이유는 상업용, 군용으로서의 가치 때문만이 아닙니다. 이전부터 군용드론에 대한 관심은 뜨거웠으며, 상업분야에서도 마찬가지였습니다. 하지만 드론이 지금처럼 많은 인기를 누리게 된 이유는, 누구나 가지고 조종할 수 있는 상용드론의 출현 때문이었습니다.</p>
<p>중국의 DJI는 바로 이 점을 정확히 집어내었습니다. [reference1] http://www.techm.kr/bbs/board.php?bo_table=article&amp;wr_id=724<br />
상용드론이 일반인들에게 다가갈 수 있었던 이유는 스마트폰 기술과 배터리 성능의 발전 그리고 쉬운 조종기 때문이었는데, 스마트폰 기술이 발전 하면서 드론에 들어가는 부품(센서)등의 크기가 많이 줄었으며 최소 3개 이상의 모터를 동시에 고속으로 돌려야 하는 가혹한 조건에서의 배터리 사용은 이전에는 큰 문제였으나 최근 이러한 문제가 해결됨으로써 저가의 Quad Copter가 탄생할 수 있었습니다. 하지만, 가장 큰 요인은 상대적으로 쉬운 조종법 때문이라 생각했습니다. 다만 Scrolling Stick 조종방식을 이용한 조종법 또한 익숙해지는데 어려워 안전사고나 추락으로 인한 쿼드의 파손 등이 있었습니다. 그래서 우리는 좀 더 직관적이고 쉬운 조종기를 만들어 보려했습니다.</p>
<p>최근 Quad Copter의 모듈화된 보드와 오픈소스가 많이있지만, 이와 관계없이 직접 필요한 회로와 부품을 선정해 납땜 수작업으로 만들었습니다.</p>
<p>Own Frame(완전수제작) Quad Copter를 만들기 위해 자료 조사와 몸체제작을 시도했습니다. 그러나 몸체를 직접 만들면 기구로 인해 실패할 확률이 높다 판단하여 ARF(반완제품)키트를 구매하여 제작했습니다.</p>
<p><span style="color: #008000"><strong>작품 설명</strong></span><br />
<span style="color: #339966"><strong>주요동작 및 특징</strong></span><br />
기존의 조종법보다 직관적이고 쉬운 조종기를 만들려고 했습니다. 저희 Quad Copter는 조종기의 기울임에 따라 쿼드를 움직일 수 있게 설계되었습니다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-쿼드콥터-1.jpg" rel="lightbox[31919]"><img class="alignnone size-full wp-image-32036" alt="38 ict 쿼드콥터 (1)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-쿼드콥터-1.jpg" width="573" height="266" /></a></p>
<p>조종기와 Quad Copter를 평지에 내려놓고(이때 조종기의 stroll을 최저로 두어야합니다.) Quad Copter의 전원을 켜고 조종기를 켜면 처음에 쿼드와 조종기를 페어링을 하게 됩니다. 이 과정은 1~2초 정도 소요됩니다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-쿼드콥터-2.jpg" rel="lightbox[31919]"><img class="alignnone size-full wp-image-32038" alt="38 ict 쿼드콥터 (2)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-쿼드콥터-2.jpg" width="573" height="266" /></a></p>
<p>그 다음 ESC(Electronic Speed Control) Setting을 위해 먼저 조종을 위한 PWM의 최대치를 송신 합니다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-쿼드콥터-3.jpg" rel="lightbox[31919]"><img class="alignnone size-full wp-image-32040" alt="38 ict 쿼드콥터 (3)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-쿼드콥터-3.jpg" width="573" height="266" /></a></p>
<p>이후 설정음이 들리고 최저치를 송신하면 ESC의 setting이 완료됩니다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-쿼드콥터-4.jpg" rel="lightbox[31919]"><img class="alignnone size-full wp-image-32042" alt="38 ict 쿼드콥터 (4)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-쿼드콥터-4.jpg" width="573" height="266" /></a></p>
<p>이후 자이로 센서를 calibration합니다. 이 과정에서 센서가 처음에 켜지면서 들어온 쓰레기 값을 삭제하고 쿼드와 조종기 사이의 센서 값을 일치시키는 프로세스가 진행됩니다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-쿼드콥터-5.jpg" rel="lightbox[31919]"><img class="alignnone size-full wp-image-32044" alt="38 ict 쿼드콥터 (5)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-쿼드콥터-5.jpg" width="573" height="266" /></a></p>
<p>이전의 모든 과정이 끝나면 조종기는 Quad Copter로 stroll, 자이로 값(Roll, Pitch, Yaw)값을 송신하며, 쿼드는 이 값을 수신 받아 비행하게 됩니다.</p>
<p><span style="color: #339966"><strong>시스템 구성도</strong></span></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-쿼드콥터-1.png" rel="lightbox[31919]"><img class="alignnone size-full wp-image-32037" alt="38 ict 쿼드콥터 (1)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-쿼드콥터-1.png" width="573" height="341" /></a></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-쿼드콥터-2.png" rel="lightbox[31919]"><img alt="38 ict 쿼드콥터 (2)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-쿼드콥터-2.png" width="573" height="380" /></a></p>
<p><span style="color: #339966"><strong>작품 개발 환경</strong></span></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-쿼드콥터-3.png" rel="lightbox[31919]"><img class="alignnone size-full wp-image-32041" alt="38 ict 쿼드콥터 (3)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-쿼드콥터-3.png" width="573" height="135" /></a></p>
<p><span style="color: #008000"><strong>단계별 제작과정</strong></span></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-쿼드콥터-6.jpg" rel="lightbox[31919]"><img class="alignnone size-full wp-image-32045" alt="38 ict 쿼드콥터 (6)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-쿼드콥터-6.jpg" width="573" height="325" /></a></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-쿼드콥터-7.jpg" rel="lightbox[31919]"><img class="alignnone size-full wp-image-32046" alt="38 ict 쿼드콥터 (7)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-쿼드콥터-7.jpg" width="573" height="325" /></a></p>
<p>&nbsp;</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-쿼드콥터-8.jpg" rel="lightbox[31919]"><img class="alignnone size-full wp-image-32047" alt="38 ict 쿼드콥터 (8)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-쿼드콥터-8.jpg" width="573" height="325" /></a></p>
<p>&nbsp;</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-쿼드콥터-9.jpg" rel="lightbox[31919]"><img class="alignnone size-full wp-image-32048" alt="38 ict 쿼드콥터 (9)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-쿼드콥터-9.jpg" width="573" height="299" /></a></p>
<p><strong style="color: #339966">하드웨어 구성</strong></p>
<p><span style="color: #3366ff"><strong>Controller</strong></span><br />
조종기는 CLCD와 1개의 가변저항 그리고 3개의 switch로 조종 및 현재 상태를 볼 수 있습니다. 가변저항은 모터의 base speed를 조절하며 이 값으로 Quad Copter의 상승과 하강을, 자이로 값을 가감하며 전진, 후진 및 좌우 이동을 합니다. 배터리는 안정감을 위해 조종기 하부에 부착하였으며, 자이로 센서는 중앙에 위치시켜 기울기에 오차없이 반응하도록 하였습니다.</p>
<p><span style="color: #3366ff"><strong>Quad Copter</strong></span><br />
Quad Copter 또한 기체의 중심부에 자이로센서를 장착하였고, 무게중심을 맞추기 위해 최대한 좌우대칭이 되도록 기판을 설계하였습니다. 배터리 역시 안정적인 구조를 실험하다 프레임 중앙 하부에 끼웠습니다.</p>
<p><span style="color: #3366ff"><strong>Motor &amp; Propeller</strong></span><br />
부품을 선정하고 Motor와 Propeller가 Quad Copter의 하중을 부담할 수 있는지 계산해보아야 합니다.<br />
그림 1과 그림 2는 Quad Copter의 무게와 호버링시 4개의 각 모터가 부담해야할 중량을 계산한 것이며, 그림 3은 Excel식의 이론값과 모터의 추력을 실험적으로 구한 값과 비교하여 rpm과 추력에 대한 실험식을 구한 그래프입니다.(계열1=이론값, 계열2=실험값) 고속회전에서 실험값이 이론값 보다 작게 측정되는 이유는 고속회전으로 인해 프로펠러의 효율이 떨어지기 때문으로 생각됩니다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-쿼드콥터-10.jpg" rel="lightbox[31919]"><img class="alignnone size-full wp-image-32049" alt="38 ict 쿼드콥터 (10)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-쿼드콥터-10.jpg" width="579" height="571" /></a></p>
<p><span style="color: #3366ff"><strong>기체 test용 기구</strong></span><br />
Roll, Pitch, Yaw축 제어 test를 위한 기구를 철물점과 재료실의 부품을 이용하여 직접 제작하였습니다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-쿼드콥터-11.jpg" rel="lightbox[31919]"><img class="alignnone size-full wp-image-32050" alt="38 ict 쿼드콥터 (11)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-쿼드콥터-11.jpg" width="572" height="330" /></a></p>
<p>&nbsp;</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-쿼드콥터-12.jpg" rel="lightbox[31919]"><img class="alignnone size-full wp-image-32051" alt="38 ict 쿼드콥터 (12)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-쿼드콥터-12.jpg" width="572" height="330" /></a></p>
<p>&nbsp;</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-쿼드콥터-12.jpg" rel="lightbox[31919]"><img class="alignnone size-full wp-image-32051" alt="38 ict 쿼드콥터 (12)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-쿼드콥터-12.jpg" width="572" height="330" /></a></p>
<p><span style="color: #339966"><strong>소프트웨어(주요 알고리즘 및 적용 기술) </strong></span><br />
<span style="color: #3366ff"><strong>상보필터</strong></span><br />
<strong>가속도센서</strong><br />
중력 가속도를 기준으로 물체의 기울어진 각도를 중력의 세기로 x, y, z축으로 백터값 계산해내는 센서 (범위 -32768~32767)<br />
단점: 외력에 민감하게 반응 (고주파에 취약)<br />
장점: 가속도 값이 시간이 지나도 일정. (드리프트가적다)</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-쿼드콥터-14.jpg" rel="lightbox[31919]"><img class="alignnone size-full wp-image-32053" alt="38 ict 쿼드콥터 (14)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-쿼드콥터-14.jpg" width="572" height="173" /></a></p>
<p>노이즈가 심하고 값이 왜곡될 수 있지만, 오차의 누적이 적습니다.<br />
가속도 값을 오일러 각으로 변환</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-쿼드콥터-15.jpg" rel="lightbox[31919]"><img class="alignnone size-full wp-image-32054" alt="38 ict 쿼드콥터 (15)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-쿼드콥터-15.jpg" width="188" height="72" /></a></p>
<p><strong>자이로 센서</strong><br />
각 축을 기준으로 축의 각속도를 측정하여 크기로 표현하는 센서 (범위 -32768~32767)<br />
단점: 외력에 의한 오차가 시간에 따라 축적되어 발산.(드리프트)<br />
장점: 자세 변화를 잘 감지.<br />
실제 물체의 자세변화를 잘 나타내지만 누적 오차가 발생합니다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-쿼드콥터-16.jpg" rel="lightbox[31919]"><img class="alignnone size-full wp-image-32055" alt="38 ict 쿼드콥터 (16)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-쿼드콥터-16.jpg" width="572" height="312" /></a></p>
<p><strong>상보필터</strong><br />
이러한 가속도 센서와 자이로 센서의 장단점을 융합한 필터가 상보필터입니다.</p>
<div class="symple-box gray none" style="text-align:left; width:100%;"> 
<p>//PI제어_X축<br />
cf_err_x = cf_result_x-accel_angle_x; // 필터값.accel 오일러각, P제어에 사용 오차=목표치·현재값<br />
cf_err_sum_x += cf_erR_x * dt; // 에러를 적분해서 저장, I제어에 사용<br />
cf_kp_val_x = cf_err_x*cf_kp; // P value<br />
cf_ki_val_x = cf_err_sum_x*CF_KI; // I value<br />
cf_pid_out_x = (p*qsinx*tany*rcosx*tany) &#8211; (cf_kp_val_x + cf_ki_val_x);<br />
// 자이로 각도값을 PID제어를 통해 얼마나 빠르게 가속도 각도값에 맞출 것인지 결정<br />
cf_result_x += (cf_pid_out_x*dt);</p>
<p><span style="text-decoration: underline"><strong>쿼드 코드에서 구현된 상보필터 (X축)</strong></span></p>
</div>
<p><span style="color: #3366ff"><strong>2중 PID제어</strong></span><br />
일반 pid 제어기는 p제어 i제어 d제어기를 합친 것입니다.<br />
각각 비례 적분 미분을 통하여 목표 값이 도달하는 특성을 원하는 모델에 맞게 gain 값을 튜닝하여 사용합니다. Quad Copter에는 조종기에서 보낸 각도를 목표치로 Quad Copter 몸체의 각도를 현재 값으로 합니다. P, I, D gain 값에 대한 특성은 아래와 같습니다.</p>
<table style="width: 620px" border="1" cellspacing="0" cellpadding="2">
<tbody>
<tr>
<td style="text-align: center" colspan="2">PID gain 값과 제어기의 특성</td>
</tr>
<tr>
<td style="text-align: center">P제어</td>
<td style="text-align: center">목표값 도달시간을 줄인다.</td>
</tr>
<tr>
<td style="text-align: center">I제어</td>
<td style="text-align: center">정상 상태오차를 줄인다.</td>
</tr>
<tr>
<td style="text-align: center">D제어</td>
<td style="text-align: center">오버슈트를 억제한다.</td>
</tr>
</tbody>
</table>
<p>각각의 gain 값은 서로 종속적이기 때문에 하나의 gain 값이 변화하면 다른 두 개의 값에 영향을 줍니다.<br />
2중 pid 제어기는 자이로센서 값으로 1차 pid를 한 뒤 가속도센서 값으로 2차 pid 제어를 한 것입니다.</p>
<div class="symple-box gray none" style="text-align:left; width:100%;"> 
<p>void ROLL PID(void) {<br />
//Roll_Cmd = C_Roll_Cmd*0.01;</p>
<p>Roll_Ang_Err = Roll_Cmd &#8211; cf_cf_result_x;<br />
Roll_Out_Err = Roll_Ang_Err * Roll_Out_Pgain &#8211; gyro_x_t;<br />
Roll_In_P = Roll_Out_Err * Roll_In_Pgain;<br />
Roll_In_I = Roll_In_I + (Roll_Out_Err * Roll_In_Igain)*dt_pid;<br />
// Limit_var(&amp;Roll_In_I,-300,300);</p>
<p>Roll_In_D = (Roll_Out_Err &#8211; Pre_Roll_Out_Err)/dt_pid * Roll_In_Dgain;<br />
Pre_Roll = (Roll_In_P + Roll_In_I + Roll_In_D);<br />
//// 이중 PID ROLL</p>
<p><span style="text-decoration: underline"><strong>Quad Copter 코드에서의 2중 PID함수</strong></span></p>
</div>
<p><span style="color: #3366ff"><strong>Check sum</strong></span><br />
check sum은 중복검사의 한 가지로, 전송된 자료의 값을 통해 계산된 암호를 같이 송신하여 수신부에서 수신 받은 값으로 송신부와 같은 방법으로 check sum암호를 계산하고 이것을 송신 받은 암호와 비교하여 송신된 자료의 무결점을 보장해주는 단순한 방법입니다.<br />
처음 조종기와 쿼드의 데이터 통신은 문제가 되지 않는 것 같았지만, 이후 진행된 비행테스트에서 모터의 RPM이 튀는 현상이 발견되었고 이를 고치기 위해 많은 자료조사와 필터를 설계해보려 했지만, 이 방법이 가장 간단한 코드로 가장 효과가 좋았습니다.</p>
<div class="symple-box gray none" style="text-align:left; width:100%;"> 
<p>case 34: GPIOC -&gt; BSRR=0xe7ff; flag)cycle = 1;<br />
while(flag_cycle){<br />
while(rx_flag == 0); rx_flag=0;</p>
<p>parsing();<br />
count = atoi(da[0];<br />
C_Roll_Cmd = atoi(da[1]);<br />
C_Pitch_Cmd = atoi(da[2]);<br />
C_Throttle = atoi(da[3]);<br />
C_Check_sum = atoi(da[4]);</p>
<p>if((C_Roll_Cmd+C_Pitch_Cmd+C_throttle)==C_CHECK_SUM){<br />
gy_ac();<br />
Result_PID();<br />
//Limit_var(&amp;PID_Roll, -50,50);<br />
//Limit_var(&amp;Pid_Pitch,-50,50);<br />
X_Motor();<br />
}</p>
<p>Key_backselect(34);<br />
} ? end while flag_cycle? break;<br />
</div>
<p><span style="color: #008000"><strong>기타</strong></span><br />
<span style="color: #339966"><strong>소스코드</strong></span></p>
<div class="symple-box gray none" style="text-align:left; width:100%;"> 
<p>#include “stm32f10x.h”<br />
#include “MPU6050.h”<br />
#include “MPU6050_Lib.h”<br />
#include “HAL_MPU6050.h”<br />
#include&lt;math.h&gt;<br />
#include&lt;stdio.h&gt;<br />
#include&lt;string.h&gt;<br />
#include&lt;stdlib.h&gt;<br />
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)<br />
#define on 0<br />
#define off 1<br />
#define TRUE 1<br />
#define FALSE 0<br />
#define PWM_ocr1 (TIM2-&gt;CCR1)<br />
#define PWM_ocr2 (TIM2-&gt;CCR2)<br />
#define PWM_ocr3 (TIM4-&gt;CCR3)<br />
#define PWM_ocr4 (TIM4-&gt;CCR4)</p>
<p>volatile int send=0,mflag=0;<br />
unsigned int Key_count=0;</p>
<p>//실시간 자이로 가속도 값<br />
int16_t accelgyro[6];</p>
<p>volatile int RxCounter=0,tokencount=0;<br />
uint8_t NbrOfDataToTransfer=10;<br />
char TxBuffer[50], TxCounter, RxBuffer[52]={0,},G_DATA[52]={0,};<br />
char *da[5]={0,};<br />
char *last = NULL;<br />
char *token;<br />
char ch;<br />
char* context = NULL;<br />
float pitch_cont=0,roll_cont=0,yaw_cont=0;<br />
int calibrate_flag = 1;<br />
float calibrate_cf_x = 0;<br />
float calibrate_cf_y = 0;<br />
unsigned int calibrate_flag_if = 100;</p>
<p>int C_check_sum=0;<br />
int throttle=0;<br />
//float test1=0,test2=0;<br />
int test_t=800;<br />
//I2C TEST 용<br />
struct {<br />
u16 tmr;<br />
u16 connect;<br />
}test;</p>
<p>// KEY TEST<br />
struct {<br />
u16 bf;<br />
} key;<br />
u16 key_flag;<br />
u16 key_flag1=0;</p>
<p>int K_count = 0;<br />
volatile int flag_num = 1;<br />
int flag_count = 0;</p>
<p>int flag_cycle = 1;<br />
int rx_flag = 0;<br />
int count=0;</p>
<p>#define SW_up (GPIOD-&gt;IDR&amp;GPIO_Pin_0)<br />
#define SW_sel (GPIOD-&gt;IDR&amp;GPIO_Pin_1)<br />
#define SW_down (GPIOD-&gt;IDR&amp;GPIO_Pin_2)</p>
<p>//&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br />
void RCC_Configuration(void);<br />
void NVIC_Configuration(void);<br />
void GPIO_Configuration(void);<br />
void Uart1_Initialize(void);<br />
int fputc(int a, FILE*f);<br />
void Sensor_Test();<br />
void I2C_ini(void);<br />
void TIM2_Configuration(void);<br />
void TIM2_IRQHandler(void);<br />
void SerialPutChar(uint8_t c);<br />
void Serial_PutString(uint8_t *s);<br />
void Delay_us(vu32 nCount);<br />
void Delay_ms(vu32 nCount);<br />
void Usart1_init(void);<br />
void SendSerial(uint8_t buffer[], uint8_t size);<br />
void USART1_IRQHandler(void);<br />
void parsing(void);<br />
void TIM2_Configuration(void);<br />
void ocr_limit(void);</p>
<p>void GY_AC(void);<br />
void Result_PID();<br />
void X_Motor();</p>
<p>&nbsp;</p>
<p>//&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br />
void Delay_us(vu32 nCount){</p>
<p>nCount *= 8;<br />
for(; nCount!=0; nCount&#8211;);<br />
}<br />
void Delay_ms(vu32 nCount){</p>
<p>nCount *= 6000;<br />
for(; nCount!=0; nCount&#8211;);<br />
}<br />
void I2C_ini(void){</p>
<p>I2C_InitTypeDef I2C_InitStruct;</p>
<p>I2C_InitStruct.I2C_Mode = I2C_Mode_I2C;<br />
I2C_InitStruct.I2C_DutyCycle = I2C_DutyCycle_2;<br />
I2C_InitStruct.I2C_OwnAddress1 = MPU6050_DEFAULT_ADDRESS;<br />
I2C_InitStruct.I2C_Ack = I2C_Ack_Enable;<br />
I2C_InitStruct.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;<br />
I2C_InitStruct.I2C_ClockSpeed = MPU6050_I2C_Speed;</p>
<p>I2C_Init(MPU6050_I2C, &amp;I2C_InitStruct);<br />
I2C_Cmd(MPU6050_I2C, ENABLE);<br />
}<br />
void gy_ac(void){<br />
if(MPU6050_TestConnection()==TRUE){ test.connect++; }<br />
MPU6050_GetRawAccelGyro(accelgyro);<br />
calibrate_sensors(accelgyro);<br />
SendSerialAccelGryro(accelgyro);<br />
}</p>
<p>void RCC_Configuration(void){</p>
<p>ErrorStatus HSEStartUpStatus;</p>
<p>RCC_DeInit(); //RCC system reset(for debug purpose)<br />
RCC_HSEConfig(RCC_HSE_ON); //Enable HSE<br />
HSEStartUpStatus = RCC_WaitForHSEStartUp(); //Wait till HSE is ready</p>
<p>if(HSEStartUpStatus == SUCCESS) {<br />
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);<br />
FLASH_SetLatency(FLASH_Latency_2); //Flash 2 wait state<br />
RCC_HCLKConfig(RCC_SYSCLK_Div1); //HCLK = SYSCLK<br />
RCC_PCLK2Config(RCC_HCLK_Div1); //PCLK2 = HCLK<br />
RCC_PCLK1Config(RCC_HCLK_Div4); //PCLK1 = HCLK/4</p>
<p>RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); //PLLCLK = 8MHz * 9 = 72 MHz<br />
RCC_PLLCmd(ENABLE);</p>
<p>while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET); //Wait till PLL is ready<br />
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //Select PLL as system clock source<br />
while (RCC_GetSYSCLKSource() != 0&#215;08); //Wait till PLL is used as system clock source<br />
}<br />
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);<br />
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);<br />
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);<br />
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE ); //클럭설정<br />
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);<br />
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);<br />
//C_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);<br />
RCC_APB1PeriphClockCmd(MPU6050_I2C_RCC_Periph|RCC_APB1Periph_TIM3, ENABLE);</p>
<p>}<br />
</div>
<p><span style="color: #339966"><strong>사용부품</strong></span></p>
<table style="width: 620px" border="1" cellspacing="0" cellpadding="2">
<tbody>
<tr>
<td style="text-align: center">번호</td>
<td style="text-align: center">부품명</td>
<td style="text-align: center">수량</td>
<td style="text-align: center">사용목적</td>
</tr>
<tr>
<td style="text-align: center">1</td>
<td style="text-align: center">쿼드콥터 프레임세트(7.4~11.1V,  40A)</td>
<td style="text-align: center"></td>
<td style="text-align: center">frame</td>
</tr>
<tr>
<td style="text-align: center">2</td>
<td style="text-align: center">FlyFun-40A</td>
<td style="text-align: center">4</td>
<td style="text-align: center">ESC</td>
</tr>
<tr>
<td style="text-align: center">3</td>
<td style="text-align: center">MAI-CLCD-4B420 V2.0</td>
<td style="text-align: center">1</td>
<td style="text-align: center">LCD</td>
</tr>
<tr>
<td style="text-align: center">4</td>
<td style="text-align: center">11.1V 3200mAh extreme (40C)</td>
<td style="text-align: center">1</td>
<td style="text-align: center">battery</td>
</tr>
<tr>
<td style="text-align: center">5</td>
<td style="text-align: center">MPU6050</td>
<td style="text-align: center">2</td>
<td style="text-align: center">sensor</td>
</tr>
<tr>
<td style="text-align: center">6</td>
<td style="text-align: center"> [RA5]보급형 원형만능기판(150*200_양면)</td>
<td style="text-align: center">3</td>
<td style="text-align: center">기판</td>
</tr>
<tr>
<td style="text-align: center">7</td>
<td style="text-align: center">DiffusedRGB(tri-color)10mmLED(10pack) &#8211; Common</td>
<td style="text-align: center">1</td>
<td style="text-align: center">LED</td>
</tr>
<tr>
<td style="text-align: center">8</td>
<td style="text-align: center">NETmate 케이블 정리용 헤리컬밴드 10M 10mm/화이트 [NMT-SWB10]</td>
<td style="text-align: center">1</td>
<td style="text-align: center">케이블정리</td>
</tr>
<tr>
<td style="text-align: center">9</td>
<td style="text-align: center">Cortex-M3(144핀) CPU코어모듈 (CORE-STM32-144P)</td>
<td style="text-align: center">1</td>
<td style="text-align: center">MCU</td>
</tr>
<tr>
<td style="text-align: center">10</td>
<td style="text-align: center">Cortex-M3(64핀) CPU코어모듈 (CORE-STM32-64P)</td>
<td style="text-align: center">1</td>
<td style="text-align: center">MCU</td>
</tr>
<tr>
<td style="text-align: center">11</td>
<td style="text-align: center">RV09H-20SQ 10KΩ</td>
<td style="text-align: center">1</td>
<td style="text-align: center">가변저항</td>
</tr>
<tr>
<td style="text-align: center">12</td>
<td style="text-align: center">CHINA KN-A04</td>
<td style="text-align: center">1</td>
<td style="text-align: center">캡</td>
</tr>
<tr>
<td style="text-align: center">13</td>
<td style="text-align: center">XB24-DMPIT-250</td>
<td style="text-align: center">2</td>
<td style="text-align: center">통신</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<p><span style="color: #339966"><strong>참고자료</strong></span><br />
·[reference1] : www.techm.kr/bbs/board.php?bo_table=article&amp;wr_id=724<br />
· [reference2] : cluster1.cafe.daum.net/_c21_/bbs_search_read?grpid=Q31X&amp;fldid=5p7u&amp;datanum=70&amp;openArticle=true&amp;docid=Q31X5p7u7020041020132919<br />
· 파란만장 개발이야기: http://hs36.tistory.com/<br />
· 이뭐병의 블로그: http://blog.naver.com/ejtkddl<br />
· Git Hub: https://github.com/sincoon/STM32F4xx_MPU6050lib<br />
· 쿼드 로터 무인항공기 제어 및 시뮬레이션 &#8211; KITECH 양광웅 작성<br />
· 쿼드 로터 무인항공기 동역학 모델링 &#8211; KITECH 양광웅 작성</p>
<p><span style="color: #339966"><strong>회로도</strong></span></p>
<div id='wpdm_file_17' class='wpdm_file wpdm-only-button'><h3>[38호]기울기 방식의 조종기를 적용한 쿼드콥터</h3><div class='cont'><div class='btn_outer'><div class='btn_outer_c' style='background-image: url(http://www.ntrexgo.com/wp-content/plugins/download-manager/icon/file_extension_pdf.png);'><a class='btn_left  ' rel='17' title='[38호]기울기 방식의 조종기를 적용한 쿼드콥터' href='http://www.ntrexgo.com/?wpdmact=process&did=MTcuaG90bGluaw=='  >Download</a><span class='btn_right'>&nbsp;</span></div></div><div class='clear'></div></div></div>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p style="text-align: right">
]]></content:encoded>
			<wfw:commentRss>http://www.ntrexgo.com/archives/31919/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[28호]ICT 융합 공모전 – 모든 온열기에 범용적으로 연결할 수 있는 추가적인 안전장치</title>
		<link>http://www.ntrexgo.com/archives/27574</link>
		<comments>http://www.ntrexgo.com/archives/27574#comments</comments>
		<pubDate>Thu, 01 Jan 2015 09:31:37 +0000</pubDate>
		<dc:creator>디바이스마트 매거진</dc:creator>
				<category><![CDATA[디바이스마트 매거진]]></category>
		<category><![CDATA[특집]]></category>
		<category><![CDATA[28호]]></category>
		<category><![CDATA[feture]]></category>
		<category><![CDATA[ict]]></category>
		<category><![CDATA[공모전]]></category>
		<category><![CDATA[디바이스마트]]></category>
		<category><![CDATA[매거진]]></category>
		<category><![CDATA[융합]]></category>
		<category><![CDATA[프로젝트]]></category>

		<guid isPermaLink="false">http://www.ntrexgo.com/?p=27574</guid>
		<description><![CDATA[디바이스마트 매거진 28호 &#124; 온열장치마다 기본적으로 안전장치가 달려있다고는 하지만, 온열기구 자체의 열을 측정하여 적정거리를 그 때 그 때 산출하여 그 이상 접근 시에 경고 메세지를 보낸다거나, 전원을 꺼버리는 온열장치는 찾기 힘들다. 그래서 우리는 간단하게 탈·부착을 할 수 있고, 내열성도 고려하며, 모든 온열 기구에 사용할 수 있는 범용적이면서 저렴한 장치를 제작하게 되었다.]]></description>
				<content:encoded><![CDATA[<p><span style="font-size: large;color: #ffffff;background-color: #3366ff"><strong>ICT 융합 프로젝트 공모전 입선작</strong></span></p>
<p><span style="font-size: x-large"><strong>모든 온열기에 범용적으로 연결할 수 있는 추가적인 안전장치</strong></span></p>
<p><strong><br />
<span style="color: #ffffff;background-color: #3366ff">심 사 평</span></strong><br />
<strong>싱크웍스</strong> 실험 결과가 있었으면 좋았을 뻔했다. 결과를 알 수 없었으므로 완성도를 평가하기 어렵다.<br />
JK전자 보고서를 읽으면서 지금까지 온열기에 왜 이런 장치가 없었나 하는 생각을 하게 되었다. 구현 방법이 어려운 것은 아니지만 작은 아이디어로 실제 제품에도 쉽게 바로 적용도 가능할 것 같은 생각이 들어서 창의성과 실용성에 높은 점수를 주고 싶다.<br />
<strong>뉴티씨</strong> 온풍기와 같은 온열기로 인한 화재사고로 사망하거나 다치는 것 또는 재산을 잃는 사람들의 수가 해마다 많이 있다. 조금 따뜻해 보려고 쓰던 것이 부주의하게 사용하여 문제가 많이 생기는 경우인데, 이러한 점의 일부분을 개선하여 안전을 높이는 좋은 시도인 것 같다. 온풍기 회사에서 이러한 내용을 참조하여 온풍기의 기능 개선하여 판매한다면, 좋은 반향을 불러일으킬 것 같다. 다만, 거리나 설정 온도 등이 얼마가 되어야 하는지는 실내인지, 실외인지 현지의 상황마다 많이 다를 것으로 예상된다. 따라서, 설정 옵션을 두어 간편 설정, 사용자 세부설정 등과 같이 설정할 수 있도록 하는 것도 중요하리라 생각된다. 이러한 부분이 좀 더 고려되었으면 하는 아쉬움이 있으나, 전체적으로 학생의 입장에서 매우 잘 만든 작품이라 생각된다.<br />
<strong>펌테크</strong> 실용성이 돋보이는 아이디어 작품입니다. 창의성과 작품 구성상의 난이도는 높지 않으나 아이디어에는 높은 점수를 주고 싶습니다.</p>
<p><span style="color: #ffffff;background-color: #3366ff"><strong>1. 작품 개요</strong> </span><br />
온열기 ( 열풍기, 온풍기, 스탠드식 난로 등)는 생각보다 열이 높아서, 춥다고 가까이 있거나, 책상이나 의자 앞에 놓게 되면 화재의 위험 및 화상의 위험이 있다. 실제로 우리 학교에서도 온열기 때문에 화재사고가 날 뻔 하거나 화상을 입은 경우가 적지 않다. 그래서 생각한 것이 모든 온열기에 좀 더 실용적인 안전장치가 있었으면 좋겠다는 것에서 생각해 낸 것이 바로 범용적인 안전장치인 것이다.<br />
이는 온열장치마다 기본적으로 안전장치가 달려있다고는 하지만, 온열기구 자체의 열을 측정하여 적정거리를 그 때 그 때 산출하여 그 이상 접근 시에 경고 메세지를 보낸다거나, 전원을 꺼버리는 온열장치는 찾기 힘들다. 그래서 우리는 간단하게 탈·부착을 할 수 있고, 내열성도 고려하며, 모든 온열 기구에 사용할 수 있는 범용적이면서 저렴한 장치를 제작하게 되었다.<br />
<span style="color: #ffffff;background-color: #3366ff"><strong>2. 작품 설명</strong></span><br />
<span style="color: #800080"><strong>1. 주요 동작 및 특징</strong></span></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2015/01/모든-온열기-안전장치.jpg" rel="lightbox[27574]"><img class="alignnone size-full wp-image-27610" alt="모든 온열기 안전장치" src="http://www.ntrexgo.com/wp-content/uploads/2015/01/모든-온열기-안전장치.jpg" width="620" height="299" /></a></p>
<p>주요 동작으로는 맨 처음 온도센서가 켜지고, 온도를 읽어내어 어느 정도의 거리가 안전한지 계산한다. 이는 실시간으로 이루어지며, 사용자가 열의 세기를 조절함에 따라 안전 거리도 달라질 수 있을 것이란 점에 착안하였다. 그 다음, 초음파 센서를 부착하였다. 초음파 센서는 MCU의 Time Interrupts를 사용하여 매 시간마다 앞에 물체가 있는지 없는지 알아본다. 만약 초음파센서에 물체가 감지되면, 자동으로 MCU의 interrupts 가 실행되고, Beep 소리를 내는 함수를 실행하게 되며, 위험 거리 내로 접근할 경우 일정 시간 이후, AC 콘센트와 연결된 차단회로 (릴레이 스위치)가 작동하여 전력을 차단한다. 만약 위험거리까지 접근하였다가 다시 벗어나게 되면, 회로 차단 알고리즘은 종료가 되며 다시 정상적인 작동을 하게 된다.</p>
<p><span style="color: #800080"><strong>2. 전체 시스템 구성</strong></span><br />
<span style="color: #666699"><strong>(1) 초음파센서</strong></span><br />
여러 초음파 센서가 있었지만, 우선 시스템에서 요구하는 사양은 1~2미터 사이까지만 측정할 수 있으면 충분하였고, 모듈을 온열 기구에서 열이 나오는 부분이 아닌 부분에 부착을 하는 것이기 때문에 작동 허용범위가 80도 안팎이어야 했으며, 가격을 고려하여 HC- SR04 모델을 채택하였다. 이 초음파 센서는 각각의 입출력 포트를 MCU의 Timer Interrupt Port에 연결하였다.</p>
<p><span style="color: #666699"><strong>(2) 온도센서</strong></span><br />
온도 역시 열이 나오는 곳에 놓긴 하지만, 공중에 놓는 형식이라 작동 허용 범위가 80도 안팎인 것이 필요하였고, 가격 면에서 저렴한 것을 고르다가, LM35라는 제품을 쓰게 되었다. 이는 ADC를 써야하는 부품으로, MCU의 ADC Port에 연결을 하였다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2015/01/모든-온열기-안전장치-1.jpg" rel="lightbox[27574]"><img class="alignnone size-full wp-image-27611" alt="모든 온열기 안전장치 (1)" src="http://www.ntrexgo.com/wp-content/uploads/2015/01/모든-온열기-안전장치-1.jpg" width="620" height="438" /></a></p>
<p><span style="color: #666699"><strong>(3) 스피커</strong></span><br />
사용자에게 위험을 알리기 위한 용도로, 간단한 부저음을 요하고, MCU의 GPIO에서 나오는 전압이 3V인 것을 감안하고, 가격 면에서 고려하였을 때, BTM-0327을 쓰게 되었다.</p>
<p><span style="color: #666699"><strong>(4) 차단회로 (릴레이 스위치)</strong></span><br />
릴레이 스위치는 가격 면으로 따져봤을 때, JS1 5V (입력 전압 5V, 스위칭 전압 220V도 되는 소자)로 선택하였다.</p>
<p><span style="color: #666699"><strong>(5) MCU</strong></span><br />
MCU는 우리의 시스템에서 요구하는 사항으로, 저전력, 저렴, 뛰어난 퍼포먼스를 지녀야 한다. 그래서 택한 것이 바로 MSP430G2553을 채택하였다. 이 MCU는 한국에선 잘 알려지지 않은 MCU라 프로그래밍이나 구조 자체가 매우 생소하지만, 요구하는 성능을 만족하기 때문에 사용하게 되었다. 그러나 우리는 MCU에 프로그래밍을 해야하기 때문에, Msp430g2553이달려있는 Launch Pad의 에뮬레이터, 다운로더를 같이 썼다.</p>
<p><span style="color: #666699"><strong>(6) LCD + 가변저항</strong></span><br />
LCD는 원래는 없어도 되는 것이지만, 어떠한 정보 값을 받는지 직접 눈으로 확인하기 위해 구매하였다. 캐릭터 LCD로 만들었으며, 가격이 가장 저렴한 MC1602-13을 구매하였다. LCD 밝기 조절을 위한 가변저항은 Hongxing H3362P Series를 썼다.</p>
<p><span style="color: #ffffff;background-color: #3366ff"><strong>3. 개발환경 </strong></span><br />
<span style="color: #666699"><strong>(1) CCS ( Code Composer Studio v5)</strong></span><br />
이는 Ti에서 만드는 MCU를 프로그래밍 하여 MCU에 다운로드 할 수 있게끔 만든 Tool이다. 기본적으로 각 모델마다 특화된 레지스터 및 코드를 제공하고, 예제코드까지 바로 볼 수 있는 매우 특이한 툴이다. 게다가 이 툴은 기본적으로 타겟 보드를 각 MCU의 Launch Pad 로 삼고 있는데, 이 보드엔 기존의 PIC 같은 경우는 다운로더만 있어서 실질적으로 디버깅할 때 에뮬레이터가 따로 필요한 상황이 많았다. 하지만 Ti에서 제공하는 개발 보드엔 매우 저렴한 에뮬레이터가 기본적으로 달려있기 때문에 이 Tool을 이용하여 실시간 디버깅을 할 수 있다. 심지어는 MCU의 어떤 레지스터에 어떤 값이 들어가는지 Memory Browser 라는 기능까지 있다. 개발 언어로는 C를 사용하며, USB에 타겟 보드를 연결하여 다운로드, 디버깅을 할 수 있게끔 만들어 놓았다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2015/01/모든-온열기-안전장치-2.jpg" rel="lightbox[27574]"><img class="alignnone size-full wp-image-27612" alt="모든 온열기 안전장치 (2)" src="http://www.ntrexgo.com/wp-content/uploads/2015/01/모든-온열기-안전장치-2.jpg" width="620" height="665" /></a></p>
<p><span style="color: #ffffff;background-color: #3366ff"><strong>4. 단계별 제작 과정</strong></span></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2015/01/모든-온열기-안전장치-3.jpg" rel="lightbox[27574]"><img class="alignnone size-full wp-image-27613" alt="모든 온열기 안전장치 (3)" src="http://www.ntrexgo.com/wp-content/uploads/2015/01/모든-온열기-안전장치-3.jpg" width="620" height="328" /></a></p>
<p>위 사진은 MSP430G2553으로 제작한 보드에 한꺼번에 다 꽂을 수 있게 만든 기판이다.</p>
<p>① 초음파 센서를 온열기구 위에 부착하기 위하여 핀으로 빼서 쓸 수 있게끔 하였다.</p>
<p>② 온도센서 역시 온열기구 앞에 위치하게끔 해야 하기 때문에 핀으로 만들었다.</p>
<p>③ 스피커는 보드 위에 직접 부착을 하였다. 소리가 생각보다 크기 때문에 바로 붙였다.</p>
<p>④ LCD는 핀이 총 16개이지만, MCU의 GPIO 개수가 한정적이기 때문에, 8비트 (핀 8개)로 LCD에 띄우고자 하는 내용을 보내는 방법을 쓰지 않고, 4비트씩 나눠서 보내는 방식을 채택하여, 실질적으로 MCU에 꽂히는 핀 개수는 5개 (EN 까지 포함)이다. GND와 VCC는 별도로 붙였다.</p>
<p>⑤ 릴레이 스위치 역시 선을 길게 하여 콘센트에 연결해야 했기에 핀으로 꼽는 방식을 채택하였다.</p>
<p><img class="alignnone size-full wp-image-27614" alt="모든 온열기 안전장치 (4)" src="http://www.ntrexgo.com/wp-content/uploads/2015/01/모든-온열기-안전장치-4.jpg" width="564" height="300" /><br />
⑥ 5V전압 공급은 배터리 홀더 혹은 다른 전원 장치를 쓸 수 있게끔 핀으로 꼽는 방식을 채택하였다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2015/01/모든-온열기-안전장치-5.jpg" rel="lightbox[27574]"><img class="alignnone size-full wp-image-27615" alt="모든 온열기 안전장치 (5)" src="http://www.ntrexgo.com/wp-content/uploads/2015/01/모든-온열기-안전장치-5.jpg" width="570" height="331" /></a><br />
⑦ MSP430G2553 보드를 직접 제작하였다. Launch Pad의 에뮬레이터를 쓰기 위해 SBW 포트를 만들었고, 후에 무선통신으로 제어를 할 수 있게끔 UART 포트도 만들어놓았다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2015/01/모든-온열기-안전장치-6.jpg" rel="lightbox[27574]"><img class="alignnone size-full wp-image-27616" alt="모든 온열기 안전장치 (6)" src="http://www.ntrexgo.com/wp-content/uploads/2015/01/모든-온열기-안전장치-6.jpg" width="569" height="410" /></a><br />
⑧ LCD를 부착하여 케이스안에 모든 부품을 넣는다</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2015/01/모든-온열기-안전장치-7.jpg" rel="lightbox[27574]"><img class="alignnone size-full wp-image-27617" alt="모든 온열기 안전장치 (7)" src="http://www.ntrexgo.com/wp-content/uploads/2015/01/모든-온열기-안전장치-7.jpg" width="566" height="318" /></a><br />
⑨ 온풍기 위에 부착</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2015/01/모든-온열기-안전장치-8.jpg" rel="lightbox[27574]"><img class="alignnone size-full wp-image-27618" alt="모든 온열기 안전장치 (8)" src="http://www.ntrexgo.com/wp-content/uploads/2015/01/모든-온열기-안전장치-8.jpg" width="570" height="332" /></a><br />
⑩ 릴레이 스위치 연결</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2015/01/모든-온열기-안전장치-9.jpg" rel="lightbox[27574]"><img class="alignnone size-full wp-image-27619" alt="모든 온열기 안전장치 (9)" src="http://www.ntrexgo.com/wp-content/uploads/2015/01/모든-온열기-안전장치-9.jpg" width="565" height="297" /></a></p>
<p><span style="color: #ffffff;background-color: #3366ff"><strong>5. 소스코드</strong></span></p>
<div class="symple-box yellow none" style="text-align:left; width:100%;"> 
<p>Main.c<br />
float temp;<br />
void main(void)<br />
{<br />
WDTCTL = WDTPW + WDTHOLD;<br />
P2DIR = 0xFF;<br />
lcdinit();<br />
initsona();<br />
readsona();<br />
}<br />
Sona.h<br />
#ifndef SONA_H_<br />
#define SONA_H_<br />
#include &lt;msp430.h&gt;<br />
#include “lcd16.h”<br />
#define P1_ECHO BIT1<br />
#define P1_TRIGGER BIT0<br />
#define P1_LED0 BIT2<br />
#define P1_LED1 BIT3<br />
#define P1_LED2 BIT4<br />
#define P1_LED3 BIT5<br />
#define P1_BUZZER BIT6<br />
#define TH0 5000 /* Distance */<br />
#define TH1 4000<br />
#define TH2 3000<br />
#define TH3 2000<br />
#define TH4 1000<br />
#define TH5 500<br />
void initsona(void);<br />
void readsona(void);<br />
#endif /* SONA_H_ */<br />
Sona.c<br />
#include &lt;msp430.h&gt;<br />
#include “lcd16.h”</p>
<p>&nbsp;</p>
<p>#include “temp.h”<br />
#include “sona.h”<br />
unsigned int j;<br />
unsigned int measure = 0;<br />
unsigned int measure_1 = 0;<br />
float temp;<br />
void initsona(void) {<br />
//포트 설정을 해줌<br />
P1DIR |= BIT0 +BIT6 + BIT7;<br />
P1SEL |= BIT1;<br />
P1OUT |= 0&#215;00;<br />
BCSCTL1 |= CALBC1_1MHZ;<br />
DCOCTL |= CALDCO_1MHZ;<br />
BCSCTL2 &amp;= ~SELS;<br />
BCSCTL2 |= DIVS0;<br />
TACCTL0 |= CM_3 + SCS + CCIS_0 + CAP + CCIE;<br />
TACTL |= TASSEL_2 + MC_2 + ID_0;<br />
_BIS_SR(GIE);// general interrupt enable<br />
}<br />
void readsona(void) {<br />
while (1) {<br />
long i;<br />
temp = readtemp();<br />
P1OUT |= P1_TRIGGER;<br />
for (i = 0; i &lt; 3; i++)<br />
;<br />
P1OUT &amp;= ~P1_TRIGGER;<br />
for (i = 0; i &lt; 8000; i++)<br />
;<br />
}<br />
}<br />
#pragma vector=TIMER0_A0_VECTOR<br />
__interrupt void TimerA0(void) {<br />
long i;<br />
if ((P1IN &amp; P1_ECHO)&gt; 0){<br />
measure_1 = TACCR0;<br />
TACCTL0 |= CM_3;<br />
} else {<br />
measure = TACCR0 &#8211; measure_1;<br />
TACCR0 = 0;<br />
P1OUT &amp;= ~(BIT0 + BIT1);<br />
if (measure &gt; TH0) {<br />
gotoXy(0, 0);<br />
prints(“safe”);<br />
j=0;<br />
} else if (measure &gt; TH1) {<br />
gotoXy(0, 0);<br />
prints(“safe”);<br />
j=0;<br />
} else if (measure &gt; TH2) {<br />
j++;<br />
if(j&gt;50000&amp;&amp;temp&gt;100&amp;&amp;temp&lt;150)<br />
{<br />
gotoXy(0, 0);<br />
prints(“Too close”);<br />
P1OUT |= (BIT7+BIT6);</p>
<p>&gt; TH3) {<br />
j++;<br />
if(j&gt;48000&amp;&amp;temp&gt;=150&amp;&amp;temp&lt;170)<br />
{<br />
gotoXy(0, 0);<br />
prints(“Too close”);<br />
P1OUT |= (BIT7+BIT6);<br />
}<br />
}<br />
else if (measure &gt; TH4) {<br />
j++;<br />
if(j&gt;46000&amp;&amp;temp&gt;=170)<br />
{<br />
gotoXy(0, 0);<br />
prints(“Too close”);<br />
P1OUT |= (BIT7+BIT6);<br />
}<br />
}<br />
for (i = 0; i &lt; 8000; i++)<br />
;<br />
}<br />
TACTL &amp;= ~TAIFG;<br />
P1OUT &amp;= ~(BIT7+BIT6);<br />
}<br />
#pragma vector= ADC10_VECTOR ; // interrupt vector<br />
__interrupt void ADC10(void) {<br />
gotoXy(0, 1);<br />
integerToLcd(temp);<br />
}<br />
Temp.h<br />
#ifndef TEMP_H_<br />
#define TEMP_H_<br />
#include &lt;msp430.h&gt;<br />
#include “lcd16.h”<br />
float readtemp(void);<br />
#endif<br />
Temp.c<br />
#include “temp.h”<br />
#include “lcd16.h”<br />
float temp;<br />
float readtemp(void) {<br />
ADC10CTL0 |= ADC10SHT_2 + ADC10ON + ADC10IE; //<br />
ADC10ON, interrupt enabled<br />
ADC10CTL1 = INCH_4; // input A1<br />
ADC10AE0 |= BIT4; // PA.1 ADC option<br />
select<br />
ADC10CTL0 |= ENC + ADC10SC; // Sampling and<br />
conversion start<br />
temp = (ADC10MEM * 3.7 / 1023.0) * 100;<br />
ADC10CTL0 &amp;= ~ADC10ON;</p>
<p>return temp;<br />
}<br />
LCD.h<br />
#ifndef LCD16_H_<br />
#define LCD16_H_<br />
#include &lt;msp430.h&gt;<br />
#define LCD_OUT P2OUT<br />
#define LCD_DIR P2DIR<br />
#define EN BIT5<br />
#define RS BIT4<br />
#define EN_1 (P2OUT |= EN)<br />
#define EN_0 (P2OUT &amp;= ~EN)<br />
#define RS_1 (P2OUT |= RS)<br />
#define RS_0 (P2OUT &amp;= ~RS)<br />
void waitlcd(unsigned int x);<br />
void lcdinit(void);<br />
void integerToLcd(int integer);<br />
void lcdData(unsigned char l);<br />
void prints(char *s);<br />
void gotoXy(unsigned char x, unsigned char y);<br />
#endif /* LCD16_H_ */<br />
LCD.c<br />
/*<br />
* lcd16.c<br />
*<br />
* Created on: Dec 1, 2011<br />
* Author: Gaurav www.circuitvalley.com<br />
*/<br />
#include “lcd16.h”<br />
void lcdcmd(unsigned char Data) {<br />
RS_0;<br />
EN_0;<br />
LCD_OUT &amp;= 0&#215;00; //clear all data pin.<br />
LCD_OUT |= ((Data &amp; 0xF0) &gt;&gt; 4);<br />
EN_1;<br />
waitlcd(2);<br />
EN_0;<br />
LCD_OUT &amp;= 0&#215;00; //clear all data pin<br />
LCD_OUT |= (Data &amp; 0x0F); // P1OUT |=BIT<br />
EN_1;<br />
waitlcd(2);<br />
EN_0;<br />
}<br />
void lcdData(unsigned char l) {<br />
RS_1;<br />
EN_0;<br />
LCD_OUT &amp;= 0xF0;<br />
LCD_OUT |= ((l &amp; 0xF0) &gt;&gt; 4);</p>
<p>EN_1;<br />
waitlcd(2);<br />
EN_0;<br />
LCD_OUT &amp;= 0xF0;<br />
LCD_OUT |= (l &amp; 0x0F);<br />
EN_1;<br />
waitlcd(2);<br />
EN_0;<br />
}<br />
void lcdinit(void) {<br />
RS_0;<br />
EN_0;<br />
LCD_OUT = (BIT0 + BIT1);<br />
waitlcd(40);<br />
EN_1;<br />
EN_0;<br />
waitlcd(5);<br />
EN_1;<br />
EN_0;<br />
waitlcd(5);<br />
EN_1;<br />
EN_0;<br />
waitlcd(2);<br />
LCD_OUT = BIT1;<br />
EN_1;<br />
EN_0;<br />
lcdcmd(0&#215;28); // Function set -&gt; set data length 4 bit 2 line<br />
waitlcd(250);<br />
lcdcmd(0x0C); //Display on/off control -&gt; set display on<br />
cursor on blink on<br />
waitlcd(250);<br />
lcdcmd(0&#215;01); // Clear display<br />
waitlcd(250);<br />
lcdcmd(0&#215;06); // Cursor or display shift -&gt; cursor shift<br />
direction<br />
waitlcd(250);<br />
lcdcmd(0&#215;80); //Set DDRAM address -&gt; set ram address<br />
waitlcd(250);<br />
}<br />
void waitlcd(volatile unsigned int x) {<br />
volatile unsigned int i;<br />
for (x; x &gt; 1; x&#8211;) {<br />
for (i = 0; i &lt;= 110; i++)<br />
;<br />
}<br />
}<br />
void prints(char *s) {<br />
while (*s) {<br />
lcdData(*s);<br />
s++;<br />
}</p>
<p>}<br />
void gotoXy(unsigned char x, unsigned char y) {<br />
if (x &lt; 40) {<br />
if (y)<br />
x |= 0&#215;40;<br />
x |= 0&#215;80;<br />
lcdcmd(x);<br />
}<br />
}<br />
void integerToLcd(int integer) {<br />
unsigned char thousands, hundreds, tens, ones;</p>
<p>thousands = integer / 1000;<br />
lcdData(thousands + 0&#215;30);<br />
hundreds = ((integer &#8211; thousands * 1000) &#8211; 1) / 100;<br />
lcdData(hundreds + 0&#215;30);<br />
tens = (integer % 100) / 10;<br />
lcdData(tens + 0&#215;30);<br />
ones = integer % 10;<br />
lcdData(ones + 0&#215;30);<br />
}</p>
</div>
<span style="color: #ffffff;background-color: #3366ff"><strong>6. 회로도</strong></span></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2015/01/모든-온열기에-10.jpg" rel="lightbox[27574]"><img class="alignnone size-large wp-image-27620" alt="모든 온열기에 10" src="http://www.ntrexgo.com/wp-content/uploads/2015/01/모든-온열기에-10-620x333.jpg" width="620" height="333" /></a></p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ntrexgo.com/archives/27574/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
