<?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; 38호</title>
	<atom:link href="http://www.ntrexgo.com/archives/tag/38%ed%98%b8/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호]지능형 GPS &amp; 장애물 감시 주행로봇</title>
		<link>http://www.ntrexgo.com/archives/31857</link>
		<comments>http://www.ntrexgo.com/archives/31857#comments</comments>
		<pubDate>Sun, 25 Sep 2016 07:00:19 +0000</pubDate>
		<dc:creator>디바이스마트 매거진</dc:creator>
				<category><![CDATA[디바이스마트 매거진]]></category>
		<category><![CDATA[특집]]></category>
		<category><![CDATA[38호]]></category>
		<category><![CDATA[Feature]]></category>
		<category><![CDATA[ict]]></category>
		<category><![CDATA[공모전]]></category>
		<category><![CDATA[디바이스마트]]></category>
		<category><![CDATA[매거진]]></category>
		<category><![CDATA[융합]]></category>
		<category><![CDATA[참가상]]></category>
		<category><![CDATA[프로젝트]]></category>

		<guid isPermaLink="false">http://www.ntrexgo.com/?p=31857</guid>
		<description><![CDATA[디바이스마트 매거진 38호 &#124; 현재 애플, 구글과 같은 세계적인 IT 기업은 무인자동차를 미래 먹거리 산업으로 정하고 계속 연구를 진행하고 있다는 것을 언론으로 알게 되었고, 꼭 한번 직접 만들고 싶다는 생각을 하게 되었습니다. 그러나 실제 크기의 자동차를 만들기에는 무리가 있다고 생각하여 미니카 사이즈로 제작하는 것부터 시작하였습니다.]]></description>
				<content:encoded><![CDATA[<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/05/2016-ictmain.png" rel="lightbox[31857]"><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"><strong><span style="background-color: #339966;color: #ffffff">2016 ICT 융합 프로젝트 공모전 참가상</span></strong></span></p>
<p><span style="font-size: xx-large"><strong>지능형 GPS &amp; 장애물 감시 주행로봇</strong></span></p>
<p style="text-align: right">글 | 가천대학교 도성곤, 박성진</p>
<p style="text-align: right">
<p><span style="background-color: #ffffff;color: #008000"><strong>심사평</strong></span><br />
<strong></strong></p>
<p><strong><span style="color: #0000ff">JK전자</span> </strong>창의적이거나 기술적으로 완성도가 높은 작품은 분명히 아니다. 하지만 보고서의 내용을 읽어 보면서 기초 지식이 굉장히 부족한 상태에서 의욕만 가지고 작품 구현을 시작한 것으로 보이고 비록 완성도가 높은 작품은 아니지만, 공모전에 참가하고 작품 완성을 위해서 하나하나 배우면서 많은 고생을 했을 것이라는 것이 보고서에서 느껴진다. 작품에 참여한 모든 인원들 수고했고 앞으로 많은 발전이 있을 것이라 생각된다.</p>
<p><strong><span style="color: #0000ff">뉴티씨</span></strong> GPS를 이용하여 입력된 장소를 찾아가는 것은 말하기는 쉬우나, 실제로 만들어보면 생각보다 난제가 많음을 알 수 있다. 움직이는 것은 많은 문제점을 내포하고 있으며, 아이디어를 구현하였다는 점에 큰 점수를 주고 싶다. 이 자체로 실용적이거나 하지는 않지만, 앞으로 좀 더 연구하여 자동주행에 적용될 수 있도록 한다면 좋을 것 같다. 이 분야를 공부하는 한가지 계기가 될 수 있지 않았을까 생각하며, 이 작품을 만든 학생의 미래를 꿈꿔본다.</p>
<p><span style="color: #0000ff"><strong>칩센</strong></span> 보고서 내용처럼 공부를 목적으로 하는 부분은 충분히 만족했을 것 같다. 너무 어려운 주제를 선택한 것 같다.</p>
<p><span style="color: #0000ff"><strong>위드로봇</strong></span> 고생을 많이 한 작품으로 보인다. 특히 실외에서 실험을 진행해야 하기에 더욱 그러했을 것이다. UART 통신 및 기타 센서 인터페이스를 위해 MCU의 기초부터 차근차근 학습하면 좀 더 수월하게 개발을 할 수 있을 것으로 보인다.</p>
<p><span style="color: #008000"><strong>작품개요</strong></span><br />
<span style="color: #008080"><strong>동기</strong></span><br />
현재 애플, 구글과 같은 세계적인 IT 기업은 무인자동차를 미래 먹거리 산업으로 정하고 계속 연구를 진행하고 있다는 것을 언론으로 알게 되었고, 꼭 한번 직접 만들고 싶다는 생각을 하게 되었습니다. 그러나 실제 크기의 자동차를 만들기에는 무리가 있다고 생각하여 미니카 사이즈로 제작하는 것부터 시작하였습니다.</p>
<p>무인자동차를 만들면 많은 부분에 관한 기초를 익힐 수 있다고 생각했습니다. GPS, 적외선 센서를 사용해 봄으로써 다양한 분야에 응용이 가능할 것이라는 기대를 합니다. 예로 청소기 로봇을 들 수 있는데 청소기 로봇은 집안의 장애물을 파악하여 피하며 스스로 청소를 하는 로봇입니다. 기존의 청소기 역시 청소는 가능했으므로 기존의 청소기에 장애물을 피하는 능력이 있으면 로봇 청소기가 되는 것이고, 이러한 장애물을 피하는 알고리즘을 무인 자동차를 만들면서 생각해 볼 수 있습니다.</p>
<p>또 다른 예로 작년에 많은 관심을 일으켰던 드론에도 적용하는 것도 가능할 것입니다. 아마존에서는 드론을 이용하여 제품을 배달하려는 계획을 세웠는데 이를 위해서는 GPS를 통해 현재 위치를 파악하고 목적지까지 가는 방법을 생각해야 합니다. 향후 우리들이 이 분야에도 진입할 수 있다는 생각에, 한동안 작품을 만들면서 힘들지만 계속 동기부여를 할 수 있었습니다.</p>
<p><span style="color: #008000"><strong>제품의 도전 과제</strong></span><br />
① 적외선 센서의 장애물 감지<br />
② 로봇의 모터 움직임(차체의 무게 최소화)<br />
③ GPS 센서의 위성신호 데이터 수신<br />
④ 수신된 데이터 GLCD에 표시<br />
⑤ 이 모두를 구동케 하는 전원 장치(스위치로 구동)</p>
<p><span style="color: #008000"><strong>제품 결과</strong></span><br />
적외선 센서는 평균적으로 15cm 거리의 장애물을 인식합니다. 앞과 좌, 우의 인지로, 로봇이 움직이는 방향이 달라집니다. 만약, 1) 좌측에 장애물이 있다면 우측으로 방향을 정하고 90도 각도로 회전해 움직입니다. 2) 좌측과 우측에 모두 장애물이 있을 시 180도 각도로 회전해 반대 방향으로 움직입니다. 3) 장애물이 없을 시 계속 전진합니다. 이 구동은 실외나 실내 모두 작동됩니다.</p>
<p>GLCD는 LCD보다 더 세밀한 장치입니다. 원래는 LCD를 하려고 했지만, 더 큰 과제로 GLCD로 도전해 보았습니다. GLCD는 픽셀로 제어해서 LCD보다는 더 정밀한 형태들을 만들 수 있었습니다. 특히, LCD는 영문자와 다른 기호 등 정도만 제어할 수 있지만, GLCD는 우리가 만들 수 있으면 한글로도 표시가 가능했습니다.</p>
<p>작품을 만들면서 최대한 무게를 줄이고 크기는 작게 하는 방식으로 생각했습니다. 그러기 위해선 속도보단 최소한의 안정된 경도를 유지하고 각종 센서들에 붙여진 모듈을 제거하려고 노력하였습니다. 그래서 ATmega128과 연결된 각종 PORT 보드를 안 쓰고 직접 이 MCU의 pin만 있는 상태에서 리드선을 납땜했습니다. 그리고 실외용으로 쓰이는 것도 감안하여 플라스틱으로 된 바퀴보다는 고무로 된 바퀴로 대체하여 실외용에도 크게 손상되지 않게 만들었습니다.</p>
<p>작품에서 의외로 전원 장치를 만드는 것에 애를 많이 먹었습니다. 우리가 쓰고자 하는 센서들이 필요한 구동전압과 전류들이 각각 다르기 때문에 거기에 적합한 구동을 하기 위해서 익숙치 않은 회로설계를 하여야 했습니다. 그리고 전원 장치로는 스위치로 작동시키기 위해 슬라이드 스위치를 이용하였고 바로 건전지의 6V에 외부전원을 공급하면 회로가 상당한 열을 받는 것을 알게 되어 다이오드 등 내부 전압강하를 유도해 전원 전압을 각종 센서들이 작동할 수 있는 최소한의 전압으로 4.5V 내지 최대 5.1V까지 공급할 수 있게 하였습니다.</p>
<p><span style="color: #008000"><strong>작품 설명</strong></span><br />
<span style="background-color: #ffffff;color: #008080"><strong>주요동작/특징</strong></span><br />
· 적외선 센서로 80~10cm의 거리를 인식, 그 안에 장애물을 피함.<br />
· GPS 센서 모듈을 이용, 실외에 있을시 GPS 신호를 받으며 목표지점을 지정할 수 있음<br />
· 받은 GPS 신호와 목표지점은 GLCD에 표시가 됨.<br />
· ATmega128 Lite를 이용, 건전지 6V 전원으로 구동.</p>
<p><span style="color: #008080"><strong>전체 시스템 구성</strong></span><br />
1. ATMEGA128을 활용, 전원 스위치로 전원을 제어.<br />
2. DC 모터 드라이버를 활용해서 DC 모터를 제어하여 로봇 구동.<br />
3.적외선 센서를 이용해서 장애물 감지.<br />
4. 장애물을 감지하면 DC 모터가 그에 따라 각도 조절.<br />
5. GPS 모듈을 사용해서 어떤 데이터가 들어오는지 로봇이 확인.<br />
6. GPS 데이터를 GLCD로 전송.<br />
7. GLCD에서 수신 받은 GPS 데이터를 확인하고 목표 좌표 데이터를 로봇으로 전송.<br />
8. 로봇이 목표 좌표 데이터를 수신 받고 수신 받은 데이터를 하이퍼 터미널이나 GLCD로 확인.<br />
9. 목표 거리만큼 소스 코드에 따라 DC모터 제어를 통해 주행.<br />
10. 앞의 적외선 센서 프로그램 제어를 통해 목표 좌표로 가는 동안 장애물을 감지하면서 구동.</p>
<p><strong><span style="color: #008080">개발환경</span></strong></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-지능형-1.jpg" rel="lightbox[31857]"><img class="alignnone size-large wp-image-32110" alt="38 ict 지능형 (1)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-지능형-1-620x534.jpg" width="620" height="534" /></a></p>
<p>1) 개발 언어 &#8211; C언어<br />
2) Tool &#8211; 이클립스, AVR studio4.19, RS232_terminal<br />
3) 사용 시스템 &#8211; 디지털 멀티 미터, power supply</p>
<p><span style="color: #008000"><strong>단계별 제작 과정</strong></span></p>
<p>1. 자동차 차체에 두 개의 DC 모터를 연결하였습니다. 앞에 구동하려는 바퀴는 따로 철물점상에 사온 작은 룰러 형식의 바퀴로 쓰이게 했고 로봇이 주행하는데 더 원활하게 움직일 수 있었습니다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-지능형-2.jpg" rel="lightbox[31857]"><img alt="38 ict 지능형 (2)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-지능형-2.jpg" width="509" height="299" /></a></p>
<p>2. DC 모터는 나사와 모터 고정대를 이용, 접착제와 함께 단단하게 부착시켰습니다.</p>
<p>3. 모터 드라이버는 차체 내 가운데에 부착시켰고, 드라이버에 선이 있어 DC 모터와 연결하고 MCU PORT B에 10p 커넥터로 연결했습니다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-지능형-3.jpg" rel="lightbox[31857]"><img class="alignnone size-full wp-image-32112" alt="38 ict 지능형 (3)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-지능형-3.jpg" width="509" height="299" /></a>ㅁ</p>
<p>4. PCB 기판은 기판의 모서리에 구멍에다 나사와 철막대 2개를 이용하여 고정시키고, 차체에 접착제를 붙였습니다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-지능형-4.jpg" rel="lightbox[31857]"><img class="alignnone size-full wp-image-32113" alt="38 ict 지능형 (4)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-지능형-4.jpg" width="509" height="299" /></a></p>
<p>5. 로봇의 배터리는 원활하게 전류가 흐르게 하는 것과 동시에, ATmeg128에 외부 단자가 아닌 내부 전원 5v을 공급하는데 효용성이 있다고 판단하여, 1.5V 알칼리 건전지 4개를 쓰게 되었습니다, 그래서 4개를 연결하는 소켓(6V)을 ATmega128의 외부전원으로 선택하였고 PCB 기판 아래에 부착시켰습니다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-지능형-5.jpg" rel="lightbox[31857]"><img class="alignnone size-full wp-image-32114" alt="38 ict 지능형 (5)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-지능형-5.jpg" width="509" height="299" /></a></p>
<p>6. 차체의 무게를 조금이라도 줄이기 위해 원래의 Atmega128을 모듈에서 빼고 PCB 기판에 부착시켰습니다. 여기에 구동전압을 최대 6V로 주지 않고 7805 IC 소자를 통해서 정전압 5V 직류로 구동되게 하였습니다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-지능형-7.jpg" rel="lightbox[31857]"><img class="alignnone size-full wp-image-32116" alt="38 ict 지능형 (7)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-지능형-7.jpg" width="509" height="299" /></a></p>
<p>7. PCB 기판 위에 GPS 센서 모듈을 4pin 소켓을 꽂아 고정시켰고 통신이 원활하게 유지되도록 ATmega128 uart 통신 pin에 직접 연결하였습니다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-지능형-8.jpg" rel="lightbox[31857]"><img class="alignnone size-full wp-image-32117" alt="38 ict 지능형 (8)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-지능형-8.jpg" width="509" height="255" /></a></p>
<p>8. 적외선센서 3개는 차체 앞에 간격을 동일하게 두면서 접착제로 고정시켰습니다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-지능형-9.jpg" rel="lightbox[31857]"><img class="alignnone size-full wp-image-32118" alt="38 ict 지능형 (9)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-지능형-9.jpg" width="509" height="255" /></a></p>
<p>9. 기판 아래에 회로선을 모터 드라이브, 적외선 센서, GPS 센서 모듈, GLCD 센서 모듈과 연결되는 포트들에 납땜하였습니다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-지능형-10.jpg" rel="lightbox[31857]"><img class="alignnone size-full wp-image-32119" alt="38 ict 지능형 (10)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-지능형-10.jpg" width="509" height="255" /></a></p>
<p>10. GLCD를 PCB 기판위에 ATmega128 PORT A와 PORT F에 기판 아래 pin에다가 납땜된 커넥터와 GLCD 모듈의 10p 커넥터와 연결하였습니다. GLCD에 표시되는 것은 현재 속도, 현재 좌표, 목표 좌표입니다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-지능형-11.jpg" rel="lightbox[31857]"><img class="alignnone size-large wp-image-32120" alt="38 ict 지능형 (11)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-지능형-11-620x280.jpg" width="620" height="280" /></a></p>
<p>11. 최종적으로 PCB 기판 위에 정리되지 않는 선들은 최대한 기판 아래 납땜하였고 기판 차체 사이에 보이는 연결선들을 접착제로 붙여 정리하였습니다. 위에서 보면은 UART 선들과 전원선을 제외하고는 연결선들이 거의 보이지 않게 하였습니다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-지능형-12.jpg" rel="lightbox[31857]"><img class="alignnone size-full wp-image-32121" alt="38 ict 지능형 (12)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-지능형-12.jpg" width="514" height="294" /></a></p>
<p>12.제품 소프트웨어 구성</p>
<p><strong>· DC 모터 구동 소스</strong></p>
<p><strong></strong><div class="symple-box gray none" style="text-align:left; width:100%;"> 
<p>/*<br />
Purpose: Go forward<br />
Input: Void<br />
Output: Void<br />
*/<br />
void forward()<br />
{<br />
PORTB=0&#215;00;<br />
PORTB|=0&#215;02;<br />
PORTB|=0&#215;10;<br />
PORTB|=0&#215;04;<br />
}<br />
</div>
<strong>· 적외선 센서 핵심 소스</strong></p>
<div class="symple-box gray none" style="text-align:left; width:100%;"> 
<p>/*<br />
Purpose: Read value from infrared sensor<br />
Input: Pin number<br />
Output: Value which is read from infrared sensor<br />
*/<br />
unsigned int read_adc(unsigned char ch){<br />
ADMUX=ch|0&#215;40; _delay_us(10);<br />
ADCSRA|=0&#215;40; while((ADCSRA&amp;0&#215;10)==0); ADCSRA|=0&#215;10;<br />
return ADC;<br />
}</p>
</div>
<strong> · GPS 센서 핵심 소스</strong></p>
<div class="symple-box gray none" style="text-align:left; width:100%;"> 
<p>/*<br />
Purpose: Interrupt service routine<br />
Input: GPS Signal<br />
Output: Parsed value<br />
*/<br />
ISR(USART1_RX_vect)<br />
{<br />
unsigned char RX;<br />
int i;<br />
RX=UDR1;<br />
if(RX==’$’))//각각의 신호의 시작을 나타내는 것(GPS신호는 5개가 들어온다).<br />
{<br />
rx_buf[0]=’$’;<br />
rx_cnt=1;<br />
}<br />
else if(RX==0x0A)//1개의 신호가 끝났음을 의미<br />
{<br />
rx_buf[rx_cnt++]=0;<br />
if(strncmp(“$GPRMC”, rx_buf, 6)==0)/이번에 받은 신호가 우리에게 필요한 신호인지 확인<br />
{<br />
GPS_cut=strtok(rx_buf, “,”);//필요한 신호라 판단되면 ,을 기준으로 문자열을 나눈다.</p>
<p>for(i=0; GPS_cut; i++)<br />
{<br />
GPRMC[i]=GPS_cut;<br />
GPS_cut=strtok(0, “,”);<br />
}<br />
strcpy(valid, GPRMC[2]);<br />
strcpy(cur_lon, GPRMC[5]);<br />
strcpy(cur_lat, GPRMC[3]);<br />
strcpy(speed, GPRMC[7]);<br />
}<br />
rx_cnt=0;<br />
}</p>
<p>else if(RX==0x0D)<br />
rx_buf[rx_cnt++]=0;<br />
else if(RX==’,’)<br />
{<br />
if(rx_buf[rx_cnt-1]==’,’)<br />
rx_buf[rx_cnt++]=’0’;<br />
rx_buf[rx_cnt++]=RX;<br />
}<br />
else if(RX==’*’)<br />
{<br />
if(rx_buf[rx_cnt]==’,’)<br />
rx_buf[rx_cnt++]=’,’;<br />
rx_buf[rx_cnt++]=RX;<br />
}<br />
else<br />
{<br />
if(rx_cnt&lt;180)<br />
rx_buf[rx_cnt++]=RX;<br />
}<br />
}<br />
</div>
<strong> · GLCD 센서 핵심 소스</strong></p>
<div class="symple-box gray none" style="text-align:left; width:100%;"> 
<p>/*<br />
Purpose: Input cmd to GLCD<br />
Input: pinNumber and command<br />
Output: Void<br />
*/<br />
void write_cmd(unsigned char cs, unsigned char cmd)<br />
{<br />
//check_bf();<br />
LCD_CTRL = cs &amp; CS_ALL;<br />
SetE(1);<br />
LCD_OUTP = cmd;<br />
delay(1);<br />
SetE(0);<br />
delay(1);<br />
LCD_CTRL=0&#215;00;<br />
delay(10);<br />
}</p>
<p>/*<br />
Purpose: Write data to GLCD<br />
Input: Pin number and char<br />
Output: void<br />
*/<br />
void write_data(unsigned char cs, unsigned char ch)<br />
{<br />
LCD_CTRL = (cs &amp; CS_ALL) | DI;<br />
SetE(1);<br />
LCD_OUTP = ch;<br />
delay(1);<br />
SetE(0);<br />
delay(1);<br />
LCD_CTRL=0&#215;00;<br />
delay(10);<br />
}<br />
/*<br />
Purpose: Clear glcd<br />
Input: Void<br />
Output: Void<br />
*/<br />
void lcd_clear(void)<br />
{<br />
unsigned char i, j, x, y;<br />
LCD_CTRL=0&#215;00;<br />
write_cmd(CS_ALL,0x3f);<br />
write_cmd(CS_ALL,0xc0);<br />
x = 0xB8; /* X start address */<br />
y = 0&#215;40; /* Y start address */<br />
for(i = 0; i &lt;= 7; i++)<br />
{<br />
write_cmd(CS_ALL,x);<br />
write_cmd(CS_ALL,y);<br />
for(j = 0; j &lt; 64; j++)<br />
write_data(CS_ALL,0&#215;00); /* clear CS1 and CS2 */<br />
x++;<br />
}<br />
}</p>
<p>/*<br />
Purpose: Initiation of glcd<br />
Input: Void<br />
Output: Void<br />
*/<br />
void lcd_init(void)<br />
{<br />
write_cmd( CS_ALL, DISPON );<br />
write_cmd( CS_ALL, 0xc0 );<br />
write_cmd( CS_ALL, 0xb8 );<br />
write_cmd( CS_ALL, 0&#215;40 );<br />
}</p>
<p>/*<br />
Purpose: Pointing and turn on lcd<br />
Input: X, Y value<br />
Output: Void<br />
void PointXY(int xpoint, int ypoint){ //픽셀 단위로 x,y축으로<br />
int point=0&#215;01, value; 조정<br />
int x1, y1, y2, y3;<br />
x1=xpoint%128;<br />
y1=ypoint%64;<br />
y2=y1/8;<br />
y3=y1%8;<br />
compare[y2][x1]|=(point&lt;&lt;y3);<br />
value=compare[y2][x1];<br />
if(x1&lt;64){<br />
write_cmd(CS_ALL, x+y2);<br />
write_cmd(CS_ALL, y+x1);<br />
write_data(_CS1, value);<br />
} else {<br />
write_cmd(CS_ALL, x+y2);<br />
write_cmd(CS_ALL, y+x1-64);<br />
write_data(_CS2, value);<br />
}<br />
}<br />
Purpose: Pointing and delete<br />
Input: X&amp;Y value<br />
Output: Void<br />
*/<br />
void Point_Del(int xpoint, int ypoint){<br />
int point=0&#215;01, value;<br />
int x1, y1, y2, y3;</p>
<p>x1=xpoint%128;<br />
y1=ypoint%64;<br />
y2=y1/8;<br />
y3=y1%8;<br />
compare[y2][x1]&amp;=(~(point&lt;&lt;y3));<br />
value=compare[y2][x1];<br />
if(x1&lt;64){<br />
write_cmd(CS_ALL, x+y2);<br />
write_cmd(CS_ALL, y+x1);<br />
write_data(_CS1, value);<br />
} else {<br />
write_cmd(CS_ALL, x+y2);<br />
write_cmd(CS_ALL, y+x1-64);<br />
write_data(_CS2, value);<br />
}<br />
}<br />
</div>
<p><span style="color: #008000;background-color: #ffffff"><strong>재료</strong></span></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-지능형-50.jpg" rel="lightbox[31857]"><img class="alignnone size-full wp-image-32130" alt="38 - ict - 지능형 - 50" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-지능형-50.jpg" width="247" height="223" /></a><br />
<strong>· ATmega128 모듈(뉴티씨)</strong><br />
MUC는 ATmega128을 사용하였습니다. 뉴티씨 Lite 모델로 무게를 최소화하고 ADC, UART, LCD를 이용할 pin들은 따로 pin 포트를 사와 고정시키고 PCB기판 동박면에 센서 모듈을 장착시킬 수 있었습니다. 외부 전원은 5V-input 핀에 연결을 하였고 GPS센서는 UART1통신에 연결하였습니다. 리셋버튼으로 통신제어하기에도 용이했습니다.</p>
<table style="width: 620px" border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td><a style="font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif;font-size: 13px" href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-지능형-13.jpg" rel="lightbox[31857]"><img alt="38 ict 지능형 (13)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-지능형-13.jpg" width="231" height="178" /></a></td>
<td><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-지능형-14.jpg" rel="lightbox[31857]"><img class="alignnone size-full wp-image-32123" alt="38 ict 지능형 (14)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-지능형-14.jpg" width="231" height="121" /></a></td>
</tr>
</tbody>
</table>
<p><strong>· DC모터 &amp; 듀얼 DC모터 드라이브(YS-2270/유틸전자)</strong><br />
저희는 DC모터를 가벼운 것으로 선택하였습니다. 세운상가에서 값싼 가격대에서 샀고 모터드라이버는 1.5A에 5V~12V까지 구동되는 걸로 구매했습니다. 빠른 속도를 요하는 게 아니라서 5V 내로 전압을 준 속도면 충분했습니다. 실제, 모든 센서 모듈과 같이 제어하고 나면 마지막으로 모터와 GLCD가 가장 전류를 많이 잡아먹었습니다. 나머지 센서들이 작동되고 두 센서가 모두 켜지기 위해서는 600mA까지 전류가 흘러야 구동이 되었습니다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-지능형-15.jpg" rel="lightbox[31857]"><img class="alignnone size-large wp-image-32124" alt="38 ict 지능형 (15)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-지능형-15-620x180.jpg" width="620" height="180" /></a></p>
<p><strong>· 적외선센서(lk-dms) 3개</strong><br />
10cm-80cm정도 거리를 인식합니다. 구동전압은 4.5V-5.5V입니다. 적외선 센서는 3개를 이용하였으며, 각 VCC와 GND를 공통 VCC선과 GND선에 연결하였고, MCU의 PORT F.1,2,3 에 Vout선을 납땜하였습니다. 대체적으로 하이터미널로 확인한 바 15cm내외로 수신을 잘 받아내었습니다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-지능형-16.jpg" rel="lightbox[31857]"><img class="alignnone size-large wp-image-32125" alt="38 ict 지능형 (16)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-지능형-16-620x155.jpg" width="620" height="155" /></a></p>
<p><strong>· GPS 센서모듈(us-technology-UST-SNR-GPS v2)</strong><br />
3.3V로 구동되는 GPS 센서는 위 그림처럼 위성신호에서 수신받은 데이터를 다시 MCU에 송신해줘야 하기 때문에 센서의 UART 통신모듈 핀 VCC/TX/RX/GND에서 GPS의 VCC와 GND는 연결해주고 TX를 MCU UART1 RX에 연결해줍니다. 위도, 경도에 PC를 연결하여 하이퍼터미널로 확인 또는 GLCD로 확인케 하였습니다.<br />
위성신호 데이터는 ‘$GPRMC’라는 문장에서 나오는데 이 신호가 가는 것이 위도, 경도가 그 뒤를 따릅니다. ‘A’라는 문구가 뜨면 실내로 들어온 것이라 뜨게 됩니다.</p>
<p><strong>· 정전압 레귤레이터 7805 소자</strong></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-지능형-17.jpg" rel="lightbox[31857]"><img class="alignnone size-large wp-image-32126" alt="38 ict 지능형 (17)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-지능형-17-620x216.jpg" width="620" height="216" /></a></p>
<p>전원문제를 해결하는데 사용하였습니다. 1.5V 건전지 4개를 연결하여 6V 외부전원이 들어오는데 5V로 정전압을 공급해야 했습니다. 순간적인 전압의 흔들림으로 인한 리플값을 잡아주기 위해서 세라믹 콘덴서를 양쪽에 병렬로 설치하였습니다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-지능형-18.jpg" rel="lightbox[31857]"><img class="alignnone size-large wp-image-32127" alt="38 ict 지능형 (18)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-지능형-18-620x178.jpg" width="620" height="178" /></a></p>
<p><strong>· GLCD 모듈(LG128643 LMD WH6V)</strong><br />
5V 구동전압을 가지고 128&#215;64 dots 로 제어합니다. 이것을 픽셀이라 합니다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-지능형-19.jpg" rel="lightbox[31857]"><img class="alignnone size-full wp-image-32128" alt="38 ict 지능형 (19)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-지능형-19.jpg" width="229" height="156" /></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-지능형-20.jpg" rel="lightbox[31857]"><img class="alignnone  wp-image-32129" alt="38 ict 지능형 (20)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-지능형-20-620x518.jpg" width="496" height="414" /></a></p>
<p><span style="color: #008080"><strong>작품후기</strong></span><br />
처음 시작했을 때 GPS 신호라든지 적외선 센서라든지 LCD라든지 제대로 배워본 적 없던 소자를 다루기 때문에 걱정이 정말 많이 들었다. 역시나 해보면서 너무 많은 것을 배워야 되는 일들이 한꺼번에 쏟아져서 자료들을 많이 검색해서 얻은 정보로 간신히 만든 정도이다. 처음 용산전자로 가서 모터가 뭔지도 모르고 시작했던 터라 물어보는 것도 시원찮아 꾸중도 많이 들었다. 같이 했던 조원과도 뜻을 맞추기도 힘들었고 계속할 수 있을지 계속 의문이 들었다.<br />
얼마 안 된 시간에 조금씩 차체에서 원했던 모습들이 쌓여가는 것이 보여지는 걸로 위안 삼아 이를 악물고 버티면서 배워보려고 했다. 처음 소자를 구매하는 것부터 디바이스마트에서 제품 설명서를 보면서 이해할려고 최대한 노력하였다. 추운 날씨에 GPS를 실외에서 신호를 받아 가는 과정을 지켜보는 시간이 길어지면서 너무 힘이 들었지만, MCU를 샀던 사이트에서 소스를 가져와서 고쳐보고 다시 그 소스로 밖에서 확인하고 하는 과정을 몇 십번씩 하면서 결국엔 GPS 신호를 처음으로 받아봤던 기쁨은 잊을 수 없다. 역시나 완성품이라고 하기에는 볼품이 없는 것 같다. 다른 학생들이 작품을 보면서 우리들이 쏟아부었던 노력들을 쌍그리 무시할 정도로 냉담히 평가하면 할 말이 없어진다. 하지만, 지금까지 이런 어려운 과제를 하면서 배우고, 실행하였던 과정들이 지금은 굉장히 뜻깊고 잘했단 생각이 든다. 앞으로 또 이런 과제로 주어지게 된다면 더 잘하고 싶다. 특히 GPS를 아직도 제대로 이해하지 못하여서 GPS관련한 걸로 하고 싶다.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ntrexgo.com/archives/31857/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[38호]라즈베리파이 SENSE HAT 리뷰</title>
		<link>http://www.ntrexgo.com/archives/31932</link>
		<comments>http://www.ntrexgo.com/archives/31932#comments</comments>
		<pubDate>Sun, 25 Sep 2016 05:30:01 +0000</pubDate>
		<dc:creator>디바이스마트 매거진</dc:creator>
				<category><![CDATA[디바이스마트 매거진]]></category>
		<category><![CDATA[특집]]></category>
		<category><![CDATA[38호]]></category>
		<category><![CDATA[review]]></category>
		<category><![CDATA[sesne hat]]></category>
		<category><![CDATA[디바이스마트]]></category>
		<category><![CDATA[라즈베리파이]]></category>
		<category><![CDATA[매거진]]></category>

		<guid isPermaLink="false">http://www.ntrexgo.com/?p=31932</guid>
		<description><![CDATA[디바이스마트 매거진 38호 &#124; 한마디로 Sense HAT 보드는 라즈베리파이보드 기반에서 현존하는 어지간한 센서는 모두 장착된 올인원 쉴드보드 정도라고 보면 틀리지 않을 듯합니다.]]></description>
				<content:encoded><![CDATA[<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/Cap-2016-12-08-10-23-45-719.jpg" rel="lightbox[31932]"><img class="alignnone size-large wp-image-32190" alt="Cap 2016-12-08 10-23-45-719" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/Cap-2016-12-08-10-23-45-719-620x294.jpg" width="620" height="294" /></a></p>
<p><span style="font-size: medium;background-color: #800080;color: #ffffff"><strong>라즈베리파이 SENSE HAT 리뷰</strong></span></p>
<p><span style="font-size: xx-large"><strong>우주정거장으로 날아 간</strong></span></p>
<p><span style="font-size: xx-large"><strong>라즈베리파이 Sense HAT</strong></span></p>
<p style="text-align: right">글 | 금강초롱 blog.naver.com/crucian2k3</p>
<p style="text-align: left">
<p style="text-align: left">우리는 누군가가 순발력과 재치가 있어 다른 사람에게 일종의 기쁨 내지는 편안함을 선사한다면 ‘그 사람 참 센스가 있더라’라는 칭찬성 멘트를 일상에서 사용하곤 합니다.</p>
<p>이번에는 이러한 의미로 흔히 사용하곤 하는 센스(Sense : 감각)와 알파벳 대문자로 HAT(hat : 모자, 머리)라는 키워드가 붙은 보드라 조금은 어색함을 느끼며 리뷰를 시작하게 되었습니다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-sr-금강초롱-1.jpg" rel="lightbox[31932]"><img class="alignnone size-full wp-image-32136" alt="38 sr 금강초롱 (1)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-sr-금강초롱-1.jpg" width="542" height="304" /></a></p>
<p>HAT가 그냥 모자를 의미하지는 않을듯하여 잠시 찾아보니 Hardware Attached on Top(HAT : 업보드, 쉴드 보드 등)의 머리글자를 따서 HAT를 만들었음을 알 수 있었습니다. 그냥 멀티센서쉴드 정도로 명명하면 누구나 쉽게 이해 할 수 있지 않을까 생각도 듭니다만 아두이노 진영에서 사용하는 쉴드라는 용어는 가급적 쓰고 싶지 않았을 수도 있고 아두이노는 이탈리아 태생이고 라즈베리파이는 잉글랜드 태생이라 문화적인 차이에 기인하기도 한 것으로 여겨집니다.<br />
한마디로 Sense HAT 보드는 라즈베리파이보드 기반에서 현존하는 어지간한 센서는 모두 장착된 올인원 쉴드보드 정도라고 보면 틀리지 않을 듯합니다.</p>
<p>필자가 느끼는 아쉬움을 거론한다면 바이브레이션모터와 피에조스피커를 꼽을 수 있을 것입니다. 만일 Sense HAT에 진동과 사운드를 발생시킬 수 있는 소자가 추가가 되었더라면 더욱 크게 히트치지 않았을까 생각을 해봤습니다.</p>
<p>여러분~ 이제 이 센스쟁이 모자(?)와 즐거운 여행을 떠나 볼까요?</p>
<p>이 글은 (주)엔티렉스의 지원을 받아 작성하게 되었습니다.</p>
<p>라즈베리파이의 파이는 파이썬에서 따왔을 만큼 파이썬 언어와 관련이 깊습니다. 파이썬으로 작성된 센스햇 라이브러리와 gcc 기반에서 작성된 예제를 차근차근 실행시켜 보면서 이 보드가 어떤 재미난(?) 일을 할 수 있는지를 살펴보도록 하겠습니다.<em id="__mceDel"><br />
</em></p>
<p><span style="color: #800080"><strong>1. 개요</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">I2C Addr.</td>
<td>성능(기능)</td>
</tr>
<tr>
<td style="text-align: center">MCU</td>
<td style="text-align: center">0&#215;46</td>
<td>ATtiny88</td>
</tr>
<tr>
<td style="text-align: center">자이로스코프</td>
<td style="text-align: center">0x1C</td>
<td>LSM9DS1, 각도측정센서 : ±245/500/2000dps</td>
</tr>
<tr>
<td style="text-align: center">가속도계</td>
<td style="text-align: center">0x1C</td>
<td>LSM9DS1, 선형가속센서 : ±-2/4/8/16g</td>
</tr>
<tr>
<td style="text-align: center">지자기센서</td>
<td style="text-align: center">0x6A</td>
<td>LSM9DS1, Magnetic Sensor: ± 4/8/12/16gauss</td>
</tr>
<tr>
<td style="text-align: center">기압센서</td>
<td style="text-align: center">0x5C</td>
<td>LPS25H, 260 &#8211; 1260hPa absolute range</td>
</tr>
<tr>
<td style="text-align: center">온도센서</td>
<td style="text-align: center">0x5F</td>
<td>HTS221, ± 2degC in the 0-65 degC</td>
</tr>
<tr>
<td style="text-align: center">습도센서</td>
<td style="text-align: center">0x5F</td>
<td>HTS221, 20-80%Rh의 범위 내에서 정확도 +/- 4.5%, 15-40degC의 범위 내에서 정확도 +/- 0.5degC</td>
</tr>
<tr>
<td style="text-align: center">디스플레이 모듈</td>
<td style="text-align: center">0&#215;46</td>
<td>LED2472G, 8&#215;8 LED matrix display</td>
</tr>
<tr>
<td style="text-align: center">조이스틱</td>
<td style="text-align: center">0&#215;46</td>
<td>ALPS SKRHABE010, 소형 5 button joystick</td>
</tr>
</tbody>
</table>
<p>Sense HAT 보드는 Atmel사(현재는 Microchip사(PIC)에 인수합병 됨)의 8비트 MCU인 ATtiny88을 기반으로 설계되어졌으며 일반적으로 사용되는 거의 모든 종류의 센서가 총망라 되어 있습니다. 모션센서는 MPU6050등 6축으로 구성된 칩이 하비일렉트로닉스 시장에서는 널리 사용됩니다만 이 보드에서는 ST Microelectronics의 LSM9DS1을 사용하여 9축 정보를 제공하는 등 차별화를 시도하고 있는 점이 이채롭습니다.<br />
각각의 센서에 대한 정보를 살펴보는 것이 Sense HAT 보드를 이해하는데 상당한 도움이 될 듯하며 우선 총괄적인 부분을 살펴보면 아래와 같습니다.<br />
이제 이 글을 읽는 독자님들이 궁금해 할 각각의 센서를 개략적으로 살펴보도록 하겠습니다.</p>
<p><span style="color: #81499e"><strong>1.1. 9축 모션센서</strong></span></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-sr-금강초롱-2.jpg" rel="lightbox[31932]"><img class="alignnone size-full wp-image-32138" alt="38 sr 금강초롱 (2)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-sr-금강초롱-2.jpg" width="259" height="247" /></a><br />
● 모델명 : LSM9DS1<br />
● 칩벤더 : ST Microelectronics사<br />
● 주요 기능<br />
· 3축 가속도계, 3축 자이로, 3축 지자계 센서<br />
· ±2/±4/±8/±16g 선형가속계 감도<br />
· ±4/±8/±12/±16가우스 지자계 센서 감도<br />
· ±245/±500/±2000dps angular rate full scale<br />
· 16-bit 데이터 출력<br />
· SPI / I2C serial 인터페이스<br />
· Analog 부문 공급전압 1.9V to 3.6V<br />
· “Always-on” eco power mode down to 1.9mA<br />
· Programmable interrupt generators<br />
· 온도센서 내장<br />
· Embedded FIFO<br />
· 위치, 움직임 감지 함수 내장<br />
· 휴대기기를 위한 저전력소모 기능 내장</p>
<p>일전에도 다룬바 있는 Genuino 101 보드에서도 모션센서를 내장하고 있기는 합니다만 가속도계와 자이로센서로 구성된 6축을 채용하고 있습니다.<br />
Sense HAT에 내장된 9축 모션센서는 피치, 롤, 요 정보를 제대로 출력해 줄 수 있으므로 쿼드콥터, 밸런싱로봇, 게임기 등등 움직임이 수반되는 기기에 응용해 볼 수 있을 것으로 봅니다.</p>
<p><span style="color: #81499e"><strong>1.2. 기압센서</strong></span></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-sr-금강초롱-3.jpg" rel="lightbox[31932]"><img class="alignnone size-full wp-image-32140" alt="38 sr 금강초롱 (3)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-sr-금강초롱-3.jpg" width="254" height="177" /></a><br />
● 모델명 : LPS25H<br />
● 칩벤더 : ST Microelectronics사<br />
● 주요 기능<br />
· 절대기압 범위 260 to 1260hPa<br />
· 고 분해능 모드 : 1Pa RMS<br />
· 저 소비전력 : (저 분해능 모드)4μA, (고 분해능 모드)25μA<br />
· 과압성능(High overpressure capability) : 20x full scale<br />
· 내장 온도보정 기능<br />
· Embedded 24-bit ADC<br />
· Selectable ODR from 1Hz to 25Hz<br />
· SPI and I²C 인터페이스<br />
· 동작전압 : 1.7 to 3.6V<br />
· 충격성능(High shock survivability) : 10,000g</p>
<p>Sense HAT을 활용하여 대기 중 온도, 습도, 기압 정보를 얻어와 날씨정보를 표시하거나 고도정보를 표시하는 용도로 응용이 가능할 듯합니다.<br />
흔히 사용되지 않는 기압센서를 이번 기회에 라즈베리파이 유저들이 간편하게 접근해 볼 수 있도록 세심한 배려를 해둠에 감사할 따름입니다.</p>
<p><span style="color: #81499e"><strong>1.3. 온습도센서</strong></span></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-sr-금강초롱-4.jpg" rel="lightbox[31932]"><img class="alignnone size-full wp-image-32142" alt="38 sr 금강초롱 (4)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-sr-금강초롱-4.jpg" width="254" height="186" /></a><br />
● 모델명 : HTS221<br />
● 칩벤더 : ST Microelectronics사<br />
● 주요 기능<br />
· 상대습도측정 범위 : 0 to 100%<br />
· 온도측정범위 : -40 to +120°C<br />
· 전원공급 : 1.7 to 3.6V<br />
· 소비전력 : 2μA @ 1Hz ODR<br />
· Selectable ODR from 1Hz to 12.5Hz<br />
· 고감도 rH : 0.004% rH/LSB<br />
· 습도정밀도 : ± 3.5% rH, 20 to +80% rH<br />
· 온도정밀도 : ± 0.5°C, 15 to +40°C<br />
· 온습도 데이터 출력 : 16-bit<br />
· SPI and I²C 인터페이스<br />
· 제조자 보정 후 출고<br />
· 패키지사이즈 : Tiny 2 x 2 x 0.9mm</p>
<p>취미전자 등에 흔히 사용하는 DHT-xx 시리즈에 비해 넓은 온습도 측정범위를 가진 칩이 장착되어져 있습니다. 이 칩이 제공해주는 기능을 활용해 라즈베리파이로 에어컨, 자동제어 등의 실험을 해볼 수 있을 것으로 예상해 봅니다.</p>
<p><span style="color: #81499e"><strong>1.4. RGB 고휘도 LED 모듈</strong></span></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-sr-금강초롱-5.jpg" rel="lightbox[31932]"><img class="alignnone size-full wp-image-32144" alt="38 sr 금강초롱 (5)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-sr-금강초롱-5.jpg" width="254" height="353" /></a><br />
● 모델명 : CLP6R-FKW<br />
● 칩벤더 : CREE사<br />
● 주요 기능<br />
· 사이즈(mm) : 6.0 x 5.0<br />
· 주파장(Dominant Wavelength) : Red (610 &#8211; 625nm), Green (514 &#8211; 534nm), Blue (460 &#8211; 480nm)<br />
· 광도(Luminous Intensity, mcd) : Red (450 &#8211; 1800), Green (710 &#8211; 1800), Blue (280 &#8211; 710)<br />
· 가시각 : 120 degree</p>
<p>풀칼라 표현이 가능한 RGB 고휘도 LED모듈로 Sense HAT에는 8행 8열, 즉 64개가 실장되어 있습니다. 매우 밝고 반응속도도 빠르며 픽셀마다 RGB 독립 혹은 혼합색 표현이 가능하므로 각종 정보 표출이나 게임 등에 재미난 활용가치가 있을 것으로 봅니다.<br />
다만 ATtiny88에 의해 다이나믹 제어를 하고 있으므로 전체적인 리프레시 타임은 한계가 있습니다.<br />
보다 효과적인 LED 통제를 위해 LED2472G 8채널 FULL COLOR LED 드라이버를 사용하고 있으며 컬럼 라인은 래치를 사용하여 MCU가 직접 제어를 하는 방식으로 설계되어 있습니다.</p>
<p><span style="color: #81499e"><strong>1.5. 5버튼 조이스틱</strong></span></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-sr-금강초롱-6.jpg" rel="lightbox[31932]"><img class="alignnone size-full wp-image-32146" alt="38 sr 금강초롱 (6)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-sr-금강초롱-6.jpg" width="546" height="226" /></a><br />
● 모델명 : SKRHABE010<br />
● 칩벤더 : ALPS사<br />
● 주요 기능 : 4방향키 + center push 스위치<br />
● 스위치 내부구조</p>
<p><span style="color: #800080"><strong>2. Hello World에 도전하기</strong></span></p>
<p><span style="color: #81499e"><strong>2.1. 기본환경</strong></span></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-sr-금강초롱-7.jpg" rel="lightbox[31932]"><img class="alignnone size-full wp-image-32148" alt="38 sr 금강초롱 (7)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-sr-금강초롱-7.jpg" width="545" height="219" /></a></p>
<p>우선 실험을 진행하기 위해서는 라즈베리파이3와 Sense HAT을 결합하고 여기에 라즈비안(운영체제)까지 깔려있는 상태여야 합니다.<br />
라즈베리파이3를 사용한다면 와이파이모듈이 기본적으로 내장되어 있으므로 외부에서 간단히 접속할 수 있습니다.<br />
와이파이 동글을 끼우지 않아도 되고 RJ45 잭을 꽂지 않아도 이더넷 환경이 만들어 진다는 것은 대단한 강점이라고 볼 수 있겠습니다.<br />
여기까지의 상황에 대한 준비는 전월호(36호)의 ‘라즈베리파이를 활용한 인터넷 라디오 &amp; 게임머신 작업기’편에서 다뤘으므로 참고하시기 바랍니다.<br />
※ 필자의 블로그 참조 :<br />
<a href="http://blog.naver.com/crucian2k3/220788282079" target="_blank">http://blog.naver.com/crucian2k3/220788282079</a></p>
<p>자, Tera Term을 띄워 라즈베리파이에 접속해 들어갑니다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-sr-금강초롱-8.jpg" rel="lightbox[31932]"><img class="alignnone size-full wp-image-32150" alt="38 sr 금강초롱 (8)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-sr-금강초롱-8.jpg" width="548" height="315" /></a></p>
<p>SSH가 지원이 되는 터미널프로그램이라면 어떤 것이든 상관없습니다.<br />
· 접속 아이디와 비밀번호 : pi / raspberry</p>
<p>이렇게 접속한 후 보여지는 첫 화면은 아래와 같습니다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-sr-금강초롱-34.jpg" rel="lightbox[31932]"><img class="alignnone  wp-image-32193" alt="38 sr 금강초롱 (34)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-sr-금강초롱-34-620x278.jpg" width="558" height="250" /></a></p>
<p><span style="color: #81499e"><strong>2.2. Sense HAT API 설치</strong></span><br />
우선 라즈베리파이에 API(이하 라이브러리)가 설치되어 있어야 합니다.<br />
공식 설치소개 페이지는 아래 주소를 참고 합니다.<br />
<a href="https://www.raspberrypi.org/documentation/hardware/sense-hat/" target="_blank">https://www.raspberrypi.org/documentation/hardware/sense-hat/</a></p>
<div class="symple-box gray none" style="text-align:left; width:100%;"> 
<p>$ sudo apt-get update<br />
$ sudo apt-get install sense-hat<br />
$ sudo reboot</p>
</div>
<p>이 라이브러리가 설치되면 자이로스코프, 가속도계, 지자기센서, 온도센서, 습도센서, 기압센서, 조이스틱 등을 자유롭게 접근할 수 있습니다.</p>
<p>이렇게 라이브러리를 설치한 후에 시험 삼아 Hello.py를 작성해 봅니다.<br />
작성된 파일에 chmod 755 hello.py를 하여 실행파일로 만들어 줍니다.<br />
파이썬으로 만들어진 파일을 실행을 시킬 때는 ./hello.py를 칩니다.</p>
<div class="symple-box gray none" style="text-align:left; width:100%;"> 
<p><span style="color: #3366ff">pi@raspberrypi:~/examples/crucian2k3 $ cat hello.py</span><br />
#!/usr/bin/python</p>
<p>from sense_hat import SenseHat<br />
sense = SenseHat()<br />
sense.show_message(“Hello world!”)</p>
<p><span style="color: #3366ff">pi@raspberrypi:~/examples/crucian2k3 $ chmod 755 hello.py</span><br />
<span style="color: #3366ff"> pi@raspberrypi:~/examples/crucian2k3 $ ls -al</span><br />
total 12<br />
drwxr-xr-x 2 pi pi 4096 Aug 31 22:27 .<br />
drwxr-xr-x 6 pi pi 4096 Aug 31 22:22 ..<br />
-rwxr-xr-x 1 pi pi 105 Aug 31 22:27 hello.py<br />
<span style="color: #3366ff">pi@raspberrypi:~/examples/crucian2k3 $</span></p>
</div>
<p>동작하고 있는 장면은 아래와 같습니다.<br />
‘Hello World’가 우에서 좌로 살짝 빠르게 스크롤 됩니다.<br />
이처럼 스크롤이 일어나는 것은 Sense HAT 내부에 ATtiny88이 올려져 있기 때문입니다. 라즈베리파이 SOC는 ‘뿌려져라’라는 명령을 I2C 채널을 통해 ATtiny88로 보내고, MCU에서는 후처리를 알아서 담당하는 방식입니다. 일종의 역할분담입니다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-sr-금강초롱-9.jpg" rel="lightbox[31932]"><img class="alignnone size-full wp-image-32152" alt="38 sr 금강초롱 (9)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-sr-금강초롱-9.jpg" width="542" height="310" /></a><br />
아래는 Tera Term에서 명령을 내리는 모든 과정을 캡처한 것입니다.<br />
여기서</p>
<p><span style="color: #3366ff">$ ls -al hello.py</span>는 hello.py가 실행이 가능한 상태인 755 퍼미션이 들어가 있는지 보는 것입니다.</p>
<p><span style="color: #3366ff">$ cat hello.py</span>는 hello.py에 무슨 내용이 담겨져 있는지 리스팅 해보는 것입니다.</p>
<p><span style="color: #3366ff">$ ./hello.py</span>는 리눅스 등 유닉스 기반의 OS에서는 실행할 때 실행파일명과 경로를 반드시 명기해야 하며 ./는 현재 경로를 의미 합니다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-sr-금강초롱-10.jpg" rel="lightbox[31932]"><img class="alignnone size-full wp-image-32154" alt="38 sr 금강초롱 (10)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-sr-금강초롱-10.jpg" width="542" height="315" /></a></p>
<p>여기까지는 잘 따라 오셨나요?<br />
일단 Hello Word에 성공하였다면 Sense HAT을 갖고 놀고, 즐길 수 있는 만반의 준비가 끝났다고 볼 수 있습니다.<br />
사실 이러한 제품을 구상하고 만드는 사람이 어렵지 쓰는 사람은 그저 그 분들의 노고에 감사해하며 잘 써주면 그만일 듯합니다.</p>
<p><span style="color: #800080"><strong>3. Sense HAT 학습을 위한 재단의 배려</strong></span></p>
<p>이제부터 Sense HAT을 학습에 어떻게 이용할 수 있는지를 살펴보도록 하겠습니다.<br />
라즈베리파이 재단에서는 가르치는 선생님을 위한 페이지, 공부하고자 하는 학생을 위한 페이지, 그리고 활용할 수 있는 실습코너 등을 준비해 놓고 있습니다.<br />
정말 어지간한 정성이 아니고선 보기 힘든 싸이트라고 생각 됩니다.<br />
필자는 모든 코너를 따라가며 실행해 보았습니다.<br />
정말 감탄이 절로 나올 정도로 잘 만들어져 있음을 알 수 있었습니다.<br />
이 글을 읽는 독자님들도 한번쯤 방문해 보실 것을 강력히 권합니다.<br />
우측 상단에 ‘<strong>Help / Teach / Learn / Make</strong>’ 가 메인 링크입니다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-sr-금강초롱-11.jpg" rel="lightbox[31932]"><img class="alignnone size-full wp-image-32156" alt="38 sr 금강초롱 (11)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-sr-금강초롱-11.jpg" width="542" height="330" /></a><br />
<a href="https://www.raspberrypi.org/learning/getting-started-with-the-sense-hat/" target="_blank">https://www.raspberrypi.org/learning/getting-started-with-the-sense-hat/</a><br />
재단에서 신경 써서 만들어 놓은 것 중에 시뮬레이터라는 것도 있습니다.<br />
라즈베리파이보드와 Sense HAT을 갖고 있지 않더라도 간단한 실험을 여기에서 해볼 수 있습니다. 크롬웹브라우져에서는 별 탈 없이 구동되나 인터넷익스플로러 상에서는 약간의 문제가 있어 보입니다. 아래는 Rainbow.py를 구동시켜본 장면입니다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-sr-금강초롱-12.jpg" rel="lightbox[31932]"><img class="alignnone size-full wp-image-32158" alt="38 sr 금강초롱 (12)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-sr-금강초롱-12.jpg" width="542" height="334" /></a></p>
<p><span style="color: #800080"><strong>4. Sense HAT 활용을 위한 API 접근</strong></span></p>
<p>Sense HAT으로 뭔가를 해보고자 한다면 라즈베리파이 재단에서 공개한 API에 대해 학습해 보는 것이 순서일 듯합니다.<br />
API는 일종의 라이브러리라고 이해해도 무방하며 이 역시 파이썬으로 제작이 되어 있습니다. 아래 주소에서 최신판에 대한 확인이 가능합니다.</p>
<p>https://github.com/RPi-Distro/python-sense-hat</p>
<p>이 API는 Sense HAT이 가지고 있는 모든 종류의 센서를 비롯하여 조이스틱까지를 핸들링 할 수 있도록 파이선 기반으로 작성되어 있으며, 파이선 자체가 워낙 가독성이 좋으므로 언어를 잘 몰라도 어떻게 동작이 되는지를 짐작해 보는데 큰 무리는 없다고 봅니다.<br />
프로그램은 sense_hat.py에 본격적으로 기술되어 있습니다.<br />
이장에서 언급하는 API는 아래 주소를 참조 하였습니다.</p>
<p>https://pythonhosted.org/sense-hat/api/</p>
<p><span style="color: #81499e"><strong>4.1. LED 매트릭스 핸들링과 관련된 API(라이브러리)</strong></span><br />
LED 매트릭스는 RGB 색상을 가지는 LED가 8*8로 배열되어 있으며 ATtiny88 AVR에 의해 제어됩니다. 포드절약을 위해 다이나믹 디스플레이 방식을 사용함에 따라 한번에 8개의 LED가 점등한 후 나머지는 소등하는 방식으로 바르게 반복하여 원하는 글자나 문양을 표현해 낼 수 있습니다.<br />
만일 라즈베리파이 메인 SOC에게 이 일을 시키면, LED 매트릭스에 글자 표시하느라 다른 일을 제대로 할 수 없을 것입니다.</p>
<p><span style="color: #a37acc"><strong>4.1.1. set_rotation</strong></span><br />
● 기능 : 라즈베리파이를 거꾸로 사용하거나 옆으로 사용하여야 하는 상황에서 이미지의 방향을 회전시킬 수 있는 기능을 제공합니다.<br />
이 함수는 인자를 2개 갖습니다. 첫 번째 인자는 회전하는 각도를 담고 두 번째 인자는 갱신시킬 것인지를 결정하며, 만일 두 번째 인자를 생략하면 작동으로 True가 입력되어 갱신이 일어납니다. 이러한 기능은 아래 함수에서 똑같이 적용됩니다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-sr-금강초롱-3.png" rel="lightbox[31932]"><img class="alignnone size-full wp-image-32141" alt="38 sr 금강초롱 (3)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-sr-금강초롱-3.png" width="542" height="257" /></a></p>
<p>● 예제 코드</p>
<div class="symple-box gray none" style="text-align:left; width:100%;"> 
<p>#!/usr/bin/python</p>
<p>from sense_hat import SenseHat<br />
sense = SenseHat()<br />
sense.set_rotation(180)<br />
# 다른 방법으로 이렇게 할 수도 있음<br />
sense.rotation = 180<br />
</div>
<p><span style="color: #a37acc"><strong>4.1.2. flip_h</strong></span><br />
● 기능 : LED 매트릭스에 표출된 이미지를 수평방향으로 반전시킵니다.<br />
반전된 RGB 값이 들어 있는 목록정보가 리턴됩니다.<br />
파라메터에 값을 넣지 않으면 True가 자동으로 입력되어 리프레시가 일어납니다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-sr-금강초롱-7.png" rel="lightbox[31932]"><img alt="38 sr 금강초롱 (7)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-sr-금강초롱-7.png" width="541" height="143" /></a></p>
<p>&nbsp;</p>
<div class="symple-box gray none" style="text-align:left; width:100%;"> 
<p>#!/usr/bin/python<br />
from sense_hat import SenseHat</p>
<p>sense = SenseHat()<br />
sense.flip_h()</p>
</div>
<p><span style="color: #a37acc"><strong>4.1.3. flip_v</strong></span><br />
● 기능 : LED 매트릭스에 표출된 이미지를 수직방향으로 반전시킵니다.<br />
반전된 RGB 값이 들어 있는 목록정보가 리턴됩니다.<br />
파라메터에 값을 넣지 않으면 True가 자동으로 입력되어 리프레시가 일어납니다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-sr-금강초롱-4.png" rel="lightbox[31932]"><img alt="38 sr 금강초롱 (4)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-sr-금강초롱-4.png" width="542" height="144" /></a></p>
<div class="symple-box gray none" style="text-align:left; width:100%;"> 
<p>#!/usr/bin/python</p>
<p>from sense_hat import SenseHat</p>
<p>sense = SenseHat()<br />
sense.flip_v()<br />
</div>
<p><span style="color: #a37acc"><strong>4.1.4. set_pixels</strong></span><br />
● 기능 : 화소값의 64바이트 길이를 갖는 리스트에 기반하여 LED매트릭스 행렬을 업데이트 합니다. 이 함수는 리턴값이 없습니다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-sr-금강초롱-8.png" rel="lightbox[31932]"><img class="alignnone size-full wp-image-32151" alt="38 sr 금강초롱 (8)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-sr-금강초롱-8.png" width="541" height="111" /></a></p>
<div class="symple-box gray none" style="text-align:left; width:100%;"> 
<p>#!/usr/bin/python</p>
<p>from sense_hat import SenseHat</p>
<p>sense = SenseHat()</p>
<p>X = [255, 0, 0] # Red<br />
O = [255, 255, 255] # White</p>
<p>question_mark = [<br />
O, O, O, X, X, O, O, O,<br />
O, O, X, O, O, X, O, O,<br />
O, O, O, O, O, X, O, O,<br />
O, O, O, O, X, O, O, O,<br />
O, O, O, X, O, O, O, O,<br />
O, O, O, X, O, O, O, O,<br />
O, O, O, O, O, O, O, O,<br />
O, O, O, X, O, O, O, O<br />
]
<p>sense.set_pixels(question_mark)<br />
</div>
<p><span style="color: #a37acc"><strong>4.1.5. get_pixels</strong></span><br />
64바이트의 RGB정보가 포함된 목록이 리턴됩니다.<br />
픽셀리스트에 담겨진 정보가 RGB565 포맷 즉 R:5, G:6, B:5로 됨에 따라 컬러비트 손실이 발생됨에 유의해야 합니다.</p>
<div class="symple-box gray none" style="text-align:left; width:100%;"> 
<p>#!/usr/bin/python</p>
<p>from sense_hat import SenseHat</p>
<p>sense = SenseHat()<br />
pixel_list = sense.get_pixels()</p>
</div>
<p><span style="color: #a37acc"><strong>4.1.6. set_pixel</strong></span><br />
● 기능 : x, y로 지정된 픽셀의 색좌표를 설정 할 수 있습니다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-sr-금강초롱-9.png" rel="lightbox[31932]"><img class="alignnone size-full wp-image-32153" alt="38 sr 금강초롱 (9)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-sr-금강초롱-9.png" width="541" height="267" /></a></p>
<div class="symple-box gray none" style="text-align:left; width:100%;"> 
<p>from sense_hat import SenseHat</p>
<p>sense = SenseHat()</p>
<p># examples using (x, y, r, g, b) //각각의 좌표와 r,g,b를 넣는 방법<br />
sense.set_pixel(0, 0, 255, 0, 0)<br />
sense.set_pixel(0, 7, 0, 255, 0)<br />
sense.set_pixel(7, 0, 0, 0, 255)<br />
sense.set_pixel(7, 7, 255, 0, 255)</p>
<p>red = (255, 0, 0)<br />
green = (0, 255, 0)<br />
blue = (0, 0, 255)</p>
<p># examples using (x, y, pixel) // 튜플로 엮어서 한방에 넣는 방법이 있음<br />
sense.set_pixel(0, 0, red)<br />
sense.set_pixel(0, 0, green)<br />
sense.set_pixel(0, 0, blue)</p>
</div>
<p><span style="color: #a37acc"><strong>4.1.7. get_pixel</strong></span><br />
● 기능 : 지정된 좌표의 픽셀의 r,g,b 값을 반환합니다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-sr-금강초롱-10.png" rel="lightbox[31932]"><img class="alignnone size-full wp-image-32155" alt="38 sr 금강초롱 (10)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-sr-금강초롱-10.png" width="541" height="106" /></a></p>
<div class="symple-box gray none" style="text-align:left; width:100%;"> 
<p>#!/usr/bin/python</p>
<p>from sense_hat import SenseHat</p>
<p>sense = SenseHat()<br />
top_left_pixel = sense.get_pixel(0, 0)<br />
</div>
<p><span style="color: #a37acc"><strong>4.1.8. load_image</strong></span><br />
● 기능 : 8*8로 구성된 rgb 이미지를 LED 매트릭스에 표시합니다.<br />
rgb로 변환되어 표출된 픽셀값을 반환합니다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-sr-금강초롱-11.png" rel="lightbox[31932]"><img class="alignnone size-full wp-image-32157" alt="38 sr 금강초롱 (11)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-sr-금강초롱-11.png" width="541" height="134" /></a></p>
<div class="symple-box gray none" style="text-align:left; width:100%;"> 
<p>#!/usr/bin/python</p>
<p>from sense_hat import SenseHat</p>
<p>sense = SenseHat()<br />
invader_pixels = sense.load_image(“space_invader.png”, redraw=False)<br />
</div>
<p><span style="color: #a37acc"><strong>4.1.9. clear</strong></span><br />
● 기능 : LED 매트릭스를 단일 색상으로 정리합니다. 기본적으로는 블랭크(아무것도 없는 상태, off)로 만들어 줍니다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-sr-금강초롱-12.png" rel="lightbox[31932]"><img class="alignnone size-full wp-image-32159" alt="38 sr 금강초롱 (12)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-sr-금강초롱-12.png" width="541" height="227" /></a></p>
<div class="symple-box gray none" style="text-align:left; width:100%;"> 
<p>#!/usr/bin/python</p>
<p>from sense_hat import SenseHat<br />
from time import sleep</p>
<p>sense = SenseHat()</p>
<p>red = (255, 0, 0)</p>
<p>sense.clear() # no arguments defaults to off<br />
sleep(1)<br />
sense.clear(red) # passing in an RGB tuple<br />
sleep(1)<br />
sense.clear(255, 255, 255) # passing in r, g and b values of a colour<br />
</div>
<p><span style="color: #a37acc"><strong>4.1.10. show_message</strong></span><br />
● 기능 : 오른쪽에서 왼쪽으로 스크롤되는 텍스트 메시지를 보여줍니다. 배경화면의 색상을 지정해줄 수 있습니다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-sr-금강초롱-13.png" rel="lightbox[31932]"><img class="alignnone size-full wp-image-32161" alt="38 sr 금강초롱 (13)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-sr-금강초롱-13.png" width="541" height="210" /></a></p>
<div class="symple-box gray none" style="text-align:left; width:100%;"> 
<p>#!/usr/bin/python</p>
<p>from sense_hat import SenseHat</p>
<p>sense = SenseHat()<br />
sense.show_message(“One small step for Pi!”, text_colour=[255, 0, 0])<br />
</div>
<p><span style="color: #a37acc"><strong>4.1.11. show_letter</strong></span><br />
● 기능 : LED 매트릭스에 하나의 문자를 표출합니다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-sr-금강초롱-14.png" rel="lightbox[31932]"><img class="alignnone size-full wp-image-32163" alt="38 sr 금강초롱 (14)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-sr-금강초롱-14.png" width="541" height="139" /></a></p>
<div class="symple-box gray none" style="text-align:left; width:100%;"> 
<p>#!/usr/bin/python</p>
<p>import time<br />
from sense_hat import SenseHat</p>
<p>sense = SenseHat()</p>
<p>for i in reversed(range(0,10)):<br />
sense.show_letter(str(i))<br />
time.sleep(1)<br />
</div>
<p><span style="color: #a37acc"><strong>4.1.12. low_light</strong></span><br />
● 기능 : Sense HAT을 어두운 환경에서 사용 시 조도를 낮춰서 사용할 수 있도록 해줍니다.</p>
<div class="symple-box gray none" style="text-align:left; width:100%;"> 
<p>#!/usr/bin/python</p>
<p>import time<br />
from sense_hat import SenseHat</p>
<p>sense = SenseHat()<br />
sense.clear(255, 255, 255)<br />
sense.low_light = True<br />
time.sleep(2)<br />
sense.low_light = False</p>
</div>
<p><strong><span style="color: #a37acc">4.1.13. gamma</span></strong><br />
● 기능 : 고급사용자를 위한 기능입니다. 일반 유저는 위의 low_light 정도만 사용해도 문제가 없습니다.<br />
Sense HAT 파이선API는 리눅스프레임 버퍼로 데이터가 넘어갈 때 565포맷으로 변환을 시키며 이 값이 LED 매트릭스 제어용 MCU인 AtTiny88 AVR로 전달됩니다.<br />
감마테이블이 이 값이 변환되는 과정에 관여하는 것으로서 0~31사이의 값으로 정의되어 있습니다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-sr-금강초롱-15.png" rel="lightbox[31932]"><img class="alignnone size-full wp-image-32165" alt="38 sr 금강초롱 (15)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-sr-금강초롱-15.png" width="541" height="117" /></a></p>
<div class="symple-box gray none" style="text-align:left; width:100%;"> 
<p>#!/usr/bin/python</p>
<p>import time<br />
from sense_hat import SenseHat</p>
<p>sense = SenseHat()<br />
sense.clear(255, 127, 0)</p>
<p>print(sense.gamma) # 현재의 감마 값<br />
time.sleep(2)</p>
<p>sense.gamma = reversed(sense.gamma) # 감마 값을 반전 시켜 봄<br />
print(sense.gamma)<br />
time.sleep(2)</p>
<p>sense.low_light = True # low_light 함수를 적용해봄<br />
print(sense.gamma) # 이때 감마값이 어떻게 변화하는지를 관찰<br />
time.sleep(2)</p>
<p>sense.low_light = False<br />
</div>
<p><span style="color: #a37acc"><strong>4.1.14. gamma_reset</strong></span><br />
● 기능 : 감마 룩업테이블을 원위치 시켜줍니다.</p>
<div class="symple-box gray none" style="text-align:left; width:100%;"> 
<p>#!/usr/bin/python</p>
<p>import time<br />
from sense_hat import SenseHat</p>
<p>sense = SenseHat()<br />
sense.clear(255, 127, 0)<br />
time.sleep(2)<br />
sense.gamma = [0] * 32 # Will turn the LED matrix off<br />
time.sleep(2)<br />
sense.gamma_reset()</p>
</div>
<p><span style="color: #81499e"><strong>4.2. 환경센서(습도, 온도, 기압)용 API(라이브러리)</strong></span><br />
Sense HAT에는 별로 흔치 않은 기압센서가 장착되어져 있습니다.<br />
이 센서를 활용하여 날씨, 고도 등 재미난 어플리케이션을 만들어 볼 수 있을 듯 합니다.<br />
또한 온습도센서는 매우 컴팩트하여 과연 잘 동작 될 수 있을까 의문이 들기도 하지만 라즈베리파이를 활용하여 온실이나 실내 환경제어에도 응용해 볼 수 있는 방법을 제시해 주는데 부족함이 없으리라 봅니다.</p>
<p><span style="color: #a37acc"><strong>4.2.1. get_humidity</strong></span><br />
● 기능 : 습도 센서에서 상대 습도의 비율을 가져옵니다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-sr-금강초롱-16.png" rel="lightbox[31932]"><img class="alignnone size-full wp-image-32167" alt="38 sr 금강초롱 (16)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-sr-금강초롱-16.png" width="541" height="75" /></a></p>
<div class="symple-box gray none" style="text-align:left; width:100%;"> 
<p>#!/usr/bin/python</p>
<p>from sense_hat import SenseHat</p>
<p>sense = SenseHat()<br />
humidity = sense.get_humidity()<br />
print(“Humidity: %s %%rH” % humidity)</p>
<p># alternatives<br />
print(sense.humidity)<br />
</div>
<p><strong><span style="color: #a37acc">4.2.2. get_temperature</span></strong><br />
● 기능 : 습도센서에서 섭씨의 현재 온도 값을 얻어 옵니다.<br />
내부적으로 get_temperature_from_humidity() 함수를 호출함</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-sr-금강초롱-17.png" rel="lightbox[31932]"><img class="alignnone size-full wp-image-32169" alt="38 sr 금강초롱 (17)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-sr-금강초롱-17.png" width="541" height="75" /></a></p>
<div class="symple-box gray none" style="text-align:left; width:100%;"> 
<p>#!/usr/bin/python</p>
<p>from sense_hat import SenseHat</p>
<p>sense = SenseHat()<br />
temp = sense.get_temperature()<br />
print(“Temperature: %s C” % temp)</p>
<p># alternatives<br />
print(sense.temp)<br />
print(sense.temperature)<br />
</div>
<p><span style="color: #a37acc"><strong>4.2.3. get_temperature_from_humidity</strong></span><br />
● 기능 : 습도센서에서 섭씨의 현재 온도 값을 얻어옵니다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-sr-금강초롱-18.png" rel="lightbox[31932]"><img class="alignnone size-full wp-image-32171" alt="38 sr 금강초롱 (18)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-sr-금강초롱-18.png" width="541" height="75" /></a></p>
<div class="symple-box gray none" style="text-align:left; width:100%;"> 
<p>#!/usr/bin/python</p>
<p>from sense_hat import SenseHat</p>
<p>sense = SenseHat()<br />
temp = sense.get_temperature_from_humidity()<br />
print(“Temperature: %s C” % temp)<br />
</div>
<p><span style="color: #a37acc"><strong>4.2.4. get_Temperature_from_pressure</strong></span><br />
● 기능 : 압력 센서에서 섭씨의 현재 온도를 가져옵니다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-sr-금강초롱-19.png" rel="lightbox[31932]"><img class="alignnone size-full wp-image-32173" alt="38 sr 금강초롱 (19)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-sr-금강초롱-19.png" width="541" height="75" /></a></p>
<div class="symple-box gray none" style="text-align:left; width:100%;"> 
<p>#!/usr/bin/python</p>
<p>from sense_hat import SenseHat</p>
<p>sense = SenseHat()<br />
temp = sense.get_temperature_from_pressure()<br />
print(“Temperature: %s C” % temp)<br />
</div>
<p><span style="color: #a37acc"><strong>4.2.5. get_pressure</strong></span><br />
● 기능 : 압력 센서에서 밀리바의 현재 압력을 가져옵니다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-sr-금강초롱-20.png" rel="lightbox[31932]"><img class="alignnone size-full wp-image-32175" alt="38 sr 금강초롱 (20)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-sr-금강초롱-20.png" width="541" height="75" /></a></p>
<div class="symple-box gray none" style="text-align:left; width:100%;"> 
<p>#!/usr/bin/python</p>
<p>from sense_hat import SenseHat</p>
<p>sense = SenseHat()<br />
pressure = sense.get_pressure()<br />
print(“Pressure: %s Millibars” % pressure)</p>
<p># alternatives<br />
print(sense.pressure)<br />
</div>
<p><span style="color: #81499e"><strong>4.3. IMU Sensor API(라이브러리)</strong></span><br />
IMU(관성측정유닛) 센서는 X, Y, Z축을 측정할 수 있는 3종의 센서로 되어 있습니다. 이렇게 3종의 센서를 사용하여 9축의 모션센싱 기능을 수행할 수 있습니다.</p>
<p>· 자이로스코프<br />
· 가속도계<br />
· 지자기센서(나침반)</p>
<p><span style="color: #a37acc"><strong>4.3.1. set_imu_config</strong></span><br />
● 기능 : 자이로스코프, 가속도계, 지자기센서를 활성화시킬지 비활성화시킬지를 설정합니다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-sr-금강초롱-21.png" rel="lightbox[31932]"><img class="alignnone size-full wp-image-32177" alt="38 sr 금강초롱 (21)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-sr-금강초롱-21.png" width="541" height="155" /></a></p>
<div class="symple-box gray none" style="text-align:left; width:100%;"> 
<p>#!/usr/bin/python</p>
<p>from sense_hat import SenseHat</p>
<p>sense = SenseHat()<br />
sense.set_imu_config(False, True, False) # gyroscope only<br />
</div>
<p><span style="color: #a37acc"><strong>4.3.2. get_orientation_radians</strong></span><br />
● 기능 : 피치, 롤, 요축의 정보로부터 라디안을 얻어옵니다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-sr-금강초롱-23.png" rel="lightbox[31932]"><img class="alignnone size-full wp-image-32179" alt="38 sr 금강초롱 (23)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-sr-금강초롱-23.png" width="541" height="88" /></a></p>
<div class="symple-box gray none" style="text-align:left; width:100%;"> 
<p>#!/usr/bin/python</p>
<p>from sense_hat import SenseHat</p>
<p>sense = SenseHat()<br />
orientation_rad = sense.get_orientation_radians()<br />
print(“p: {pitch}, r: {roll}, y: {yaw}”.format(**orientation_rad))</p>
<p># alternatives<br />
print(sense.orientation_radians)</p>
</div>
<p><span style="color: #a37acc"><strong>4.3.3. get_orientation_degrees</strong></span><br />
● 기능 : 피치, 롤, 요축의 정보로부터 각도를 얻어옵니다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-sr-금강초롱-24.png" rel="lightbox[31932]"><img class="alignnone size-full wp-image-32180" alt="38 sr 금강초롱 (24)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-sr-금강초롱-24.png" width="541" height="88" /></a></p>
<div class="symple-box gray none" style="text-align:left; width:100%;"> 
<p>#!/usr/bin/python</p>
<p>from sense_hat import SenseHat</p>
<p>sense = SenseHat()<br />
orientation = sense.get_orientation_degrees()<br />
print(“p: {pitch}, r: {roll}, y: {yaw}”.format(**orientation))</p>
</div>
<p><span style="color: #a37acc"><strong>4.3.4. get_orientation</strong></span><br />
● 기능 : get_orientation_degrees()와 동일한 기능을 수행합니다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-sr-금강초롱-23.png" rel="lightbox[31932]"><img class="alignnone size-full wp-image-32179" alt="38 sr 금강초롱 (23)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-sr-금강초롱-23.png" width="541" height="88" /></a></p>
<div class="symple-box gray none" style="text-align:left; width:100%;"> 
<p>#!/usr/bin/python</p>
<p>from sense_hat import SenseHat</p>
<p>sense = SenseHat()<br />
orientation = sense.get_orientation()<br />
print(“p: {pitch}, r: {roll}, y: {yaw}”.format(**orientation))</p>
<p># alternatives<br />
print(sense.orientation)</p>
</div>
<p><span style="color: #a37acc"><strong>4.3.5. get_compass</strong></span><br />
● 기능 : 자이로스코프와 가속도계가 set_imu_config에서 disable 되면 지자기센서로부터 북쪽방위 정보를 얻어올 수 있습니다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-sr-금강초롱-25.png" rel="lightbox[31932]"><img class="alignnone size-full wp-image-32181" alt="38 sr 금강초롱 (25)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-sr-금강초롱-25.png" width="541" height="74" /></a></p>
<div class="symple-box gray none" style="text-align:left; width:100%;"> 
<p>#!/usr/bin/python</p>
<p>from sense_hat import SenseHat</p>
<p>sense = SenseHat()<br />
north = sense.get_compass()<br />
print(“North: %s” % north)</p>
<p># alternatives<br />
print(sense.compass)<br />
</div>
<p><span style="color: #a37acc"><strong>4.3.6. get_compass_raw</strong></span><br />
● 기능 : 원시 x, y, z축 자력계 데이를 출력합니다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-sr-금강초롱-26.png" rel="lightbox[31932]"><img class="alignnone size-full wp-image-32182" alt="38 sr 금강초롱 (26)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-sr-금강초롱-26.png" width="541" height="88" /></a></p>
<div class="symple-box gray none" style="text-align:left; width:100%;"> 
<p>#!/usr/bin/python</p>
<p>from sense_hat import SenseHat</p>
<p>sense = SenseHat()<br />
raw = sense.get_compass_raw()<br />
print(“x: {x}, y: {y}, z: {z}”.format(**raw))</p>
<p># alternatives<br />
print(sense.compass_raw)<br />
</div>
<p><span style="color: #a37acc"><strong>4.3.7. get_gyroscope</strong></span><br />
● 기능 : set_imu_config에서 지자기센서, 가속도 센서를 사용하지 않도록 하면 자이로스코프 센서를 사용하여 현재 방향정보를 가져올 수 있습니다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-sr-금강초롱-27.png" rel="lightbox[31932]"><img class="alignnone size-full wp-image-32183" alt="38 sr 금강초롱 (27)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-sr-금강초롱-27.png" width="541" height="88" /></a></p>
<div class="symple-box gray none" style="text-align:left; width:100%;"> 
<p>#!/usr/bin/python</p>
<p>from sense_hat import SenseHat</p>
<p>sense = SenseHat()<br />
gyro_only = sense.get_gyroscope()<br />
print(“p: {pitch}, r: {roll}, y: {yaw}”.format(**gyro_only))</p>
<p># alternatives<br />
print(sense.gyro)<br />
print(sense.gyroscope)</p>
</div>
<p><span style="color: #a37acc"><strong>4.3.8. get_gyroscope_raw</strong></span><br />
● 기능 : 원시 x, y, z축 자이로스코프 데이터를 가져옵니다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-sr-금강초롱-28.png" rel="lightbox[31932]"><img class="alignnone size-full wp-image-32184" alt="38 sr 금강초롱 (28)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-sr-금강초롱-28.png" width="541" height="88" /></a></p>
<div class="symple-box gray none" style="text-align:left; width:100%;"> 
<p>#!/usr/bin/python</p>
<p>from sense_hat import SenseHat</p>
<p>sense = SenseHat()<br />
raw = sense.get_gyroscope_raw()<br />
print(“x: {x}, y: {y}, z: {z}”.format(**raw))</p>
<p># alternatives<br />
print(sense.gyro_raw)<br />
print(sense.gyroscope_raw)</p>
</div>
<p><span style="color: #a37acc"><strong>4.3.9. get_accelerometer</strong></span><br />
● 기능 : set_imu_config에서 지자기센서, 자이로스코프를 사용하지 않도록 하면 가속도계만으로 현재 방향 정보를 얻어올 수 있습니다.</p>
<p><del><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-sr-금강초롱-29.png" rel="lightbox[31932]"><img class="alignnone size-full wp-image-32185" alt="38 sr 금강초롱 (29)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-sr-금강초롱-29.png" width="541" height="88" /></a></del></p>
<div class="symple-box gray none" style="text-align:left; width:100%;"> 
<p>#!/usr/bin/python</p>
<p>from sense_hat import SenseHat</p>
<p>sense = SenseHat()<br />
accel_only = sense.get_accelerometer()<br />
print(“p: {pitch}, r: {roll}, y: {yaw}”.format(**accel_only))</p>
<p># alternatives<br />
print(sense.accel)<br />
print(sense.accelerometer))<br />
</div>
<p><span style="color: #a37acc"><strong>4.3.10. get accelerometer_raw</strong></span><br />
● 기능 : x, y, z축의 가속도계 원시데이터를 가져옵니다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-sr-금강초롱-31.png" rel="lightbox[31932]"><img class="alignnone size-full wp-image-32187" alt="38 sr 금강초롱 (31)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-sr-금강초롱-31.png" width="541" height="88" /></a></p>
<div class="symple-box gray none" style="text-align:left; width:100%;"> 
<p>#!/usr/bin/python</p>
<p>from sense_hat import SenseHat</p>
<p>sense = SenseHat()<br />
raw = sense.get_accelerometer_raw()<br />
print(“x: {x}, y: {y}, z: {z}”.format(**raw))</p>
<p># alternatives<br />
print(sense.accel_raw)<br />
print(sense.accelerometer_raw)</p>
</div>
<p><span style="color: #81499e"><strong>4.4. 조이스틱관련 API(라이브러리)</strong></span><br />
조이스틱은 손잡이도 없이 좀 빈약하게 붙어 있습니다.<br />
조이스틱과 관련된 라이브러리는 stick.py에 파이썬으로 짜여져 있습니다.</p>
<p><span style="color: #a37acc"><strong>4.4.1. InputEvent</strong></span><br />
조이스틱의 이벤트는 튜플로 반환되며 아래와 같은 3가지 형태가 있습니다.<br />
· timestamp : 이벤트가 발생한 시간으로, “초”<br />
· direction : 조이스틱이 이동한 방향으로, 문자열로 구성, “up, “down”, left”, right”, “push” 등<br />
· action : 발생한 상황에 대한 문자열 “pressed”, “released”, “held”</p>
<p><span style="color: #a37acc"><strong>4.4.2. wait_for_event</strong></span><br />
● 기능 : 조이스틱 이벤트가 발생할 때까지 대기합니다.</p>
<div class="symple-box gray none" style="text-align:left; width:100%;"> 
<p>#!/usr/bin/python</p>
<p>from sense_hat import SenseHat<br />
from time import sleep</p>
<p>sense = SenseHat()<br />
event = sense.stick.wait_for_event()<br />
print(“The joystick was {} {}”.format(event.action, event.direction))<br />
sleep(0.1)<br />
event = sense.stick.wait_for_event()<br />
print(“The joystick was {} {}”.format(event.action, event.direction))<br />
</div>
<p>조이스틱을 한쪽 방향으로 전환시켜 제대로 동작되는 지를 확인코자 하는 경우의 예제</p>
<div class="symple-box gray none" style="text-align:left; width:100%;"> 
<p>#!/usr/bin/python</p>
<p>from sense_hat import SenseHat<br />
from time import sleep</p>
<p>sense = SenseHat()<br />
event = sense.stick.wait_for_event()<br />
print(“The joystick was {} {}”.format(event.action, event.direction))<br />
sleep(0.1)<br />
event = sense.stick.wait_for_event(emptybuffer=True)<br />
print(“The joystick was {} {}”.format(event.action, event.direction))<br />
</div>
<p><span style="color: #a37acc"><strong>4.4.3. get_events</strong></span><br />
● 기능 : 이벤트의 목록을 튜플로 출력합니다.</p>
<div class="symple-box gray none" style="text-align:left; width:100%;"> 
<p>#!/usr/bin/python</p>
<p>from sense_hat import SenseHat</p>
<p>sense = SenseHat()<br />
while True:<br />
for event in sense.stick.get_events():<br />
print(“The joystick was {} {}”.format(event.action, event.direction))<br />
</div>
<p><span style="color: #a37acc"><strong>4.4.4. direction_up, direction_left, direction_right, direction_down, direction_middle, direction_any</strong></span><br />
● 기능 : 조이스틱을 움직인 방향을 추적하는 이벤트로 활용됩니다.</p>
<div class="symple-box gray none" style="text-align:left; width:100%;"> 
<p>#!/usr/bin/python</p>
<p>from sense_hat import SenseHat, ACTION_PRESSED, ACTION_HELD, ACTION_RELEASED<br />
from signal import pause</p>
<p>x = 3<br />
y = 3<br />
sense = SenseHat()</p>
<p>def clamp(value, min_value=0, max_value=7):<br />
return min(max_value, max(min_value, value))</p>
<p>def pushed_up(event):<br />
global y<br />
if event.action != ACTION_RELEASED:<br />
y = clamp(y &#8211; 1)</p>
<p>def pushed_down(event):<br />
global y<br />
if event.action != ACTION_RELEASED:<br />
y = clamp(y + 1)</p>
<p>def pushed_left(event):<br />
global x<br />
if event.action != ACTION_RELEASED:<br />
x = clamp(x &#8211; 1)</p>
<p>def pushed_right(event):<br />
global x<br />
if event.action != ACTION_RELEASED:<br />
x = clamp(x + 1)</p>
<p>def refresh():<br />
sense.clear()<br />
sense.set_pixel(x, y, 255, 255, 255)</p>
<p>sense.stick.direction_up = pushed_up<br />
sense.stick.direction_down = pushed_down<br />
sense.stick.direction_left = pushed_left<br />
sense.stick.direction_right = pushed_right<br />
sense.stick.direction_any = refresh<br />
refresh()<br />
pause()<br />
</div>
<p>여기까지 라즈베리파이 재단에서 발표한 API를 살펴 봤습니다.<br />
필자가 느끼는 소감은 한마디로 ‘지극정성’이 들어가 있는 프로젝트란 생각이 들 정도입니다. 맛보기가 아니라 이 제품을 활용하여 무엇인가를 실제로 만들어 볼 수 있도록 준비를 다 해 놨습니다.<br />
한걸음 더 나아가 배우고자 하는 사람을 위한 페이지, 가르치고자 하는 페이지를 만들어 줄 정도니 그 정성 대단하다 아니할 수 없을듯합니다.<br />
<strong></strong></p>
<p><span style="color: #800080"><strong>5. API를 활용한 실제 실험 결과</strong></span></p>
<p><span style="color: #81499e"><strong>5.1 실험환경 준비</strong></span><br />
위의 2.2에서 API를 설치하고 나면 다음과 같은 프로그램이 쭉~ 설치가 되어 있습니다. 우선 제대로 된 테스트를 하기위해 몇 가지 사전 준비를 합니다.<br />
인스톨이 끝나고 나면 아래 주소에 파일이 들어가 있습니다.<br />
<span style="text-decoration: underline">/usr/src/sense-hat/examples</span></p>
<p>이 파일 들을 pi의 홈디렉토리로 복사합니다.<br />
<span style="text-decoration: underline">cp /usr/src/sense-hat/examples ~/ -a</span></p>
<p>여기에 소개되어 있는 프로그램들은 C, C++로 짜여져 있으며 각 디렉토리에서 컴파일을 하여야 실행을 해볼 수 있습니다.<br />
컴파일은 간단하여 해당 디렉토리에서 make를 하는 것만으로 간단히 끝납니다.<br />
API간 전체적인 구성은 아래와 같습니다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-sr-금강초롱-32.png" rel="lightbox[31932]"><img class="alignnone size-full wp-image-32188" alt="38 sr 금강초롱 (32)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-sr-금강초롱-32.png" width="541" height="319" /></a></p>
<p><span style="color: #81499e"><strong>5.2. 파이선으로 작성된 기본예제 실험</strong></span><br />
우선 디렉토리를 python-sense-hat으로 이동합니다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-sr-금강초롱-13.jpg" rel="lightbox[31932]"><img class="alignnone size-full wp-image-32160" alt="38 sr 금강초롱 (13)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-sr-금강초롱-13.jpg" width="541" height="72" /></a></p>
<p>컬러 패턴을 보내는 예제와 스네이크바이트의 라즈베리파이향 게임을 하는 장면입니다. 스네이크바이트는 전설과도 같은 게임이라고 생각합니다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-sr-금강초롱-14.jpg" rel="lightbox[31932]"><img class="alignnone size-full wp-image-32162" alt="38 sr 금강초롱 (14)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-sr-금강초롱-14.jpg" width="541" height="283" /></a></p>
<p>다음으로 무지개와 흐르는 문자를 표시해 봤습니다.</p>
<p>화면에 표출되는 영상이 다이나믹디스플레이 방식이므로 사진에 잘 찍히지 않을 수도 있습니다만 육안으로 보는데는 별 지장이 없습니다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-sr-금강초롱-15.jpg" rel="lightbox[31932]"><img class="alignnone size-full wp-image-32164" alt="38 sr 금강초롱 (15)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-sr-금강초롱-15.jpg" width="541" height="281" /></a></p>
<p>실행을 할 때는 아래와 같이 경로가 명확히 지정되어져야 합니다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-sr-금강초롱-16.jpg" rel="lightbox[31932]"><img class="alignnone size-full wp-image-32166" alt="38 sr 금강초롱 (16)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-sr-금강초롱-16.jpg" width="541" height="58" /></a></p>
<p>첫 번째 실험으로 사용한 color_cycle.py는 다음과 같이 짜여져 있음을 알 수 있습니다.</p>
<div class="symple-box gray none" style="text-align:left; width:100%;"> 
<p>pi@raspberrypi:~/examples/python-sense-hat $ cat colour_cycle.py</p>
<p>#!/usr/bin/python<br />
import time<br />
from sense_hat import SenseHat // SenseHat API를 로드한다.<br />
sense = SenseHat()<br />
r = 255<br />
g = 0<br />
b = 0<br />
msleep = lambda x: time.sleep(x / 1000.0)<br />
def next_colour(): // next_colour 라는 함수를 선언한다.<br />
global r<br />
global g<br />
global b<br />
if (r == 255 and g &lt; 255 and b == 0):<br />
g += 1<br />
if (g == 255 and r &gt; 0 and b == 0):<br />
r -= 1<br />
if (g == 255 and b &lt; 255 and r == 0):<br />
b += 1<br />
if (b == 255 and g &gt; 0 and r == 0):<br />
g -= 1<br />
if (b == 255 and r &lt; 255 and g == 0):<br />
r += 1<br />
if (r == 255 and b &gt; 0 and g == 0):<br />
b -= 1<br />
while True: // 실제 실행이 일어나는 부분이다.<br />
sense.clear([r, g, b])<br />
msleep(2)<br />
next_colour() // 위에서 작성한 함수를 호출한다.</p>
<p>pi@raspberrypi:~/examples/python-sense-hat $<br />
</div>
<p><span style="color: #81499e"><strong>5.3. IMU 실험</strong></span><br />
RTIMULib 디렉토리에서 9축 모션센서의 동작 상태를 실험해 볼 수 있습니다. 파이썬 프로그램은 당연히 라이브러리는 위에서 언급한 것으로 짜여져 있습니다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-sr-금강초롱-18.jpg" rel="lightbox[31932]"><img class="alignnone size-full wp-image-32170" alt="38 sr 금강초롱 (18)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-sr-금강초롱-18.jpg" width="541" height="586" /></a></p>
<p>다음으로는 C++언어 기반으로 짜여진 예제입니다.<br />
pi@raspberrypi:~/examples/RTIMULib/RTIMULibDrive로 이동한 후<br />
make를 하면 실행파일인 RTIMULibDrive를 얻을 수 있습니다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-sr-금강초롱-19.jpg" rel="lightbox[31932]"><img class="alignnone size-full wp-image-32172" alt="38 sr 금강초롱 (19)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-sr-금강초롱-19.jpg" width="541" height="346" /></a></p>
<p>실행하는 방법은 파이썬과 동일 합니다.<br />
pi@raspberrypi:~/examples/RTIMULib/RTIMULibDrive $ ./RTIMULibDrive라고 치면 됩니다.<br />
화면 하단부에 Sample rate, roll, pitch, yaw의 값이 보입니다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-sr-금강초롱-20.jpg" rel="lightbox[31932]"><img class="alignnone size-full wp-image-32174" alt="38 sr 금강초롱 (20)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-sr-금강초롱-20.jpg" width="541" height="337" /></a></p>
<p>라즈베리파이를 움직이면 이에 추종하여 롤, 피치, 요 값이 변하는 것을 확인할 수 있습니다. 이 정보를 균형로봇이나 쿼드콥터 등에 응용해 볼 수 있을 것 같습니다.</p>
<p>위 실험의 소스코드는 라이브러리를 이용하는 방식으로 비교적 간단합니다.</p>
<div class="symple-box gray none" style="text-align:left; width:100%;"> 
<p><span style="color: #008000">pi@raspberrypi:~/examples/RTIMULib/RTIMULibDrive $ cat RTIMULibDrive.cpp</span></p>
<p><span style="color: #008000">////////////////////////////////////////////////////////////////////////////</span><br />
<span style="color: #008000"> //</span><br />
<span style="color: #008000"> // This file is part of RTIMULib</span><br />
<span style="color: #008000"> //</span><br />
<span style="color: #008000"> // Copyright (c) 2014-2015, richards-tech, LLC</span><br />
<span style="color: #008000"> //</span><br />
<span style="color: #008000"> // Permission is hereby granted, free of charge, to any person obtaining a copy of</span><br />
<span style="color: #008000"> // this software and associated documentation files (the “Software”), to deal in</span><br />
<span style="color: #008000"> // the Software without restriction, including without limitation the rights to use,</span><br />
<span style="color: #008000"> // copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the</span><br />
<span style="color: #008000"> // Software, and to permit persons to whom the Software is furnished to do so,</span><br />
<span style="color: #008000"> // subject to the following conditions:</span><br />
<span style="color: #008000"> //</span><br />
<span style="color: #008000"> // The above copyright notice and this permission notice shall be included in all</span><br />
<span style="color: #008000"> // copies or substantial portions of the Software.</span><br />
<span style="color: #008000"> //</span><br />
<span style="color: #008000"> // THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,</span><br />
<span style="color: #008000"> // INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A</span><br />
<span style="color: #008000"> // PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT</span><br />
<span style="color: #008000"> // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION</span><br />
<span style="color: #008000"> // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE</span><br />
<span style="color: #008000"> // SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.</span></p>
<p>#include “RTIMULib.h”</p>
<p>int main()<br />
{<br />
int sampleCount = 0;<br />
int sampleRate = 0;<br />
uint64_t rateTimer;<br />
uint64_t displayTimer;<br />
uint64_t now;</p>
<p><span style="color: #008000">// Using RTIMULib here allows it to use the .ini file generated by RTIMULibDemo.</span><br />
<span style="color: #008000"> // Or, you can create the .ini in some other directory by using:</span><br />
<span style="color: #008000"> // RTIMUSettings *settings = new RTIMUSettings(“&lt;directory path&gt;”, “RTIMULib”);</span><br />
<span style="color: #008000"> // where &lt;directory path&gt; is the path to where the .ini file is to be loaded/saved</span></p>
<p>RTIMUSettings *settings = new RTIMUSettings(“RTIMULib”);</p>
<p>RTIMU *imu = RTIMU::createIMU(settings);</p>
<p>if ((imu == NULL) || (imu-&gt;IMUType() == RTIMU_TYPE_NULL)) {<br />
printf(“No IMU found\n”);<br />
exit(1);<br />
}</p>
<p><span style="color: #008000">// This is an opportunity to manually override any settings before the call IMUInit</span><br />
<span style="color: #008000"> // set up IMU</span></p>
<p>imu-&gt;IMUInit();</p>
<p><span style="color: #008000">// this is a convenient place to change fusion parameters</span></p>
<p>imu-&gt;setSlerpPower(0.02);<br />
imu-&gt;setGyroEnable(true);<br />
imu-&gt;setAccelEnable(true);<br />
imu-&gt;setCompassEnable(true);</p>
<p><span style="color: #008000">// set up for rate timer</span></p>
<p>rateTimer = displayTimer = RTMath::currentUSecsSinceEpoch();</p>
<p><span style="color: #008000">// now just process data</span></p>
<p>while (1) {<br />
<span style="color: #008000">// poll at the rate recommended by the IMU</span></p>
<p>usleep(imu-&gt;IMUGetPollInterval() * 1000);</p>
<p>while (imu-&gt;IMURead()) {<br />
RTIMU_DATA imuData = imu-&gt;getIMUData();<br />
sampleCount++;</p>
<p>now = RTMath::currentUSecsSinceEpoch();</p>
<p><span style="color: #008000">// display 10 times per second</span></p>
<p>if ((now &#8211; displayTimer) &gt; 100000) {<br />
printf(“Sample rate %d: %s\r”, sampleRate, RTMath::displayDegrees(“”, imuData.fusionPose));<br />
fflush(stdout);<br />
displayTimer = now;<br />
}</p>
<p><span style="color: #008000">// update rate every second</span></p>
<p>if ((now &#8211; rateTimer) &gt; 1000000) {<br />
sampleRate = sampleCount;<br />
sampleCount = 0;<br />
rateTimer = now;<br />
}<br />
}<br />
}<br />
}</p>
<p>pi@raspberrypi:~/examples/RTIMULib/RTIMULibDrive $<br />
</div>
<p><span style="color: #800080"><strong>6. 마무리</strong></span></p>
<p>Sense HAT은 라즈베리파이재단에서 Astro Pi Mission의 일부로 제작되어 실제 우주정거장에 보내진 제품입니다. 아래 사진 속 QR코드로 확인 가능합니다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/Cap-2016-12-08-11-17-15-048.jpg" rel="lightbox[31932]"><img class="alignnone size-large wp-image-32194" alt="Cap 2016-12-08 11-17-15-048" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/Cap-2016-12-08-11-17-15-048-620x363.jpg" width="620" height="363" /></a></p>
<p>그래서 그런지도 모르겠습니다만 매우 정성이 들어간 설명이 존재하고, 예제프로그램과 API 역시 섬세하게 만들어졌음을 알 수 있었습니다.<br />
학교 등 교육기관에서 컴퓨터 프로그래밍과 센서가 융복합된 과제와 학습을 진행하는데 더할 나위 없이 좋은 제품이 아닐까하는 생각이 듭니다.<br />
위에서도 언급을 한 바가 있습니다만, Sense HAT을 가르치는 자를 위한 별도의 페이지와 Sense HAT을 배우고자하는 이를 위한 페이지 그리고 Sense HAT을 활용하여 창의적인 무엇인가를 해보는 프로젝트를 위한 페이지로 구성된 것 자체가 필자에게는 적잖은 신선함으로 다가왔습니다.<br />
마치 모범답안을 보는 그런 느낌마저 들었습니다.<br />
더군다나 라즈베리파이보드와 Sense HAT이 없이도 학습을 해 볼 수 있는 시뮬레이션 웹싸이트까지 준비해 놓고 있으므로, 이 정도면 제대로 준비해두었다 아니할 수 없을 듯합니다.<br />
이번 리뷰를 진행하는 기간 동안 극강(?)의 회사업무와 숨이 막히는 폭염이 겹쳐서 살짝 고전은 하였습니다만, 이런 훌륭한 제품을 접할 기회가 있었다는 점 하나만으로도 충분히 보람있는 시간이 아니었나 생각됩니다.<br />
다음 편에서는 라즈베리파이와 아두이노의 한계를 뛰어넘는 강력한 컴퓨팅파워를 자랑하는 ‘LattePanda’ 최신형보드에 대해 집중적으로 살펴보려 합니다.<br />
감사합니다.</p>
<p><span style="color: #800080"><strong>7. 참고자료</strong></span><br />
1. 라즈베리파이 가이드<br />
<a href="https://www.raspberrypi.org/learning/astro-pi-guide/" target="_blank">https://www.raspberrypi.org/learning/astro-pi-guide/</a><br />
2. API레퍼런스<br />
<a href="http://pythonhosted.org/sense-hat/api/" target="_blank">http://pythonhosted.org/sense-hat/api/</a><br />
3. 파이선에서 지원하는 센스헷 설치 페이지<br />
<a href="https://pythonhosted.org/sense-hat/" target="_blank">https://pythonhosted.org/sense-hat/</a><br />
4. 센스햇 예제<br />
<a href="https://github.com/RPi-Distro/python-sense-hat/blob/master/examples/README.md" target="_blank">https://github.com/RPi-Distro/python-sense-hat/blob/master/examples/README.md</a><br />
5. 아스트로파이 페이지의 예제프로그램<br />
<a href="https://astro-pi.org/get-involved/program-the-sense-hat/python/" target="_blank">https://astro-pi.org/get-involved/program-the-sense-hat/python/</a><br />
6. 원디하나님 블로그<br />
<a href="http://windy.luru.net/1863" target="_blank">http://windy.luru.net/1863</a><br />
7. 우주정거장 실험 관련 영상물<br />
<a href="https://astro-pi.org/updates/coding-challenges-update/" target="_blank">https://astro-pi.org/updates/coding-challenges-update/</a><br />
8. Sense HAT 시뮬레이터 주소<br />
<a href="//www.raspberrypi.org/learning/getting-started-with-the-sense-hat/worksheet/" target="_blank">https://www.raspberrypi.org/learning/getting-started-with-the-sense-hat/worksheet/</a></p>
<p>&nbsp;</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-sr-금강초롱-33.png" rel="lightbox[31932]"><img class="alignnone  wp-image-32189" alt="38 sr 금강초롱 (33)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-sr-금강초롱-33.png" width="430" height="197" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.ntrexgo.com/archives/31932/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[38호]카멜레온 DIY LED 이야기 ④</title>
		<link>http://www.ntrexgo.com/archives/31927</link>
		<comments>http://www.ntrexgo.com/archives/31927#comments</comments>
		<pubDate>Sun, 25 Sep 2016 04:35:02 +0000</pubDate>
		<dc:creator>디바이스마트 매거진</dc:creator>
				<category><![CDATA[디바이스마트 매거진]]></category>
		<category><![CDATA[특집]]></category>
		<category><![CDATA[38호]]></category>
		<category><![CDATA[diy]]></category>
		<category><![CDATA[LED]]></category>
		<category><![CDATA[Projects to build]]></category>
		<category><![CDATA[디바이스마트]]></category>
		<category><![CDATA[매거진]]></category>

		<guid isPermaLink="false">http://www.ntrexgo.com/?p=31927</guid>
		<description><![CDATA[디바이스마트 매거진 38호 &#124; 카멜레온 DIY LED를 실제 생활에 적용하여 만들 수 있는 다양한 작품을 만들어 보는 시간을 준비해 보았습니다. ]]></description>
				<content:encoded><![CDATA[<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/08/38-PTB-39.jpg" rel="lightbox[31927]"><img class="alignnone size-large wp-image-32414" alt="38 PTB (39)" src="http://www.ntrexgo.com/wp-content/uploads/2016/08/38-PTB-39-620x229.jpg" width="620" height="229" /></a></p>
<p>&nbsp;</p>
<p><span style="font-size: large"><strong>카멜레온 DIY LED 이야기 4</strong></span></p>
<p><strong><span style="font-size: xx-large">LED ART 1 : I ♥ U와 변색 카멜레온</span></strong></p>
<p>&nbsp;</p>
<p style="text-align: right">글 | 신상석 ssshin@jcnet.co.kr</p>
<p style="text-align: right">
<table style="background-color: #e2e2e2;;width: 620px" border="0" cellspacing="0" cellpadding="10">
<tbody>
<tr>
<td>디바이스마트 매거진 독자 여러분, 안녕하세요. 앞으로 5회에 걸쳐 [카멜레온 DIY LED 이야기]를 진행할 신상석입니다.<br />
이 이야기는 WS2812B라는 컬러 LED를 기반으로 제작된 [카멜레온 DIY LED] 시리즈를 이용하여 생활에 필요한 다양한 형상을 꾸며보고 이것을 다양한 컬러로 디스플레이 해보는 내용입니다. 앞으로 진행할 내용에 대하여 간단히 알아보면 다음과 같습니다. (약간 변경될 수도 있습니다.)<br />
앞으로 즐겁고 유익한 강의가 될 수 있도록 많은 격려와 성원 부탁드립니다.</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<p>디바이스마트매거진 독자 여러분, 안녕하세요. 반갑습니다.<br />
[카멜레온 DIY LED 이야기] 네번째 시간입니다.<br />
아, 참, 그리고 앞으로는 [카멜레온 DIY LED] 대신 줄인 말로 [카DL]을 주로 사용할까 합니다. 아무래도 3글자가 편하겠죠?<br />
그러면, 기본 준비물부터 챙겨 보도록 하지요. GO~</p>
<p><span style="color: #0000ff"><strong>직선(BAR) 모듈과 곡선(ARC) 모듈</strong></span></p>
<p>카DL의 기본 구성품은 그리 많지는 않지만, 직선과 곡선, 방향자, 기본 도형을 가지고 있어서 똑같지는 않지만 비슷한 정도로는 어떤 형상이든 모두 구현이 가능합니다. 왜냐하면 임의의 형상은 이것을 이루는 직선과 곡선의 조합으로 표현이 가능하기 때문입니다. 물론, 정밀도에서는 조금 차이가 날 것이므로 완전 똑같게는 안되겠지만 잘만 만들면 상당히 비슷하게 됩니다.<br />
카DL은 직선(BAR) 형태로 다음의 6가지 모듈을 제공합니다. 실제로 JLED-BAR-1만으로도 구성은 가능하겠지만 이렇게 되면 너무나 많은 연결이 필요하므로 길이가 다른 6가지 모듈을 제공하여 사용의 편의성을 제공하고 있습니다. 이 6가지 모듈은 길이가 각각 1, 2, 3, 4, 5, 10cm 로 설계되어 있어 연결된 형상의 크기를 매우 쉽게 예측할 수 있는 것도 장점입니다. 급할 때는 자 대용으로도 사용이 가능하지요.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/08/38-PTB-1.jpg" rel="lightbox[31927]"><img class="alignnone size-full wp-image-32376" alt="38 PTB (1)" src="http://www.ntrexgo.com/wp-content/uploads/2016/08/38-PTB-1.jpg" width="517" height="286" /></a></p>
<p>기본 직선(BAR) 모듈에 대응하여 카DL이 제공하는 기본 곡선(ARC) 모듈은 다음의 12가지 모듈입니다. 곡선의 경우는 원의 일부인 원호에 해당되는 부분을 제공하는데 모든 원호에 대하여 제공할 수는 없으므로 대표적인 3가지 다른 곡률을 가진 원을 정하여 제공합니다. 개수는 3개가 연속된 것과 4개가 연속된 것의 2종류를 제공하고, 방향성에 따라 UP, DOWN의 2종류로 나누어 제공하므로, 총 3 x 2 x 2 = 12 가지가 기본 모듈이 됩니다. (방향은 왼쪽이 IN, 오른쪽이 OUT입니다.)</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/08/38-PTB-2.jpg" rel="lightbox[31927]"><img class="alignnone size-full wp-image-32377" alt="38 PTB (2)" src="http://www.ntrexgo.com/wp-content/uploads/2016/08/38-PTB-2.jpg" width="517" height="466" /></a><br />
모듈의 이름은 이 원호 모듈을 이용하여 원을 만들 경우, 사용되는 총 LED의 개수와 모듈이 포함한 원의 개수, 그리고 방향을 포함하여 만들어집니다. JLED-ARC12-D3 모듈을 예로 들면, 이 모듈은 LED 3개로 이루어진 DOWN(D) 방향의 LED로, LED가 총12개(이 모듈 4개)가 모이면 아래와 같이 원(지름 약 40mm 정도)이 되는 모듈입니다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/08/38-PTB-3.jpg" rel="lightbox[31927]"><img class="alignnone size-full wp-image-32378" alt="38 PTB (3)" src="http://www.ntrexgo.com/wp-content/uploads/2016/08/38-PTB-3.jpg" width="517" height="348" /></a><br />
여러 개의 서로 다른 원호 모듈을 이용하면 부드러운 곡선을 표현할 수 있는데, 예를 들어 아래와 같은 지렁이 형상을 만들 수 있습니다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/08/38-PTB-4.jpg" rel="lightbox[31927]"><img class="alignnone size-full wp-image-32379" alt="38 PTB (4)" src="http://www.ntrexgo.com/wp-content/uploads/2016/08/38-PTB-4.jpg" width="517" height="311" /></a><br />
오, 그러면 직선(BAR) 모듈과 곡선(ARC) 모듈을 함께 섞어서 사용한다면 여러가지 임의의 형상을 만들 수도 있겠네요. 예. 맞습니다. 동물도 만들 수 있고, 글자도 만들 수 있고, 메뚜기도 만들 수 있고, 조금은 어렵겠지만 뽀로로도 만들 수 있겠습니다. 아래는 몇가지 예입니다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/08/38-PTB-5.jpg" rel="lightbox[31927]"><img class="alignnone size-full wp-image-32380" alt="38 PTB (5)" src="http://www.ntrexgo.com/wp-content/uploads/2016/08/38-PTB-5.jpg" width="517" height="426" /></a><br />
너무 오래 설명만 하면 재미가 없으니까 다른 모듈이 더 필요해지면 그 때 가서 또 설명하기로 하고, 우리의 1단계 목표인 [I ♥ U] 제작에 들어가 봅시다.</p>
<p><span style="color: #0000ff"><strong>I ♥ U</strong></span></p>
<p><span style="color: #3366ff"><strong>1단계 : 형상 설계하기</strong></span><br />
제작을 하기 위하여 가장 먼저 해야 할 일은 규격을 정하는 것입니다. 아래와 같은 사항을 정해 놓고 시작하는 것이 좋겠습니다.<br />
첫번째로 결정해야 할 것은 형상입니다. 무엇을 만들지, 어떤 형상으로 만들지를 정해야 합니다. 우리는 이미 정했죠! [I ♥ U] 형태로 가로로 길게 만드는 것으로 하겠습니다.</p>
<p>두번째로 결정해야 할 것은 용도입니다. 어떤 용도로 어느 장소에 설치할 것인가? 소품 형태로 어떤 곳에 놓아도 되는 형태로 만들 것인지, 벽이나 유리창에 간판처럼 붙여놓을 것인지 등이지요. 일단 우리는 휴대용 소품으로 들고 다닐 수 있는 투명 아크릴 박스 형태로 꾸며보기로 하지요. 아크릴 박스 형태는 온라인 아크릴 전문점에서 다양한 크기의 박스 형태를 구입할 수 있습니다.</p>
<p>세번째는 크기가 되겠습니다. 용도에 알맞게 하기 위하여 크기를 결정하기도 하지만 크기는 소요되는 비용과도 어느 정도의 비례하므로 이것도 고려 대상이 됩니다. 크기가 너무 크면 비용이 많이 들 뿐만 아니라, 전원 공급이나 고정 방법 등에서도 제약을 받을 수 있습니다. 그렇다고 너무 작으면 원하는 형상을 표현하는데 어려움이 따르거나 형상이 부자연스러워질 수도 있으므로 알맞은 크기를 선택하여야 합니다. 우리는 비용은 적게 들면서도 형상은 또렷하게 나타낼 수 있는 정도의 크기로 전체 크기가 25cm (가로) X 10cm (세로) X 7cm (두께) 정도의 아크릴박스에 들어가는 정도로 하겠습니다. (사실은 미리 생각해서 준비한 박스입니다.)</p>
<p>마지막으로 해야 할 일은 디자인입니다. 디자인을 하기 위하여는 일단, 카DL이 제공하는 모든 형상을 알고 이것을 선택적으로 사용하여 디자인하는 것이 좋습니다. 디자인은 사실 제작하는 사람의 취향이나 능력에 따라 조금씩 달라질 수 있습니다. 디자인 감각이 있는 사람은 좀 더 예쁘고 세련되게 만들 수 있을 것이고, 그렇지 않은 사람은 약간은 어색하거나 투박한 형상으로 만들 가능성이 높겠지요. 제가 사용할 디자인은 제이씨넷 [신승현]님이 만들어 준 것인데 8cm X 8cm 사각형을 기준으로 아래와 같이 디자인하였습니다. 직선(BAR) 모듈과 곡선(ARC) 모듈을 다양하게 사용하였고, 방향자 모듈도 사용한 것이 보입니다. 제가 보기에는 디자인이 꽤 괜찮습니다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/08/38-PTB-6.jpg" rel="lightbox[31927]"><img class="alignnone size-full wp-image-32381" alt="38 PTB (6)" src="http://www.ntrexgo.com/wp-content/uploads/2016/08/38-PTB-6.jpg" width="517" height="171" /></a></p>
<p>영문자 I 와 U는 카DL 모듈이 가능한 직접 연결이 될 수 있도록 하면 누가 디자인해도 거의 이런 모양으로 나올 것 같고, 하트(♥)는 사람마다 다르게 디자인할 것 같은데, 이런 경우 2가지 사항은 꼭 고려하면서 디자인하셔야 합니다. 하나는 LED의 모양 및 배치입니다. 카DL에 실제로 전원이 들어와서 불이 켜질 때의 모습을 상상하여 원하는 모습으로 나타날 수 있도록 모듈을 선택하고 배치하는 것이 중요합니다. 실제로 동작하는 것은 LED 불빛이므로 아래와 같이 카DL의 동그란 LED를 색칠해 본 후 이것이 괜찮게 보이는지를 판단해 보는 것이 하나의 방법입니다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/08/38-PTB-7.jpg" rel="lightbox[31927]"><img class="alignnone size-full wp-image-32382" alt="38 PTB (7)" src="http://www.ntrexgo.com/wp-content/uploads/2016/08/38-PTB-7.jpg" width="517" height="171" /></a></p>
<p>다른 하나는 연결성입니다. 형상 때문에 어쩔 수 없이 연결이 직접적으로 될 수 없는 부분이 생기게 되는데 이런 상황이 가능한 적게 생기도록(즉, 직접 연결이 가능한 많아지도록) 디자인하는 것이 중요합니다. 왜냐하면 직접 연결은 간단한 커넥터(JLED-CON-0)로만 쉽게 연결되기 때문입니다. 또한, 모서리 부분은 카DL의 직선(BAR) 모듈과 곡선(ARC) 모듈만으로는 표현하기 어려운 부분이 있을 수 있으므로 필요에 따라 방향자(DIR) 모듈이나 도형(FIGURE) 모듈도 섞어서 사용하면 좀 더 자연스러운 형상을 만들 수 있습니다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/08/38-PTB-8.jpg" rel="lightbox[31927]"><img class="alignnone size-full wp-image-32383" alt="38 PTB (8)" src="http://www.ntrexgo.com/wp-content/uploads/2016/08/38-PTB-8.jpg" width="517" height="253" /></a></p>
<p>아, 참, 방향자(DIR) 모듈은 위에서 설명을 하지 않았죠. 카멜레온 DIY LED는 모서리의 직접 연결을 위하여 아래와 같은 6가지 방향자(DIR)를 제공합니다. 이것은 UP 또는 DOWN 방향으로 각각 45도, 90도, 135도 방향 전환 시 사용할 수 있으며, 가끔씩은 도형적인 의미로도 사용됩니다.<br />
위 하트 모양에서는 오른쪽과 같이 동그라미로 표시된 부분에 안성맞춤으로 사용이 되었네요.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/08/38-PTB-9.jpg" rel="lightbox[31927]"><img class="alignnone size-full wp-image-32384" alt="38 PTB (9)" src="http://www.ntrexgo.com/wp-content/uploads/2016/08/38-PTB-9.jpg" width="182" height="182" /></a></p>
<p><span style="color: #3366ff"><strong>2단계 : 형상 제작하기</strong></span><br />
자, 이제 설계(디자인)가 완료되었으니 구현할 차례입니다. 일반적으로 카DL을 구현하는 방법은 하나의 골판지 또는 폼보드 등을 밑판으로 하여 카DL을 관통하여 모양을 잡고, 뒤쪽에서 커넥터와 케이블을 이용하여 고정시키는 방법이 가장 편하고 쉽습니다. 도화지, 아트지, 스티로폼, 책받침과 같은 얇은 플라스틱 등등 상당히 많은 다양한 재료를 사용하여 보았지만, 현재까지는 2mm 두께의 폼보드가 가장 편리하고, 그 다음으로는 1mm 정도 두께의 골판지가 편리한 것으로 보입니다. 조립할 때 한가지 주의해야 할 것은 카DL은 방향성이 있으므로 신호선의 IN과 OUT 방향을 잘 보고 연결해야 한다는 점입니다. 각 모듈의 V(+5V)와 G(GND) 신호는 동일한 신호끼리 연결하여야 하는 것은 물론, 앞 모듈의 O(Data Out)핀은 반드시 다음에 연결할 모듈의 I(Data In)핀에 연결해야만 카DL 전체 형상이 정상적으로 동작할 수 있습니다.<br />
그러면, 이제 실제로 골판지를 밑판으로 사용하여 순서대로 제작해 보겠습니다.</p>
<p>(1) 검정색 골판지를 가로 239mm, 세로 94mm의 사각형으로 자릅니다. (아크릴 두께가 있어 양쪽으로 3mm씩은 여유를 둡니다.)</p>
<p>(2) 카DL을 모양에 맞추어 골판지 위에 원하는 형태로 놓아 봅니다. (뒤집어 놓으면 균형을 잘 잡을 수 있습니다.)</p>
<p>(3) 카DL을 조립합니다. 방향성을 잘 확인하고, 위치를 잘 잡아가며 조립하여야 자신이 원하는 형태가 되므로 주의하여야 합니다. 특히 2개의 카DL이 직접 연결되는 부분은 정확하게 연결되도록 위치를 잘 잡아서 조립하여야 나중에 커넥터(JLED-CON-0)를 쉽게 연결할 수 있습니다. 한편, 카DL은 연결 핀이 뾰족하게 나와 있어 골판지를 관통하여 조립할 때 매우 조심하여야 합니다. 잘못하면 연결 핀에 손이 찔려 상처가 날 수도 있습니다.</p>
<p>(4) 골판지를 뒤로 돌려서, 직접 연결되는 카DL은 JLED-CON-0를 이용하여 연결하고(JLED-CON-0는 2핀 점퍼 3개를 동시에 각각 연결하는 형태인 2&#215;3 점퍼임) 직접 연결되지 않는 카DL은 JLED-CABLE3-MM10 또는 JLED-CABLE3-MM20 케이블을 이용하여 연결합니다. 이 때 전원 및 데이터 신호가 서로 일치하도록 방향성을 확인하면서 연결해야 합니다. (V-V, O-I, G-G가 연결되도록 함)</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/08/38-PTB-10.jpg" rel="lightbox[31927]"><img class="alignnone size-full wp-image-32385" alt="38 PTB (10)" src="http://www.ntrexgo.com/wp-content/uploads/2016/08/38-PTB-10.jpg" width="517" height="262" /></a></p>
<p>&nbsp;</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/08/38-PTB-11.jpg" rel="lightbox[31927]"><img class="alignnone size-full wp-image-32386" alt="38 PTB (11)" src="http://www.ntrexgo.com/wp-content/uploads/2016/08/38-PTB-11.jpg" width="517" height="244" /></a></p>
<p>&nbsp;</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/08/38-PTB-12.jpg" rel="lightbox[31927]"><img class="alignnone size-full wp-image-32387" alt="38 PTB (12)" src="http://www.ntrexgo.com/wp-content/uploads/2016/08/38-PTB-12.jpg" width="517" height="244" /></a></p>
<p>&nbsp;</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/08/38-PTB-13.jpg" rel="lightbox[31927]"><img class="alignnone size-full wp-image-32388" alt="38 PTB (13)" src="http://www.ntrexgo.com/wp-content/uploads/2016/08/38-PTB-13.jpg" width="517" height="246" /></a></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><strong style="color: #3366ff">3단계 : 아두이노 연결하기</strong></p>
<p>이제 만들어진 형상을 제어하기 위하여 아두이노를 연결하도록 하겠습니다. 아두이노는 일반적으로 가장 많이 사용하는 아두이노 UNO를 사용해도 되지만, 우리는 제어기를 아크릴박스에 넣어서 휴대용으로 제작하려 하므로, 크기가 작고 가격이 저렴한 아두이노를 선택하는 것이 좋겠습니다. 아두이노 NANO도 좋고, 아두이노 Pro Micro 등 어떤 것도 좋은데, 여기서는 기왕이면 크기가 엄지 손가락 크기로 가장 작고 가격도 상대적으로 저렴한 아두이노 Pro Micro(아두이노 Leonardo의 소형 버전)를 사용하는 것으로 하겠습니다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/08/38-PTB-14.jpg" rel="lightbox[31927]"><img class="alignnone size-full wp-image-32389" alt="38 PTB (14)" src="http://www.ntrexgo.com/wp-content/uploads/2016/08/38-PTB-14.jpg" width="517" height="193" /></a></p>
<p>아두이노 Pro Micro는 납땜이 되지 않은 상태의 것이 많은데 아래와 같은 핀 배열을 가지고 있습니다. 카DL과 연결할 신호는 VCC와 GND, 데이터 1포트이므로, 연결하기 쉽게 빨강색 네모 박스의 신호를 연결하도록 하겠습니다. 데이터신호로 A3 신호를 사용하는 것이지요. (아날로그 핀은 디지털핀으로도 사용 가능합니다.) 좀 더 편리하게 사용하려면 이 3핀의 신호를 터미널블록으로 처리한 카DL 전용 아두이노인 JARDUINO-PROMICRO-1을 사용하는 것도 방법입니다. (여기서는 이것을 사용하겠습니다.)</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/08/38-PTB-15.jpg" rel="lightbox[31927]"><img class="alignnone size-full wp-image-32390" alt="38 PTB (15)" src="http://www.ntrexgo.com/wp-content/uploads/2016/08/38-PTB-15.jpg" width="517" height="256" /></a></p>
<p>JARDUINO-PROMICRO-1의 3핀을 카DL 형상의 첫번째 모듈의 입력과 연결하면 되는데, 이 때 JLED-START-1을 아두이노와 카DL 첫번째 모듈 사이에 삽입하는 것이 좋습니다. JLED-START-1은 카DL 모듈을 여러 개 연결하거나 장시간 사용하는 경우 전체 모듈의 안정성을 위하여 제어기(아두이노)와 카DL 첫번째 모듈 사이에 장착하는 안정화 모듈로 안정화를 위한 대용량 커패시터와 저항을 내장하고 있습니다. 신호선 연결은 일반적인 카DL 모듈과 동일하게 연결합니다. (V-V, O-I, G-G)</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/08/38-PTB-16.jpg" rel="lightbox[31927]"><img class="alignnone size-full wp-image-32391" alt="38 PTB (16)" src="http://www.ntrexgo.com/wp-content/uploads/2016/08/38-PTB-16.jpg" width="508" height="321" /></a></p>
<p><span style="color: #3366ff"><strong>4단계 : 아두이노 스케치 프로그램하기</strong></span><br />
하드웨어는 모두 완성되었으므로, 이제는 스케치 프로그램만 작성하면 될 것 같습니다. 자신이 원하는 형태로 [I ♥ U]가 움직이도록 프로그램을 작성해 보시지요. 지난 시간에 라이브러리를 이용하는 방법을 익혔으므로 너무 어렵게 생각하지 말고 일단 지난번 배운 라이브러리만을 이용하여 구현해 보겠습니다. 한가지 예로 지난 회에서 언급하였던 Adafruits 프로그램 중 strandtest 프로그램을 데이터 핀 번호와 LED 개수, 그리고 색상과 delay 시간 등만 아주 조금 바꾸고 그대로 실행시켜 보겠습니다. 설명은 프로그램 내의 주석을 참조하시기 바랍니다.</p>
<div class="symple-box gray none" style="text-align:left; width:100%;"> 
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br />
#include &lt;Adafruit_NeoPixel.h&gt;<br />
#include &lt;avr/power.h&gt;</p>
<p>#define PIN A3 // JARDUINO-PROMICRO-1 사용으로 데이터 핀은 A3</p>
<p>Adafruit_NeoPixel strip = Adafruit_NeoPixel(53, PIN, NEO_GRB + NEO_KHZ800); // [I ♥ U] LED 갯수 = 53</p>
<p>void setup() {<br />
strip.begin();<br />
strip.show();<br />
}<br />
void loop() {<br />
colorWipe(strip.Color(255, 0, 0), 20); // 빨강색으로 하나씩 순서대로 채우기<br />
colorWipe(strip.Color(0, 255, 0), 20); // 녹색으로 하나씩 순서대로 채우기<br />
colorWipe(strip.Color(0, 0, 255), 20); // 파랑색으로 하나씩 순서대로 채우기</p>
<p>theaterChase(strip.Color(127, 127, 0), 20); // 노랑색(Yellow) 사이키 조명 디스플레이<br />
theaterChase(strip.Color( 0, 127, 127), 20); // 심홍색(Magenta) 사이키 조명 디스플레이<br />
theaterChase(strip.Color(127, 0, 127), 20); // 청록색(Cyan) 사이키 조명 디스플레이<br />
theaterChase(strip.Color(127, 127, 127), 20); // 흰색(White) 사이키 조명 디스플레이</p>
<p>rainbow(20); // // 전체가 같은 색으로 동시에 변하면서 디스플레이<br />
rainbowCycle(20); // // 전체가 다르게 다양한 색으로 변하면서 디스플레이<br />
theaterChaseRainbow(20); // // 다양한 색으로 변하면서 사이키 조명 디스플레이<br />
}</p>
<p>// 하나씩 순서대로 채우기 함수<br />
void colorWipe(uint32_t c, uint8_t wait) {<br />
for(uint16_t i=0; i&lt;strip.numPixels(); i++) {<br />
strip.setPixelColor(i, c);<br />
strip.show();<br />
delay(wait);<br />
}<br />
}</p>
<p>// 전체가 같은 색으로 동시에 변하면서 디스플레이하는 함수<br />
void rainbow(uint8_t wait) {<br />
uint16_t i, j;</p>
<p>for(j=0; j&lt;256; j++) {<br />
for(i=0; i&lt;strip.numPixels(); i++) {<br />
strip.setPixelColor(i, Wheel((i+j) &amp; 255));<br />
}<br />
strip.show();<br />
delay(wait);<br />
}<br />
}</p>
<p>// 전체가 다르게 다양한 색으로 변하면서 디스플레이하는 함수<br />
void rainbowCycle(uint8_t wait) {<br />
uint16_t i, j;</p>
<p>for(j=0; j&lt;256*5; j++) { // 5 cycles of all colors on wheel<br />
for(i=0; i&lt; strip.numPixels(); i++) {<br />
strip.setPixelColor(i, Wheel(((i * 256 / strip.numPixels()) + j) &amp; 255));<br />
}<br />
strip.show();<br />
delay(wait);<br />
}<br />
}</p>
<p>// 한가지 색의 사이키 조명 디스플레이<br />
void theaterChase(uint32_t c, uint8_t wait) {<br />
for (int j=0; j&lt;10; j++) { //do 10 cycles of chasing<br />
for (int q=0; q &lt; 3; q++) {<br />
for (int i=0; i &lt; strip.numPixels(); i=i+3) {<br />
strip.setPixelColor(i+q, c); //turn every third pixel on<br />
}<br />
strip.show();</p>
<p>delay(wait);</p>
<p>for (int i=0; i &lt; strip.numPixels(); i=i+3) {<br />
strip.setPixelColor(i+q, 0); //turn every third pixel off<br />
}<br />
}<br />
}<br />
}</p>
<p>// 다양한 색으로 변하면서 사이키 조명 디스플레이<br />
void theaterChaseRainbow(uint8_t wait) {<br />
for (int j=0; j &lt; 256; j++) { // cycle all 256 colors in the wheel<br />
for (int q=0; q &lt; 3; q++) {<br />
for (int i=0; i &lt; strip.numPixels(); i=i+3) {<br />
strip.setPixelColor(i+q, Wheel( (i+j) % 255)); //turn every third pixel on<br />
}<br />
strip.show();</p>
<p>delay(wait);</p>
<p>for (int i=0; i &lt; strip.numPixels(); i=i+3) {<br />
strip.setPixelColor(i+q, 0); //turn every third pixel off<br />
}<br />
}<br />
}<br />
}</p>
<p>// 0~255까지의 값을 전달하면 4 바이트 컬러값을 리턴하는 함수<br />
// 임의의 고르게 분포된 컬러값을 생성하기 위하여 사용<br />
uint32_t Wheel(byte WheelPos) {<br />
WheelPos = 255 &#8211; WheelPos;<br />
if(WheelPos &lt; 85) {<br />
return strip.Color(255 &#8211; WheelPos * 3, 0, WheelPos * 3);<br />
} else if(WheelPos &lt; 170) {<br />
WheelPos -= 85;<br />
return strip.Color(0, WheelPos * 3, 255 &#8211; WheelPos * 3);<br />
} else {<br />
WheelPos -= 170;<br />
return strip.Color(WheelPos * 3, 255 &#8211; WheelPos * 3, 0);<br />
}<br />
}<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-</p>
</div>
<p>&nbsp;</p>
<p><span style="color: #3366ff"><strong>5단계 : 업로드하고 실행시키기</strong></span><br />
이제 프로그램까지 준비가 되었으니 업로드하고 실행시켜 볼 차례입니다. 한가지 주의하여야 할 것은 앞에서도 언급했듯이 아두이노 Pro Micro는 아두이노 Leonardo의 소형 버전이므로, 업로드시 스케치 프로그램의 [보드] 선택 항목을 “UNO”가 아닌 “Leonardo”로 선택하여야 하는 것입니다. 나머지 업로드 방법은 일반적인 아두이노와 동일합니다.<br />
아래에 업로드 된 프로그램이 실행되는 예를 몇 가지 보였습니다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/08/38-PTB-17.jpg" rel="lightbox[31927]"><img class="alignnone size-full wp-image-32392" alt="38 PTB (17)" src="http://www.ntrexgo.com/wp-content/uploads/2016/08/38-PTB-17.jpg" width="508" height="266" /></a></p>
<p>&nbsp;</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/08/38-PTB-18.jpg" rel="lightbox[31927]"><img class="alignnone size-full wp-image-32393" alt="38 PTB (18)" src="http://www.ntrexgo.com/wp-content/uploads/2016/08/38-PTB-18.jpg" width="508" height="266" /></a></p>
<p>&nbsp;</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/08/38-PTB-19.jpg" rel="lightbox[31927]"><img class="alignnone size-full wp-image-32394" alt="38 PTB (19)" src="http://www.ntrexgo.com/wp-content/uploads/2016/08/38-PTB-19.jpg" width="508" height="266" /></a></p>
<p>오우, 아주 화려하게 잘 동작합니다. 생각했던 것보다 꽤 밝아서 눈이 조금 부실 정도입니다. 밤에는 멀리서도 아주 잘 보일 것 같네요. (혹시, 은은한 밝기를 원하시면 스케치 프로그램 작성 시 색상을 조절하시면 됩니다.)</p>
<p><span style="color: #3366ff"><strong>6단계 : 외관을 정리하고 고정하기</strong></span><br />
위의 사진에서는 아크릴 상자에 넣어진 모습으로 동작하는데, 사실은 아크릴 상자에 넣지않은 상태에서 동작을 테스트하고 원하는 형태로 잘 동작하면 그 때 아크릴 상자에 조립하는 것이 순서입니다. 조립시에는 먼저, 연결된 카DL 형상을 아크릴 상자의 앞면에 밀착시키고, JLED-START-1과 JARDUINO-PROMICRO-1 은 뒤쪽으로 빼 놓습니다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/08/38-PTB-20.jpg" rel="lightbox[31927]"><img class="alignnone size-full wp-image-32395" alt="38 PTB (20)" src="http://www.ntrexgo.com/wp-content/uploads/2016/08/38-PTB-20.jpg" width="508" height="266" /></a></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/08/38-PTB-21.jpg" rel="lightbox[31927]"><img class="alignnone size-full wp-image-32396" alt="38 PTB (21)" src="http://www.ntrexgo.com/wp-content/uploads/2016/08/38-PTB-21.jpg" width="508" height="266" /></a></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/08/38-PTB-22.jpg" rel="lightbox[31927]"><img class="alignnone size-full wp-image-32397" alt="38 PTB (22)" src="http://www.ntrexgo.com/wp-content/uploads/2016/08/38-PTB-22.jpg" width="508" height="266" /></a></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/08/38-PTB-23.jpg" rel="lightbox[31927]"><img class="alignnone size-full wp-image-32398" alt="38 PTB (23)" src="http://www.ntrexgo.com/wp-content/uploads/2016/08/38-PTB-23.jpg" width="508" height="266" /></a></p>
<p>준비한 휴대폰 보조 배터리(용량이 큰 것일수록 좋음. 적어도 5000mAh 이상의 배터리 권장)를 아크릴 박스 뒷면에 위치시킵니다. 휴대성 및 전원 공급 용량의 이유로 업로드 후 실제 동작 시에는 전원 공급을 USB 케이블로 하지 않고 휴대폰 보조 배터리 등으로 하는 것이 좋습니다. 위 사진에서 보듯 찍찍이를 아크릴의 한쪽 면과 휴대폰 보조 배터리의 한쪽 면에 각각 붙인 후 서로 밀착시켜 정리하면 깔끔한 모양을 유지할 수 있습니다. USB 케이블을 이용하여 휴대폰 보조 배터리와 JARDUINO-PROMICRO-1을 연결하면 완성입니다.</p>
<p><span style="color: #3366ff"><strong>7단계 : 내가 원하는 곳에 놓고 감상하기</strong></span><br />
모든 것이 원하는 대로 잘 동작합니다. 이제 내가 원하는 곳에 가져다 놓고 감상할 시간입니다. 주변 사람에게 자랑도 좀 하구요. 연인이나 친구에게 선물할 수도 있겠습니다. 저는 일단, 거실 앞쪽에 한 번 놓아 보았습니다. 괜찮게 된 것 같네요.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/08/38-PTB-26.jpg" rel="lightbox[31927]"><img class="alignnone size-full wp-image-32401" alt="38 PTB (26)" src="http://www.ntrexgo.com/wp-content/uploads/2016/08/38-PTB-26.jpg" width="508" height="266" /></a></p>
<p>&nbsp;</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/08/38-PTB-25.jpg" rel="lightbox[31927]"><img class="alignnone size-full wp-image-32400" alt="38 PTB (25)" src="http://www.ntrexgo.com/wp-content/uploads/2016/08/38-PTB-25.jpg" width="508" height="266" /></a></p>
<p>&nbsp;</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/08/38-PTB-26.jpg" rel="lightbox[31927]"><img class="alignnone size-full wp-image-32401" alt="38 PTB (26)" src="http://www.ntrexgo.com/wp-content/uploads/2016/08/38-PTB-26.jpg" width="508" height="266" /></a></p>
<p>불을 꺼보니 LED의 움직임이 더욱 선명하게 나타나는 것이 환상적입니다. 오~ 예~<br />
이 정도면 자동차 뒤 유리창에 놓아도 괜찮을 장식이 될 것 같습니다. 뒷 차에 부담을 주는 정도가 안되도록 밝기는 조절해야 하겠죠? 기회가 되면 [I ♥ U] 뿐만 아니라 내가 원하는 모양을 만들어 응용도 해보시기 바랍니다.</p>
<p><span style="color: #0000ff"><strong>변색 카멜레온</strong></span></p>
[I ♥ U]가 잘 만들어졌으니, 좀 더 고급 단계인 [변색 카멜레온]에 도전해 보겠습니다. [I ♥ U]에서 했던 방법과 똑같은 순서대로 진행해 봅니다.</p>
<p><span style="color: #3366ff"><strong>1단계 : 형상 설계하기</strong></span><br />
이제 긴 설명은 생략하고 조금 단순화하여 빠르게 진행해 보겠습니다.</p>
<p>· 형상 : 카멜레온<br />
· 용도 : 실제 카멜레온처럼 일부분씩 색상을 다르게 나타낼 수 있고, 약간의 움직임도 표현할 수 있는 창문에 부착하는 전광판 형태로 제작<br />
· 크기 : A4 용지 크기와 비슷한 30cm X 20cm에 들어가는 크기<br />
· 디자인 : 아래 참조 (이번 디자인도 제이씨넷 [신승현]님의 디자인입니다.)</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/08/38-PTB-27.jpg" rel="lightbox[31927]"><img class="alignnone size-full wp-image-32402" alt="38 PTB (27)" src="http://www.ntrexgo.com/wp-content/uploads/2016/08/38-PTB-27.jpg" width="508" height="298" /></a></p>
<p>카멜레온과 같은 동물 형상은 조금은 복잡하므로 특징을 잘 살려서 단순하게 표현하는 것이 중요합니다. (이것은 재능이 조금은 필요한 부분이므로 자신이 직접 하기가 어려우면 잘 할 수 있는 다른 사람에게 부탁하는 것도 방법입니다.) 아, 참, 그리고 기본 설계 도구가 궁금하실 분도 있을 것 같은데 위 그림은 오토캐드를 이용하여 카DL 기본 형상을 라이브러리처럼 모두 만들어 놓은 상태에서 이것을 배치하고 연결하여 만든 그림임을 밝혀둡니다. 이렇게 하기가 쉽지 않으면 그냥 손으로 대강의 모습을 스케치 한 후 카DL을 직접 배열해 가면서 진행해도 되겠습니다.</p>
<p>이미 한 번 이야기한 것처럼 카DL은 방향성이 있으므로 이것을 잘 고려하여 형상을 만들어야 합니다. 또한, 첫 시작점을 어디로 잡을 것인지, 연결되는 순서는 어떻게 할 것인지도 전체적인 모양을 고려하여 결정하는 것이 좋습니다.</p>
<p>저는 목 부분에서 시작하여 얼굴 ▶ 등 ▶ 꼬리 ▶ 배 ▶ 뒷다리 ▶ 앞다리 ▶ 피부 ▶ 눈 ▶ 혀의 순으로 연결되도록 카DL을 배치하였습니다. 여기서 새로 선보인 것은 눈 형상에 해당되는 JLED-HEXA-7 입니다. 6각형 모서리에 LED(WS2812B)가 하나씩 있고 가운데에도 1개가 있는 형상으로 카DL 도형(FIGURE) 그룹 중의 하나입니다. 카DL의 도형(FIGURE) 그룹은 아래와 같이 7개의 도형으로 구성되어 있으므로 필요에 따라 알맞은 것을 골라 사용하면 됩니다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/08/38-PTB-28.jpg" rel="lightbox[31927]"><img class="alignnone size-full wp-image-32403" alt="38 PTB (28)" src="http://www.ntrexgo.com/wp-content/uploads/2016/08/38-PTB-28.jpg" width="524" height="284" /></a></p>
<p><span style="color: #3366ff"><strong>2단계 : 형상 제작하기</strong></span><br />
1단계에서 배열한 순서대로 카DL을 조립해 봅니다. 지난번과 마찬가지로 직접 연결되는 부분이 잘 조립될 수 있도록 하는 것에 주의하여야 하며, 한 가지 팁을 더 이야기하면 직접 연결되는 부분은 순서대로 차례차례 조립하는 것이 좋습니다. 순서 없이 조립을 진행하다 보면 중간에 직접 연결되는 부분을 조립할 때 서로 어긋나서 이미 진행하였던 조립을 다시 수정하여야 하는 상황이 발생할 수도 있기 때문입니다. 아래 그림에서는 화살표로 방향과 연결 관계를 미리 표시하여 가능한 이 순서대로 조립을 진행합니다. 또한 카DL의 원호(ARC) 그룹인 경우는 Up 방향 모듈과 Down 방향 모듈의 구분이 쉽지 않으므로, 그림 상에서 “U”, “D”를 간단히 명시해 놓고 조립을 진행하면 실수를 줄일 수 있습니다.<br />
아래는 조립이 완성된 상태의 앞면입니다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/08/38-PTB-29.jpg" rel="lightbox[31927]"><img class="alignnone size-full wp-image-32404" alt="38 PTB (29)" src="http://www.ntrexgo.com/wp-content/uploads/2016/08/38-PTB-29.jpg" width="524" height="309" /></a></p>
<p><span style="color: #3366ff"><strong>3단계 : 아두이노 연결하기</strong></span><br />
이번에는 제어기로 가장 많이 사용하는 아두이노 UNO를 사용하도록 하겠습니다. 아두이노 UNO와 JLED-START-1까지 연결한 뒷면 모습은 아래와 같습니다. 데이터핀은 디지털 핀 6번을 사용하였습니다. 아두이노와 JLED-START-1의 입력쪽을 각각 +5V- V(VCC), GND-G(GND), D6-I(Data In)의 짝으로 연결합니다.</p>
<p><span style="color: #3366ff"><strong>4단계 : 아두이노 스케치 프로그램하기</strong></span><br />
그 동안에는 다른 사람들이 제공하였던 라이브러리와 스케치 프로그램을 그대로 이용하면서 값만 조금 바꾸어 사용하였는데, 이번에는 조금 더 적극적으로 내가 표현하고 싶은 동작과 색상을 정하고 이것을 스케치 프로그램으로 구현하도록 해 보겠습니다. 필요하다면 새로운 함수도 정의하여 작성하도록 하지요. 일단, 동작과 색상을 표로 간단하게 기술해 봅시다.</p>
<p><strong>[카멜레온 형상의 동작 및 색상]</strong></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>
</tr>
<tr>
<td style="text-align: center">1</td>
<td style="text-align: center">머리를 녹색으로 켜기</td>
<td style="text-align: center"></td>
</tr>
<tr>
<td style="text-align: center">2</td>
<td style="text-align: center">등과 배, 꼬리를 파랑색으로 켜기</td>
<td style="text-align: center"></td>
</tr>
<tr>
<td style="text-align: center">3</td>
<td style="text-align: center">뒷다리와 앞다리를 보라색으로 켜기</td>
<td style="text-align: center"></td>
</tr>
<tr>
<td style="text-align: center">4</td>
<td style="text-align: center">피부를 노랑색으로 켜기</td>
<td style="text-align: center"></td>
</tr>
<tr>
<td style="text-align: center">5</td>
<td style="text-align: center">눈을 주황색으로 켜기</td>
<td style="text-align: center"></td>
</tr>
<tr>
<td style="text-align: center">6</td>
<td style="text-align: center">앞다리와 뒷다리를 번갈아 가면서 켜기</td>
<td style="text-align: center">2번 반복</td>
</tr>
<tr>
<td style="text-align: center">6</td>
<td style="text-align: center">혀를 빨강색으로 내밀었다가 집어넣기</td>
<td style="text-align: center"></td>
</tr>
<tr>
<td style="text-align: center">7</td>
<td style="text-align: center">눈은 싸이키로 반짝반짝, 피부도 싸이키로 반짝반짝</td>
<td style="text-align: center"></td>
</tr>
<tr>
<td style="text-align: center">8</td>
<td style="text-align: center">전체가 동일한 랜덤색으로 앞에서부터 뒤로 천천히 변신</td>
<td style="text-align: center">3번 반복</td>
</tr>
<tr>
<td style="text-align: center">9</td>
<td style="text-align: center">전체가 개별적으로 무지개색으로 변신</td>
<td style="text-align: center">약 5초간</td>
</tr>
<tr>
<td style="text-align: center">10</td>
<td style="text-align: center">완전히 사라짐</td>
<td style="text-align: center">약 5초간</td>
</tr>
</tbody>
</table>
<p style="text-align: right">※ 10단계까지 진행을 마치면 다시 1단계부터 무한 반복합니다.</p>
<p> <strong>[프로그램 구현 방법]</strong></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">머리</td>
<td style="text-align: center">0</td>
<td style="text-align: center">3<br />
1</td>
</tr>
<tr>
<td style="text-align: center">2</td>
<td style="text-align: center">등</td>
<td style="text-align: center">3<br />
2</td>
<td style="text-align: center">5<br />
7</td>
</tr>
<tr>
<td style="text-align: center">3</td>
<td style="text-align: center">꼬리</td>
<td style="text-align: center">5<br />
8</td>
<td style="text-align: center">8<br />
3</td>
</tr>
<tr>
<td style="text-align: center">4</td>
<td style="text-align: center">배</td>
<td style="text-align: center">8<br />
4</td>
<td style="text-align: center">8<br />
9</td>
</tr>
<tr>
<td style="text-align: center">5</td>
<td style="text-align: center">뒷다리</td>
<td style="text-align: center">9<br />
0</td>
<td style="text-align: center">9<br />
9</td>
</tr>
<tr>
<td style="text-align: center">6</td>
<td style="text-align: center">앞다리</td>
<td style="text-align: center">1<br />
0<br />
0</td>
<td style="text-align: center">1<br />
1<br />
1</td>
</tr>
<tr>
<td style="text-align: center">7</td>
<td style="text-align: center">피부</td>
<td style="text-align: center">1<br />
2<br />
2</td>
<td style="text-align: center">1<br />
3<br />
2</td>
</tr>
<tr>
<td style="text-align: center">8</td>
<td style="text-align: center">눈</td>
<td style="text-align: center">1<br />
3<br />
3</td>
<td style="text-align: center">1<br />
3<br />
9</td>
</tr>
<tr>
<td style="text-align: center">9</td>
<td style="text-align: center">혀</td>
<td style="text-align: center">1<br />
4<br />
0</td>
<td style="text-align: center">1<br />
4<br />
7</td>
</tr>
</tbody>
</table>
<p>색상이 바뀌는 동작은 그룹별로 처리되어야 하므로, 이것을 효과적으로 처리할 수 있는 기능은 우리가 새로 만들어야 할 것 같습니다. 음… 당장 엄밀하게 정의하지는 못하겠지만, 현재 우리가 사용하고 있는 기능을 LED 번호의 특정 범위에서 실행할 수 있는 함수로 확장하여 정의하면 매우 편리할 것 같네요. 예를 들어 colorWipe(color, wait)로 정의된 기능을 이용하여 colorWipeFT(from, to, color, wait)와 같이 시작 LED 번호인 from과 끝 LED 번호인 to를 파라미터로 더 정의하여 사용하면 좋을 것 같습니다. 이것은 원래 제공되었던 프로그램을 그대로 가져다가 쓰면서 for 루프를 사용하여 from부터 to까지 적용하면 되므로 별로 어렵지는 않을 것으로 생각됩니다. 예를 들어 colorWipeFT(from, to, color, wait) 함수 하나만 작성해 보면 아래와 같이 됩니다.</p>
<div class="symple-box gray none" style="text-align:left; width:100%;"> 
<p>void colorWipeFT(uint16_t from, uint16_t to, uint32_t color, uint16_t wait)<br />
{<br />
/* 일정 범위의 카DL을 하나씩 순서대로 채우는 함수<br />
- from : from LED 번호<br />
- to : to LED 번호<br />
- color : 32비트 RGB 컬러 코드, 0x00RRGGBB 형태<br />
- wait : LED 사이의 동작 간격(딜레이)<br />
*/</p>
<p>for (int i=from; i&lt;=to; i++) // 원래 범위가 (0~끝)인 것을 (from~to)로 수정<br />
{<br />
strip.setPixelColor(i, c);<br />
strip.show();<br />
delay(wait);<br />
}<br />
}<br />
</div>
<p>원래 colorWipe( ) 프로그램 내에서 for (uint16_t i=0; i&lt;strip.numPixels(); i++) 로 표현된 부분을 for (int i=from; i&lt;=to; i++) 로 바꾸기만 하면 쉽게 colorWipeFT( )가 작성되는 것을 볼 수 있습니다. 다른 함수들도 이런 방법을 잘 응용하면 쉽게 만들 수 있겠지요?<br />
또, 한가지 미리 알아둘 것은 randomSeed( ) 함수와 random( ) 함수에 관련된 것입니다. 이 부분은 C 함수에서도 많이 나오는 라이브러리 함수인데 아두이노에서도 라이브러리 로 제공됩니다. random( ) 함수를 이용하면 임의의 값(난수)을 얻을 수 있으므로 스케치 프로그램을 실행시킬 때 다양성을 부여하기가 매우 쉽습니다. 예를 들어 카DL 형상에 색상을 표현할 때 이 random( ) 함수를 적용하여 표현한다면 함수가 실행될 때마다 값이 달라져 표현되는 색이 실행할 때마다 변하는 임의성을 확보할 수가 있겠습니다. 함수를 사용하는 방법은 아래와 같습니다.</p>
<p><span style="text-decoration: underline"><strong>randomSeed(seed)</strong></span></p>
<p style="padding-left: 30px">· 기능 : seed 값에 따른 난수표의 시작 포인트를 결정하여, 추후 random( ) 함수 사용시 난수를 제공할 수 있는 준비를 함, seed 값이 같으면 random( )의 return 값은 동일한 값이 됨<br />
· seed : 정수값<br />
· 반환값 : 없음</p>
<p><span style="text-decoration: underline"><strong>random(max)</strong></span><br />
<span style="text-decoration: underline"> <strong>random(min, max)</strong></span></p>
<p style="padding-left: 30px">· 기능 : min과 max 사이의 임의의 난수값을 제공<br />
· min : 반환값 범위의 최소값으로 long 타입이며 이 값은 포함됨<br />
· max : 반환값 범위의 최대값으로 long 타입이며 이 값은 포함이 되지 않음<br />
· 반환값 : 0~max 또는 min~max 사이의 정수</p>
<p>많이 사용되는 예로는,</p>
<p style="padding-left: 30px">randomSeed(analogRead(0));<br />
randNumber = random(256);</p>
<p>과 같이 사용하여 0~255까지의 난수를 얻는 방법이 있습니다. 즉, 아두이노에서 아날로그 포트 중 하나인 A0 포트에 아무 것도 연결하지 않은 상태의 값을 읽으면 임의의 값이 읽히는 것을 이용하여 randomSeed(seed) 함수를 결정하고, 이후 원하는 범위의 값은 random(max)를 이용하여 추출해 내는 것이지요.<br />
자, 이제 기본 준비가 되었으니 실제 카멜레온 형상에 대한 스케치 프로그램을 직접 작성해 보겠습니다. 가능하면 여러분들도 나름대로 먼저 충분히 작성해 본 다음에 아래 내용과 비교 검토해 보기를 권장합니다.</p>
<div class="symple-box gray none" style="text-align:left; width:100%;"> 
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-<br />
/* 카멜레온 만들기 */</p>
<p>#define RED 0x00ff0000 // 빨강<br />
#define GREEN 0x0000ff00 // 녹색<br />
#define BLUE 0x000000ff // 파랑<br />
#define YELLOW 0x00ffff00 // 노랑<br />
#define SKYBLUE 0x0073d1f7 // 하늘색<br />
#define PINK 0x00f69fa8 // 분홍<br />
#define BLACK 0&#215;00000000 // 검정(OFF)<br />
#define BROWN 0x0088563f // 갈색<br />
#define ORANGE 0x00f3753a // 오렌지색<br />
#define DEEPBLUE 0x002a365c // 남색</p>
<p>#define HEAD_FROM 0 // 머리 시작 번호<br />
#define HEAD_TO 31 // 머리 끝 번호<br />
#define SPINE_FROM 32 // 등 시작 번호<br />
#define SPINE_TO 57 // 등 끝 번호<br />
#define TAIL_FROM 58 // 꼬리 시작 번호<br />
#define TAIL_TO 83 // 꼬리 끝 번호<br />
#define BELLY_FROM 84 // 배 시작 번호<br />
#define BELLY_TO 89 // 배 끝 번호<br />
#define LEG_B_FROM 90 // 뒷다리 시작 번호<br />
#define LEG_B_TO 99 // 뒷다리 끝 번호<br />
#define LEG_F_FROM 100 // 앞다리 시작 번호<br />
#define LEG_F_TO 111 // 앞다리 끝 번호<br />
#define SKIN_FROM 112 // 피부 시작 번호<br />
#define SKIN_TO 132 // 피부 끝 번호<br />
#define EYE_FROM 133 // 눈 시작 번호<br />
#define EYE_TO 139 // 눈 끝 번호<br />
#define TONGUE_FROM 140 // 혀 시작 번호<br />
#define TONGUE_TO 147 // 혀 끝 번호</p>
<p>#define TWINKLE_LOOP 3 // twinkle 함수 실행시 깜빡깜빡 사이키 조명 횟수<br />
#include &lt;Adafruit_NeoPixel.h&gt;<br />
#include &lt;avr/power.h&gt;</p>
<p>#define PIN 6 // 6번 핀을 데이터 핀으로 이용</p>
<p>Adafruit_NeoPixel cdl = Adafruit_NeoPixel(147, PIN, NEO_GRB + NEO_KHZ800);<br />
// cdl 구조체 설정, 카멜레온 LED 총 개수 = 147<br />
void setup() {<br />
cdl.begin();<br />
cdl.show();<br />
randomSeed(analogRead(0)); // random( ) 함수 사용을 위한 준비, seed = A0 포트 read 값<br />
}</p>
<p>void loop() {<br />
uint8_t r, g, b;<br />
uint16_t i;<br />
uint32_t color;<br />
colorWipeFT(HEAD_FROM, HEAD_TO, GREEN, 0); // 머리를 녹색으로 켜기<br />
delay(300);<br />
colorWipeFT(SPINE_FROM, SPINE_TO, SKYBLUE, 0); // 등을 하늘색으로 켜기<br />
colorWipeFT(BELLY_FROM, BELLY_TO, SKYBLUE, 0);// 배를 하늘색으로 켜기<br />
colorWipeFT(TAIL_FROM, TAIL_TO, BLUE, 0); // 꼬리를 파랑색으로 켜기<br />
delay(300);<br />
colorWipeFT(LEG_F_FROM, LEG_F_TO, BROWN, 0); // 앞발을 갈색으로 켜기<br />
colorWipeFT(LEG_B_FROM, LEG_B_TO, BROWN, 0);// 뒷발을 갈색으로 켜기<br />
delay(300);<br />
colorWipeFT(SKIN_FROM, SKIN_TO, YELLOW, 0); // 피부를 노랑색으로 켜기<br />
colorWipeFT(EYE_FROM, EYE_TO, PINK, 0); // 눈을 핑크색으로 켜기<br />
delay(300);<br />
for (i=0; i&lt;4; i++) // 앞발과 뒷발을 번갈아 가면서 켜고 끄기, 4번 실행<br />
{<br />
colorWipeFT(LEG_F_FROM, LEG_F_TO, DEEPBLUE, 0);// 앞발은 남색으로 켜고<br />
colorWipeFT(LEG_B_FROM, LEG_B_TO, BLACK, 0); // 뒷발은 끄기<br />
delay(200);<br />
colorWipeFT(LEG_B_FROM, LEG_B_TO, DEEPBLUE, 0); // 뒷발은 남색으로 켜고<br />
colorWipeFT(LEG_F_FROM, LEG_F_TO, BLACK, 0); // 앞발은 끄기<br />
delay(200);<br />
}<br />
colorWipeFT(LEG_F_FROM, LEG_F_TO, DEEPBLUE, 0); // 앞발을 남색으로 켜기<br />
delay(200);<br />
tongueFT(TONGUE_FROM, TONGUE_TO, RED, 50); // 혀를 빨강색으로 내밀었다가 집어넣기<br />
twinkleFT(EYE_FROM, EYE_TO, PINK, 20); // 눈을 핑크색으로 깜빡이기<br />
colorWipeFT(EYE_FROM, EYE_TO, PINK, 0); // 눈을 모두 켜기<br />
twinkleFT(SKIN_FROM, SKIN_TO, YELLOW, 20); // 피부를 노랑색으로 깜빡이기<br />
colorWipeFT(SKIN_FROM, SKIN_TO, YELLOW, 0); // 피부를 모두 켜기<br />
delay(300);<br />
for (i=0; i&lt;3; i++) {<br />
r = random(256); // 난수 1개 얻어 r 값으로 할당<br />
g = random(256); // 난수 1개 얻어 g 값으로 할당<br />
b = random(256); // 난수 1개 얻어 b 값으로 할당<br />
color = cdl.Color(r, g, b); // r, g, b로 RGB 컬러값 결정<br />
colorWipeFT(0, cdl.numPixels()-1, color, 10); // 위 컬러로 전체를 차례로 색칠<br />
delay(500);<br />
}<br />
rainbowCycle(20); // 각 카DL을 다양한 색으로 표현<br />
colorWipeFT(0, cdl.numPixels()-1, BLACK, 0); // 모든 카DL 소등(OFF)<br />
delay(3000);<br />
}</p>
<p>/* colorWipeFT( ) : 일정 범위의 카DL을 하나씩 순서대로 채우는 함수<br />
- from : from LED 번호<br />
- to : to LED 번호<br />
- color : 32비트 RGB 컬러 코드, 0x00RRGGBB 형태<br />
- wait : LED 사이의 동작 간격(딜레이)<br />
*/<br />
void colorWipeFT(uint16_t from, uint16_t to, uint32_t color, uint16_t wait)<br />
{<br />
uint16_t i;<br />
for (i=from; i&lt;=to; i++) // 원래 범위가 (0~끝)인 것을 (from~to)로 수정<br />
{<br />
cdl.setPixelColor(i, color);<br />
cdl.show();<br />
delay(wait);<br />
}<br />
}</p>
<p>/* tongueFT( ) : 일정 범위의 카DL을 혀를 내밀었다가 다시 거둬들이도록 동작처럼 움직이도록 하는 함수<br />
- from : from LED 번호<br />
- to : to LED 번호<br />
- color : 32비트 RGB 컬러 코드, 0x00RRGGBB 형태<br />
- wait : LED 사이의 동작 간격(딜레이)<br />
*/<br />
void tongueFT(uint16_t from, uint16_t to, uint32_t color, uint16_t wait)<br />
{<br />
uint16_t i;<br />
for (i=from; i&lt;= to; i++) // 혀를 내미는 동작<br />
{<br />
cdl.setPixelColor(i, color);<br />
cdl.show();<br />
delay(wait);<br />
}<br />
delay(wait);<br />
for (i=to; i&gt;= from; i&#8211;) // 혀를 거둬들이는 동작<br />
{<br />
cdl.setPixelColor(i, BLACK);<br />
cdl.show();<br />
delay(wait);<br />
}<br />
delay(wait);<br />
}</p>
<p>/* twinkleFT( ) : 일정 범위의 카DL을 사이키 조명처럼 번쩍번쩍하면서 움직이도록 하는 함수<br />
- from : from LED 번호<br />
- to : to LED 번호<br />
- color : 32비트 RGB 컬러 코드, 0x00RRGGBB 형태<br />
- wait : LED 사이의 동작 간격(딜레이)<br />
*/<br />
void twinkleFT(uint16_t from, uint16_t to, uint32_t color, uint16_t wait)<br />
{<br />
uint16_t i, j;<br />
for(j=0; j&lt;TWINKLE_LOOP; j++)<br />
{<br />
for(i=from; i&lt;=to; i=i+2) // 1개는 켜고, 그 다음 1개는 끔(BLACK)<br />
{<br />
cdl.setPixelColor(i, color);<br />
if (i+1&lt;=to)<br />
cdl.setPixelColor(i+1, BLACK);<br />
cdl.show();<br />
}<br />
delay(wait);<br />
for(i=from; i&lt;=to; i=i+2) // 위와 반대로, 켜진 것은 끄고(BLACK), 꺼진 것은 켬<br />
{<br />
cdl.setPixelColor(i, BLACK);<br />
if (i+1&lt;=to)<br />
cdl.setPixelColor(i+1, color);<br />
cdl.show();<br />
}<br />
delay(wait);<br />
}<br />
}</p>
<p>// 지난 회에 사용하였던 함수<br />
// 전체가 다르게 다양한 색으로 변하면서 디스플레이하는 함수<br />
void rainbowCycle(uint8_t wait) {<br />
uint16_t i, j;</p>
<p>for(j=0; j&lt;256*5; j++) {<br />
for(i=0; i&lt; cdl.numPixels(); i++) {<br />
cdl.setPixelColor(i, Wheel(((i * 256 / cdl.numPixels()) + j) &amp; 255));<br />
}<br />
cdl.show();<br />
delay(wait);<br />
}<br />
}</p>
<p>// 지난 회에 사용하였던 함수<br />
// 0~255까지의 값을 전달하면 4 바이트 컬러값을 리턴하는 함수<br />
// 임의의 고르게 분포된 컬러값을 생성하기 위하여 사용<br />
uint32_t Wheel(byte WheelPos) {<br />
WheelPos = 255 &#8211; WheelPos;<br />
if(WheelPos &lt; 85) {<br />
return cdl.Color(255 &#8211; WheelPos * 3, 0, WheelPos * 3);<br />
} else if(WheelPos &lt; 170) {<br />
WheelPos -= 85;<br />
return cdl.Color(0, WheelPos * 3, 255 &#8211; WheelPos * 3);<br />
} else {<br />
WheelPos -= 170;<br />
return cdl.Color(WheelPos * 3, 255 &#8211; WheelPos * 3, 0);<br />
}<br />
}<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-</p>
</div>
<p>※ 프로그램 정리 및 테스트는 한밭대학교 윤병우님이 도움을 주었습니다.</p>
<p>&nbsp;</p>
<p><span style="color: #3366ff"><strong>5단계 : 업로드하고 실행시키기</strong></span><br />
조금 긴 과정이었지만 스케치 프로그램 작성이 완료되었습니다. 이번에는 아두이노 UNO 이므로 업로드시 스케치 프로그램의 [보드] 선택 항목을 “UNO”로 선택하고 업로드와 실행을 진행하면 되겠습니다. 자, 원하는 대로 잘 움직이는지 살펴 볼까요? 아, 참, 여기서 한가지만 더 주의!!! 바로 전에 실행했던 [I ♥ U] 제작 시와 다르게 고려하여야 할 것 하나는 휴대폰 보조 배터리 용량입니다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/08/38-PTB-31.jpg" rel="lightbox[31927]"><img class="alignnone size-full wp-image-32406" alt="38 PTB (31)" src="http://www.ntrexgo.com/wp-content/uploads/2016/08/38-PTB-31.jpg" width="524" height="245" /></a></p>
<p>이번 [변색하는 카멜레온]의 경우는 147개의 WS2812B가 사용되므로 전류 소모량이 상당히 되므로 최소 약 2A의 전류 공급 용량을 갖는 휴대폰 보조 배터리를 사용하시기 바랍니다. LED를 켜다가 전류 용량이 부족하면 그대로 정지하거나 리셋되어 다시 처음부터 시작할 수 있습니다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/08/38-PTB-32.jpg" rel="lightbox[31927]"><img class="alignnone size-full wp-image-32407" alt="38 PTB (32)" src="http://www.ntrexgo.com/wp-content/uploads/2016/08/38-PTB-32.jpg" width="524" height="245" /></a></p>
<p>&nbsp;</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/08/38-PTB-33.jpg" rel="lightbox[31927]"><img class="alignnone size-full wp-image-32408" alt="38 PTB (33)" src="http://www.ntrexgo.com/wp-content/uploads/2016/08/38-PTB-33.jpg" width="524" height="273" /></a></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/08/38-PTB-34.jpg" rel="lightbox[31927]"><img class="alignnone size-full wp-image-32409" alt="38 PTB (34)" src="http://www.ntrexgo.com/wp-content/uploads/2016/08/38-PTB-34.jpg" width="524" height="273" /></a></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/08/38-PTB-35.jpg" rel="lightbox[31927]"><img class="alignnone size-full wp-image-32410" alt="38 PTB (35)" src="http://www.ntrexgo.com/wp-content/uploads/2016/08/38-PTB-35.jpg" width="524" height="273" /></a></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/08/38-PTB-36.jpg" rel="lightbox[31927]"><img class="alignnone size-full wp-image-32411" alt="38 PTB (36)" src="http://www.ntrexgo.com/wp-content/uploads/2016/08/38-PTB-36.jpg" width="524" height="273" /></a></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/08/38-PTB-37.jpg" rel="lightbox[31927]"><img class="alignnone size-full wp-image-32412" alt="38 PTB (37)" src="http://www.ntrexgo.com/wp-content/uploads/2016/08/38-PTB-37.jpg" width="524" height="273" /></a></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/08/38-PTB-38.jpg" rel="lightbox[31927]"><img class="alignnone size-full wp-image-32413" alt="38 PTB (38)" src="http://www.ntrexgo.com/wp-content/uploads/2016/08/38-PTB-38.jpg" width="524" height="273" /></a></p>
<p>성공입니다! 발이 왔다가는 하는 동작과 혀를 날름거리는 동작도 잘 된 것 같습니다. 몸 전체 컬러를 변화시킬 때는 random() 함수를 이용하므로 루프가 반복될 때마다 새로운 색상으로 변화하므로 지루하지 않다는 장점도 있네요. 외관을 잘 다듬어서 지난번에 만든 것처럼 아크릴 판에 넣거나, 창문이나 유리판에 고정시켜 보조 간판처럼 사용하는 것이 가능할 것 같습니다. OK~</p>
<p>이 정도면 이제 어떤 형상, 어떤 컬러, 어떤 움직임도 시간만 주어진다면 모두 만들 수 있을 것 같은 자만심(?)도 드네요. 여러분도 상상의 나래, 창조의 나래를 펴서 자신만의 디자인과 자신만의 프로그램으로 동작하는 카DL 소품을 한 번쯤 만들어 보시기 바랍니다.<br />
오늘 모두 수고 많으셨습니다. 다음 시간에는 [카멜레온 DIY LED 이야기]의 마지막 시간으로, [특별한 크리스마스 트리] 제작을 포함하여 생활 속에서 응용할 수 있는 재미있는 카DL 소품을 함께 만들어 보는 시간을 갖도록 하겠습니다. 좋은 하루 되시기 바랍니다. 감사합니다.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ntrexgo.com/archives/31927/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[38호]로꾸꺼 보트</title>
		<link>http://www.ntrexgo.com/archives/31922</link>
		<comments>http://www.ntrexgo.com/archives/31922#comments</comments>
		<pubDate>Sun, 25 Sep 2016 02:53:11 +0000</pubDate>
		<dc:creator>디바이스마트 매거진</dc:creator>
				<category><![CDATA[디바이스마트 매거진]]></category>
		<category><![CDATA[특집]]></category>
		<category><![CDATA[38호]]></category>
		<category><![CDATA[Feature]]></category>
		<category><![CDATA[ict]]></category>
		<category><![CDATA[공모전]]></category>
		<category><![CDATA[디바이스마트]]></category>
		<category><![CDATA[매거진]]></category>
		<category><![CDATA[융합]]></category>
		<category><![CDATA[프로젝트]]></category>

		<guid isPermaLink="false">http://www.ntrexgo.com/?p=31922</guid>
		<description><![CDATA[디바이스마트매거진 38호 &#124; 기존 무선 모터보트의 단점을 개선하였다.]]></description>
				<content:encoded><![CDATA[<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/05/2016-ictmain.png" rel="lightbox[31922]"><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><strong><span style="color: #0000ff">위드로봇</span></strong> 보트를 위·아래 대칭 형태로 제작하는 아이디어가 무척 재미있다. 문제는 이렇게 제작한 보드가 실제 강이나 바다에서 동작하는데 문제가 없는지를 조사해 봐야 할 것 같은데, 그 부분에 대한 조사가 없는 것이 아쉽다.</p>
<p><span style="color: #008000"><strong>작품개요</strong></span><br />
기존 무선 모터보트의 단점을 개선한다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-로꾸꺼-1.jpg" rel="lightbox[31922]"><img alt="38 ict 로꾸꺼 (1)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-로꾸꺼-1.jpg" width="572" height="225" /></a></p>
<p><strong>① 보트의 전복을 방지</strong><br />
잔잔한 호숫가든 파도가 치는 바닷가든, 충돌의 가능성과 물살에 의해 전복이 되는 위험성이 있다.<br />
: 일반적인 RC보트의 구조로는 파도가 조금 높고, 바람의 세기가 강해지면 쉽게 전복된다. 때문에 보트가 전복이 되더라도 상관없이 계속해서 정찰할 수 있도록 보트의 구조를 위·아래 대칭으로 만들었다. 보트가 전복되었을 때 카메라의 구도가 뒤집히고 좌우 모터의 위치가 바뀌기 때문에 자이로 센서의 값을 이용하여 컨트롤러의 방향에 맞게 보트의 앞·뒷면을 판단하고 카메라의 스트리밍 화면을 똑바로 볼 수 있게 화면을 조정해 준다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-로꾸꺼-2.jpg" rel="lightbox[31922]"><img class="alignnone size-full wp-image-32068" alt="38 ict 로꾸꺼 (2)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-로꾸꺼-2.jpg" width="572" height="195" /></a></p>
<p><strong>② 시야의 확보</strong><br />
보트가 시야에서 가려지면 컨트롤을 할 수 없다.<br />
: 카메라를 통해서 시야를 확보했다. 카메라는 액션캠을 이용했다. 액션캠의 장점이 작고 가볍고 내구성이 좋으며 다각도를 촬영할 수 있다는 점 때문에 보트에 활용하기 적합하다. 그리고 움직이면서 촬영할 수 있기 때문에 일반 캠코더로는 불가능한 역동적인 동영상 촬영이 가능하다. 가장 큰 장점은 실시간 카메라 스트리밍을 이용하여 보트의 주변 환경정보를 받아들일 수 있으며 장거리에서도 주변 상황에 맞추어 보트를 작동하는 것이 가능하다.</p>
<p><strong>③ 장거리 동작 가능</strong><br />
RC보트의 전파 도달거리는 약 50~60m정도로 그 범위를 벗어나게 되었을 경우 컨트롤로는 더 이상 조작을 할 수 없다.<br />
: UDP통신을 이용하여 WIFI가 가능한 지역이라면 어디서든 원격으로 조정이 가능하다. 사람의 시야 밖에서도 카메라를 통해 주변 상황을 스트리밍 할 수 있기 때문에 원활한 조작이 가능하다. LTE를 이용하여 좀 더 원활한 조작을 하고 싶었지만 LTE 주파수는 기업에서 구매하여 사용하고 있기 때문에 개발하지 못하였다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-로꾸꺼-4.jpg" rel="lightbox[31922]"><img class="alignnone size-full wp-image-32072" alt="38 ict 로꾸꺼 (4)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-로꾸꺼-4.jpg" width="572" height="254" /></a></p>
<p><strong>④ 컨트롤방식의 다양성</strong><br />
기존의 RC보트의 컨트롤은 조이스틱만을 이용해 조작한다.<br />
: 조이스틱을 이용한 조작과 더불어 자이로센서를 이용하여 컨트롤러의 기울기에 따른 조작을 할 수 있게 하여 컨트롤방식의 다양성을 부여하였다.</p>
<p><span style="color: #008000"><strong>작품설명</strong></span><br />
<span style="color: #339966"><strong>주요동작 및 특징</strong></span></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-로꾸꺼-5.jpg" rel="lightbox[31922]"><img class="alignnone size-full wp-image-32073" alt="38 ict 로꾸꺼 (5)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-로꾸꺼-5.jpg" width="597" height="312" /></a></p>
<p><strong>① 스위치</strong></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-로꾸꺼-6.jpg" rel="lightbox[31922]"><img class="alignnone size-full wp-image-32074" alt="38 ict 로꾸꺼 (6)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-로꾸꺼-6.jpg" width="597" height="149" /></a><br />
1) 자이로센서로 보트가 동작한다. 조이스틱 모듈로는 동작하지 않는다.<br />
2) 조이스틱 모듈로 보트가 동작한다. 자이로센서로는 동작하지 않는다.<br />
※ 스위치를 위 1처럼 하기 전에 컨트롤러가 좌, 우, 앞으로 기울지 않은 상태에서 해야 한다.</p>
<p><strong>②자이로센서</strong></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-로꾸꺼-7.jpg" rel="lightbox[31922]"><img class="alignnone size-full wp-image-32075" alt="38 ict 로꾸꺼 (7)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-로꾸꺼-7.jpg" width="597" height="325" /></a><br />
컨트롤러를 번호의 방향대로 기울였을 때,<br />
1) 보트가 제자리에서 왼쪽으로 돈다.<br />
2) 보트가 제자리에서 오른쪽으로 돈다.<br />
3) 보트가 앞으로 나아간다.<br />
4) 보트가 앞으로 나아가며 컨트롤러를 기울인 방향으로 선회한다.</p>
<p><strong>③ 조이스틱</strong></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-로꾸꺼-8.jpg" rel="lightbox[31922]"><img class="alignnone size-full wp-image-32076" alt="38 ict 로꾸꺼 (8)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-로꾸꺼-8.jpg" width="293" height="325" /></a><br />
조이스틱을 다음 번호의 위치로 움직였을 때,<br />
1) 보트가 제자리에서 왼쪽으로 돈다.<br />
2) 보트가 제자리에서 오른쪽으로 돈다.<br />
3) 보트가 앞으로 나아간다.<br />
4) 보트가 앞으로 나아가며 조이스틱을 움직인 방향으로 선회한다.</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[31922]"><img class="alignnone size-full wp-image-32067" alt="38 ict 로꾸꺼 (1)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-로꾸꺼-1.png" width="597" height="456" /></a><br />
<strong>① 사용자 ▶ 보트</strong><br />
: 컨트롤러의 자이로 센서와 조이스틱 모듈에서 출력되는 값을 UDP 통신을 통해 보트의 라즈베리파이로 전송하여 보트의 움직임을 제어한다.<br />
<strong>② 보트 ▶ 사용자</strong><br />
: 액션캠에서 받아들이는 영상정보를 라즈베리파이에서 MMAL 용 motion 프로그램을 사용한다. 사용자의 pc인 J-player로 전송하여 IP에 따라 실시간으로 받아들인다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-로꾸꺼-9.jpg" rel="lightbox[31922]"><img class="alignnone size-full wp-image-32077" alt="38 ict 로꾸꺼 (9)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-로꾸꺼-9.jpg" width="597" height="328" /></a></p>
<p><strong>① Brushless Motor</strong><br />
: ESC(Electric Speed Controller)를 통해 라즈베리파이의 GPIO핀에서 PWM 신호를 받아 컨트롤러에 따른 모터의 출력을 제어한다.<br />
<strong>② 액션캠</strong><br />
: 라즈베리파이와의 USB연결을 통해 영상정보를 받아오고 라즈베리파이를 통해 UDP 통신으로 전송한다. 사용자의 PC에서 J-Player 화면으로 실시간으로 영상정보를 전송한다.<br />
<strong>③ 자이로 센서</strong><br />
: I2C 통신을 이용하여 자이로 센서의 가속도 값을 라즈베리파이로 전송하여 보트의 상·하를 구별할 수 있도록 한다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-로꾸꺼-10.jpg" rel="lightbox[31922]"><img class="alignnone size-full wp-image-32078" alt="38 ict 로꾸꺼 (10)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-로꾸꺼-10.jpg" width="597" height="277" /></a></p>
<p><strong>① 무선 컨트롤러</strong><br />
: I2C 통신을 이용하여 자이로 센서의 자이로 가속도 값을 상보필터를 사용하여 X축과 Y축 값의 정보를 받아온다. 받아온 값을 UDP 통신을 통해 보트의 라즈베리파이로 전송한다. SPI 통신을 이용하여, 조이스틱의 방향에 따라 출력되는 아날로그 값을 디지털 값으로 변환하고 UDP 통신을 통해 보트의 라즈베리파이로 전송한다.<br />
<strong>② 실시간 영상 수신 </strong><br />
: 보트의 액션캠 영상정보를 사용자 PC에 J-Player를 이용하여 보트 라즈베리파이 IP를 통해 실시간으로 영상을 수신한다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-로꾸꺼-2.png" rel="lightbox[31922]"><img class="alignnone size-full wp-image-32069" alt="38 ict 로꾸꺼 (2)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-로꾸꺼-2.png" width="597" height="557" /></a></p>
<p>· 컨트롤러의 스위치 값이 1이면 자이로 센서의 출력 값을 보트의 라즈베리파이로 전송한다.<br />
· 컨트롤러의 스위치 값이 0이면 조이스틱의 방향에 따른 출력 값을 보트가 가지고 있는 모터제어 값에 맞게 변환하여 보트의 라즈베리파이로 전송한다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-로꾸꺼-3.png" rel="lightbox[31922]"><img class="alignnone size-large wp-image-32071" alt="38 ict 로꾸꺼 (3)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-로꾸꺼-3-589x620.png" width="589" height="620" /></a></p>
<p>· 액션캠이 실행되어 실시간으로 영상정보전송을 시작한다.<br />
· 자이로센서의 Z축 가속도 값을 수신하여 상·하를 구분한다.<br />
· Z축 가속도 값에 따라 프로펠러의 포트를 선택한다.<br />
· 컨트롤러로부터 받아오는 Roll/Pitch 값을 모터제어 함수를 거쳐, 조건에 따라 양측모터의 출력을 제어하여 보트를 동작시킨다.</p>
<p><span style="color: #339966"><strong>개발환경</strong></span><br />
<strong>① 개발 보드</strong><br />
· 라즈베리파이<br />
<strong>② 개발 환경</strong><br />
· 리눅스 기반의 Raspbian OS<br />
<strong>③ 활용 프로그램</strong><br />
· J player<br />
· Motion-MMAL(영상 전송을 위한 리눅스 프로그램)<br />
<strong>④ 개발 언어</strong><br />
· python</p>
<p><span style="color: #008000"><strong>단계별 제작과정</strong></span></p>
<p><span style="color: #008000"><strong><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-로꾸꺼-11.jpg" rel="lightbox[31922]"><img class="alignnone size-full wp-image-32079" alt="38 ict 로꾸꺼 (11)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-로꾸꺼-11.jpg" width="597" height="270" /></a></strong></span></p>
<p>① 보트의 외형을 기능이 잘 작동할 수 있도록 설계한다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-로꾸꺼-12.jpg" rel="lightbox[31922]"><img class="alignnone size-full wp-image-32080" alt="38 ict 로꾸꺼 (12)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-로꾸꺼-12.jpg" width="597" height="326" /></a></p>
<p>② Sketch Up 프로그램을 이용하여 설계한 모형을 3D로 그려본다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-로꾸꺼-13.jpg" rel="lightbox[31922]"><img class="alignnone size-full wp-image-32081" alt="38 ict 로꾸꺼 (13)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-로꾸꺼-13.jpg" width="597" height="326" /></a></p>
<p>③ 방수·단열재인 아이소핑크를 이용하여 보트의 외형을 제작한다.<br />
· 크기에 맞게 아이소핑크를 자른다.<br />
· ESC를 납땜한다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-로꾸꺼-14.jpg" rel="lightbox[31922]"><img class="alignnone size-full wp-image-32082" alt="38 ict 로꾸꺼 (14)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-로꾸꺼-14.jpg" width="602" height="344" /></a></p>
<p>· 모터를 ESC와 연결하여 부착한다.<br />
· ESC선을 내부로 집어넣는다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-로꾸꺼-15.jpg" rel="lightbox[31922]"><img class="alignnone size-full wp-image-32083" alt="38 ict 로꾸꺼 (15)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-로꾸꺼-15.jpg" width="602" height="344" /></a></p>
<p>· 배터리/라즈베리파이/자이로센서/카메라를 내부에 부착한다.<br />
· Glue-gun으로 모서리 방수처리를 한다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-로꾸꺼-16.jpg" rel="lightbox[31922]"><img class="alignnone size-full wp-image-32084" alt="38 ict 로꾸꺼 (16)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-로꾸꺼-16.jpg" width="602" height="473" /></a></p>
<p>④ 컨트롤러를 제작한다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-로꾸꺼-17.jpg" rel="lightbox[31922]"><img class="alignnone size-full wp-image-32085" alt="38 ict 로꾸꺼 (17)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-로꾸꺼-17.jpg" width="602" height="270" /></a></p>
<p>⑤ 컨트롤러와 보트에 코드를 작성한다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-로꾸꺼-18.jpg" rel="lightbox[31922]"><img class="alignnone size-full wp-image-32086" alt="38 ict 로꾸꺼 (18)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-로꾸꺼-18.jpg" width="602" height="237" /></a></p>
<p><span style="color: #339966"><strong>소스코드</strong></span><br />
<strong>① 컨트롤러</strong></p>
<div class="symple-box gray none" style="text-align:left; width:100%;"> 
<p><span style="color: #ff0000">#필요한 라이브러리</span><br />
import smbus<br />
import time<br />
import math<br />
import string<br />
import socket<br />
import RPi.GPIO as GPIO<br />
import os<br />
import spidev</p>
<p><span style="color: #ff0000">#ADC 변환위한 채널 설정</span><br />
roll_ch = 1<br />
pitch_ch = 2</p>
<p><span style="color: #ff0000">#자이로, 가속도 센서 사용을 위해 정의 및 필요함수</span><br />
power_mgmt_1 = 0x6b<br />
power_mgmt_2 = 0x6c<br />
gyro_scale = 131.0<br />
accel_scale = 16384.0<br />
address = 0&#215;68<br />
bus = smbus.SMBus(1)<br />
bus.write_byte_data(address, power_mgmt_1, 0)</p>
<p><span style="color: #ff0000">#UDP 통신 위한 선언</span><br />
UDP_IP =”192.168.59.152”<br />
UDP_PORT = 5005<br />
sock1 = socket.socket(socket.AF_INET, #Internet<br />
socket.SOCK_DGRAM) #UDP</p>
<p><span style="color: #ff0000">#스위치 값 읽어오기 위한 선언</span><br />
GPIO.setmode(GPIO.BCM)<br />
GPIO.setup(23,GPIO.IN)</p>
<p><span style="color: #ff0000">#조이스틱 모듈 값을 adc컨버터로 읽어오기 위한 선언 및 함수</span><br />
spi = spidev.SpiDev()<br />
spi.open(0,0)<br />
def ReadChannel(channel):<br />
adc = spi.xfer2([1,(8+channel)&lt;&lt;4,0])<br />
data = ((adc[1]&amp;3) &lt;&lt; 8) + adc[2]
return data</p>
<p><span style="color: #ff0000">#UDP 통신을 위한 함수</span><br />
def send(a,b):<br />
for i,j in [(a,’a’),(b,’b’)]:<br />
i = str(i)<br />
buffer1 = j+i[0:]
sock1.sendto(buffer1, (UDP_IP, UDP_PORT))</p>
<p><span style="color: #ff0000">#자이로, 가속도 센서 사용을 위한 필요함수</span><br />
def read_all():<br />
raw_gyro_data = bus.read_i2c_block_data(address, 0&#215;43, 6)<br />
raw_accel_data = bus.read_i2c_block_data(address, 0x3b, 6)<br />
gyro_scaled_x = twos_compliment((raw_gyro_data[0] &lt;&lt; 8) +raw_gyro_data[1]) / gyro_scale<br />
gyro_scaled_y = twos_compliment((raw_gyro_data[2] &lt;&lt; 8) +raw_gyro_data[3]) / gyro_scale<br />
gyro_scaled_z = twos_compliment((raw_gyro_data[4] &lt;&lt; 8) +raw_gyro_data[5]) / gyro_scale</p>
<p>accel_scaled_x = twos_compliment((raw_accel_data[0] &lt;&lt; 8) +raw_accel_data[1]) / accel_scale<br />
accel_scaled_y = twos_compliment((raw_accel_data[2] &lt;&lt; 8) +raw_accel_data[3]) / accel_scale<br />
accel_scaled_z = twos_compliment((raw_accel_data[4] &lt;&lt; 8) +raw_accel_data[5]) / accel_scale<br />
return (gyro_scaled_x, gyro_scaled_y, gyro_scaled_z, accel_scaled_x, accel_scaled_y, accel_scaled_z)<br />
def twos_compliment(val):<br />
if (val &gt;= 0&#215;8000):<br />
return -((65535 &#8211; val) + 1)<br />
else:<br />
return val<br />
def dist(a, b):<br />
return math.sqrt((a * a) + (b * b))<br />
def get_y_rotation(x,y,z):<br />
radians = math.atan2(x, dist(y,z))<br />
return -math.degrees(radians)<br />
def get_x_rotation(x,y,z):<br />
radians = math.atan2(y, dist(x,z))<br />
return math.degrees(radians)</p>
<p><span style="color: #ff0000">#COMPLEMENTARY FILTER 함수</span><br />
def com():<br />
global last_com_x<br />
global last_com_y<br />
K = 0.98<br />
K1 = 1 &#8211; K<br />
time_diff = 0.001<br />
(gyro_scaled_x, gyro_scaled_y, gyro_scaled_z, accel_scaled_x, accel_scaled_y, accel_scaled_z) = read_all()<br />
last_1x = get_x_rotation(accel_scaled_x, accel_scaled_y, accel_scaled_z)<br />
last_1y = get_y_rotation(accel_scaled_x, accel_scaled_y, accel_scaled_z)</p>
<p>gyro_offset_x = gyro_scaled_x<br />
gyro_offset_y = gyro_scaled_y</p>
<p>gyro_total_x = (last_1x) &#8211; gyro_offset_x<br />
gyro_total_y = (last_1y) &#8211; gyro_offset_y</p>
<p>(gyro_scaled_x, gyro_scaled_y, gyro_scaled_z, accel_scaled_x,<br />
accel_scaled_y, accel_scaled_z) = read_all()</p>
<p>gyro_scaled_x -= gyro_offset_x<br />
gyro_scaled_y -= gyro_offset_y</p>
<p>gyro_x_delta = (gyro_scaled_x * time_diff)<br />
gyro_y_delta = (gyro_scaled_y * time_diff)</p>
<p>gyro_total_x += gyro_x_delta<br />
gyro_total_y += gyro_y_delta</p>
<p>rotation_x = get_x_rotation(accel_scaled_x, accel_scaled_y, accel_scaled_z)<br />
rotation_y = get_y_rotation(accel_scaled_x, accel_scaled_y, accel_scaled_z)<br />
last_1x = K * (last_1x + gyro_x_delta) + (K1 * rotation_x)<br />
last_1y = K * (last_1y + gyro_y_delta) + (K1 * rotation_y)</p>
<p>last_com_x=last_1x<br />
last_com_y=last_1y</p>
<p>while 1:</p>
<p><span style="color: #ff0000">#스위치 값이 0이라 조이스틱 값 전송</span><br />
if GPIO.input(23)==0 :</p>
<p><span style="color: #ff0000">#조이스틱 값 읽어오기</span><br />
roll = ReadChannel(roll_ch)<br />
pitch = ReadChannel(pitch_ch)</p>
<p><span style="color: #ff0000">#알맞은 값으로 변환하기 위한 과정</span><br />
if roll&gt;510 and roll&lt;530 :<br />
roll = 520<br />
elif roll&gt;1020:<br />
roll = 1020<br />
elif roll&lt;3:<br />
roll = 3</p>
<p>roll_last = (((roll-520)-10)/16.3)<br />
if roll_last&lt;10 and roll_last&gt;-10:<br />
roll_last = 0<br />
if roll_last&gt;0 :<br />
roll_last += 10<br />
if roll_last&lt;0 :<br />
roll_last -= 10</p>
<p>if pitch&gt;530 :<br />
pitch = 520<br />
elif pitch&lt;3 :<br />
pitch = 3</p>
<p>pitch_last = -(((pitch-520)-10)/16.3)<br />
if pitch_last&lt;5 :<br />
pitch_last = 0<br />
if pitch_last&gt;10 :<br />
pitch_last += 10</p>
<p><span style="color: #ff0000">#알맞은 값으로 변환하기 위한 과정</span></p>
<p><span style="color: #ff0000">#전송</span><br />
send(roll_last,pitch_last)<br />
print “roll:”,roll_last<br />
print “pitch:”,pitch_last<br />
time.sleep(0.3)</p>
<p><span style="color: #ff0000">#스위치 값이 1이라 자이로, 가속도 값 전송</span><br />
elif GPIO.input(23)==1 :</p>
<p><span style="color: #ff0000">#COMPLEMENTARY FILTER 함수적용</span><br />
com()<br />
xro=last_com_x<br />
yro=last_com_y</p>
<p><span style="color: #ff0000">#전송</span><br />
send(xro,yro)<br />
print “xro:”,xro<br />
print “yro:”,yro<br />
time.sleep(0.3)</p>
</div>
<p><strong>② 보트</strong></p>
<div class="symple-box gray none" style="text-align:left; width:100%;"> 
<span style="color: #ff0000">#필요한 라이브러리</span><br />
from Tkinter import*<br />
import RPi.GPIO as GPIO<br />
from RPIO import PWM<br />
import time<br />
import math<br />
import string<br />
import socket<br />
import smbus</p>
<p><span style="color: #ff0000">#UDP 통신을 위한 선언</span><br />
UDP_IP =”192.168.59.152”<br />
UDP_PORT = 5005<br />
sock1 = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)<br />
sock1.bind((UDP_IP, UDP_PORT))<br />
bus = smbus.SMBus(1)<br />
address = 0&#215;68<br />
bus.write_byte_data(address, power_mgmt_1, 0)<br />
<span style="color: #ff0000">#자이로, 가속도 센서 사용위해 정의 및 필요함수</span></p>
<p><span style="color: #ff0000">#전송값 초기화</span><br />
xro=0<br />
yro=0</p>
<p><span style="color: #ff0000">#자이로, 가속도 센서을 사용위해 정의 및 필요함수</span><br />
power_mgmt_1 = 0x6b<br />
power_mgmt_2 = 0x6c</p>
<p>def read_byte(adr):<br />
return bus.read_byte_data(address, adr)<br />
def read_word(adr):<br />
high = bus.read_byte_data(address, adr)<br />
low = bus.read_byte_data(address, adr+1)<br />
val = (high &lt;&lt; 8) + low<br />
return val<br />
def read_word_2c(adr):<br />
val = read_word(adr)<br />
if (val &gt;= 0&#215;8000):<br />
return -((65535 &#8211; val) + 1)<br />
else:<br />
return val<br />
def dist(a,b):<br />
return math.sqrt((a*a)+(b*b))<br />
def get_y_rotation(x,y,z):<br />
radians = math.atan2(x, dist(y,z))<br />
return -math.degrees(radians)<br />
def get_x_rotation(x,y,z):<br />
radians = math.atan2(y, dist(x,z))<br />
return math.degrees(radians)</p>
<p><span style="color: #ff0000">####모터 동작을 위한 함수####</span><br />
<span style="color: #ff0000"> #모터가 돌지 않는 경우</span><br />
def STOP():<br />
PWM.Servo().set_servo(motor_1,1000)<br />
PWM.Servo().set_servo(motor_2,1000)</p>
<p><span style="color: #ff0000">#방향 회전없이 앞으로만 가는 경우</span><br />
def STRAIGHT(a) :<br />
a=a//1<br />
a=1400+(10*a)<br />
PWM.Servo().set_servo(motor_1,a)<br />
PWM.Servo().set_servo(motor_2,a)</p>
<p><span style="color: #ff0000">#제자리 회전을 위한 경우</span><br />
def S_TURN(a) :<br />
if a==1:<br />
PWM.Servo().set_servo(motor_1,1200)<br />
PWM.Servo().set_servo(motor_2,1800)<br />
elif a==2:<br />
PWM.Servo().set_servo(motor_1,1800)<br />
PWM.Servo().set_servo(motor_2,1200)</p>
<p><span style="color: #ff0000">#앞으로 가면서 방향 회전을 하는 경우</span><br />
def R_L_TURN(a,b) :<br />
a=a//1<br />
b=b//1<br />
b=1400+(10*b)<br />
if a&lt;-10:<br />
a=a*10<br />
PWM.Servo().set_servo(motor_1,b)<br />
PWM.Servo().set_servo(motor_2,b+a)<br />
elif a&gt;10:<br />
a=a*10<br />
PWM.Servo().set_servo(motor_1,b-a)<br />
PWM.Servo().set_servo(motor_2,b)</p>
<p><span style="color: #ff0000">#전체 모터 제어 함수</span><br />
def ACTION(xro,yro):<br />
if yro &lt;=10 and xro&lt;10 and xro&gt;-10 :<br />
STOP()<br />
elif yro &lt;=10 and xro&gt;40 :<br />
S_TURN(1)<br />
elif yro &lt;=10 and xro&lt;-40 :<br />
S_TURN(2)<br />
elif yro&gt;10 and yro&lt;=50 and xro&lt;10 and xro&gt;-10 :<br />
STRAIGHT(yro)<br />
elif yro&gt;10 and yro&lt;=50 :<br />
R_L_TURN(xro,yro)<br />
while 1:</p>
<p><span style="color: #ff0000">#가속도 값 z값을 읽어옴</span><br />
accel_zout = read_word_2c(0x3f)<br />
print “accel_zout: “, accel_zout</p>
<p><span style="color: #ff0000">#읽어온 가속도 z값으로 모터 핀 번호 변경</span><br />
if accel_zout&gt;15000:<br />
motor_1=4<br />
motor_2=18<br />
elif accel_zout&lt;=15000:<br />
motor_1=18<br />
motor_2=4</p>
<p><span style="color: #ff0000">#조종 라즈베리파이가 보낸 값을 받아옴</span><br />
for i in range(1,2):<br />
data, addr = sock1.recvfrom(1024)<br />
if data[0]==’a’:<br />
xro = string.atof(data[1:])<br />
elif data[0]==’b’:<br />
yro = string.atof(data[1:])<br />
print(“x_rotation=%f\t” %(xro))<br />
print(“y_rotation=%f\t” %(yro))</p>
<p><span style="color: #ff0000">#받아온 값으로 부터 모터 제어실행</span><br />
ACTION(xro,yro)</p>
</div>
<p><span style="color: #339966"><strong>기대효과</strong></span><br />
해양 정찰을 할 경우 암초, 바다의 포식자, 혹은 위험 물질로 인해 갈 수 없는 곳은 사람을 대신해 배로 정찰이 가능하다. 특히 해초가 많은 곳에서 일반적인 RC보트나 배로는 모터에 해초가 감겨서 쉽게 고장날 수 있다. 이런 장소들을 ‘로꾸꺼 보트’는 모터 위치가 물 위에 있기 때문에 고장의 염려없이 갈 수 있다. 수시로 보트들이 돌아가면서 충전하고 정찰하는 시스템을 구축해 놓아 녹조·적조 현상을 감지하여 빠른 조치가 가능하고 지속적인 해양기후 탐지를 통해 배들의 안전한 운항이 가능하다.<br />
다리를 지을 때 육지에서는 교량을 만드는 부분을 모든 각도에서 볼 수 없기 때문에 사람이 보기 힘든 각도에서 촬영하여 사람들이 쉽게 분석할 수 있도록 한다. 강물의 폭이 넓어지고 깊이가 깊어지면 수질 검사나 생태계 조사를 위해서 배를 타고 가서 조사를 하는 번거로움이 있다. 수심이 얕을 경우에도 물의 오염 정도가 심각할 경우에는 사람이 직접 들어가기 보다는 ‘로꾸꺼 보트’를 이용해 수질 검사 및 생태계 조사가 가능하다.</p>
<p><span style="color: #008000"><strong>참고문헌</strong></span><br />
· 파이썬 UDP 프로젝트 : wiki.python.org/moin/UdpCommunication<br />
· 파이썬 참조 : www.python.org/<br />
· 라즈베리파이 공식 홈페이지 : www.raspberrypi.org<br />
· jpeg 공식 홈페이지 : https://jpeg.org/</p>
<p><strong><span style="color: #008000">회로도</span></strong></p>
<p><strong>① 컨트롤러</strong></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-로꾸꺼-19.jpg" rel="lightbox[31922]"><img class="alignnone size-large wp-image-32087" alt="38 ict 로꾸꺼 (19)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-로꾸꺼-19-399x620.jpg" width="399" height="620" /></a><br />
<strong>② 보트</strong></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-로꾸꺼-20.jpg" rel="lightbox[31922]"><img class="alignnone size-large wp-image-32088" alt="38 ict 로꾸꺼 (20)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-로꾸꺼-20-527x620.jpg" width="527" height="620" /></a></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ntrexgo.com/archives/31922/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[38호]友 酒 Like-? 친구야 Cocktail 한잔 어때?</title>
		<link>http://www.ntrexgo.com/archives/31903</link>
		<comments>http://www.ntrexgo.com/archives/31903#comments</comments>
		<pubDate>Sun, 25 Sep 2016 02:22:31 +0000</pubDate>
		<dc:creator>디바이스마트 매거진</dc:creator>
				<category><![CDATA[디바이스마트 매거진]]></category>
		<category><![CDATA[특집]]></category>
		<category><![CDATA[38호]]></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=31903</guid>
		<description><![CDATA[디바이스마트 매거진 38호 &#124; 술자리의 의의는 친목을 도모하고 함께하는 사람들과 기억에 남을 추억을 만드는 것이다. 현재 대학생인 우리는 항상 비슷하고 딱딱한 분위기의 술자리에 지루해하고 있다. 그래서 우리는 색다르고 특별한 재미를 첨가시키고 싶었다.]]></description>
				<content:encoded><![CDATA[<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/05/2016-ictmain.png" rel="lightbox[31903]"><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="color: #ffffff;background-color: #008000"><strong>2016 ICT 융합 프로젝트 공모전 참가상</strong></span></p>
<p><span style="font-size: x-large"><strong>友 酒 Like-? 친구야 Cocktail 한잔 어때?</strong></span></p>
<p style="text-align: right">글 | 상지대학교 김준혁, 유대상, 황보경태</p>
<p><span style="color: #008000"><strong>심사평</strong></span><br />
<span style="color: #0000ff"><strong>뉴티씨</strong></span> 매우 고생하여 만든 흔적이 역력하며, 실용적으로 잘만 다듬으면 좋은 제품이 될 수도 있을 것으로 생각된다.<br />
현재는 실용적으로 사용하기는 디자인이나 작품성 면에서 조금 부족하지만, 디자인적인 감성과 기계적인 부분이 잘 접목되면 좋은 작품이 될 것이다. 현재는 그런 베이스가 부족한 상황에서도 전자적인 제어만으로 잘 구현하였다.<br />
<span style="color: #0000ff"><strong>칩센</strong></span> 모터 제어를 연습하기 위한 최고의 주제라고 생각한다.<br />
<span style="color: #0000ff"><strong>위드로봇</strong> </span>모터 제어 부분과 실제 시스템 동작시 장단점 등의 분석이 보고서에 언급이 되면 좋겠다.</p>
<p><span style="color: #008000"><strong>작품 개요</strong></span><br />
술자리의 의의는 친목을 도모하고 함께하는 사람들과 기억에 남을 추억을 만드는 것이다. 현재 대학생인 우리는 항상 비슷하고 딱딱한 분위기의 술자리에 지루해하고 있다. 그래서 우리는 색다르고 특별한 재미를 첨가시키고 싶었다.<br />
요즘 대학생들 사이에 칵테일은 인기가 많다. 칵테일은 복잡하고 미묘한 맛을 지닌 음료로써 마시는 사람의 기호와 취향에 맞추어 먹는 술의 예술품이라 할 수 있다. 그래서 공대생인 우리는 건전한 음주문화를 재미와 특별함을 위해, 직접 프로그래밍을 하여 칵테일 제조기를 만들게 되었다. 그리고 우리는 1년에 한 번씩 축제를 여는데 그 때 우리가 만든 칵테일 제조기를 사용하여 다른 학과들이 할 수 없는 공대생들의 위엄을 보여 주기로 하였다.</p>
<p><span style="color: #008000"><strong>작품 설명</strong></span><br />
<strong><span style="color: #008080">주요 동작 및 특징</span></strong><br />
Atmel社의 ATmega128에 AVR Studio 프로그램을 삽입하여 모터펌프와 프로펠러, LCD화면을 이용하여 구동하는 칵테일 머신이다. 그림에 보이는 칸 마다 다른 종류의 음료를 배치하고 일렬로 배치된 모터펌프를 이용하여 비율에 맞게 끌어올려서 배합기 통으로 음료를 전달한다. 배합기에서 모인 음료들이 섞이고, 배출구와 연결된 모터펌프가 배합기를 거쳐서 제조된 칵테일을 외부로 배출시킨다. 음료가 완성되면 음악과 LED 조명이 켜지는 등의 심미적인 요소를 더했다. 또 복불복 게임 모드 기능을 추가했는데, 이 기능은 LCD 화면에 4개의 원이 나타나고 이 원을 하나씩 고를 때마다 당첨과 꽝으로 나타난다. 술 게임과 유사한 오락적인 요소로 재미를 더했으며, 음료가 섞이는 배합기를 깨끗하게 세척하기 위해 전동기 모터와 프로펠러를 이용했다. 이 작품의 외형은 아크릴과 포맥스로 제작했고, 테스트 보드는 작년 수업시간에 쓰던 것을 이용했고, 배합 통은 페트병을 이용했다.</p>
<p><span style="color: #008080"><strong>개발 환경</strong></span><br />
AVR Studio를 이용하여 프로그래밍을 하고 난 후 회로를 구성했다.<br />
상황에 따른 모터의 작동 순서와 LED를 출력하기 위해 많은 포트를 사용하느라 기존의 5V 어댑터의 전압만으로는 많이 부족했다. 그래서 별도의 12V 전압을 연결하여 전압을 보충하였다.</p>
<p><span style="color: #008080"><strong>제작 과정</strong></span></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/12/38-ict-칵테일-6.jpg" rel="lightbox[31903]"><img class="alignnone size-full wp-image-32205" alt="38 ict 칵테일 (6)" src="http://www.ntrexgo.com/wp-content/uploads/2016/12/38-ict-칵테일-6.jpg" width="441" height="297" /></a></p>
<p>12V DC모터펌프에 호스를 연결하여 고정하였다.(위에서 본 사진)</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/12/38-ict-칵테일-7.jpg" rel="lightbox[31903]"><img class="alignnone size-full wp-image-32204" alt="38 ict 칵테일 (7)" src="http://www.ntrexgo.com/wp-content/uploads/2016/12/38-ict-칵테일-7.jpg" width="441" height="394" /></a></p>
<p>12V 전동기 모터를 이용하여 배합통에 장착될 배합기를 만들었다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/12/38-ict-칵테일-1.jpg" rel="lightbox[31903]"><img class="alignnone size-full wp-image-32203" alt="38 ict 칵테일 (1)" src="http://www.ntrexgo.com/wp-content/uploads/2016/12/38-ict-칵테일-1.jpg" width="441" height="270" /></a></p>
<p>재료통에 연결된 튜브를 배합기으로 이어준다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/12/38-ict-칵테일-2.jpg" rel="lightbox[31903]"><img class="alignnone size-full wp-image-32202" alt="38 ict 칵테일 (2)" src="http://www.ntrexgo.com/wp-content/uploads/2016/12/38-ict-칵테일-2.jpg" width="441" height="296" /></a></p>
<p>ATmega128를 이용하여 회로를 구성하였다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/12/38-ict-칵테일-3.jpg" rel="lightbox[31903]"><img class="alignnone size-full wp-image-32201" alt="38 ict 칵테일 (3)" src="http://www.ntrexgo.com/wp-content/uploads/2016/12/38-ict-칵테일-3.jpg" width="441" height="296" /></a></p>
<p>완성된 友 酒 Like의 모습</p>
<p><span style="color: #008080"><strong>이 기계가 구동되는 C언어</strong></span></p>
<div class="symple-box gray none" style="text-align:left; width:100%;"> 
<p>#include &lt;avr/io.h&gt;<br />
#include &lt;avr/interrupt.h&gt;<br />
#include &lt;stdio.h&gt;<br />
#include &lt;stdlib.h&gt;<br />
#include “mp3.h”<br />
#include &lt;util/delay.h&gt;<br />
#include “tftlcd_uart1.h”<br />
#include “tftlcd.h”<br />
/**************************************<br />
[MP3 connection]
PORT MP3 pin<br />
=======================================<br />
1 LED-Acess Mute 24<br />
2 LED-Random LED-PUS 23<br />
3 LED-repeat LED-PSD 22<br />
PA2 &#8212;&#8212; 4 Reset LED-Play 21<br />
GND &#8212;&#8212; 5 SEL-Slave LED-Error 20<br />
PA1 &#8212;&#8212; 6 R1(MUCHNG) Audio-L-Out 19 &#8212; L-speaker &#8211;o o&#8211;+<br />
PA0 &#8212;&#8212; 7 R2(Busy) Audio-R-Out 18 &#8211;R-speaker &#8211;o o&#8211;+<br />
PA5 -+&#8212;- 8 R3(SCL) DC5V 17 &#8212;&#8212; +5V |<br />
PA4 -|-+&#8211; 9 R4(SDA) USB(PM) 16 |<br />
GND -|-|&#8211; 10 C1 USB(DM) 15 |<br />
GND -|-|&#8211; 11 C2 GND 14&#8211; GND &#8212;&#8211;+<br />
PA3 -|-|&#8211; 12 C3(ModeH-2,L-3) DC3.3V 13<br />
| | ========================================<br />
| |<br />
| +&#8212;- 10K &#8212; +5V<br />
+&#8212;&#8212; 10K &#8212; +5V</p>
[MOTOR connection]
PORT 2803 MOTOR<br />
PF7 &#8212;&#8212; 1 18 &#8212;&#8212;o MOTOR1 o&#8212;&#8211;+12V<br />
PF6 &#8212;&#8212; 2 17 &#8212;&#8212;o MOTOR2 o&#8212;&#8211;+12V<br />
PF5 &#8212;&#8212; 3 16 &#8212;&#8212;o MOTOR3 o&#8212;&#8211;+12V<br />
PF4 &#8212;&#8212; 4 15 &#8212;&#8212;o MOTOR4 o&#8212;&#8211;+12V<br />
PF3 &#8212;&#8212; 5 14 &#8212;&#8212;o MOTOR5 o&#8212;&#8211;+12V<br />
PF2 &#8212;&#8212; 6 13 &#8212;&#8212;o MOTOR6 o&#8212;&#8211;+12V<br />
PF1 &#8212;&#8212; 7 12 &#8212;&#8212;o MOTOR7 o&#8212;&#8211;+12V<br />
PF0 &#8212;&#8212; 8 11 &#8212;&#8212;o MOTOR8 o&#8212;&#8211;+12V<br />
GND &#8212;&#8212; 9 10 &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+12V<br />
|<br />
+&#8211;o +12V 전원<br />
GND &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;o GND</p>
[LED connection}<br />
PORT 2803 LED<br />
PC7 ------ 1 18 ------o LED1 o-----+5V<br />
PC6 ------ 2 17 ------o LED2 o-----+5V<br />
PC5 ------ 3 16 ------o LED3 o-----+5V<br />
PC4 ------ 4 15 ------o LED4 o-----+5V<br />
PC3 ------ 5 14 ------o LED5 o-----+5V<br />
PC2 ------ 6 13 ------o LED6 o-----+5V<br />
PC1 ------ 7 12 ------o LED7 o-----+5V<br />
PC0 ------ 8 11 ------o LED8 o-----+5V<br />
GND ------ 9 10</p>
<p>***************************************/</p>
<p>// mp3.c에 정의된 변수를 사용함<br />
extern uchar volatile uflag;<br />
extern uchar CurrFileNum;<br />
extern uchar SI_Buff[BUFF_MAX];<br />
extern uchar I2C_Read_Buff[76];</p>
<p>#define DISP_START 0&#215;0010<br />
#define DISP_SEL_1 0&#215;0020<br />
#define DISP_SEL_2 0&#215;0030<br />
#define DISP_SEL_3 0&#215;0040<br />
#define DISP_SEL_4 0&#215;0050<br />
#define DISP_SEL_5 0&#215;0060<br />
#define DISP_SEL_6 0&#215;0070<br />
#define DISP_FINISH 0&#215;0080<br />
#define DISP_1 0&#215;0100<br />
#define DISP_2 0&#215;0110<br />
#define DISP_3 0&#215;0120<br />
#define DISP_4 0&#215;0130</p>
<p>#define PIC_INIT 0<br />
#define PIC_START_UP 1<br />
#define PIC_START_DN 2<br />
#define PIC_MENU 3<br />
#define PIC_MAKING 4<br />
#define PIC_FINISH 5<br />
#define PIC_GAME 6<br />
#define PIC_GAMECOLOR 7<br />
#define PIC_GAMERESULT 8</p>
<p>#define OFF 0<br />
#define ON 1</p>
<p>#define RUN_START 0<br />
#define RUN_CHOISE 1<br />
#define RUN_MAKING 2<br />
#define RUN_FINISH 3<br />
#define RUN_GAME 4</p>
<p>unsigned char motor_speed[9]={0,0,0,0,0,0,0,0,0};<br />
unsigned char cur_count=0;</p>
<p>extern volatile char RXFRMOK;<br />
extern unsigned char REC[128];</p>
<p>char run_flag = RUN_START;<br />
unsigned long MSEC10=0;</p>
<p>/////////////////////////////////////////////////////////////<br />
ISR(TIMER0_OVF_vect)<br />
{<br />
int i;</p>
<p>MSEC10++;</p>
<p>for(i=0; i&lt;8; i++)<br />
{<br />
if(motor_speed[i] == cur_count)<br />
{<br />
PORTF |= 1&lt;&lt;i;<br />
}<br />
}<br />
if(motor_speed[8] == cur_count)<br />
{<br />
PORTD |= (1&lt;&lt;0);<br />
}</p>
<p>if(cur_count==0)<br />
{<br />
PORTF = 0&#215;00;<br />
PORTD &amp;= ~(1&lt;&lt;0);<br />
}</p>
<p>cur_count&#8211;;<br />
}</p>
<p>//////////////////////////////////////////////////////////////////////<br />
void InitPORT(void)<br />
{<br />
// for MP3 module control<br />
PORTA = 0b00110111;<br />
DDRA = 0b00001100;<br />
// PA5 (I) &#8211; I2C SCL<br />
// PA4 (I) &#8211; I2C SDA<br />
// PA3 (O) &#8211; H:mode2 L:mode3<br />
// PA2 (O) &#8211; nRESET<br />
// PA1 (i) &#8211; MUCHNG<br />
// PA0 (i) &#8211; BUSY</p>
<p>// for MP3 LED<br />
PORTB = 0&#215;00;<br />
DDRB = 0b00111000;<br />
// PB5 (o) &#8211; PLAY LED ISP<br />
// PB4 (O) &#8211; SLED ISP<br />
// PB3 (o) &#8211; ISP<br />
// PB2 (i) -<br />
// PB1 (i) -<br />
// PB0 (i) -</p>
<p>// for LED output<br />
DDRC = 0xff;</p>
<p>// for motor9 output<br />
DDRD = 0&#215;01;</p>
<p>// for motor1-8 output<br />
PORTF=0&#215;00;<br />
DDRF=0xff;</p>
<p>// for key input and TFT LCD<br />
PORTE=0xff;<br />
DDRE=0&#215;00;</p>
<p>_delay_ms(50);</p>
<p>// 타이머 카운트 설정, 1/16us*8분주*(256-156) = 50us<br />
TIMSK = 0&#215;01; // 인터럽트 일단 정지<br />
TCCR0 = 0&#215;02; // clk/8분주<br />
TCNT0 = 0; // 타이머 카운트 레지스터 초기값<br />
</div>
<p><span style="color: #008000"><strong>완성작</strong></span></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/12/38-ict-칵테일-4.jpg" rel="lightbox[31903]"><img class="alignnone size-full wp-image-32200" alt="38 ict 칵테일 (4)" src="http://www.ntrexgo.com/wp-content/uploads/2016/12/38-ict-칵테일-4.jpg" width="503" height="244" /></a></p>
<p>&nbsp;</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/12/38-ict-칵테일-5.jpg" rel="lightbox[31903]"><img class="alignnone size-full wp-image-32199" alt="38 ict 칵테일 (5)" src="http://www.ntrexgo.com/wp-content/uploads/2016/12/38-ict-칵테일-5.jpg" width="503" height="244" /></a></p>
<p><span style="color: #008000"><strong>회로도</strong></span></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/12/38-ict-칵테일-회로도.png" rel="lightbox[31903]"><img class="alignnone size-large wp-image-32206" alt="38 ict 칵테일 (회로도)" src="http://www.ntrexgo.com/wp-content/uploads/2016/12/38-ict-칵테일-회로도-620x531.png" width="620" height="531" /></a></p>
<p><span style="color: #008000"><strong>기타</strong></span><br />
‘생릉출판’ &#8211; 쉽게 배우는 AVR ATmega128 마이크로컨트롤러<br />
‘한빛미디어’ &#8211; 디지털 논리회로, AVR마이크로컨트롤러<br />
‘INFINITY BOOKS’ &#8211; 한번에 이해되는 AVR ATmega128 C로 배우는 프로그래밍 기초</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ntrexgo.com/archives/31903/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<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>[38호]Personal Black Box 소형 단말 개인 보안 장치</title>
		<link>http://www.ntrexgo.com/archives/31912</link>
		<comments>http://www.ntrexgo.com/archives/31912#comments</comments>
		<pubDate>Sun, 25 Sep 2016 00:39:11 +0000</pubDate>
		<dc:creator>디바이스마트 매거진</dc:creator>
				<category><![CDATA[디바이스마트 매거진]]></category>
		<category><![CDATA[특집]]></category>
		<category><![CDATA[38호]]></category>
		<category><![CDATA[Feature]]></category>
		<category><![CDATA[ict]]></category>
		<category><![CDATA[공모전]]></category>
		<category><![CDATA[디바이스마트]]></category>
		<category><![CDATA[매거진]]></category>
		<category><![CDATA[융합]]></category>
		<category><![CDATA[프로젝트]]></category>

		<guid isPermaLink="false">http://www.ntrexgo.com/?p=31912</guid>
		<description><![CDATA[디바이스마트 매거진 38호 &#124; 이 작품의 목적은 새로운 플랫폼을 통하여 사람의 범죄나 사고를 예방하고 후처리를 빠르게 해결할 수 있도록 도와주는, 누구나 보다 안전해지는 악세서리를 만드는 것이다.]]></description>
				<content:encoded><![CDATA[<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/05/2016-ictmain.png" rel="lightbox[31912]"><img class="alignnone size-large wp-image-31056" alt="2016 ictmain" src="http://www.ntrexgo.com/wp-content/uploads/2016/05/2016-ictmain-620x156.png" width="620" height="156" /></a></p>
<p>&nbsp;</p>
<p><strong>2016 ICT 융합 프로젝트 공모전 참가상</strong></p>
<p><span style="font-size: x-large"><strong>Personal Black Box 소형 단말 개인 보안 장치</strong></span></p>
<p style="text-align: right">글 | 건국대학교 김호중, 박현근</p>
<p>&nbsp;</p>
<p><span style="color: #ff6600"><strong>심사평</strong></span></p>
<p><span style="color: #0000ff"><strong>JK전자</strong> </span>차량용 블랙박스에서 착안해서 개인용으로 사용하도록 만들겠다는 생각은 창의성이 있어 보인다. 하지만 구현된 작품을 실제 사용하기에는 기구물의 완성도가 낮고, 특히 센서들과 카메라 데이터의 데이터 수집을 위한 소프트웨어 구현이 해외의 특정 업체에서 제공하는 라이브러리를 그대로 사용하고 있어서 소프트웨어 구현을 위한 노력이 부족한것 같다.</p>
<p><span style="color: #0000ff"><strong>뉴티씨</strong> </span>매우 좋은 아이디어이지만 보고서 내용이 많이 빈약하고 설명이 부족하여, 기술성도 높은 좋은 작품임에도 불구하고 그에 비해서 높은 점수를 받지는 못했다. 하지만, 좀 더 표현하는 데에도 신경을 써서 문서화도 잘하고, 창의적인 내용과 실용적인 내용을 부각하여, 자세히 기술한다면 좋은 작품이 될 것이라고 확신한다.</p>
<p><span style="color: #0000ff"><strong>칩센</strong></span> 내용상 스마트폰의 기능이 그대로 반영되어 있고 유사 APP도 있는 상황으로 좋은 평가를 받기는 힘들다. 어떤 경우를 위험한 상황으로 판단할지에 대한 부분도 없어 아쉽다.</p>
<p><span style="color: #0000ff"><strong>위드로봇</strong> </span>라즈베리파이 보드에 여러 센서를 부착하여 개인용 블랙박스를 제작하는 아이디어가 좋다. 아쉬운 점은 보고서 상에서는 각각의 센서값들이 어떻게 잘 저장되었으며, 어떻게 활용할 수 있는지에 대한 내용이 빠져있다는 점이 어떻게 만들었는지 상세하게 설명하는 것만큼이나 이렇게 만들어진 작품이 어떻게 동작했으며, 잘 된 부분과 잘 안된 부분을 나눠 잘 안된 부분은 어떻게 추후 개선해 보겠다라는 내용이 보고서에 들어가면 더 좋을 것 같다.</p>
<p><span style="color: #ff6600"><strong>작품 개요</strong></span><br />
<strong>새롭게 떠오르고 있는 새로운 플랫폼(Platform)</strong><br />
21세기 2015년이후 현재, 세계 IT산업은 빠르게 발전하다 못해 현재 포화상태이고, 각 국의 IT기업들은 소리없는 전쟁을 치르고 있다. 우리는 지금까지 다양한 플랫폼(Platform)의 변화를 겪어왔다.<br />
고전적인 PC에서부터, 휴대성이 강조된 랩탑과 노트북, 통신기능이 탑재된 휴대폰, 강력한 컴퓨팅 파워까지 포함된 스마트폰. 이제는, 더욱 더 나아가 시계와 안경까지 플랫폼은 계속해서 변화중이다. 이러한 변화들을 통해 우리는 이제, 언제 어디서든지 인터넷에 접근할 수 있게 되었고, 모바일과 새로운 플랫폼에서는 다양한 센서(Sensor)를 통해 이전 플랫폼에서는 볼 수 없었던 다양하고 새로운, 신기한 어플리케이션이 제작되었다. 이는 가히 플랫폼이 가져온 혁명이라고 말할 수 있다.</p>
<p><strong>오픈소스 소프트웨어에서 오픈소스 하드웨어로</strong><br />
이러한 IOT 시대로의 변화의 중점에 있다는 것을 더욱 체감하게 해주는 것이 바로 오픈소스 하드웨어(Open Source Hardware Project)이다. 최근의 소프트웨어는 오픈소스 소프트웨어로 개발되는 것이 추세였다. 이런 장점을 그대로 가져와 IOT 시대에 서는 하드웨어에 오픈소스 개념을 적용하였다. 오픈소스의 장점은 많지만 그 중에서도 사용자의 입맛에 맞게 소스를 재구성 할 수 있다는 점이 가장 매력적인 부분이다. 하드웨어라고 달라진 점은 없다. 하드웨어의 모든 소스, 회로도, 아키텍처가 공개되어 있고, 이를 사용하는 사용자는 필요한 부분, 수정할 부분을 고쳐 사용하면 된다.</p>
<p><strong>자신을 좀 더 안전하게 돌봐줄 악세서리, Personal Black Box</strong><br />
블랙박스(Black Box)는, 현재까지는 자동차의 사고에 있어서 사고 현장을 촬영하여 사고 해결에 도움을 주는 그런 장치로 인식되고 있다. 사람의 경우는 어떠한가. 사람이 다니는 길에는 곳곳에 CCTV가 배치되어 있건만 CCTV의 사각지대로 인하여 제대로 촬영되지 않는 문제가 발생하기도 하며, 실종사건 발생시 추적하기가 매우 어려워진다. 그렇다면, 블랙박스를 사람에게도 가지고 다니게하면 어떨까?하고 생각하였다. 이 작품의 목적은 새로운 플랫폼을 통하여 사람의 범죄나 사고를 예방하고 후처리를 빠르게 해결할 수 있도록 도와주는, 누구나 보다 안전해지는 악세서리를 만드는 것이다.</p>
<p><span style="color: #ff6600"><strong>작품설명</strong></span><br />
<span style="color: #ff9900"><strong>센서 데이터 수집/조회</strong></span></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-소형단말-1.png" rel="lightbox[31912]"><img class="alignnone size-full wp-image-32016" alt="38 ict 소형단말 (1)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-소형단말-1.png" width="490" height="172" /></a></p>
<p><span style="color: #ff9900"><strong>카메라 사진 촬영/조회</strong></span></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-소형단말-2.png" rel="lightbox[31912]"><img class="alignnone size-full wp-image-32018" alt="38 ict 소형단말 (2)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-소형단말-2.png" width="490" height="172" /></a><br />
<span style="color: #ff9900"><strong> 전체 시스템 구성</strong></span></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-소형단말-3.png" rel="lightbox[31912]"><img class="alignnone size-full wp-image-32020" alt="38 ict 소형단말 (3)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-소형단말-3.png" width="490" height="403" /></a></p>
<p><span style="color: #ff9900"><strong>데이터 흐름도(Data Flow Diagram)</strong></span></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-소형단말-4.png" rel="lightbox[31912]"><img class="alignnone size-full wp-image-32022" alt="38 ict 소형단말 (4)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-소형단말-4.png" width="515" height="370" /></a></p>
<p><span style="color: #ff9900"><strong>개발 환경</strong></span><br />
<span style="color: #99cc00"><strong>MotherBoard</strong></span></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-소형단말-1.jpg" rel="lightbox[31912]"><img class="alignnone size-full wp-image-32015" alt="38 ict 소형단말 (1)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-소형단말-1.jpg" width="515" height="135" /></a></p>
<p><span style="color: #99cc00"><strong>NetWork</strong></span></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-소형단말-2.jpg" rel="lightbox[31912]"><img class="alignnone size-full wp-image-32017" alt="38 ict 소형단말 (2)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-소형단말-2.jpg" width="515" height="135" /></a></p>
<p><span style="color: #99cc00"><strong>Sensors</strong></span></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-소형단말-3.jpg" rel="lightbox[31912]"><img class="alignnone size-full wp-image-32019" alt="38 ict 소형단말 (3)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-소형단말-3.jpg" width="515" height="151" /></a></p>
<p>GPS &#8211; Adafruit GPS breakout board<br />
Accelerometer &#8211; Adafruit Flora LSM303<br />
Light &#8211; Adafuit Flora TSL2561<br />
etc &#8211; Resistor, Switch, Wire…</p>
<p><strong>Operation System and Programming Language</strong></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-소형단말-4.jpg" rel="lightbox[31912]"><img class="alignnone size-full wp-image-32021" alt="38 ict 소형단말 (4)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-소형단말-4.jpg" width="174" height="154" /></a><br />
OS : Raspbian (Debian)<br />
Language : Python, Java, HTML5</p>
<p><span style="color: #ff6600"><strong>단계별 제작 과정</strong></span><br />
<span style="color: #ff9900"><strong>라즈비안 운영체제 설치 및 환경설정</strong></span></p>
<p><strong>라즈비안 운영체제 다운로드</strong><br />
<a href="https://www.raspberrypi.org/downloads/raspbian/" target="_blank">https://www.raspberrypi.org/downloads/raspbian/</a></p>
<p><strong>Win32DiskImager 다운로드</strong><br />
<a href="http://sourceforge.net/projects/win32diskimager/" target="_blank">http://sourceforge.net/projects/win32diskimager/</a></p>
<p><strong>Win32DiskImager로 다운받은 라즈비안 운영체제 이미지 파일을 SD Card에 설치하도록 한다.</strong></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-소형단말-7.jpg" rel="lightbox[31912]"><img class="alignnone size-full wp-image-32025" alt="38 ict 소형단말 (7)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-소형단말-7.jpg" width="507" height="278" /></a></p>
<p><strong>SSH접근이 가능하도록 설정해주고 W ifi 모듈을 장착한뒤, 무선랜 설정으로 들어가 현재 사용할 AP를 연결 및 저장하도록 한다.</strong></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-소형단말-6.jpg" rel="lightbox[31912]"><img class="alignnone size-full wp-image-32024" alt="38 ict 소형단말 (6)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-소형단말-6.jpg" width="510" height="264" /></a></p>
<p><span style="color: #ff9900"><strong>라즈베리파이 카메라 모듈 테스팅 및 모션인식 설정</strong></span></p>
<p><strong>카메라 모듈을 보드에 장착한다.</strong></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-소형단말-7.jpg" rel="lightbox[31912]"><img class="alignnone size-full wp-image-32025" alt="38 ict 소형단말 (7)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-소형단말-7.jpg" width="507" height="278" /></a></p>
<p><strong>카메라 사용을 위해 다음을 터미널에서 입력한다.</strong><br />
‘sudo apt-get update’와 ‘sudo apt-get upgrade’를 입력한다. 그 후 ‘sudo raspi-config’를 입력해 설정창으로 들어간다. 설정창에서 카메라 사용여부를 ‘Enable’ 로 변경한다. 이후 리부팅한다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-소형단말-8.jpg" rel="lightbox[31912]"><img class="alignnone size-full wp-image-32026" alt="38 ict 소형단말 (8)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-소형단말-8.jpg" width="507" height="228" /></a></p>
<p>라즈베리파이 모션 패키지를 설치하기 위해 터미널 창에서 순서로 진행하도록 한다.<br />
‘sudo apt-get install -y motion’<br />
‘sudo rm /usr/bin/motion’<br />
‘mkdir tmp’<br />
‘cd tmp’<br />
‘wget http://rasplay.iptime.org/data/source/motion-mmal/motion’<br />
‘wget http://rasplay.iptime.org/data/source/motion-mmal/motion-mmalcam.conf’<br />
‘sudo chmod 700 motion’<br />
‘sudo mv ~/tmp/motion /usr/bin/’<br />
‘sudo mv ~/tmp/motion-mmalcam.conf /etc/motion/’</p>
<p><span style="color: #ff9900"><strong>GPS 모듈 설정</strong></span><br />
<strong>GPS 모듈을 사용하기 위하여 OS설정을 변경한다. 터미널 창에서 다음을 입력한다.</strong><br />
‘sudo vi /boot/cmdline.txt’ 파일 안의 다음의 내용을<br />
‘dwc_otg.lpm_enable=0 console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=dedline rootwait’<br />
다음과 같이 바꾼다.<br />
‘dwc_otg.lpm_enable=0 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait’</p>
<p><strong>/etc/inittab 파일을 수정하기 위해 터미널에 다음과 같이 입력 후 수정한다.</strong><br />
‘sudo vi /etc/inittab’ 파일 안의 다음의 내용을<br />
‘#Spawn a getty on Raspberry Pi serial line T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100’<br />
다음과 같이 바꾼다.<br />
‘#Spawn a getty on Raspberry Pi serial line #T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100’</p>
<p><strong>GPS 관련 Daemon을 설치한다.</strong><br />
‘sudo apt-get install gaps psd-clients python-gps’</p>
<p><span style="color: #ff9900"><strong>센서 사용을 위한 I2C 데이터 버스 설정</strong></span><br />
<strong>사용 금지된 i2c blacklist를 해제하여야 한다. 터미널에 다음을 입력한다.</strong><br />
‘sudo vi /etc/modprobe.d/raspi-blacklist.conf’<br />
파일 안에 내용 중 ‘blacklist i2c-bcm2708’이란 내용을 ‘#’으로 주석 처리해준다.</p>
<p><strong>i2c 디바이스를 활성화시키기 위해 터미널에 다음을 입력한다.</strong><br />
‘sudo vi /etc/modules’<br />
파일의 내용중 가장 마지막 줄에 ‘i2c-dev’를 입력한뒤 저장한다.</p>
<p><strong>i2c 관련 응용툴을 설치하기 위해 터미널에 다음을 입력한다.</strong><br />
‘sudo apt-get install i2c-tools libi2c-dev python-smbus’</p>
<p><strong>i2c에 관해 유저 등록을 해주기 위해 다음을 입력한다.</strong><br />
‘sudo adduser pi i2c’</p>
<p><span style="color: #ff9900"><strong>각종 센서 GPIO에 연결</strong></span></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-소형단말-9.jpg" rel="lightbox[31912]"><img class="alignnone size-full wp-image-32027" alt="38 ict 소형단말 (9)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-소형단말-9.jpg" width="507" height="282" /></a> <a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-소형단말-10.jpg" rel="lightbox[31912]"><img class="alignnone size-full wp-image-32028" alt="38 ict 소형단말 (10)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-소형단말-10.jpg" width="507" height="255" /></a><br />
<span style="color: #ff9900"><strong>각종 코드를 다운 및 설정</strong></span><br />
<strong>Adafruit 센서의 예제 소스코드를 토대로 소스코드를 작성할 것 이므로 GitHub에서 예제 소스코드를 다운 받는다.</strong><br />
터미널 창에서 다음을 입력한다.<br />
‘git clone https://github.com/adafruit/Adafruit-Raspberry-Pi-Python-Code.git’<br />
Adafruit에서 제공하는 센서들의 Python으로 작성된 예제 소스코드들이 전부 포함되어 있다.</p>
<p><strong>센서들을 자동 실행할 쉘 스크립트 파일을 만든다.</strong><br />
라즈베리파이의 홈폴더에 ‘Motion.sh’라는 쉘 스크립트 파일을 만든다. 이 스크립트 파일은 모션캡쳐기능을 자동 실행하는 스크립트이다. 라즈베리파이의 홈폴더에 ‘Start.sh’라는 쉘 스크립트 파일을 만든다. 이 스크립트 파일은 클라우드, 센서를 작동시키는 스크립트이다.</p>
<p><strong>스크립트 파일 자동 실행 등록을 해준다.</strong><br />
터미널 창에 다음을 입력한다. ‘sudo vim /etc/rc.local’</p>
<div class="symple-box gray none" style="text-align:left; width:100%;"> 
<p>#!/bin/sh-e<br />
#<br />
#rc.local<br />
#<br />
#This script is executed at the end of each multiuser runlevel.<br />
#Make sure that the script will “exit o” on success or any other<br />
#value on error.<br />
#<br />
#In order to enable or disable this script just change the execution<br />
#bits.<br />
#<br />
#By default this script does nothing.<br />
#Print the IP address<br />
_IP=$(hostname-I)||true<br />
if{“$_IP”}; them<br />
printf “My IP address is %sn””$_IP”<br />
fi<br />
#ADD line:<br />
exit o</p>
</div>
fi와 exit0사이에 명령어를 입력해준다.</p>
<div class="symple-box gray none" style="text-align:left; width:100%;"> 
<p>‘/home/pi/Start.sh/’</p>
</div>
<p>재부팅하여 정상 동작하는지 확인한다.</p>
<p><span style="color: #ff9900"><strong>First Model</strong></span></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-소형단말-11.jpg" rel="lightbox[31912]"><img class="alignnone size-full wp-image-32029" alt="38 ict 소형단말 (11)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-소형단말-11.jpg" width="262" height="287" /></a></p>
<p>라즈베리파이에서 불필요한 파츠를 제거한 모습.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-소형단말-12.jpg" rel="lightbox[31912]"><img class="alignnone size-full wp-image-32010" alt="38 ict 소형단말 (12)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-소형단말-12.jpg" width="507" height="226" /></a></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-소형단말-13.jpg" rel="lightbox[31912]"><img class="alignnone size-full wp-image-32011" alt="38 ict 소형단말 (13)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-소형단말-13.jpg" width="217" height="259" /></a></p>
<p>RJ-45잭, 오디오잭, 영상잭을 제거했다. 또한 GPIO의 핀들을 전부 제거, USB 호스트에서 2단 잭을 제거하고, 1단 잭으로 변경했다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-소형단말-14.jpg" rel="lightbox[31912]"><img class="alignnone size-full wp-image-32012" alt="38 ict 소형단말 (14)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-소형단말-14.jpg" width="213" height="180" /></a></p>
<p>작품의 초기 모델 Wifi모듈, 카메라, 센서들. 단, GPS센서의 경우 중요도가 낮 아서 일단 실험(자세 측정)에는 필요가 없고, 실험특성상 건물 내부에서만 진행되기에 장착하지 않음.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-소형단말-15.jpg" rel="lightbox[31912]"><img class="alignnone size-full wp-image-32013" alt="38 ict 소형단말 (15)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-소형단말-15.jpg" width="214" height="180" /></a></p>
<p>작품의 뒷모습. 실제로 착용을 하고(목걸이형식) 실험을 해야하기 때문에, 배터리를 장착하여 전원 코드에서 독립되도록 진행<br />
목걸이 부위에서 사람의 뒷목에 닿는 부분, 이 곳에는 가속도 센서를 장착하여 현재 착용자의 몸이 앞/뒤/양옆 으로 기울었는지를 판단한다.</p>
<p><span style="color: #ff6600"><strong>소스코드</strong></span></p>
<div class="symple-box gray none" style="text-align:left; width:100%;"> 
[Motion.sh의 전문]
<p>sudo modprobe bcm2835-v4l2<br />
uv4l &#8211;driver raspicam &#8211;auto-video_nr &#8211;nopreview<br />
LD_PRELOAD=/usr/lib/uv4l/uv4lext/armv6l/libuv4lext.so<br />
motion -c ./ motion.conf</p>
</div>
<div class="symple-box gray none" style="text-align:left; width:100%;"> 
[Start.sh의 전문]
<p>python /home/pi/Adafruit-Raspberry-Pi-Python-Code/Adafruit_LSM303/ Adafruit_LSM303.py &amp;<br />
python /home/pi/Adafruit-Raspberry-Pi-Python-Code/Adafruit_LSM303/ TSL2561.py &amp;<br />
java -jar FTP.jar &amp;<br />
</div>
<div class="symple-box gray none" style="text-align:left; width:100%;"> 
[LM303.py의 전문]
<p>from Adafruit_I2C import Adafruit_I2C<br />
import math<br />
import time<br />
import RPi.GPIO as GPIO<br />
import commands<br />
import datetime<br />
originX = 1000<br />
originY = 1000<br />
originZ = 1000</p>
<p>class Adafruit_LSM303(Adafruit_I2C):<br />
LSM303_ADDRESS_ACCEL = (0&#215;32 &gt;&gt; 1) # 0011001x # Default Type<br />
LSM303_REGISTER_ACCEL_CTRL_REG1_A = 0&#215;20 # 00000111 rw LSM303_REGISTER_ACCEL_CTRL_REG4_A = 0&#215;23 # 00000000 rw LSM303_REGISTER_ACCEL_OUT_X_L_A = 0&#215;28</p>
<p>def __init__(self, busnum=-1, debug=False, hires=False):<br />
self.accel = Adafruit_I2C(self.LSM303_ADDRESS_ACCEL, busnum, debug)<br />
self.accel.write8(self.LSM303_REGISTER_ACCEL_CTRL_REG1_A, 0&#215;27)<br />
if hires:<br />
self.accel.write8(self.LSM303_REGISTER_ACCEL_CTRL_REG4_A,<br />
0b00001000)<br />
else:<br />
self.accel.write8(self.LSM303_REGISTER_ACCEL_CTRL_REG4_A, 0) def accel12(self, list, idx):<br />
n = list[idx] | (list[idx+1] &lt;&lt; 8) # Low, high bytes<br />
if n &gt; 32767: n -= 65536 # 2’s complement signed<br />
return n &gt;&gt; 4 # 12-bit resolution</p>
<p>def read(self):<br />
list = self.accel.readList(<br />
self.LSM303_REGISTER_ACCEL_OUT_X_L_A | 0&#215;80, 6)<br />
xyz = [self.accel12(list,0),<br />
self.accel12(list,2),<br />
self.accel12(list,4)]
x = xyz[0]
y = xyz[1]
z = xyz[2]
angles = [x,y,z]
if x != 0 : angles[0] = math.atan( x / math.sqrt( math.pow(y,2) + math.pow(z,2) ) )<br />
else :<br />
angles[0] = 0<br />
if y != 0 :<br />
angles[1] = math.atan( y / math.sqrt( math.pow(x,2) + math.pow(z,2) ) )<br />
else :<br />
angles[1] = 0<br />
if z != 0 :<br />
angles[2] = math.atan( math.sqrt( math.pow(x,2) + math.pow(y,2) )/z )<br />
else :<br />
angles[2] = 0<br />
angles[0] *= 180<br />
angles[0] /= 3.141592<br />
angles[1] *= 180<br />
angles[1] /= 3.141592<br />
angles[2] *= 180<br />
angles[2] /= 3.141592<br />
angles[0] = int(angles[0])<br />
angles[1] = int(angles[1])<br />
angles[2] = int(angles[2])<br />
global originX<br />
global originY<br />
global originZ<br />
if(originX != 1000 or originY != 1000 or originZ != 1000):<br />
#if(angles[0] &gt;= originX+10 or angles[0] &lt;= originX-10) or (angles[1] &gt;= originY+10 or angles[1] &lt;= originY-10) or (angles[2] &gt;= originZ+10 or angles[2] &lt;= originZ-10):<br />
if(angles[1] &gt;= originY+10 or angles[1] &lt;= originY-10):<br />
print “alarm”<br />
output = commands.getstatusoutput(“aplay /home/pi/PipeWarp.wav”)<br />
GPIO.setmode(GPIO.BCM)<br />
GPIO.setup(23 , GPIO.IN)<br />
if GPIO.input(23)==0:<br />
print “Button pressed!”<br />
time.sleep(1)<br />
print “Press the button (CTRL-C to exit)”<br />
originX = angles[0]
originY = angles[1]
originZ = angles[2]
print (“setup”, originX, originY, originZ)<br />
return angles<br />
if __name__ == ‘__main__’:<br />
from time import sleep<br />
s = datetime.datetime.now()<br />
lsm = Adafruit_LSM303()<br />
count = 1<br />
time_count =1<br />
print ‘[(Accelerometer X, Y, Z)]’<br />
while True:<br />
an = lsm.read()<br />
print an<br />
if(time_count &lt; 30) :<br />
f = open(“/home/pi/accelData”+str(count)+”.txt”, “a”)<br />
f.write(str(lsm.read())+”\n”)<br />
if(time_count &gt; 30) :<br />
count += 1<br />
time_count = 1</p>
<p>sleep(1)<br />
time_count += 1<br />
</div>
<p>&nbsp;</p>
<div class="symple-box gray none" style="text-align:left; width:100%;"> 
[TSL2561.py의 전문]
<p>#!/usr/bin/python<br />
import sys<br />
import time from Adafruit_I2C<br />
import Adafruit_I2C<br />
import os class TSL2561:<br />
i2c = None<br />
def __init__(self, address=0&#215;39, debug=0, pause=0.8):<br />
self.i2c = Adafruit_I2C(address)<br />
self.address = address<br />
self.pause = pause<br />
self.debug = debug<br />
self.gain = 0 # no gain preselected<br />
self.i2c.write8(0&#215;80, 0&#215;03) # enable the device<br />
def setGain(self,gain=1):<br />
“”” Set the gain “””<br />
if (gain != self.gain):<br />
if (gain==1):<br />
self.i2c.write8(0&#215;81, 0&#215;02) # set gain = 1X and timing = 402 mSec<br />
if (self.debug):<br />
print “Setting low gain”<br />
else:<br />
self.i2c.write8(0&#215;81, 0&#215;12) # set gain = 16X and timing = 402 mSec<br />
if (self.debug):<br />
print “Setting high gain”<br />
self.gain=gain; # safe gain for calculation<br />
time.sleep(self.pause) # pause for integration (self.pause must be bigger than integration time)<br />
def readWord(self, reg):<br />
“””Reads a word from the I2C device”””<br />
try:<br />
wordval = self.i2c.readU16(reg)<br />
newval = self.i2c.reverseByteOrder(wordval)<br />
if (self.debug):<br />
print(“I2C: Device 0x%02X returned 0x%04X from reg 0x%02X” % (self.address, wordval &amp; 0xFFFF, reg))<br />
return newval<br />
except IOError:<br />
print(“Error accessing 0x%02X: Check your I2C address” % self.address)<br />
return -1<br />
def readFull(self, reg=0x8C):<br />
“””Reads visible+IR diode from the I2C device”””<br />
return self.readWord(reg);<br />
def readIR(self, reg=0x8E):<br />
“””Reads IR only diode from the I2C device”””<br />
return self.readWord(reg);<br />
def readLux(self, gain = 0):<br />
“””Grabs a lux reading either with autoranging (gain=0) or with a specified gain (1, 16)”””<br />
if (gain == 1 or gain == 16):<br />
self.setGain(gain) # low/highGain<br />
ambient = self.readFull()<br />
IR = self.readIR()<br />
elif (gain==0): # auto gain<br />
self.setGain(16) # first try highGain<br />
ambient = self.readFull()<br />
if (ambient &lt; 65535):<br />
IR = self.readIR()<br />
if (ambient &gt;= 65535 or IR &gt;= 65535): # value(s) exeed(s) datarange<br />
self.setGain(1) # set lowGain<br />
ambient = self.readFull()<br />
IR = self.readIR()<br />
if (self.gain==1):<br />
ambient *= 16 # scale 1x to 16x<br />
IR *= 16 # scale 1x to 16x<br />
ratio = (IR / float(ambient)) # changed to make it run under python 2<br />
if (self.debug):<br />
print “IR Result”, IR<br />
print “Ambient Result”, ambient<br />
if ((ratio &gt;= 0) &amp; (ratio &lt;= 0.52)):<br />
lux = (0.0315 * ambient) &#8211; (0.0593 * ambient * (ratio**1.4))<br />
elif (ratio &lt;= 0.65):<br />
lux = (0.0229 * ambient) &#8211; (0.0291 * IR)<br />
elif (ratio &lt;= 0.80):<br />
lux = (0.0157 * ambient) &#8211; (0.018 * IR)<br />
elif (ratio &lt;= 1.3):<br />
lux = (0.00338 * ambient) &#8211; (0.0026 * IR)<br />
elif (ratio &gt; 1.3):<br />
lux = 0<br />
return lux<br />
if __name__ == “__main__”:<br />
count = 1<br />
time_count = 1<br />
while True:<br />
tsl=TSL2561()<br />
print tsl.readLux(1)<br />
f = open(“/home/pi/lightData”+str(count)+”.txt”,”a”)<br />
if(time_count &lt; 30) :<br />
f.write(str(tsl.readLux(1))+”\n”)<br />
if(time_count &gt; 30) :<br />
count += 1<br />
time_count = 1<br />
time.sleep(1)<br />
time_count += 1<br />
</div>
<div class="symple-box gray none" style="text-align:left; width:100%;"> 
[FTP.java의 전문]
<p>import org.apache.commons.net.ftp.*;<br />
import java.io.*;<br />
public class FTP {<br />
FTPClient client = new FTPClient();<br />
Thread th;<br />
Thread th2;<br />
Thread th3;<br />
public FTP() throws IOException{<br />
th3 = new Thread(execMnM);<br />
try{<br />
client.connect(“server address”);<br />
boolean login = client.login(“Login ID”,”Password”);<br />
if(login){<br />
System.out.println(“Login Success.”);<br />
try{<br />
client.changeWorkingDirectory(“Working Directory”);<br />
System.out.println(client.printWorkingDirectory());<br />
}catch(Exception se){<br />
se.printStackTrace();<br />
}<br />
th3.start();<br />
}else{<br />
System.out.println(“Login fail&#8230;”);<br />
}<br />
while(true){<br />
FileInputStream fis;<br />
File file = new File(“./”);<br />
String[] a = file.list();<br />
client.setFileTransferMode(1);<br />
for(int i = 0; i &lt; a.length; i++){<br />
if(a[i].contains(“.txt”)){<br />
Thread.sleep(500);<br />
if(new File(“./”+a[i]).length() &gt; 620){<br />
fis = new FileInputStream(a[i]);<br />
client.setFileType(FTPClient.BINARY_FILE_TYPE);<br />
boolean isuploaded = client.storeFile(a[i], fis);<br />
System.out.println(a[i]+”’s upload complete? : “+isuploaded);<br />
File up = new File(a[i]);<br />
up.delete();<br />
}<br />
}<br />
if(a[i].contains(“.jpg”)){<br />
Thread.sleep(500);<br />
fis = new FileInputStream(a[i]);<br />
client.setFileType(FTPClient.BINARY_FILE_TYPE);<br />
boolean isuploaded = client.storeFile(a[i], fis);<br />
System.out.println(a[i]+”’s upload complete? : “+isuploaded);<br />
File up = new File(a[i]);<br />
up.delete();<br />
}<br />
}<br />
}<br />
}catch(Exception e){<br />
e.printStackTrace();<br />
}finally{<br />
try{<br />
client.disconnect();<br />
}catch(Exception e){<br />
e.printStackTrace();<br />
}<br />
}<br />
} Runnable execMnM = new Runnable(){<br />
public void run(){<br />
try{ Runtime.getRuntime().exec(“./Motion.sh”); }catch(Exception e){}<br />
while(true){<br />
try{ Runtime.getRuntime().exec(“./Mic.sh”); }catch(Exception e){}<br />
}<br />
}<br />
};<br />
public static void main(String[] ar)throws IOException{<br />
new FTP();<br />
}<br />
}<br />
</div>
<p>&nbsp;</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ntrexgo.com/archives/31912/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[38호]스마트 욕조</title>
		<link>http://www.ntrexgo.com/archives/31916</link>
		<comments>http://www.ntrexgo.com/archives/31916#comments</comments>
		<pubDate>Sun, 25 Sep 2016 00:36:28 +0000</pubDate>
		<dc:creator>디바이스마트 매거진</dc:creator>
				<category><![CDATA[디바이스마트 매거진]]></category>
		<category><![CDATA[특집]]></category>
		<category><![CDATA[38호]]></category>
		<category><![CDATA[Feature]]></category>
		<category><![CDATA[ict]]></category>
		<category><![CDATA[공모전]]></category>
		<category><![CDATA[디바이스마트]]></category>
		<category><![CDATA[매거진]]></category>
		<category><![CDATA[융합]]></category>
		<category><![CDATA[참가상]]></category>
		<category><![CDATA[프로젝트]]></category>

		<guid isPermaLink="false">http://www.ntrexgo.com/?p=31916</guid>
		<description><![CDATA[디바이스마트매거진 38호 &#124; 개인 집의 화장실 욕조에 스마트한 기능을 추가하여 반신욕을 좀 더 편리하게 할 수 있다.]]></description>
				<content:encoded><![CDATA[<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/05/2016-ictmain.png" rel="lightbox[31916]"><img class="alignnone size-large wp-image-31056" alt="2016 ictmain" src="http://www.ntrexgo.com/wp-content/uploads/2016/05/2016-ictmain-620x156.png" width="620" height="156" /></a></p>
<p><span style="font-size: large;color: #008000"><strong> 2016 ICT 융합 프로젝트 공모전 참가상</strong></span></p>
<p><span style="font-size: xx-large"><strong>스마트 욕조</strong></span></p>
<p style="text-align: right">글 | 부산대학교 김유림, 윤영길</p>
<p><span style="color: #008000"><strong>심사평</strong></span><br />
<strong></strong></p>
<p><span style="color: #0000ff"><strong>JK전자</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> IoT 관점에서 보면 주변에 볼 수 있는 욕조에 자동화된 기능을 넣는 부분이 재미있다. 물의 온도를 조절하는 부분은 밸브의 on/off 만으로 구현하고 있는데, 히터가 있다는 가정하에 온도 제어하는 부분을 구현해 봤더라면 제어 이론도 같이 공부되고, 전체적인 제품의 완성도도 올라갔을 것 같다.</p>
<p><span style="color: #008000"><strong>작품 개요</strong></span><br />
<span style="color: #339966"><strong>주제 선정 이유</strong></span><br />
한국은 옛날부터 목욕탕을 즐겨왔다. 하지만 시대가 변하면서 사람들은 바쁜 일상생활 속에서 목욕탕을 가기 보다는 집에서 간단하게 피로와 스트레스를 풀어주는 반신욕을 즐기는 시간이 많아졌다. 하지만 반신욕을 할 때 몇 가지 불편한 점이 있다. 물의 양과 온도를 맞추기 위해서 계속해서 신경을 쓰고 있어야 하고, 반신욕을 하는 동안 물이 식을 수도 있다. 또한 반신욕을 오래할 경우 오히려 몸에 좋지 않을 수도 있다. 따라서 우리는 위에서 언급한 불편한 점들을 개선하기 위해 ‘스마트 욕조’라는 주제를 선정하게 되었다.</p>
<p><span style="color: #339966"><strong>작품에 대한 간단한 설명</strong></span><br />
‘스마트 욕조’란 개인 집의 화장실 욕조에 스마트한 기능을 추가한 욕조로, 이 기능들은 앞에서 말한 불편한 점들을 개선하는 방향으로 만들어 보았다. 첫 번째 기능은 물의 양을 조절해주는 것이고, 두 번째는 물의 온도를 설정해 놓으면 반신욕이 끝날 때까지 물의 온도를 유지시켜주는 것이다. 마지막으로 목욕이 끝난 후 자동으로 물을 빼주는 기능이 있다. 버튼 한번만 누름으로써 순차적으로 이 기능들이 동작하게 된다.</p>
<p><span style="color: #339966"><strong>작품에 사용한 부품</strong></span><br />
<strong>주요 부품 </strong></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-스마트욕조-1.jpg" rel="lightbox[31916]"><img class="alignnone size-full wp-image-31986" alt="38 ict 스마트욕조 (1)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-스마트욕조-1.jpg" width="568" height="218" /></a></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-스마트욕조-2.jpg" rel="lightbox[31916]"><img alt="38 ict 스마트욕조 (2)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-스마트욕조-2.jpg" width="568" height="218" /></a></p>
<p><strong>센서</strong></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-스마트욕조-3.jpg" rel="lightbox[31916]"><img class="alignnone size-full wp-image-31988" alt="38 ict 스마트욕조 (3)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-스마트욕조-3.jpg" width="568" height="218" /></a></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-스마트욕조-4.jpg" rel="lightbox[31916]"><img class="alignnone size-full wp-image-31989" alt="38 ict 스마트욕조 (4)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-스마트욕조-4.jpg" width="291" height="206" /></a></p>
<p><strong>모터</strong></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-스마트욕조-5.jpg" rel="lightbox[31916]"><img class="alignnone size-full wp-image-31990" alt="38 ict 스마트욕조 (5)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-스마트욕조-5.jpg" width="568" height="218" /></a></p>
<p><strong>기타</strong></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-스마트욕조-6.jpg" rel="lightbox[31916]"><img class="alignnone size-full wp-image-31991" alt="38 ict 스마트욕조 (6)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-스마트욕조-6.jpg" width="568" height="218" /></a></p>
<p><span style="color: #008000"><strong>작품 설명</strong></span><br />
<span style="color: #339966"><strong>주요 동작 및 특징</strong></span><br />
<span style="color: #3366ff"><strong>① 적정 온도와 높이 맞추기(반신욕 전)</strong></span></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-스마트욕조-7.jpg" rel="lightbox[31916]"><img class="alignnone size-full wp-image-31992" alt="38 ict 스마트욕조 (7)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-스마트욕조-7.jpg" width="568" height="256" /></a><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-스마트욕조-8.jpg" rel="lightbox[31916]"><img class="alignnone size-full wp-image-31993" alt="38 ict 스마트욕조 (8)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-스마트욕조-8.jpg" width="568" height="256" /></a></p>
<p>반신욕 전 욕조의 스위치를 on 하면 욕조 바닥의 배출구가 닫히고 물이 나오기 시작한다.<br />
여기서 스위치의 on/off를 눈으로 알아보기 쉽게 하기 위해서 빨간 led를 설치했고 욕조 바닥의 배출구에는 모터2를 연결시켜서 개폐가 가능하게 했다. 그리고 우리가 실제로 수도꼭지를 연결시킬 수 없었기 때문에 수도꼭지에 물이 나오는 것을 녹색 led의 on/off로 표현하였다.(물 나옴 ▶ on / 물 멈춤 ▶ off)</p>
<p>수도꼭지를 on하고 지속적으로 온도센서로 온도를 측정하면서 시스템에 설정되어 있는 38~40도에 맞춰 물의 온도를 조절한다. 여기서는 모터1의 움직임을 실제 수도꼭지의 움직임처럼 나타냈다.</p>
<p>일정량의 물과 온도에 다다르면 설치된 수위센서1이 감지해서 물을 멈출 수 있도록 구성했다. 수위센서1에 물이 닿으면 Level1이 Low(0)로 출력된다. 반대의 경우, High(1)으로 출력된다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-스마트욕조-10.jpg" rel="lightbox[31916]"><img class="alignnone size-full wp-image-31995" alt="38 ict 스마트욕조 (10)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-스마트욕조-10.jpg" width="568" height="284" /></a> <a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-스마트욕조-11.jpg" rel="lightbox[31916]"><img class="alignnone size-full wp-image-31996" alt="38 ict 스마트욕조 (11)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-스마트욕조-11.jpg" width="568" height="284" /></a> <a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-스마트욕조-12.jpg" rel="lightbox[31916]"><img class="alignnone size-full wp-image-31997" alt="38 ict 스마트욕조 (12)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-스마트욕조-12.jpg" width="568" height="284" /></a> <a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-스마트욕조-13.jpg" rel="lightbox[31916]"><img class="alignnone size-full wp-image-31998" alt="38 ict 스마트욕조 (13)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-스마트욕조-13.jpg" width="568" height="284" /></a> <a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-스마트욕조-14.jpg" rel="lightbox[31916]"><img class="alignnone size-full wp-image-31999" alt="38 ict 스마트욕조 (14)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-스마트욕조-14.jpg" width="568" height="284" /></a> <a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-스마트욕조-15.jpg" rel="lightbox[31916]"><img class="alignnone size-full wp-image-32000" alt="38 ict 스마트욕조 (15)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-스마트욕조-15.jpg" width="573" height="287" /></a> <a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-스마트욕조-16.jpg" rel="lightbox[31916]"><img class="alignnone size-full wp-image-32001" alt="38 ict 스마트욕조 (16)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-스마트욕조-16.jpg" width="573" height="287" /></a></p>
<p><span style="color: #3366ff"><strong>② 적정 온도 유지 및 적정 시간 알림(반신욕 중)</strong></span></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-스마트욕조-17.jpg" rel="lightbox[31916]"><img class="alignnone size-full wp-image-32002" alt="38 ict 스마트욕조 (17)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-스마트욕조-17.jpg" width="573" height="287" /></a> <a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-스마트욕조-18.jpg" rel="lightbox[31916]"><img class="alignnone size-full wp-image-32003" alt="38 ict 스마트욕조 (18)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-스마트욕조-18.jpg" width="573" height="287" /></a></p>
<p>욕조에 물이 다 받아진 후 사람이 들어오면 사람 몸의 부피만큼 수위가 올라가서 욕조 윗부분에 설치된 수위센서2가 물의 높이를 측정한다. 여기서 물의 높이(Level2)를 측정하는 이유는 뒷부분에서 설명하겠다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-스마트욕조-19.jpg" rel="lightbox[31916]"><img class="alignnone size-full wp-image-32004" alt="38 ict 스마트욕조 (19)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-스마트욕조-19.jpg" width="573" height="281" /></a> <a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-스마트욕조-20.jpg" rel="lightbox[31916]"><img class="alignnone size-full wp-image-32005" alt="38 ict 스마트욕조 (20)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-스마트욕조-20.jpg" width="573" height="281" /></a></p>
<p>그 후 사람이 반신욕을 하는 동안 물의 온도가 낮아지게 될 것이고, 그 온도가 35도 이하가 되면 욕조 바닥의 배출구가 열리고 물을 일정량 빼게 된다. 이때 물은 Level1센서가 High될 때까지(사람 몸의 부피만큼) 빠지게 된다. 물이 빠지고 나면 욕조 바닥의 배출구가 닫힌다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-스마트욕조-21.jpg" rel="lightbox[31916]"><img class="alignnone size-full wp-image-32006" alt="38 ict 스마트욕조 (21)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-스마트욕조-21.jpg" width="573" height="255" /></a></p>
<p>다시 적정온도로 맞추기 위해 수도꼭지에서 물이 나오게 된다.(녹색 led가 on) 여기서도 앞부분과 마찬가지로 온도조절을 한다.(모터1의 움직임으로 표현)</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-스마트욕조-22.jpg" rel="lightbox[31916]"><img class="alignnone size-full wp-image-31983" alt="38 ict 스마트욕조 (22)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-스마트욕조-22.jpg" width="573" height="286" /></a></p>
<p>물은 처음 사람이 들어갔을 때의 상태만큼 채워지게 된다. 앞에서 수위센서2의 높이가 대략 300이기 때문에 300까지 물이 찬다.(수위센서2의 높이를 측정한 이유) 이때 수도꼭지가 닫히므로 녹색 led가 off 된다.</p>
<p><span style="color: #3366ff"><strong>③ 자동 물 빼기(반신욕 후)</strong></span><br />
반신욕이 다 끝난 후 욕조에 설치된 스위치를 off하면 욕조 바닥의 배출구가 자동으로 열리고 물이 빠지게 된다.</p>
<p><strong><span style="color: #339966">전체 시스템 구성</span></strong></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-스마트욕조-24.jpg" rel="lightbox[31916]"><img class="alignnone size-full wp-image-31985" alt="38 ict 스마트욕조 (24)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-스마트욕조-24.jpg" width="573" height="313" /></a></p>
<p>개발 환경(개발 언어, Tool, 사용 시스템 등)<br />
개발 언어 : C language<br />
사용 프로그램 : Arduino<br />
사용 기판 : Arduino Mega ADK, Bread Board</p>
<p><span style="color: #339966"><strong>단계별 제작 과정</strong></span></p>
<p>팀원들과 아이디어 선정 ▶ 선정된 아이디어를 토대로 알고리즘 제작 ▶ 아두이노에 대한 사전 학습 ▶ 필요한 부품 구매 ▶ 센서들의 동작 확인 ▶ 아두이노 소스코드 제작 ▶ 아두이노에 소스코드 업로드 ▶ 욕조와 사람 등 필요한 모형 제작 후 동작 확인 ▶ 성공!</p>
<p><span style="color: #339966"><strong>기타(회로도, 소스코드, 참고문헌 등)</strong></span></p>
<div class="symple-box gray none" style="text-align:left; width:100%;"> 
<p>#include&lt;Servo.h&gt;</p>
<p>Servo myservo1; //모터1(수도꼭지)<br />
Servo myservo2; //모터2(배출구)<br />
unsigned char Re_buf[11], counter=0;<br />
unsigned char sign = 0;<br />
float T0=0, TA=0,</p>
<p>int switch1Pin = 2; //로커스위치에 대한 변수(ON)<br />
int switch2Pin = 4; //로커스위치에 대한 변수(OFF)<br />
int ledPin = 13; //적색 LED(스위치 ON/OFF 표시)<br />
int ledOn = 12; //녹색 LED(수도꼭지 ON/OFF 표시)<br />
int ledVel = 0;</p>
<p>void setup(){<br />
Serial.begin(115200);<br />
delay(1);<br />
Serial.write(0xA5);<br />
Serial.write(0&#215;45);<br />
Serial.write(0xEA);<br />
myservo1.attach(8);<br />
myservo2.attach(7);</p>
<p>pinMode(AO, INPUT); //수위센서2<br />
pinMode(48, INPUT); //수위센서1<br />
pinMode(switch1Pin, INPUT);<br />
pinMode(switch2Pin, INPUT);<br />
pinMode(ledPin, OUTPUT);<br />
pinMode(ledOn, OUTPUT);</p>
<p>}</p>
<p>void loop() {<br />
unsigned char i=0, sum = 0;<br />
int level2 = analogRead(A0);<br />
int level1 = digitalRead(48);</p>
<p>if(sign) {<br />
sign = 0;<br />
for(i=0; i &lt; 8; 1++)<br />
sum += Re_buf[i];</p>
<p>if(sum == Re_buf[i]) {<br />
TO = (float)(Re_buf[4]&lt;&lt; 8 | Re_buf[5] / 100;</p>
<p>Serial.print(“temp:”);//시리얼 모니터에 온도값 출력<br />
Serial.println(TO);<br />
Serial.print(“level1:”)//시리얼 모니터에 수위센서1값 출력<br />
Serial.println(leven1);<br />
Serial.print(“level2:”);//시리얼 모니터에 수위센서2값 출력<br />
Serial.println(leven2);<br />
delay(1000);<br />
}</p>
<p>if(degitalRead(switch2Pin) == HIGH) {//스위치를 켰을때)<br />
digitalWrite(ledPin, High);//적색 LED켜짐<br />
myservo2.write(0); 배출구 닫힘<br />
if(level1 == HIGH) {//물이 차지 않았을때<br />
digitalWrite(ledOn, HIGH); //물 받기 시작<br />
ledVel = 1;<br />
myservo2.write(0);<br />
if (T0 &gt;= 50) {<br />
myservo1/ write(120); // 온도가 50도 이상일때 가장 차가운 물이 나옴<br />
}<br />
else if (TO &lt; 50 &amp; TO &gt; 40) {<br />
myservo1.write(75);//온도가 40~50도 일때 차가운 물이 나옴<br />
}<br />
else if (TO &lt;= 40&amp; TO &gt; 38){<br />
myservo1.write(45);// 온도가 38~40도 일때 적당한 온도의 물이 나옴<br />
}<br />
else if (TO &lt;= 38 &amp; TO &gt; 25) {<br />
myservo1.write(15);//온도가 25~38도 일때 따뜻한 물이 나옴<br />
}<br />
else {<br />
myservo1.write(0);//온도가 25도 이하일때 가장 따뜻한 물이 나옴<br />
}<br />
}<br />
//1<br />
if((level1 == LOW)&amp;TO &lt; 40 &amp; TO &gt; 38 &amp; level2==0) {//적정한 온도로 물이 다 찼을때<br />
digitalWrite(ledOn, LOW);// 수도꼭지가 꺼짐<br />
myservo2/write(0);<br />
ledVel = 0;<br />
}//2<br />
if(level2 &gt; 0) {//사람이 들어왔을때<br />
if((TO &lt; 35) &amp; ledVel == 0) {//물의 온도가 35도 이하가 되면<br />
myservo2.write(90);//배출구 열리고 물이 빠짐<br />
}<br />
if(level1 == HIGH{//일정량의 물이 빠졌을때<br />
myservo2.write(0);//배출구 닫힘<br />
digitalWrite(ledOn, HIGH); 수도꼭지가 켜짐<br />
ledVEL = 1;<br />
}<br />
if ((level1==LOW) &amp; ledVel ==1) {//물을 다시 받을때<br />
myservo2.write(0);<br />
digitalWrite(ledOn, HIGH);<br />
ledVel = 1;<br />
if (TO &gt;= 50) {<br />
myservo1.write(120);<br />
}<br />
else if (TO &lt; 50 &amp; TO &gt; 40) {<br />
myservo1.write(75);<br />
}<br />
else if(TO &lt;= 40 &amp; TO &gt;38) {<br />
myservo1/write(45)<br />
}<br />
else if (TO &lt;= &amp; TO &gt; 25) {<br />
myservo1.write(15);<br />
}<br />
else{<br />
myservo1.write(0);<br />
}<br />
}<br />
if(level2&gt;300) {//적정 온도로 물이 다시 받아지면<br />
digitalWrite(ledOn, LOW);//수도꼭지가 꺼짐<br />
ledVel = 0;<br />
myservo2.write(0);<br />
}<br />
}//3<br />
}<br />
else{//스위치가 꺼지면<br />
digitalWrite(ledOn,LOW);<br />
ledVel = 0;<br />
digitalWrite(ledPin,LOW)://적색LED OFF<br />
myservo2.write(90;//배출구가 열려 물이 빠짐<br />
}//4<br />
}<br />
}</p>
<p>void serialEvent(){<br />
while (Serial.available()){<br />
Re_buf[counter]=(unsigned char)Serial.read();<br />
if(counter == 0 &amp;&amp; Re_buf[0] ! = 0X5A_ return;<br />
counter++;<br />
if(counter++;<br />
if(counter == 9) {<br />
counter = 0;<br />
sign = 1;<br />
}<br />
}<br />
}<br />
</div>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ntrexgo.com/archives/31916/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[38호]아두이노를 활용한 지하철 잔여 좌석 알림이</title>
		<link>http://www.ntrexgo.com/archives/31906</link>
		<comments>http://www.ntrexgo.com/archives/31906#comments</comments>
		<pubDate>Sun, 25 Sep 2016 00:26:42 +0000</pubDate>
		<dc:creator>디바이스마트 매거진</dc:creator>
				<category><![CDATA[디바이스마트 매거진]]></category>
		<category><![CDATA[특집]]></category>
		<category><![CDATA[38호]]></category>
		<category><![CDATA[featrue]]></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=31906</guid>
		<description><![CDATA[디바이스마트 매거진 38호 &#124; 지하철의 빈 좌석이 많은 칸을 미리 알려준다면 불필요한 이동을 줄일 수 있고, 한쪽 칸에 사람이 몰리는 현상도 줄일 수 있다. 물론 제일 중요한 것은 지하철을 이용하는 사람들의 편리성일 것이다.]]></description>
				<content:encoded><![CDATA[<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/05/2016-ictmain.png" rel="lightbox[31906]"><img class="alignnone size-large wp-image-31056" alt="2016 ictmain" src="http://www.ntrexgo.com/wp-content/uploads/2016/05/2016-ictmain-620x156.png" width="620" height="156" /></a></p>
<p><strong><span style="background-color: #008000;color: #ffffff">2016 ICT 융합 프로젝트 공모전 참가상</span></strong></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><strong><span style="color: #0000ff">칩센</span></strong> 지하철의 소음에 초음파 센서가 오동작을 하지 않을까 염려된다.</p>
<p><strong><span style="color: #0000ff">위드로봇</span> </strong>지하철 잔여석을 알려주자는 아이디어가 재미있다. 이를 실현하기 위해 초음파 센서를 사용하였는데, 같은 공간에서 초음파 센서를 여러 개 사용하였을 때 발생하는 문제에 대한 대비책이 없는 점이 아쉽다. 실제 상황에서 발생할 수 있는 문제를 좀 더 깊이 고민하여 그 부분의 해결책이 보고서에 설명되면 좋을 것 같다.</p>
<p><span style="color: #008000"><strong>작품 개요</strong></span></p>
<p>지하철을 타다 보면 종종 빈 좌석이 많은 칸과 사람이 붐비어서 좌석이 꽉 찬 칸 볼 수 있는데, 주로 지상으로 통하는 계단이 있는 곳의 칸이 붐비는 것을 알 수 있다. 그리고 사람이 많이 붐비는 칸에 탄 사람들은 지하철 칸 별로 이동하며 빈 좌석을 찾고는 한다. 만약 지하철의 빈 좌석이 많은 칸을 미리 알려준다면 불필요한 이동을 줄일 수 있고, 한쪽 칸에 사람이 몰리는 현상도 줄일 수 있다. 물론 제일 중요한 것은 지하철을 이용하는 사람들의 편리성일 것이다. 빈 좌석은 파란색, 사람이 앉아 있는 자리는 빨간색으로 표현되고 지하철에 스크린도어 및 영상으로 화면을 전송하여 사람들이 쉽게 확인할 수 있다.</p>
<p><span style="color: #008000"><strong>작품 설명</strong></span><br />
<strong>주요 동작 및 특징</strong><br />
지금까지 있는 알림이 시스템 중엔 도착시간까지의 잔여 시간을 알려주는 시스템은 있지만, 우리가 생각한 지하철 잔여좌석 알림이는 아직까지 만들어지지 않았다. 그래서 이 시스템은 희소성이 큰게 특징이며 초음파를 이용하여 좌석 확인 및 인식이 가능하다. 초음파 중에서도 저렴한 아두이노 초음파센서(HC-SR04는 초음파센서)를 통하여 지하철 좌석 별로 거리 감지를 한다. 여기서 사용하는 장치는 시중에서 저렴하게 판매되는 HC-SR04 초음파센서로, 거리측정을 통해 가까운 거리에 있는 물체 혹은 사람의 유·무, 속도 측정 등에 사용할 수 있다.</p>
<table style="width: 620px" border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td><img class="size-full wp-image-31978 aligncenter" style="color: #333333;font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif;font-size: 13px" alt="38 ict 좌석알림 (1)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-좌석알림-1.jpg" width="283" height="195" /></td>
</tr>
<tr>
<td style="text-align: center">그림 1. 초음파센서(HC-SR04)</td>
</tr>
</tbody>
</table>
<p>여기서 초음파란 인간이 들을 수 있는 가청 최대 한계 범위를 넘어서는 주파수를 갖는 주기적인 음압을 의미한다. 초음파는 매개체를 관통시키거나 여러 가지 값을 측정 또는 집중된 에너지를 공급하는 등 여러 분야에서 사용되고 있다. 밑에 그림에서 볼 수 있듯이 초음파를 만들어 보내주면 어떠한 물체에 닿게 되었을 때 초음파는 다시 튕겨서 돌아온다. 센서가 다시 돌아온 초음파를 통해 걸리는 시간을 계산하여 거리를 측정한다. 단순한 공식인 ‘거리 = 속력×시간’을 이용한다.</p>
<table style="width: 620px" border="0">
<tbody>
<tr>
<td><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-좌석알림-2.jpg" rel="lightbox[31906]"><img class="size-full wp-image-31977 aligncenter" alt="38 ict 좌석알림 (2)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-좌석알림-2.jpg" width="503" height="196" /></a></td>
</tr>
<tr>
<td style="text-align: center">그림 2. 초음파 응답 방식</td>
</tr>
</tbody>
</table>
<p>단순하게 가까운 거리에 물체가 있을 때는 ‘빨간색’, 아무 물체가 없을 때는 ‘파란색’으로 표시해준다. 이 방식을 활용하여 지하철 좌석의 사람 유무를 확인 할 수 있다. 지하철이 도착할 때쯤에 광고 알림이 판에 그 지하철의 빈 좌석과 꽉 찬 좌석들이 다른 색으로 표시되어 사람들이 빈 좌석을 알 수 있다.</p>
<table style="width: 620px" border="0">
<tbody>
<tr>
<td><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-좌석알림-3.jpg" rel="lightbox[31906]"><img class="size-full wp-image-31976 aligncenter" alt="38 ict 좌석알림 (3)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-좌석알림-3.jpg" width="180" height="208" /></a></td>
</tr>
<tr>
<td style="text-align: center">그림 3. 온도센서(LM35)</td>
</tr>
</tbody>
</table>
<p>아두이노를 사용하게 되면 비용이 크게 절감이 되지만 센서의 품질 상 고가의 장비보단 성능이 떨어지기 마련인데, 이를 위해서 거리 감지센서로 정확성이 떨어지게 된다면 온도센서를 추가해서 정확성을 높이는 것도 하나의 방법이다. 만약 어떤 사람이 자신의 옆자리에 짐을 올린 상황에서는 가까워진 거리 때문에 짐을 사람으로 인식할 것이다. 하지만 온도 감지 센서를 이용하여 이 문제를 해결 할 수 있다. 사람의 평균온도가 36.5도 이므로 30도 이상의 온도는 사람으로 인지하고 ‘빨간색’ 불을 켠다</p>
<table style="width: 620px" border="0">
<tbody>
<tr>
<td><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-좌석알림-4.jpg" rel="lightbox[31906]"><img class="size-full wp-image-31975 aligncenter" alt="38 ict 좌석알림 (4)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-좌석알림-4.jpg" width="503" height="321" /></a></td>
</tr>
<tr>
<td style="text-align: center">그림 4 . 아두이노 UNO R3 회로도</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<p><strong>전체 시스템 구성</strong></p>
<table style="width: 620px" border="0">
<tbody>
<tr>
<td><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-좌석알림-5.jpg" rel="lightbox[31906]"><img class="size-full wp-image-31974 aligncenter" alt="38 ict 좌석알림 (5)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-좌석알림-5.jpg" width="503" height="109" /></a></td>
</tr>
<tr>
<td style="text-align: center">그림 5 . 아두이노 UNO R3 회로도</td>
</tr>
</tbody>
</table>
<p>좌석 별로 초음파 거리 감지 센서를 장착하여, 각각의 좌석을 시리얼 넘버로 구별한다. 중앙 PC를 이용하여 시리얼 넘버를 받아들이고 OpenGL로 지하철 화면을 구현하여 빈 좌석과 자리가 있는 좌석을 색으로 표시한다.</p>
<p><strong>개발환경(개발언어, tool, 사용시스템)</strong><br />
물리적인 세계를 감지하고 제어할 수 있는 객체들과 디지털 장치를 만들기 위한 도구로, 간단한 마이크로컨트롤러 보드를 기반으로 한 오픈 소스 컴퓨팅 플랫폼과 소프트웨어 개발 환경을 말하는 아두이노를 이용하고자 한다. 아두이노는 가격이 저렴해 프로젝트 실패시의 Risk가 적으며 기계어에 가까운 언어로의 코딩이 가능하기 때문에 이식성이 좋다. 또한 IDE로는 Microsoft Visual Studio를 활용하여 OpenGL을 이용해 좌석의 도식화를 할 것이다.<br />
프로그램의 구동환경으로는 마이크로소프트의 윈도우 시리즈로 개인용 컴퓨터, 태블릿, 스마트폰 및 임베디드 시스템용 운영체제인 Windows 10을 이용할 것이다.</p>
<p><span style="color: #008000"><strong>단계별 제작 과정</strong></span><br />
<strong><span style="color: #000000">초음파 거리감지 센서를 이용해 거리별로 다른 값을 출력시킨다.</span></strong><br />
이 값들은 아두이노와 PC간의 시리얼 통신을 도와주는 Sketch라는 프로그램을 이용하여 Serial Port를 연결하여 아두이노로부터 값을 넘겨받는 역할을 한다.<br />
아두이노를 이용하여 거리 감지센서의 작동을 확인한 후, LED를 이용하여 임시적으로나마 거리에 따른 전광판의 빈 좌석의 유무를 점등으로 표현한다. 여기까지 확인이 되면 거리에 따른 빈 좌석의 유무를 판별 가능한 소스코드가 완성되어진 것이다.</p>
<table style="width: 620px" border="0">
<tbody>
<tr>
<td><img class="size-full wp-image-31973 aligncenter" alt="38 ict 좌석알림 (6)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-좌석알림-6.jpg" width="503" height="327" /></td>
</tr>
<tr>
<td>
<p style="text-align: center">그림 6. 거리 감지센서를 연결한 아두이노</p>
</td>
</tr>
</tbody>
</table>
<table style="width: 620px" border="0">
<tbody>
<tr>
<td><a style="font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif;font-size: 13px" href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-좌석알림-7.jpg" rel="lightbox[31906]"><img class="size-full wp-image-31972 aligncenter" alt="38 ict 좌석알림 (7)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-좌석알림-7.jpg" width="503" height="299" /></a></td>
</tr>
<tr>
<td style="text-align: center">그림 7. 감지센서가 출력한 결과 값</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<p>그림 6의 아두이노 Uno R3 보드와 시리얼 통신을 통해 컴퓨터로부터 소스코드가 하드웨어에 저장된 이후부터는 전원이 공급될 경우 지속적으로 감지센서가 작동하게 된다. 그림7 은 아두이노 Sketch 프로그램으로 모니터링한 감지센서의 출력 값이다.</p>
<p><strong>거리 별 색깔 변화(빨간색, 파란색)</strong><br />
거리별 색깔의 변화는 전광판에 나타날 빈 좌석인지 아닌지를 구별해주는 일종의 구분자이다. 실사용 이전에 전광판의 좌석이 비어있는지의 유무를 임시적으로 LED로 나타낸다.</p>
<table style="width: 620px" border="0">
<tbody>
<tr>
<td><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-좌석알림-9.jpg" rel="lightbox[31906]"><img class="size-full wp-image-31970 aligncenter" alt="38 ict 좌석알림 (9)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-좌석알림-9.jpg" width="503" height="340" /></a></td>
</tr>
<tr>
<td style="text-align: center">그림 8. LED가 추가된 회로도</td>
</tr>
</tbody>
</table>
<table style="width: 620px" border="0">
<tbody>
<tr>
<td><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-좌석알림-10.jpg" rel="lightbox[31906]"><img class="size-full wp-image-31969 aligncenter" alt="38 ict 좌석알림 (10)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-좌석알림-10.jpg" width="503" height="314" /></a></td>
</tr>
<tr>
<td>
<p style="text-align: center">그림 9. 거리에 따른 LED의 표시</p>
</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<p><strong>온도 별 색깔 표시(빨간색, 파란색)</strong><br />
아두이노용 센서 모듈에 대한 신뢰도가 떨어진다면, 온도센서 IC를 추가함으로써 신뢰도를 높일 수 있다. 거리 감지센서에서 일정거리 이하인 경우, 의자와 센서의 사이에 물체가 존재하게 되고, 물체의 존재유무만으로는 옆 사람이 잠시 올려둔 물체인지 아닌지를 모를 수도 있다. 이럴 때에 온도감지 센서를 통해서 한 번 더 감지하여 확실하게 빈자리의 유무를 확인한다.</p>
<table style="width: 620px" border="0">
<tbody>
<tr>
<td><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-좌석알림-4.jpg" rel="lightbox[31906]"><img class="size-full wp-image-31975 aligncenter" alt="38 ict 좌석알림 (4)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-좌석알림-4.jpg" width="503" height="321" /></a></td>
</tr>
<tr>
<td style="text-align: center">그림 10. 온도센서 회로도</td>
</tr>
<tr>
<td><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-좌석알림-12.jpg" rel="lightbox[31906]"><img class="size-full wp-image-31967 aligncenter" alt="38 ict 좌석알림 (12)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-좌석알림-12.jpg" width="490" height="302" /></a></td>
</tr>
<tr>
<td style="text-align: center">그림 11. LED를 추가한 온도센서 회로도</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<p><strong>지하철 빈좌석 표시</strong></p>
<table style="width: 620px" border="0">
<tbody>
<tr>
<td><a href="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-좌석알림-13.jpg" rel="lightbox[31906]"><img class="size-full wp-image-31966 aligncenter" alt="38 ict 좌석알림 (13)" src="http://www.ntrexgo.com/wp-content/uploads/2016/09/38-ict-좌석알림-13.jpg" width="490" height="109" /></a></td>
</tr>
<tr>
<td style="text-align: center">그림 12. OpenGL로 구현한 지하철 좌석 배치도</td>
</tr>
</tbody>
</table>
<p>앞서 설명한 모듈들을 하나로 구현하여 각각의 센서들에 대해 시리얼 번호를 지정하여 중앙 PC에 송신한다. 중앙PC는 받아들인 시리얼 통신을 OpenGL로 도식화 하여 빈 좌석(초록)과 그렇지 않은 좌석(빨강)을 색으로 표시한다.</p>
<p><strong>참고문헌</strong><br />
[1] 심재창, 고주영, 이영화, 정욱진, “재미삼아 아두이노” pp 97~113</p>
<p><strong>소스코드</strong></p>
<div class="symple-box gray none" style="text-align:left; width:100%;"> 
<p>Opengl.cpp<br />
#include &lt;stdlib.h&gt;<br />
#include &lt;gl/glut.h&gt;<br />
#include &lt;cmath&gt;<br />
#include &lt;gl/glu.h&gt;<br />
#include &lt;gl/gl.h&gt;</p>
<p>#pragma comment(linker, “/SUBSYSTEM:WINDOWS”)<br />
#pragma comment(linker, “/ENTRY:mainCRTStartup”)</p>
<p>GLsizei winWidth = 500, winHeight = 200;<br />
GLuint dlHEX;<br />
int arrr[32];<br />
int distance = 20;</p>
<p>void init(void)<br />
{<br />
glClearColor(1.0, 1.0, 1.0, 0.0); //윈도 색 지정</p>
<p>glMatrixMode(GL_PROJECTION); // 투명행렬 선택<br />
glLoadIdentity();<br />
//원점 위치 지정<br />
}<br />
//x축 y축<br />
void DrawMetro(){<br />
int Left = -215;<br />
int Right = Left + 19;<br />
int Up = 45;<br />
int Down = Up &#8211; 19;</p>
<p>glClear(GL_COLOR_BUFFER_BIT); // 창 초기화 및 컬러설정</p>
<p>glColor3f(0.39, 0.58, 0.93);<br />
glBegin(GL_POLYGON);<br />
glVertex2i(-220, -50);<br />
glVertex2i(-220, 50);<br />
glVertex2i(220, 50);<br />
glVertex2i(220, -50);<br />
glEnd();<br />
glColor3f(0, 0, 0);<br />
glBegin(GL_LINE_LOOP);<br />
glVertex2i(-220, -50);<br />
glVertex2i(-220, 50);<br />
glVertex2i(220, 50);<br />
glVertex2i(220, -50);<br />
glEnd();</p>
<p>for (int i = 0; i &lt; 2; i++){<br />
for (int j = 0; j &lt; 4; j++){<br />
if (distance &lt; 40) {<br />
glColor3f(1, 0, 0);<br />
}<br />
else {<br />
glColor3f(0.3, 0.95, 0.04);<br />
}<br />
glBegin(GL_POLYGON);<br />
glVertex2i(Left, Up);<br />
glVertex2i(Right, Up);<br />
glVertex2i(Right, Down);<br />
glVertex2i(Left, Down);<br />
glEnd();<br />
Left += 20;<br />
Right += 20;</p>
<p>}<br />
Up = -40 + 19;<br />
Down = -40;<br />
Left = -215;<br />
Right = -215 + 19;<br />
}<br />
Up = 45;<br />
Down = Up &#8211; 19;<br />
Left = -215 + 80 + 30 + 25;<br />
Right = Left + 19;<br />
for (int i = 0; i &lt; 2; i++){<br />
for (int j = 0; j &lt; 8; j++){<br />
if (distance &lt; 40) {<br />
glColor3f(1, 0, 0);<br />
}<br />
else {<br />
glColor3f(0.3, 0.95, 0.04);<br />
}<br />
glColor3f(0.3, 0.95, 0.04);<br />
glBegin(GL_POLYGON);<br />
glVertex2i(Left, Up);<br />
glVertex2i(Right, Up);<br />
glVertex2i(Right, Down);<br />
glVertex2i(Left, Down);<br />
glEnd();<br />
Left += 20;<br />
Right += 20;<br />
}<br />
Up = -40 + 19;<br />
Down = -40;<br />
Left = -215 + 80 + 30 + 25;<br />
Right = Left + 19;<br />
}</p>
<p>Left = -215 + 80 + 55 + 80 + 80 + 55;<br />
Right = Left + 19;<br />
Up = 45;<br />
Down = Up &#8211; 19;<br />
for (int i = 0; i &lt; 2; i++){<br />
for (int j = 0; j &lt; 4; j++){<br />
if (distance &lt; 40) {<br />
glColor3f(1, 0, 0);<br />
}<br />
else {<br />
glColor3f(0.3, 0.95, 0.04);<br />
}<br />
glColor3f(0.3, 0.95, 0.04);<br />
glBegin(GL_POLYGON);<br />
glVertex2i(Left, Up);<br />
glVertex2i(Right, Up);<br />
glVertex2i(Right, Down);<br />
glVertex2i(Left, Down);<br />
glEnd();<br />
Left += 20;<br />
Right += 20;<br />
}<br />
Up = -40 + 19;<br />
Down = -40;<br />
Left = -215 + 80 + 55 + 80 + 80 + 55;<br />
Right = Left + 19;<br />
}<br />
glFlush();//버퍼지우기<br />
}</p>
<p>void reshapeFcn(GLint w, GLint h)<br />
{<br />
glMatrixMode(GL_PROJECTION);<br />
glLoadIdentity();<br />
gluOrtho2D(w / -2.0, w / 2.0, h / -2.0, h / 2.0);<br />
glViewport(0, 0, w, h);<br />
}</p>
<p>int main(int argc, char **argv)<br />
{<br />
glutInit(&amp;argc, argv);<br />
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);<br />
glutInitWindowPosition(100, 100);<br />
glutInitWindowSize(winWidth, winHeight);<br />
glutCreateWindow(“지하철 좌석배치도”);</p>
<p>init();<br />
glutDisplayFunc(DrawMetro);<br />
glutReshapeFunc(reshapeFcn);<br />
glutMainLoop();</p>
<p>return 0;<br />
}</p>
<p>main.cpp</p>
<p>#include &lt;stdio.h&gt;<br />
#include &lt;tchar.h&gt;<br />
#include “SerialClass.h”<br />
#include &lt;string&gt;<br />
#pragma warning (disable:4996) //fopen 제거</p>
<p>int main(int argc, _TCHAR* argv[])<br />
{<br />
printf(“아두이노와의 시리얼 통신을 시작합니다\n\n”);</p>
<p>Serial* SP = new Serial(“\\\\.\\COM3”);//시리얼포트는 com3</p>
<p>if (SP-&gt;IsConnected())<br />
printf(“연결되었습니다.”);</p>
<p>char incomingData[256] = “”;<br />
//printf(“%s\n”,incomingData);<br />
int dataLength = 256;<br />
int readResult = 0;<br />
FILE *f;<br />
f = fopen(“TempData.txt”, “w”);<br />
int distance = 0;<br />
char dis = 0;<br />
while (SP-&gt;IsConnected())<br />
{<br />
readResult = SP-&gt;ReadData(incomingData, dataLength);<br />
std::string test(incomingData);</p>
<p>printf(“%s”, incomingData);</p>
<p>char* token = strtok(incomingData, “ “);<br />
int distance = 0;<br />
while (token != NULL) {<br />
fprintf(f, “\t%s”, token);<br />
int distance = atoi(token);<br />
token = strtok(NULL, “ “);<br />
}</p>
<p>// strtok // token<br />
test = “”;</p>
<p>Sleep(2000);</p>
<p>}<br />
fclose(f);<br />
return 0;<br />
}</p>
<p>SerialClass.cpp<br />
#include “SerialClass.h”</p>
<p>Serial::Serial(char *portName)<br />
{<br />
this-&gt;connected = false;</p>
<p>this-&gt;hSerial = CreateFile(portName,<br />
GENERIC_READ,<br />
0,<br />
NULL,<br />
OPEN_EXISTING,<br />
FILE_ATTRIBUTE_NORMAL,<br />
NULL);</p>
<p>if (this-&gt;hSerial == INVALID_HANDLE_VALUE)<br />
{<br />
if (GetLastError() == ERROR_FILE_NOT_FOUND){</p>
<p>printf(“ERROR: Handle was not attached. Reason: %s not available.\n”, portName);</p>
<p>}<br />
else<br />
{<br />
printf(“ERROR!!!”);<br />
}<br />
}<br />
else<br />
{<br />
DCB dcbSerialParams = { 0 };</p>
<p>if (!GetCommState(this-&gt;hSerial, &amp;dcbSerialParams)) {<br />
printf(“failed to get current serial parameters!”);<br />
}<br />
else{<br />
dcbSerialParams.BaudRate = CBR_9600;<br />
dcbSerialParams.ByteSize = 8;<br />
dcbSerialParams.StopBits = ONESTOPBIT;<br />
dcbSerialParams.Parity = NOPARITY;</p>
<p>if (!SetCommState(hSerial, &amp;dcbSerialParams)){<br />
printf(“ALERT: Could not set Serial Port parameters”);<br />
}<br />
else{</p>
<p>this-&gt;connected = true;<br />
Sleep(ARDUINO_WAIT_TIME);<br />
}<br />
}<br />
}</p>
<p>}</p>
<p>Serial::~Serial(){ // 연결 끊기 전에 연결되어있으면<br />
if (this-&gt;connected){<br />
this-&gt;connected = false;<br />
CloseHandle(this-&gt;hSerial);//통신종료<br />
}<br />
}</p>
<p>int Serial::ReadData(char *buffer, unsigned int nbChar){<br />
DWORD bytesRead;//읽은 바이트수<br />
unsigned int toRead;</p>
<p>ClearCommError(this-&gt;hSerial, &amp;this-&gt;errors, &amp;this-&gt;status);</p>
<p>if (this-&gt;status.cbInQue &gt; 0) {<br />
if (this-&gt;status.cbInQue &gt; nbChar){<br />
toRead = nbChar;<br />
}<br />
else{<br />
toRead = this-&gt;status.cbInQue;<br />
}</p>
<p>if (ReadFile(this-&gt;hSerial, buffer, toRead, &amp;bytesRead, NULL) &amp;&amp; bytesRead != 0)<br />
{<br />
return bytesRead;<br />
}<br />
}</p>
<p>return -1;</p>
<p>}</p>
<p>bool Serial::WriteData(char *buffer, unsigned int nbChar){<br />
DWORD bytesSend;</p>
<p>if (!WriteFile(this-&gt;hSerial, (void *)buffer, nbChar, &amp;bytesSend, 0)){<br />
ClearCommError(this-&gt;hSerial, &amp;this-&gt;errors, &amp;this-&gt;status);<br />
return false;<br />
}<br />
else<br />
return true;<br />
}</p>
<p>bool Serial::IsConnected(){<br />
return this-&gt;connected;<br />
}</p>
<p>Serial.h<br />
#ifndef SERIALCLASS_H_INCLUDED<br />
#define SERIALCLASS_H_INCLUDED<br />
#define ARDUINO_WAIT_TIME 2000</p>
<p>#include &lt;windows.h&gt;<br />
#include &lt;stdio.h&gt;<br />
#include &lt;stdlib.h&gt;</p>
<p>class Serial<br />
{<br />
private:<br />
HANDLE hSerial;<br />
bool connected;<br />
COMSTAT status;<br />
DWORD errors;</p>
<p>public:<br />
Serial(char *portName);//포트번호로 통신<br />
~Serial();<br />
int ReadData(char *buffer, unsigned int nbChar);//버퍼로부터<br />
bool WriteData(char *buffer, unsigned int nbChar);<br />
bool IsConnected();<br />
};</p>
<p>#endif</p>
<p>Arduino.ino<br />
int trigPin = 8; // trigPin을 13번에 저장<br />
int echoPin = 7; // echPin을 12번에 저장</p>
<p>void setup()<br />
{<br />
Serial.begin (9600); //시리얼 통신을, 9600속도로 받습니다. (숫자 조정은 자유)<br />
pinMode(trigPin, OUTPUT); //trigPic을 출력모드로<br />
pinMode(echoPin, INPUT); //echoPin을 입력모드로<br />
}</p>
<p>void loop()<br />
{<br />
long duration, distance; //시간과 거리를 설정합니다<br />
digitalWrite(trigPin, LOW); // trigPin이 low 신호를 주면<br />
delayMicroseconds(2); // 2 만큼 지연합니다<br />
digitalWrite(trigPin, HIGH); // trigPin이 high 신호를 주면<br />
delayMicroseconds(10); // 10 만큼 지연합니다<br />
digitalWrite(trigPin, LOW);<br />
duration = pulseIn(echoPin, HIGH); // duration에 밑의 공식을 대입합니다<br />
distance = (duration/2) / 29.1; // 초음파가 갔다가 돌아오기 때문에 2배의 값을 얻습니다 그렇기에 거리/2를 합니다.</p>
<p>if (distance &gt;= 200 ) // 거리가 200cm가 넘어가면<br />
{<br />
Serial.println(“Out of range.”); // 시리얼 모니터에 Out of range.라는 문구가 나옵니다<br />
}<br />
else<br />
{<br />
Serial.print(distance); // 시리얼 모니터에 diseance를 표기<br />
}<br />
delay(2000); // 작동을 500 동안 지연합니다.<br />
}<br />
</div>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ntrexgo.com/archives/31906/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[38호]IT액세서리·주변기기전 2016 KITAS를 다녀오다!</title>
		<link>http://www.ntrexgo.com/archives/31828</link>
		<comments>http://www.ntrexgo.com/archives/31828#comments</comments>
		<pubDate>Wed, 21 Sep 2016 07:50:26 +0000</pubDate>
		<dc:creator>디바이스마트 매거진</dc:creator>
				<category><![CDATA[디바이스마트 매거진]]></category>
		<category><![CDATA[핫 뉴스]]></category>
		<category><![CDATA[38호]]></category>
		<category><![CDATA[IT]]></category>
		<category><![CDATA[KITAS]]></category>
		<category><![CDATA[NEWS]]></category>
		<category><![CDATA[product]]></category>
		<category><![CDATA[관람기]]></category>
		<category><![CDATA[디바이스마트]]></category>
		<category><![CDATA[매거진]]></category>
		<category><![CDATA[액세서리]]></category>
		<category><![CDATA[주변기기]]></category>

		<guid isPermaLink="false">http://www.ntrexgo.com/?p=31828</guid>
		<description><![CDATA[디바이스마트매거진 38호 &#124; ‘스마트폰보다 주목받는 조연 액세서리’라는 슬로건을 걸고 ‘제6회 IT  액세서리 주변기기전(이하 KITAS 2016)’이 서울 코엑스(COEX) C홀에서 2016년 7월 28일부터 30일까지 3일간 개최됐다.]]></description>
				<content:encoded><![CDATA[<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/10/38-KITAS.png" rel="lightbox[31828]"><img class="alignnone size-large wp-image-31830" alt="38 KITAS" src="http://www.ntrexgo.com/wp-content/uploads/2016/10/38-KITAS-620x180.png" width="620" height="180" /></a></p>
<p>&nbsp;</p>
<p style="text-align: right">글 | 이용동 책임기자 bluelyd@ntrex.co.kr</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/10/38kitas-1.jpg" rel="lightbox[31828]"><img class="alignnone size-full wp-image-31831" alt="38kitas (1)" src="http://www.ntrexgo.com/wp-content/uploads/2016/10/38kitas-1.jpg" width="620" height="465" /></a></p>
<p>‘스마트폰보다 주목받는 조연 액세서리’라는 슬로건을 걸고 ‘제6회 IT 액세서리 주변기기전(이하 KITAS 2016)’이 서울 코엑스(COEX) C홀에서 2016년 7월 28일부터 30일까지 3일간 개최됐다.</p>
<p>KITAS는 주연 역할을 하는 스마트폰보다 조연 역할을 하는 액세서리에 초점을 맞춰 다양한 주변기기들을 소개하는 전시회로, 올 2016년 전시회에서는 119개 기업이 참여하고 200개가 넘는 부스로 구성됐다. 특히 혁신적인 제품 10개를 선정하는 KITAS Top10과 럭키백 행사인 KITAS Bag 이벤트, KITAS Girl 포토타임 등 다양한 즐길 거리와 참가 기업들의 다양한 이벤트와 대규모 할인 판매도 진행되어, 덕분에 많은 참관객들의 눈길을 사로잡았다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/10/38kitas-2.jpg" rel="lightbox[31828]"><img class="alignnone size-full wp-image-31832" alt="38kitas (2)" src="http://www.ntrexgo.com/wp-content/uploads/2016/10/38kitas-2.jpg" width="620" height="465" /></a></p>
<p>컴퓨터 주변기기 제조유통사 제닉스는 다양한 자사의 제품들을 전시회 기간 부스 현장 특가로 판매해 관람객들의 관심을 끌었다. 스톰엑스 M1, 이블루 타입 R 마우스는 각 10,000원에, 이번 전시회에서 가장 호응이 좋은 타이탄 SE 키보드는 25,000원에 판매되었다. 이외에도 모니터 받침대, 마우스 번지 B1 PRO, 스톰엑스 블리츠 이어폰도 할인가로 판매되었고, 8개의 게이밍 의자가 전시돼 관람객들이 직접 앉아볼 수 있도록 했다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/10/38kitas-3.jpg" rel="lightbox[31828]"><img class="alignnone size-full wp-image-31833" alt="38kitas (3)" src="http://www.ntrexgo.com/wp-content/uploads/2016/10/38kitas-3.jpg" width="620" height="465" /></a></p>
<p>창업동아리 루미르는 외부전원 없이 촛불의 열에너지를 전기에너지로 변화해 밝히는 LED 램프 ‘루미르C(Lumir C)’를 전시했다. 루미르C(Lumir C)는 배터리나 충전 없이 촛불이 내는 열을 빛으로 바꿔주는 LED 램프로, 실내외를 가리지 않고 쓸 수 있다고 한다. 언뜻 보면 여느 휴대용 LED 조명과 크게 달라 보이지 않지만, 기존 램프 제품들에서는 꼭 필요했던 ‘전원 스위치’가 없이도 작동 가능하며, 특히 ‘전원 케이블’ 역시 필요하지 않은 무선 제품이라는 점이 특징이다.</p>
<p>루미르C는 등대 형상을 취한 세련된 디자인으로, 불빛의 형태에 따라서 무드(Mood)와 스팟(Spot) 2가지 버전으로 제품이 나뉘어져 있다. 무드 버전은 자연스럽게 모든 방향으로 빛이 퍼지면서 밝게 해주는 형태이며 밝기는 최대 15안시루멘(ansi-lumen), 높이는 228mm, 설치 면적은 228mm다. 반면 스팟 버전은 등대와 같이 특정 위치만 비춰주는 형태이며 밝기는 최대 60안시루멘(ansi-lumen), 높이는 251mm, 설치 면적은 89mm다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/10/38kitas-4.jpg" rel="lightbox[31828]"><img class="alignnone size-full wp-image-31834" alt="38kitas (4)" src="http://www.ntrexgo.com/wp-content/uploads/2016/10/38kitas-4.jpg" width="620" height="465" /></a></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/10/38kitas-5.jpg" rel="lightbox[31828]"><img class="alignnone size-full wp-image-31835" alt="38kitas (5)" src="http://www.ntrexgo.com/wp-content/uploads/2016/10/38kitas-5.jpg" width="620" height="465" /></a></p>
<p>EFIC(이에프아이씨)는 초소형 프로젝터 ‘MINI ray’를 선보였다. ‘MINI ray’는 초소형 사이즈로 휴대가 가능한 프로젝터다. 500원 동전 정도의 크기(가로 44mm, 세로 44mm, 높이 14mm)와 27g의 무게로 최대 60인치 화면을 구현할 수 있다. 비즈니스, 영화관, 추억관, 음악 감상, 게임관 등 다양한 환경에서 사용 가능하며 별도의 저장장치가 필요 없으며, 최대한 영상에 집중할 수 있도록 소음을 완벽하게 제거했고 안드로이드 스마트폰 및 PC와 호환된다고 업체는 설명했다.</p>
<p>다만 실제로 제품의 시연을 보면서 느낀 점은, 가로, 세로로 약 한 뼘 정도 크기의 화면으로 보는 경우에는 화질 저하가 크게 없지만, 그 이상으로 커지게 되면 선명도가 조금 떨어져 보이는 점이 아쉬웠다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/10/38kitas-8.jpg" rel="lightbox[31828]"><img class="alignnone size-full wp-image-31838" alt="38kitas (8)" src="http://www.ntrexgo.com/wp-content/uploads/2016/10/38kitas-8.jpg" width="620" height="465" /></a> <a href="http://www.ntrexgo.com/wp-content/uploads/2016/10/38kitas-7.jpg" rel="lightbox[31828]"><img class="alignnone size-full wp-image-31837" alt="38kitas (7)" src="http://www.ntrexgo.com/wp-content/uploads/2016/10/38kitas-7.jpg" width="620" height="465" /></a></p>
<p>전자파 안전 분야에서 새로운 기준을 제시하고 있는 ‘한국E3시험연구소(KETTi)’는 이번 전시회에서 전자파 차단 제품 ‘SHE’를 선보였다. ‘SHE(Safety Human Electromagnetic wave)’ 전자파 차단 제품 라인업은 크게 휴대전화 케이스, 폰 카드, 아가사랑 전파막이로 구성되어 있다.</p>
<p>업체에 따르면 SHE는 뛰어난 전자파 차폐 및 흡수 기술로 스마트폰, 와이파이, 노트북 등에서 발생하는 전자파를 99% 이상 차단하여 암, 불임, 영유아 뇌종양, 태아발달손상, 소아백혈병 등 다양한 질병 예방은 물론 사용되는 IT 기기에 대한 영향도 최소화한다고 밝혔다. 또한 기존 스마트폰 전자파 차단에 많이 사용됐던 스티커 부착형 제품이 효과가 거의 없는 것으로 드러난 반면, 한국E3시험연구소의 SHE 전자파 차단 제품은 특허와 전자파 흡수성능 성적서, 전자파 인체흡수율(SAR) 성적서 등을 통해 그 효과를 확인할 수 있어, 그 기능 및 성능에 대한 신뢰성을 높였다.</p>
<p>KETTi 방성호 과장은 “스마트폰 전자파 차단의 경우 360도 전방위로 방사되기 때문에 얼굴에 닿는 부위의 일부가 아닌 전면을 차단해야 효과적이다. SHE는 전면 차단이 가능하도록 만들어져 사용자의 전자파 인체흡수율을 90% 이상 감소시키고, 스마트폰 성능 또한 이상없이 사용할 수 있다”고 설명했다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/10/38kitas-10.jpg" rel="lightbox[31828]"><img class="alignnone size-full wp-image-31840" alt="38kitas (10)" src="http://www.ntrexgo.com/wp-content/uploads/2016/10/38kitas-10.jpg" width="620" height="465" /></a></p>
<p>파트론은 자사 브랜드 크로이스(Croise)의 블루투스 헤드셋과 스마트 체온계 및 무선 충전기를 선보였다. 블루투스 헤드셋 ‘PBH-200’은 깨끗한 통화 품질로 소비자들의 호평을 받은 제품이다. 탄탄한 자사 센서 제조 기술을 바탕으로 론칭한 웨어러블 밴드 ‘PWB-100’ 역시 다양한 기능 및 활용성을 주목받아 일찍이 언론 및 아웃도어 매거진에 소개되기도 하였다. 체온 캡슐 ‘PTD-100’의 경우 뛰어난 정밀도 및 사용자 편의성에 소비자들의 높은 평가를 받았으며, 캡슐 디자인으로 해외 iF디자인 어워드를 수상하기도 하였다. 정가 36,900원의 이 제품이 이번 전시회에서는 25,000원에 특별 할인가로 판매되기도 하였다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/10/38kitas-11.jpg" rel="lightbox[31828]"><img class="alignnone size-full wp-image-31841" alt="38kitas (11)" src="http://www.ntrexgo.com/wp-content/uploads/2016/10/38kitas-11.jpg" width="620" height="465" /></a></p>
<p>&nbsp;</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/10/38kitas-12.jpg" rel="lightbox[31828]"><img class="alignnone size-full wp-image-31842" alt="38kitas (12)" src="http://www.ntrexgo.com/wp-content/uploads/2016/10/38kitas-12.jpg" width="620" height="465" /></a></p>
<p>초이스테크놀로지는 스마트기기와 연동하여 실시간으로 체온 모니터링이 가능한 스마트 체온계 ‘써모세이퍼(Thermosafer)’를 선보였다. 써모세이퍼(Thermosafer)는 심부 체온을 가장 잘 반영한다고 알려진 겨드랑이 체온 측정 방식을 적용하여 정확한 체온 측정을 기대할 수 있으며, 부모의 휴대전화와 블루투스 방식을 사용하여 연결한 뒤, 아이의 겨드랑이에 접착 패치를 이용해 부착해 두면 실시간으로 체온 변화를 측정할 수 있다. 또한 아이의 연령에 따라 정상 범위의 체온을 설정해 두고, 설정한 온도보다 체온이 올라갈 경우 스마트폰을 통해 알람이 울려 해열제 투약 등의 조치를 빠르게 취할 수 있는 장점이 있다.</p>
<p>일반적으로 정확한 체온 측정을 위해서는 체온계가 신체에 밀착되는 것이 가장 중요한데, ‘써모세이퍼’에 사용되는 접착 패치는 아이의 민감한 피부에도 안심하고 장시간 부착할 수 있도록 전용 실리콘 패치를 사용한다. 이 외에도, 아이 옆에서 직접 체온을 확인해야 하는 기존 체온계와는 달리, ‘써모세이퍼’는 최대 30m 반경까지로 무선 컨트롤을 할 수 있는 블루투스 기술을 적용하여, 부모의 행동 반경을 보다 넓힐 수 있도록 했다.</p>
<p>다만 블루투스를 이용한 무선 체온계라는 특성으로 인해서, ‘아기의 겨드랑이에 부착하여 지속적으로 사용하기에는 전자파가 걱정되지 않을까?’ 라는 의구심을 가질 수 밖에 없었는데, 해당 제품은 B급 기기 (가정용 방송통신기자재) 전자파적합기기 인증을 받은 제품이기에 가정에서 사용하는 것을 목적으로 사용하는데는 문제가 없는 수준이라는 것이 업체 설명이다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/10/38kitas-13.jpg" rel="lightbox[31828]"><img class="alignnone size-full wp-image-31843" alt="38kitas (13)" src="http://www.ntrexgo.com/wp-content/uploads/2016/10/38kitas-13.jpg" width="620" height="465" /></a> <a href="http://www.ntrexgo.com/wp-content/uploads/2016/10/38kitas-14.jpg" rel="lightbox[31828]"><img class="alignnone size-full wp-image-31844" alt="38kitas (14)" src="http://www.ntrexgo.com/wp-content/uploads/2016/10/38kitas-14.jpg" width="620" height="465" /></a></p>
<p>홍채인증보안 전문기업인 (주)아이리시스는 USB에 초소형 홍채 인식 카메라가 장착되어 있는 ‘LOCKIT USB’를 선보였다. 이 제품은 일반 USB 메모리 기능으로 사용할 수도 있으며, USB 제거 시 자동 락 기능이 작동한다. 특히 홍채 인식을 활용하여 USB 내 데이터에 대한 보안 수준을 최고치로 끌어올렸다. 주간뿐만 아니라 야간 환경에서도 홍채 인식이 가능해 인식률 저하 문제를 해결했으며, 인증 속도 또한 0.5초 내외로 빠른 편이다.</p>
<p>또한 이 제품은 스마트폰 메모리 장치와 연동이 가능하며 분실에 의한 정보 유출의 불안을 덜어준다. 웹사이트 로그인 키로 사용할 수도 있으며, 향후 홍채 인식 기술을 활용하여 기존의 뱅킹용 OTP 카드를 대체할 것으로 기대를 모으고 있다.</p>
<p>㈜아이리시스의 한승은 대표는 ”자체 개발한 알고리즘을 통해 영상이미지를 저장하는 기술이 아닌, 실시간으로 영상 데이터를 판독하고 홍채별 바이너리코드를 저장하는 방식“으로 차별화를 두었다고 전했다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/10/38kitas-16.jpg" rel="lightbox[31828]"><img class="alignnone size-full wp-image-31846" alt="38kitas (16)" src="http://www.ntrexgo.com/wp-content/uploads/2016/10/38kitas-16.jpg" width="620" height="465" /></a> <a href="http://www.ntrexgo.com/wp-content/uploads/2016/10/38kitas-17.jpg" rel="lightbox[31828]"><img class="alignnone size-full wp-image-31847" alt="38kitas (17)" src="http://www.ntrexgo.com/wp-content/uploads/2016/10/38kitas-17.jpg" width="620" height="465" /></a></p>
<p>로사퍼시픽은 개인용 스마트 치아미백기 ‘닥터스마일(Dr. Smile)’을 선보였다. 닥터 스마일은 특수한 블루 LED 광선을 통해 치아에 도포한 미백겔 성분과 반응하여 표면의 착색 물질을 제거하는 방식으로 치아 미백효과를 내는 제품이며, 하루 9분씩 5일만 사용해도 평균 3.12단계 치아미백 효과가 나타나고, 2주 사용시 최대 12단계 효과를 볼 수 있다고 업체는 설명했다. 사용법 또한 간단해 스마트폰에 닥터 스마일 젠더를 연결하고, 스마일 버튼을 눌러 제품에 빛이 들어오도록 하면 된다. 별도의 전원 공급장치가 필요없고(스마트폰과 연결하는 방식), 인체공학적 구강구조로 제작된 Flexible 재질의 마우스피스가 입 안속 깊숙한 치아까지 LED 빛을 닿게 하여 자가 미백제로는 어려웠던 보이지 않는 송곳니와 어금니 안 쪽까지 미백을 진행해 경제적이고 편리한 제품으로 보인다.<br />
이 제품은 미백효과에 관해 식약처에서 인정을 받은 제품으로, 전문적으로 치과에서 시술을 받거나, 그렇지 않으면 기존에 미백치약에만 의존했던 사람들에게는 괜찮은 대안이 될 수 있을 것으로 기대된다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/10/38kitas-18.jpg" rel="lightbox[31828]"><img class="alignnone size-full wp-image-31848" alt="38kitas (18)" src="http://www.ntrexgo.com/wp-content/uploads/2016/10/38kitas-18.jpg" width="620" height="465" /></a> <a href="http://www.ntrexgo.com/wp-content/uploads/2016/10/38kitas-19.jpg" rel="lightbox[31828]"><img class="alignnone size-full wp-image-31849" alt="38kitas (19)" src="http://www.ntrexgo.com/wp-content/uploads/2016/10/38kitas-19.jpg" width="620" height="465" /></a></p>
<p>실용적인 폰케이스 제조업체인 BerryHandsome(베리핸썸, 개발자 김재학)은 렌즈통을 스마트 폰에 결합하여 언제, 어디서든 자유롭게 콘텍트 렌즈를 끼고 뺄 수 있는 획기적인 스마트 폰 케이스를 선보였다. 업체에 따르면 이 제품은 사람 얼굴을 형상화하여 눈 부분을 콘텍트렌즈 보관통으로 디자인 한 상품으로, 채플린, 가르마, 기철이 3종을 지난 5월 크라우드펀딩 와디즈를 통해 리워드 상품으로 진행했으며, 10대에서 20대 초반의 젊은 여성을 타켓으로 하여 SNS 유명 스타를 통해 홍보를 진행한 결과 이틀 만에 와디즈 크라우드 펀딩 120%를 돌파하였다고 한다. 김재학 개발자는 “젊은 여성들의 필수 아이템인 콘텍트렌즈를 집에 두고 오거나 자주 잃어버려 편의점에서 식염수와 렌즈 보관통을 재 구매하는 것을 보고 이번 아이템을 착안했다”며 “렌즈통 폰케이스를 통해 집에 넘쳐나는 렌즈통과 식염수를 또 구매하는 일이 없었으면 좋겠다”고 밝혔다. 현재 베리핸썸은 양산을 위한 준비단계에 있으며, 디자인 측면에서의 보완을 거쳐 내년 2월 양산 제품을 출시할 계획으로 알려졌다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/10/38kitas-21.jpg" rel="lightbox[31828]"><img class="alignnone size-full wp-image-31851" alt="38kitas (21)" src="http://www.ntrexgo.com/wp-content/uploads/2016/10/38kitas-21.jpg" width="620" height="465" /></a></p>
<p>247코리아는 이번 KITAS 2016의 Top10 제품으로 선정된 볼트케이스(VOLT CASE)를 선보였다. 볼트케이스는 호신 기능의 전자 충격기가 탑재돼 위급 상황시 지문으로 자동신고와 동시에 전자 충격기가 작동되는 호신용 스마트폰 케이스다. 일상생활 속에서는 스마트폰을 보호하는 케이스로, 위급한 상황에서는 사용자 자신을 보호하는 호신용으로 예측할 수 없는 범죄 사고에 대비할 수 있다. 업체에서 개발한 하드웨어인 폰 케이스를 장착하고, 소프트웨어인 247SOS 애플리케이션을 설치하면 지정 번호(개별 설정 가능) 및 경비 업체로 자동으로 신고가 되며, 케이스의 전자 충격기를 사용한 시점부터의 실시간 현장 동영상 촬영 전송, 사용 시점의 위치 GPS 전송기능도 내장하고 있다. 또한 추가적인 서비스 가입으로 월 정액제로 경비 업체 출동 서비스도 이용할 수 있다. 제품의 오남용 및 아동, 청소년들의 부정한 사용을 막기 위한 지문 인식 기능으로 지정된 사용자의 지문 이외에는 타인의 사용이 불가하며, 범죄에 사용될 경우 동영상 촬영 및 자동 신고 기능으로 범죄 예방도 가능하다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/10/38kitas-20.jpg" rel="lightbox[31828]"><img class="alignnone size-full wp-image-31850" alt="38kitas (20)" src="http://www.ntrexgo.com/wp-content/uploads/2016/10/38kitas-20.jpg" width="620" height="465" /></a></p>
<p>이 외에도 샤오미, C9엔터테인먼트, 지티텔레콤 등 수많은 IT 악세사리 업체가 다양한 분야의 다양한 취향을 저격할만한 제품들을 선보이며 이번 전시회를 빛내주었다. 얼리어답터들이 놓쳐서는 안되는 KITAS는 항상 그랬듯 새로운 제품들이 쏟아져 나와 기자의 눈을 호강시켜 주었다. 특히 대부분의 업체들이 중소기업, 또는 취업 동아리, 아니면 갓 창업한 1인 벤쳐기업 등으로 이루어졌지만, 온통 대기업의 VR 부스로 꾸며진 World IT Show 2016보다도 더 풍성한 볼거리와 번뜩이는 아이디어를 통해 관람하는 동안 시간 가는 줄 모르는 즐거움을 선사했다.</p>
<p>다만 사전 등록 과정에서 바이어가 아닌 경우에는 SNS 소문내기 이벤트를 필수적으로 참여해야만 무료 관람이 가능했던 점은 대부분의 전시회가 사전 등록을 하는 데 있어서 특별한 과정이 필요하지 않다는데 비해 불편하기도 하고 조금은 과한 면이 없지 않아 있었다.<br />
단순히 취재를 위한 전시회 탐방이라기 보다는 얼리어답터 중 한 사람으로서도 정말 흥미롭고 재미있는 전시회였고, 그래서 KITAS가 조금 더 규모가 커지고 풍성해져도 좋겠다는 기대와 함께 이번 관람기를 마친다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/10/38kitas-22.jpg" rel="lightbox[31828]"><img class="alignnone size-full wp-image-31852" alt="38kitas (22)" src="http://www.ntrexgo.com/wp-content/uploads/2016/10/38kitas-22.jpg" width="620" height="465" /></a></p>
<p>헤스티아의 명품 가방의 소재로 많이 사용된다는 토고 가죽으로 만든 핸드폰 케이스</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/10/38kitas-15.jpg" rel="lightbox[31828]"><img class="alignnone size-full wp-image-31845" alt="38kitas (15)" src="http://www.ntrexgo.com/wp-content/uploads/2016/10/38kitas-15.jpg" width="620" height="465" /></a></p>
<p>다양한 색상과 성별의 자전거로 구성되어있는 샤오미 전기자전거 윤바이크(YUNBIKE)</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2016/10/38kitas-6.jpg" rel="lightbox[31828]"><img class="alignnone size-full wp-image-31836" alt="38kitas (6)" src="http://www.ntrexgo.com/wp-content/uploads/2016/10/38kitas-6.jpg" width="620" height="465" /></a></p>
<p>사용자가 원하는 기능의 모듈을 탈부착할 수 있는 두더지의 모듈식 보조배터리</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ntrexgo.com/archives/31828/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
