3D Printer DIY – Prusa i3

Industrial Revolution 2.0 has begun in my room.

“3D 프린터, 미래에서 온 특별한 물건일까요? 어느 날 그냥 한번 시작해 본 3D 프린터 DIY 이야기.”

Background

제 3의 산업혁명이라고도 불리우며 엄청난 변화를 몰고올 것만 같았던 3D 프린터는 아직 우리 생활에 가까이에 있지 않다. 가끔 TV를 통해 미국에 누군가가 총을 만들어 사회적 파장을 불러일으켰다더라 우주에서 3D 프린팅이 성공하여 자급의 가능성이 열려다더라 하는 등의 호기심 어린 정보들만 있을뿐이었다. 하지만 2013년 미국 출장길에 실험실에서 우연히 접한 3D프린터는 나에게 신선한 충격으로 다가왔다.inspiration

 

하나는 요다 형상을 한 스피커였고 또 하나는 18350배터리와 바나나잭을 연결하기 위한 홀더였다. 프린터가 뭔가를 찍는걸 본것도 그 때가 처음이었고 산출물의 퀄리티가 어떤지 본 것도 처음이라 신기할 뿐이었지만 무엇보다도 이미 실생활에 유용하게 사용되고 있다는 부분이 인상깊었다. 회사 특성상 테스트와 데모에 많은 시간과 비용이 소모되는데 이렇게 사소해 보이는 3D 프린팅이 시간절약과 완성도의 향상에 큰 도움이 되고 있었다.

나는 Maker Culture에 관심이 많다. Maker Culture는 기술 을 기반으로 한 DIY 문화의 일종이다. 기술, 아이디어, 예술성 등이 혼합된 형태이다. 한국에서는 이러한 문화가 태동하는 상황이지만 이미 외국에서는 활성화된 문화이고 많은 정보와 인프라가 갖추어져있다.

Maker Culture 란?

이러한 Maker Culture에 날개를 달아준 것이 3D 프린터이다. 얼마전 WiFi로 조종되는 자동차에 대한 글을 올린 적이있다. 보드와 배터리 WiFi모듈과 안테나등을 깔끔하게 정리하고 싶은데 한정된 공간에 정리하는게 간단한 일은 아니었다. 투명한 샴푸 케이스를 잘라서도 만들어보고, 아이의 고무찰흙으로도 모양을 만들었지만 완성도는 만족스럽지 않았다. 이 때 미국에서 봤던 3D 프린터가 떠올랐다. 원하는 형태의 조형물을 완성도 높게 만들어주는 3D 프린터는 Maker에게 있어서 훌륭한 동반자라 할 수 있겠다.

3D 프린터에 대한 보다 자세한 정보는 아래 Wikipedia를 참고하기 바란다.

3D 프린팅이란?

이미 뭘 고를지 어려울 정도로 많은 종류의 3D 프린터가 시장에 나와있다. 뭐가 좋은지 뭐가 나쁜지를 떠나 완성품의 가격은 최소 500달러는 넘는다. 얼마나 유용한지 품질이 어떤 정도인지를 알기도 전에 이만한 비용을 투자하는 건 위험 부담이 남기 때문에 DIY를 진행해보기로 했고, 즐겨찾는 Aliexpress.com에서 만만한(?) 가격에 사람들이 많이 찾는 모델을 정해 도전해보기로 했다. 그래서 발견한 모델이 Prusa i3 이다. Prusa i3는 Reprap(Replicating Rapid Prototyper) 프로젝트의코 어 개발자인 Prusajr가 가장 최근에 진행중인 3D 프린터로 3번째 개량형 모델이다. Reprap은 부품의 대부분을 자기 복제할 수 있는 프린터를 목표로 2005년에 시작된 프로젝트로 오픈 디자인, 소스코드를 지향함으로써 지금까지 수백대의 다른 프린터 개발을 이끌었다.

Reprap의 Prusa I3는?

What You Need

ingredient_3d_printer_allingredient_3d_printer

 

Aliexpress.com에서 3D 프린터를 검색하면 400달러 근처에서는 거의 대부분이 Prusa I3 모델이다.  위에 보이는 것처럼 생각보다 많은 부품이 들어가기 때문에 부품 하나하나를 찾아서 구매하는 것이 쉬운일은 아니다. 따라서 한 두대의 3D 프린터를 만들예정이라면 DIY 패키지를 구매하는 것이 시간과 비용의 소모를 최소화하는 길이다. 하나 만들어보고 조금씩 변형시켜보는 것도 좋은 방법이다. 만들어보면 알겠지만 3D 프린팅의 기본 개념은 생각보다 단순하며, 프린팅 기술과 Software는 오픈되어 있기 때문에 그 외의 부분들은 얼마든지 커스터마이징이 가능하다.

Direction

1. 부품의 확인

3D 프린터를 사고 첫번째 프린팅에 성공 하기까지 거의 네 달의 시간이 소요되었다. 부품만 완전하다면 주말을 온전히 투자하여 조립이 가능하지만 부품이 많고 해외에서 배송되는 특성상 패키지 상품을 주문해도 뭔가 문제가 발생하기 마련이다. 해외 배송은 상황에 따라 40일까지 지연이 발생하기도 한다. 부품 리스트가 함께 도착했지만 솔직히 부품이 하도 많아서 어떤 부품이 뭔지도 모르겠고 당연히 다 있겠거니 시작했다가 반나절만에 더이상 진행을 못하는 문제가 발생했다. 프레임 파손, 베어링 미배송 등의 문제가 있었으며 제대로 된 부품을 새로 받는데에만 세 달 넘게 소요되었다. 조립을 시작하지 않았으면 반품이라도 했겠으나 조립중에 확인된 사항이라 항의 메일을 열통 가까이 날려서 마침내 얻게된 부품이다.

3dprt_preparation

부품은 위의 사진과 같은 형태로 배송된다. 우측 맨아래의 사진처럼 프레임이 파손되어 배송되기도 한다. 혹시 모를 문제를 예방하는 차원에서 꼼꼼히 한번 부품을 확인해보는 것도 좋을 것 같다.

2. Assembly

구매처에서 제공하는 매뉴얼에 왠만한 조립과정은 잘 설명되어 있다.  부족하다 싶은 내용이 있어도 오픈 플랫폼이다 보니 인터넷에서 원하는 정보를 어렵지 않게 찾을 수 있다.

a. 프레임

프레임을 결합하는 방식은 모두 동일하다. 6각 드라이버와 렌치만 있으면 어렵지 않게 완성할 수 있다.3dprt_frame

b. 개별 부품의 조립

a. Y-axis motor b. X-axis motor c. Y-axis motor assembly d. Heating hot bed assembly e. Frame with Z-axis motor, Assembled X and Y-axis motors.
a. Y-axis motor
b. X-axis motor
c. Y-axis motor assembly
d. Heating hot bed assembly
e. Frame with Z-axis motor, Assembled X and Y-axis motors.

프린터의 각 부분을 조립한다. X, Y, Z축 모터를 각 프레임에 조립하고 Heating hot bed를 연결해준다. X, Y축에는 각각 하나의 Stepping motor가 사용된다. Z축에는 양쪽에 하나씩 총 2개의 모터가 사용된다.

c. 각 부분의 결합

3dprt_assemble2

 

준비된 각 부분을 조립한다. 여기까지하고 몇 달간의 공백기를 가졌다. X, Y축 타이밍 벨트를 연결하는 베어링이 없어서 더 이상 진행할 수가 없었다. Y축 모터에 결합되어 플라스틱을 녹여 사출하는 Extruder 역시 아직 조립되지 않은 부분을 확인할 수 있다.

3. Electrical connection

Reprap Melzi Version 1.1 보드와 각 모듈의 연결은 다음과 같다. 매뉴얼상의 연결로는 Y축 모터의 방향이 정반대가 되기 때문에 아래 그림 ⓑ의 red/blue line을 교환했다.

a. X-axis motor (green/black/red/blue) b. Y-axis motor (green/black/red/blue) c. Z-axis motor (orange/black/red/yellow) d. Extruder motor (green/black/blue/red) e. Power supply (red/black) f. Heating board (red/black) g. Heating tube (red/red) h. Fan (red/black) i. X-limit switch (black/black) j. Y-limit switch (black/black) k. Z-limit switch (black/black) l. Thermister - Heating board (white/white) m. Thermister - Extruder (white/white)
a. X-axis motor (green/black/red/blue)
b. Y-axis motor (green/black/red/blue)
c. Z-axis motor (orange/black/red/yellow)
d. Extruder motor (green/black/blue/red)
e. Power supply (red/black)
f. Heating board (red/black)
g. Heating tube (red/red)
h. Fan (red/black)
i. X-limit switch (black/black)
j. Y-limit switch (black/black)
k. Z-limit switch (black/black)
l. Thermister – Heating board (white/white)
m. Thermister – Extruder (white/white)

보드와 파워서플라이를 프레임에 고정하고 플라스틱 튜브를 이용해 깔끔하게 선정리를 하면 드디어 완성이다.

3dprt_complete

4. Software Installation

Reprap 3D 프린터를 컨트롤 하기 위해 Repetier Host Application을 PC에 설치한다.

Download the latest Repetier Host Application

USB-UART 통신을 위한 FTDI USB Driver를 설치해준다.

Download FTDI USB Driver

Repetier 프로그램을 실행하고 프린터를 다음과 같이 설정해준다.

a. Select appropriate port which printer is using. b. Select Receive Cache Size as 63 c. Set Default Extruder Temperature as 215 and Default Heated Bed Temperature as 60 respectively. d. Set 200/200/180 for width/depth/height of print area.
a. Select appropriate port which printer is using.
b. Select Receive Cache Size as 63
c. Set Default Extruder Temperature as 215 and Default Heated Bed Temperature as 60 respectively.
d. Set 200/200/180 for width/depth/height of print area.

편의를 위해 Slice up 툴인 Cura를 설치 한다. Repetier-Host에서도 Slice up 툴을 제공하지만 어려운 감이 있어 Cura를 추천한다. 설치시 machine의 종류는 RepRap으로 지정하며 machine의 width(200), depth(200), height(180), Nozzle size(0.4), Heated bed(check)를 각각 설정해준다.

Download the latest Cura

아래 그림에서 보이는 Repetier의 Manual Control 탭에서 프린터를 직접 구동해보며 기본 기능을 테스트 할 수 있다.  각 모터와 히터의 온도를 확인해보며 기능이 정상동작하는 지 확인한다.

ⓐ, ⓑ, ⓒ 각각 x/y/z 축의 초기점으로 이동한다. ⓓ Extruder에 프린팅 재료를 공급한다. Extruder 온도가 낮을 경우에는 실행되지 않는다. ⓔ Heated bed의 온도 ⓕ Extruder의 온도
ⓐ, ⓑ, ⓒ 각각 x/y/z 축의 원점으로 이동한다.
ⓓ Extruder에 프린팅 재료를 공급한다. Extruder 온도가 낮을 경우에는 실행되지 않는다.
ⓔ Heated bed의 온도
ⓕ Extruder의 온도

 

5. Printing

마침내 프린팅에 도전해본다. 예제 STL 파일중 하나를 선택해 Repetier Host 툴에 로딩한 후 Start Print 버튼을 누르면 끝이다. Extruder와 Heated bed의 온도가 설정치 만큼 오르고 프린팅이 시작된다. 이거 되긴 되는 걸까 반신반의하며 시작했지만 한층씩 쌓여 어느덧 로봇의 형상을 갖춰간다. 총 52분 48초의 시간이 소요되어 나의 첫번째 프린팅 작품이 완성되었다.

 

 

3dprt_printing

 

자세히 보면 로봇의 얼굴 부분이 쉬프트 되어 있음을 확인할 수 있다. 노란색 PLA를 공급했지만 갈색으로 탄것처럼 보이는 현상도 확인할 수 있다. 프린터는 프린팅 절대 위치를 원점으로 부터의 상대 위치로 계산한다.  쉽게 말하면 원점에서 부터 Stepping Motor가 몇 바쿼 돌아서 어느 자리에 간다는 식이다. 타이밍 벨트가 느슨할 경우 순간적으로 벨트가 느슨해지며 프린팅 위치가 쉬프트 되는 현상을 목격했다. 1시간 가까이 기다려 얻게되는 작품을 순간의 실수로 망쳐버릴 수 있으니 타이밍 벨트는 풀어지지 않도록 정확하게 고정해야 한다. 가끔씩 발생하는 찌꺼기로 인한 탄화 발생은 좀 더 배워야할 문제인 듯 하다. 실제로 Extruder와 Heated bed 온도가 PLA 재료 reference 보다 약간 낮았는데 이런 부분 부터 올바른 값으로 변경해보며 최소화 할 방법을 찾아야 될 것 같다.

일단 프린팅에 성공하자 3D 모델링 카페에서 무료로 다운받을 수 있는 수많은 오브젝트에 도전해본다. 요즘 부쩍 공룡을 좋아하는 아이를 위해 아래 모델을 선택했다. 뚝딱하면 장난감이 만들어지니 아이의 반응은 열광적이었다. 두번째 로봇 프린팅(하얀색 로봇)은 깔끔하게 성공했기 때문에 시간이 좀더 걸리더라도 큰 녀석으로 도전했는데 도무지 지구에서는 성공하기 힘들것 같은 방법으로 아래 사진처럼 라면 면발을 뽑아내었다. 자리를 비운 후 이제쯤 프린팅이 어느정도 되었겠지 돌어왔다가 어이없는 결과에 허탈해했다. 용융된 플라스틱이 고정되기 위해서는 매질이 필요하다. 아래 공룡에서 날개와 같은 부분은 느닷없이 허공에 플라스틱을 뿌려야 하는 일이 필연적으로 발생한다. 이러한 부분을 극복하기 위해 다른 모델들을 보면 적당히 프린팅 모델의 방향을 바꾸거나 추후에 제거 가능한 지지대를 세운다. 3D모델이 있다고 해서 모두 그냥 프린팅 할 수는 없다는 사실을 체험할 수 있었다. 경험 부족에서 온 해프닝이었고 차차 해결해 나가야 할 문제인 것으로 보인다.

3dprt_printing_fail

6. 3D modeling

프린팅을 하려면 3D 모델이 있어야 한다.  원하는 형태의 오브젝트를 만들고 싶다면 3D 모델링도 그만큼 중요하다. 3D 모델링을 위해서는 3D CAD 툴의 힘을 빌어야 하지만 전문적인 CAD툴을 하루이틀만에 배우기는 쉽지 않다. 따라서 초급자도 쉽게 접근할 수 있는 간단한 CAD툴이 등장하게 되는데 여기에서는 Tinkercad를 소개해보고자 한다.

Go to Tinkercad

Tinkercad의 장점은 누구나 10분이면 스스로 배울정도로 쉽다는 점에 있다. 원하는 오브젝트가 있으면 크기를 예측하여 마우스로 끌어당기고 자르고 이동시키면 그만이다. Web 기반이기 때문에 프로그램을 인스톨할 필요도 없고 자료는 서버에 저장된다.

여러개의 3D 모델을 프린팅하면서 현재까지 가장 보람되었던 시도가 아래 모델이었다. 새로 산 가구의 수평이 맞지 않았는데 고임목이 마땅치 않아 종이를 접어 넣어야 하나 하던 참이었다. 3D 프린터로 한번 해보자 생각한지 몇 분만에 아래와 같은 결과물이 나왔다. 별것아니지만 정말 필요한 곳에 써본 첫번제 예라서 의미있는 시도였다.

ⓐ Tinkercad로 작업 ⓑ Repetier 에서 STL 파일을 불러서 CuraEngine으로 Slice up ⓒ 프린팅 결과물 ⓓ 실제 설치 예
ⓐ Tinkercad로 작업
ⓑ Repetier 에서 STL 파일을 불러서 CuraEngine으로 Slice up
ⓒ 프린팅 결과물
ⓓ 실제 설치 예

 

Conclusion

그냥 한번 시작해본 3D 프린터 DIY가 이런저런 이유로 거의 네달만에 첫 성과물을 내었다. 회사 업무와 육아로 인해 많은 시간을 여기에 쏟아붇지는 못했지만 3D 프린터가 뭔지 어떤 품질의 결과물이 나오는지 프린팅을 하기위해서는 무엇이 필요한지 궁금증을 해소할 수 있었다.

가까운 미래에 3D 프린터가 집집마다 설치되게 될까? 아직 갈길이 멀어 보이지만 그렇게 되리라 믿는다. 프린팅 퀄리티, 프린팅 시간, 소음과 냄새, 손쉬운 3D 모델링 방법 및 데이터베이스. 이러한 부분에 있어서 많은 발전이 있어야 될 것으로 보인다. 플라스틱 실을 한층한층 쌓아가다 보니 결과물의 표면은 매끄럽지 않고 이를 위해 노즐을 더 줄이거나 후처리 작업에 신경써야 할 것 같은데 이런저런 한계가 있어 보인다.  조그마한 조각 하나를 만드는데도 한시간여가 소요되는 프린팅 시간도 가장 시급히 해결해야 할 문제중 하나이다. 연필꽂이 하나를 만드는데 하루가 소요되면 이걸 계속 하려 할까? 게다가 디자인이 결정되지 않은 상태라면 결과물을 보고 조금씩 보정해야 할텐데 이를 위해 투자되는 시간들이 적지 않다. 프린팅 도중에 발생하는 소음과 건강에 안좋은 듯한 플라스틱 녹는 냄새는 의외로 문제가 된다. 소음은 거의 일반 잉크젯 프린터 수준이라 심각하지는 않지만 냄새는 일반 가정집에서 하기에는 문제가 심각한 수준이다. 3D 프린팅만큼 중요한 것이 모델링이다. 일반 가정 사용자가 원하는 형태의 물건을 쉽게 모델링 할 수 있어야 보급화에 성공할 수 있을 거라 생각된다. 집에 있는 물건을 그냥 복제할 수 있는 3D 스캐너가 하나의 해결책일 수 있다. 무언가 필요할 때 직접 디자인하지 않고 쉽게 찾아서 그냥 프린팅하거나 약간의 보정만 해서 사용한다면 누구나 쓰고 싶어하는 아이템이 되지 않을까 싶다.

언젠가 온라인 마켓에서 원하는 물건의 3D 모델 파일을 구매하여 집에서 프린팅하는 날이 오겠지? 아마 무단 복제를 피하기 위한 인증과정도 생길테고 지금처럼 단색이 아닌 총천연색의 프린팅도 가능하리라. 그 때 이 글을 읽어보면 지금 90년대 천리안, 나우누리를 회상하는 것 마냥 참 즐거울 듯 하다.

Toy Car controlled by WiFi

스마트폰 WiFi로 컨트롤되는 장난감 자동차

“아이가 가지고 놀던 장난감 RC카를 스마트폰으로 조종할 수 는 없을까? WiFi로 뭔가를 조종할 수 있다면 만들 수 있는 것들이 훨씬 많을텐데. 그래서 WiFi Toy Car가 탄생합니다.”

Background

USR-WIFI232 Overview

WIFI232 series product is used for convert data from RS232 to WIFI TCPIP, Two-way transparent transmission, user need not know the WIFI and TCPIP detail, update the product for WIFI control. All the convert work is done by the module, for users, the RS232 side is only as a serial device, at the WIFI side, for user is TCPIP Socket data. User can setup the work detail by sample settings, setup via inside web pages or RS232 port, the setup work need only do once, then it will save the setting forever.

wifi232

Arduino – http://www.arduino.cc/

LED 하나를 켜기 위해서 센서 하나를 동작하기 위해서 얼마나 많은 지식이 필요할까? 답은 어디에서 구현하느냐에 따라 다르다.  어떤 프로세서를 쓰느냐, 어떤 OS를 쓰느냐에 따라 같은 동작을 두고도 구현 방법은 천차만별이다. 때로는 LED 하나를 켜는 일, 센서에서 값 하나를 읽어오는 일에 너무 많은 지식이 요구되기도 한다.

구현상의 어려움이 아이디어를 막아서는 안되지 않을까? 아두이노는 단순하며 직관적이다. 생활속 아이디어를 현실화하기 위한 훌륭한 도구이다.  시간을 몇 년전으로 돌려보자. 장난감 자동차를 스마트폰으로 컨트롤 한다는 게 가능이나 했던 이야기일까? 얼마나 많은 시간과 노력 그리고 비용을 들여야 했을지 까마득하다. 아두이노는 많은 샘플코드들이 오픈되어 있고 다양한 H/W 모듈이 라이브러리와 함께 제공된다. 컴파일/다운로드도 단 몇초면 끝난다.

What You Need

1. Toycar 2. Arduino Nano 3. WIFI232 4. LiPo Battery 3.7V 5. Jumper wires and soldering wire
1. Toycar
2. Arduino Nano ($2.15)
3. USR-WIFI232-B ($21.55)
4. LiPo Battery 3.7V ($2.95)
5. Jumper wires and soldering wire

 

 Direction

1. 눈여겨 두었던 아이의 장난감을 뜯어보았다. 2WD/2CH 를 지원하는 모델이다. 전후/좌우 컨트롤이 가능하지만 속도 조절 및 미세한 조향은 불가능하다. Ni-CD 1.2V 배터리 4개가 직렬로 연결되어 전원을 공급한다.wificar_block

RF만 WiFi로 대체하고 나머지는 재사용하기 위해서 기존에 어떻게 동작하고 있었는지 확인해볼 필요성이 생겼다. 내부를 살펴보니 RX-2C라고 적힌 IC가 PCB 한가운데 자리잡고 있다. 인터넷에서 datasheet를 찾아보니 47MHz 에서 동작하는 Receiver를 포함한 장난감 전용 IC로 보인다.  IC에서 전후/좌우 on/off 핀만을 제공하다보니 속도 조절 및 미세한 조향이 될리 없다. Reference 회로도를 보면 트랜지스터로 스위칭 회로를 구성하여 모터를 켜고 끄는 부분이 확인되며 실제 장난감의 PCB도 유사하게 구성되어 있다.

wificar_rx2

2. 전후/좌우 네 개의 핀에 점퍼선을 날려 차체밖으로 뺀다. GND와 배터리 전원도 함께 빼준다. 아두이노 보드와 WiFi 모듈 그리고 배터리는 차체 외부 트렁크에 위치할 예정이다.

wificar_inout

3.  점퍼선을 이용해 모터제어핀을 D4(LEFT), D5(RIGHT), D6(FORWARD), D7(REVERSE)에 연결한다.  WIFI232에는 12개의 출력핀이 제공되지만 VCC, GND 그리고 두 개의 Serial 통신관련 핀만 연결해주면 제어가 가능하다. D2(Serial Rx), D3(Serial Tx) 핀을 WIFI232와 연결해준다. WIFI232는 3.3V(±5%)로 동작된다.

wificar_connection

4. WiFi232 설정

WiFi232 모듈은 AP(Access Point) Mode와 STA(Station) Mode를 지원한다. UART를 이용하여 직접 연결 모드를 설정하거나 AP의 Setup Page를 이용해 원하는 설정이 가능하다. Setup web page를 통해 설정하는 방법은 다음과 같다.

WiFi232 모듈에 전원을 인가하면 ‘HF-A11x_AP’란 이름으로 AP가 검색된다. 스마트폰의 WiFi를 활성화하고 위의 AP에 접속한다. 연결에 성공하면 브라우저를 이용하여 http://10.10.100.254’로 접근한다. 메뉴에 진입하여 아래와 같이 설정하면 된다.

1. Connect to 'HF-A11x_AP (Left) 2. Working Mode Configuration (Middle) 3. AP Interface Setting (Right)
1. Connect to ‘HF-A11x_AP (Left)
2. Working Mode Configuration (Middle)
3. AP Interface Setting (Right)
1. STA Interface Setting (Left) 2. WiFi-Uart Setting (Middle) 3. Device Management (Right)
1. STA Interface Setting (Left)
2. WiFi-UART Setting (Middle)
3. Device Management (Right)

설정을 완료하면 WiFi232 모듈은 AP로 동작하게 되고 스마트폰이 Client가 되어 Host에 접속하게 된다.

5. Transmitter Application 구현

기본적으로 WiFi232 모듈을 지원하는 안드로이드/IOS 등 OS를 위한 레퍼런스 소스 코드가 제공된다.  이를 참고하여 Transmitter App.을 구현하면 된다. 추후 확장성을 위해 4채널 지원을 염두하고 구현하였으며 2채널 선택시 좌측은 전/후진,  우측은 좌/우회전으로 동작한다.

Download Transmitter App.

device-2015-02-05-162124

6. 아두이노 스케치

#include <SoftwareSerial.h>

SoftwareSerial mySerial(2, 3); // RX, TX
const int PIN_LEFT = 4;
const int PIN_RIGHT = 5;
const int PIN_FORWARD = 6;
const int PIN_REVERSE = 7;

const int MASK_LEFT=1<<3;
const int MASK_RIGHT=1<<2;
const int MASK_FORWARD=1<<1;
const int MASK_REVERSE=1<<0;

void setup()
{
  pinMode(PIN_LEFT, OUTPUT);
  pinMode(PIN_RIGHT, OUTPUT);
  pinMode(PIN_FORWARD, OUTPUT);
  pinMode(PIN_REVERSE, OUTPUT);

  digitalWrite(PIN_LEFT, LOW);
  digitalWrite(PIN_RIGHT, LOW);
  digitalWrite(PIN_FORWARD, LOW);
  digitalWrite(PIN_REVERSE, LOW);
  
  // Open serial communications and wait for port to open:
  Serial.begin(57600);

  while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }

  Serial.println("Welcome Savage Control (WIFI version)");
  mySerial.begin(57600);
}

char inByte = 0;
int exByte = 0;
const int magic0 = 0x52;
const int magic1 = 0x43;
const int magic_ping = 0x50;
int magic_check=0;
int pwm_seq = 0;
int pwm_period = 0;
static int state = 0;  //No Connection

void loop() // run over and over
{

    if (mySerial.available()>0)  {
      inByte = mySerial.read();
    }
    if(magic_check==0)  {
      if(inByte==magic_ping)  magic_check=0;
      if(inByte==magic0)  magic_check++;
    }
    else if(magic_check==1)  {
      if(inByte==magic1)  magic_check++;
    }
    else if(magic_check==2)  {
      //Serial.print(inByte, HEX);
      exByte = inByte;
      magic_check++;
    }
    else if(magic_check==3)  {
      if(exByte==inByte)    magic_check++;
      else magic_check=0;
    }
    else {
      state = exByte;
      magic_check=0;
      exByte=0;    
    }

  if((state & MASK_LEFT) == MASK_LEFT)  {
    digitalWrite(PIN_RIGHT, LOW);
    digitalWrite(PIN_LEFT, HIGH);
    Serial.println("LEFT");
  }
  else if((state & MASK_RIGHT) == MASK_RIGHT)  {
    digitalWrite(PIN_LEFT, LOW);
    digitalWrite(PIN_RIGHT, HIGH);
    Serial.println("RIGHT");
  }
  else {
    digitalWrite(PIN_LEFT, LOW);
    digitalWrite(PIN_RIGHT, LOW);
  }

  if((state & MASK_FORWARD) == MASK_FORWARD)  {
    digitalWrite(PIN_REVERSE, LOW);
    if(pwm_seq%pwm_period==0) digitalWrite(PIN_FORWARD, HIGH);
    else digitalWrite(PIN_FORWARD, LOW);
    Serial.println("FORWARD");
  }
  else if((state & MASK_REVERSE) == MASK_REVERSE)  {
    digitalWrite(PIN_FORWARD, LOW);
    if(pwm_seq%pwm_period==0) digitalWrite(PIN_REVERSE, HIGH);
    else digitalWrite(PIN_REVERSE, LOW);
    Serial.println("REVERSE");
  }
  else {
    digitalWrite(PIN_FORWARD, LOW);
    digitalWrite(PIN_REVERSE, LOW);
  }
}

7. 테스트

처음에는 배터리를 추가로 장착하지 않았다. 배터리가 없어도 5V 전원을 RX-2C에서 입력받아서 사용할 수 있다. 하지만 문제는 모터 제어시 일시적으로 3.3V 이하로 전압 강하가 일어나는 경우 WiFi 연결이 끊어지는 경우가 발생한다. 좌/우 조향의 경우 전류 소모가 적지만 전/후 동작시에는 전류소모가 커 실제로 이러한 현상이 발생하게 된다. 안정적인 전원 공급을 위해 3.7V LiPo 배터리를 추가하였다.

DSC_0913

Conclusion

무선 조종 장난감을 만드는 것이 이번 프로젝트의 목표는 아니다. 진정한 의미는 향후 확장성에서 찾을 수 있다. 집안의 무언가를 원격에서 스마트폰으로 컨트롤 할 수 있는 현실적인 방법이 생긴 것이다.  이를 통해 앞으로 현실화될 수 있는 아이디어들이 벌써부터 기대가 된다.