카테고리 보관물: Maker’s Recipe

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

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

Quadcopter With BeagleBone Black

“나의 첫 프로젝트 – 미완의 쿼드콥터 DIY”

title

2013년 여름 어느날, 자전거를 타고 우연히 들른 한강변 어느 이름모를 RC 항공기 활주로에서, 시원스럽게 하늘을 날아다니던 RC 항공기가 잊고 살았던 내 마음속 무언가를 건드렸다. ‘저걸 한번 만들어볼까? 뭐가 필요할까? 무엇부터 해야될까?’ 그리고 얼마 후 쿼드콥터라는 녀석을 알게되었다. 그냥 사다가 날려보는 건 내게 의미 없다. ‘명색이 엔지니어인데, 이 정도는 할 줄 알아야 되지 않을까?’ 나름의 호기도 부리며 신바람이 나서 재료를 사고 해외에서 배송되는 시간을 기다리며 즐거운 시간을 보냈던 것 같다. 처음 목표는 안드로이드 OS가 올라간 쿼드콥터. 이미 스마트폰에는 쿼드콥터에 필요한 센서(Gyro, Accelerometer, GPS)들과 모터 제어를 위한 네 개의 PWM포트 그리고 RF장치가 마련되어 있다. 스마트폰으로 조종하고 카메라 영상을 받아 FPV(First Person View)도 가능하게 하고 싶었다. 결과부터 말하자면 이런저런 이유에서 아직까지 이 녀석은 날지 못했다. 미완의 첫 프로젝트였지만 뜻깊은 첫 시도였기 때문에 여기에 남겨보고자 한다.

Backgrounds

– Quadcopter

쿼드콥터는 3개 이상의 모터와 프로펠러를 가진 멀티콥터 중에 4개의 모터와 프로펠러를가진 항공기를 말한다. 같은 쿼드라도 모터의 배치에 따라 쿼드콥터, X콥터, Y4콥터등으로 나뉜다. 모터의 수에 따라 트리, 헥사, 옥타콥터등 다양한 구성이 가능하다. 일반적으로 쿼드가 많이 쓰이는 이유는 모터가 적게 들어가면서도 안정성이 양호하고 직관적인 제어가 가능하기 때문이다. 상승하고 싶으면 모든 모터를 더 빨리 돌리고 하강하고 싶으면 속도를 늦추고, 어느 방향으로 가고 싶으면 반대쪽 추력을 상승시키고 어느 한쪽이 기울어지면 그 쪽 모터를 더 돌리고. 별다르게 찾아보지 않아도 이러한 접근이 가능할 정도로 직관적이다. 쿼드콥터에 대한 보다 자세한 정보는 아래를 참고하기로 하자.

http://en.wikipedia.org/wiki/Quadcopter

– BeagleBoneBlack

비글본 블랙은 TI사의 1GHz Sitara AM335x ARM cortex-A8 프로세서가 탑재된 저가의 고성능 개발 플랫폼이다.  오픈소스 소프트웨어 개발과 TI OMAP 단일칩 시스템 성능을 평가하기 위한 목적으로 지금까지 다양한 Beagle보드가 제공되었는데 그 중 가장 최근에 나왔고 가격이 저렴($55)하면서도 아쉽지 않은 성능을 가졌다. TI가 더이상 AP 프로세서를 개발하지 않으면서 다른 개발 플랫폼등과 비교해서 업데이트가 좋지 않다는 점은 흠이다. 최근에는 확인해보지 못했지만 기본기능(WIFI) 업데이트를 기다리며 꽤 오랜시간을 기다렸던 기억이 있다. 안드로이드, Linux등의 OS를 지원한다.

자세한 내용은 아래를 참고하기로 한다.

http://elinux.org/Beagleboard:BeagleBoneBlack

 What you need

1. X525 V3 fordling frame 2. XXD 2212 KV1000 brushless motor x 4 3. 9050 9x5 Propeller x 4 4. 20A ESC x 4 5. 11.1V 3000mAh 3S 35C Li-Po Battery 6. 3S Li-Po Battery Charger 7. Beaglebone Black 8. 10DOF 9-axis IMU( L3G4200D, ADXL345, HMC5883L, BMP085) 9. 10cmX10cm PCB 10. 23X2 pin header, 6 pin header socket 11. Jumper wires and soldering wire
1. X525 V3 fordling frame
2. XXD 2212 KV1000 brushless motor x 4
3. 9050 9×5 Propeller x 4
4. 20A ESC x 4
5. 11.1V 3000mAh 3S 35C Li-Po Battery
6. 3S Li-Po Battery Charger
7. Beaglebone Black
8. 10DOF 9-axis IMU( L3G4200D, ADXL345, HMC5883L, BMP085)
9. 10cmX10cm PCB
10. 23X2 pin header, 6 pin header socket
11. Jumper wires and soldering wire

 

Directions

1. 필요한 부품을 구매해 보자. Aliexpress.com이나 ebay.com과 같은 해외쇼핑몰을 이용하면 어렵지 않게 원하는 부품을 싼 값에 구할 수 있다. 왠만한건 무료배송이라는 건 장점이고 최대 한달 넘게 걸릴 수 있다는 건 함정이다. 싸고 배송이 오래걸린 다는 생각에 미리미리 주문해놓는다는 게 과소비를 야기할 수 있으니 주의가 필요하다. 구매했던 가격은 다음과 같다.

price

X525 패키지에는 쿼드콥터에 필요한 바디와 모터, 프로펠러, KK Multicopter 보드와 조립에 필요한 부품들이 포함되어 있다. KK Multicopter 보드는 RC비행에 필요한 MEMS 센서와 알고리듬의 다운로드가 가능한 MCU가 포함된 저가 보드이다. BBB(BeagleBone Black) 보드를 사용하기에  여기에서는 사용하지 않았지만 고정익 항공기 뿐만아니라 헬기, 다양한 멀티콥터에 사용가능한 firmware가 제공되고 있으며 Atmega168 MCU를 이용하여 직접 프로그래밍도 가능한점은 참고할만 하다.

2. 패키지에 포함된 메뉴얼을 따라 기체를 조립한다.

assemble

3. Beaglebone Black 보드를 구동해보자. 빌드서버를 만들고 코드를 다운받고 빌드하고 바이너리를 다운받는 내용은 경험의 정도에 따라서 쉬운일이기도 하고 어려운 일이 되기도 한다. 여기에서는 BBB보드를 어떻게 사용해야되는지에 대한 구체적인 내용은 생략하고자 한다. 하지만 걱정마시라. TI에서 제공하는 official 문서와 BBB를 사용하는 사람들의 포럼에 왠만한 정보는 다 공개되어 있다.

Developer Guide – http://processors.wiki.ti.com/index.php/TI-Android-JB-4.2.2-DevKit-4.1.1_DeveloperGuide

4. BLDC(Brushless DC) 모터를 사용하기 때문에 ESC(Electronic Speed Controller)를 이용하여 모터를 제어해야 한다. BLDC 모터의 경우 전기적, 기계적 잡음이 적고 수명이 길며 고속 제어가 용이하다. 반면 일반 DC모터에 비해 제어가 복잡하고 별도의 구동회로가 필요한 단점이 있다.  일반적인 RC ESC는 총 5개의 입력 라인과 3개의 출력 라인을 가지고 있다. 3개의 출력은 BLDC의 3상 입력을 위한 부분이며 2개의 입력은 배터리 전원(+/-)을 그리고 나머지 3개의 입력은 보드(수신기)에 연결(VCC, GND, CTRL)된다. 일반적인 보드 전압(≒5V)으로는 고속으로 모터를 드라이브 할 수 없기 때문에 보다 전압이 높고 방전율이 좋은 배터리 전압을 사용하게 된다. 결국 모터의 제어는 CTRL핀의 PWM(Pulse Width Modulation) 신호에 의해 결정된다. PWM은 펄스의 간격을 조절하여 변조하는 방식으로 Duty를 이용하여 모터의 강약을 조절할 수 있다.

pwm

절대적인 펄스의 폭보다는 주기에 따른 비율이 실제 속도를 제어한다. 예를 들면 20ms 주기의 펄스에서 High 레벨 구간이 1ms일 경우  모터는 Idle 상태가 되고 2ms일 경우 최대 속도가 된다. 결국 1 ~ 2ms 사이값으로  PWM 신호를 생성하여 모터 속도를 제어하는 것이 핵심이다.

BBB에서는 정확한 PWM을 제어하기 위한 eHRPWM(Enhanced High-Reolution Pulse-Width Modulator) 블럭을 제공한다. 자세한 내용은 아래를 참고하면 된다.

http://www.ti.com/lit/ug/sprufl3c/sprufl3c.pdf

여기에서는 4개의 모터를 위해 ‘ehrpwm.1’과 ‘ehrpwm.2’를 사용하였다. 각 블럭은 A, B 두개의 modulator를 가지고 있다.

/* Board-am335xevm.c */
#define BB_PWM_MOTOR12_DEVICE_ID   "ehrpwm.1"
#define BB_PWM_MOTOR34_DEVICE_ID   "ehrpwm.2"

static struct platform_pwm_motor_data quadcopter_pdata = {
    .pwm_12_id = BB_PWM_MOTOR12_DEVICE_ID,
    .pwm_34_id = BB_PWM_MOTOR34_DEVICE_ID,			
};
static struct pinmux_config motor1_pin_mux[] = {
    {"gpmc_a2.ehrpwm1A", OMAP_MUX_MODE6 | AM33XX_PIN_OUTPUT},
    {"gpmc_a3.ehrpwm1B", OMAP_MUX_MODE6 | AM33XX_PIN_OUTPUT},
    {NULL, 0},
};
static struct pinmux_config motor2_pin_mux[] = {
    {"gpmc_ad8.ehrpwm2A", OMAP_MUX_MODE4 | AM33XX_PIN_OUTPUT},
    {"gpmc_ad9.ehrpwm2B", OMAP_MUX_MODE4 | AM33XX_PIN_OUTPUT},
    {NULL, 0},
};

static struct platform_device am335x_evm_quadcopter = {
    .name  = "quadcopter",
    .id    = -1,
    .dev   = {
        .platform_data = &quadcopter_pdata,
    },
};

static struct pinmux_config quadcopter_gyro_irq[] = {
    {"mcasp0_fsr.gpio3_19", OMAP_MUX_MODE7 | AM33XX_PIN_INPUT},
    {NULL, 0},
};

static struct pinmux_config quadcopter_accel_irq[] = {
    {"gpmc_ad11.gpio0_27", OMAP_MUX_MODE7 | AM33XX_PIN_INPUT},
    {NULL, 0},
};

static void quadcopter_dev_init(int evm_id, int profile)
{
    int err;
    #define QUADCOPTER_MAX_FREQ 250

    setup_pin_mux(quadcopter_gyro_irq);
    setup_pin_mux(quadcopter_accel_irq);
    setup_pin_mux(motor1_pin_mux);
    pwm_pdata[1].chan_attrib[1].max_freq = QUADCOPTER_MAX_FREQ;
    am33xx_register_ehrpwm(1, &pwm_pdata[1]);
    setup_pin_mux(motor2_pin_mux);
    pwm_pdata[2].chan_attrib[1].max_freq =
    QUADCOPTER_MAX_FREQ;
    am33xx_register_ehrpwm(2, &pwm_pdata[2]);

    err = platform_device_register(&am335x_evm_quadcopter);
    if (err) {
        pr_err("failed to register quadcopter.\n");
    }
}

5. 여기에서 사용된 센서는 총 4개의 센서가 합쳐져 10DOF(Degree of freedom)를 표현하는 멋진 녀석이다. L3G4200D(Gyro), ADXL345(Accelerometer), HMC5883L(Compass), BMP085(Pressure) 센서가 함께 패키징되어 있다.  쿼드콥터에는 PID (Proportinal Integral Differential) 제어를 위해 자이로센서와 가속도센서가 꼭 필요하다. 자이로센서는 x/y/z 각 축을 회전축으로 발생하는 각속도를 측정하며 가속도센서는 중력가속도가 x/y/z 방향으로 미치는 영향을 절대적으로 보여준다. 처음에는 그냥 달려들었기 때문에 가속도 센서만으로 자세 제어가 가능할 걸로 믿었으나 모터의 심한 진동에서 오는 잡음에 가속도 센서는 취약하다. 하지만 절대값을 보여주기 때문에 누적오차는 상대적으로 적다. 자이로센서는 이와 반대로 실제 동작을 좀 더 정확하게 측정할 수 있는 반면 적분시 발생하는 누적 에러가 발생하게 된다. 일반적으로 두가지 센서의 장단점을 모아서 상보필터(Complementary Filter)를 구성하여 실제 쿼드콥터의 제어에 사용하게 된다. 이 칩의 컨트롤은 I2C를 통해 이루어진다. 모두 동일한 I2C 버스를 사용하며 각각 다른 Slave Address를 사용하여 커맨드를 구분한다. 지자기 센서와 고도 센서는 GPS와 합쳐져 자동비행/복귀에 사용될 수 있지만 기본 쿼드콥터 동작에는 사용되지 않는다. 여기에서 사용한 센서에 대한 driver는 이미 Linux 커널에 포함되어 있거나 웹에서 찾아볼 수 있다. 다음은 BBB보드에서 각 센서 device를 등록하는 부분이다.

/* Board-am335xevm.c */
static struct i2c_board_info am335x_i2c2_boardinfo[] = {
    {
	I2C_BOARD_INFO("l3g4200d", L3G4200D_I2C_ADDRESS>>1),
        .platform_data = &l3g4200d_info,			
        .irq = OMAP_GPIO_IRQ(L3G4200D_DRDY_GPIO),
    },
    {
        I2C_BOARD_INFO("bmp085", 0x77),
    },
    {
        I2C_BOARD_INFO("adxl34x", 0x53),
        .irq = OMAP_GPIO_IRQ(ADXl34X_DRDY_GPIO),
        .platform_data = (void *)&adxl34x_info,
    },
    {
        I2C_BOARD_INFO("hmc5843", 0x1e),
    },
};

6. 모터와 센서 동작에 성공하면 컨트롤에 필요한 최소한의 작업이 완료된 셈이다. 이제 BBB보드에 필요한 회로판을 구성해보자.  유지/보수의 편의성을 위해서 보드와 peripheral 사이의 연결은 헤더소켓과 핀헤더, 점퍼와이어를 적극 이용한다. UART TXD/RXD 라인은 디버그 용도 및 쿼드콥터에 커맨드를 보내기 위한 용도로 사용된다. Serial통신을 이용하여 BT/WIFI 연결이 가능하기 때문에 추후에 조종기 기능으로 확장될 수 있다. 여기에서는 별도로 조종기를 만들지 않고 USB-UART 케이블을 이용해 기체를 조정했다.

schematic2

1. BBB보드와 분리된 PCB 보드 - J8, J9, Header6와 결합된다. 2. BBB보드와 결합된 PCB 보드
1. BBB보드와 분리된 PCB 보드 : BBB 보드의 P8, P9 헤더소켓과 Header6 헤더핀에 결합된다.
2. BBB보드와 결합된 PCB 보드

 

7.  조립과 기본기능 확인

PCB 보드가 준비되면 기체에 견고하게 결합시킨다. PCB로 ESC와 센서의 PIN Layout에 맞춰 핀을 구성한 덕분에 어렵지 않게 조립을 완성할 수 있었다.

1. 모터 컨트롤을 위해서 네 개의 ESC에 연결된 모습 2. 조립이 완성된 모습 3. ESC와 모터의 연결 (Yellow와 Red가 교차될 경우 모터가 역방향으로 전환된다.) 4. BBB보드에 실장된 PCB 5. 조립이 완성된 모습 6. 센서모듈의 연결
1. 모터 컨트롤을 위해서 네 개의 ESC에 연결된 모습
2. 조립이 완성된 모습
3. ESC와 모터의 연결 (Yellow와 Red가 교차될 경우 모터가 역방향으로 전환된다.)
4. BBB보드에 실장된 PCB
5. 조립이 완성된 모습
6. 센서모듈의 연결

관심을 조금만 더 기울이면 인터넷상에 공개된 많은 정보들의 도움을 받았겠지만 이 때는 마음이 앞섰다. 네 개의 모터가 밸런스만 맞으면 뜨겠지하며 조립이 되자마자 모터를 각각 수동 조절하며 띄워보기를 시도했다. 이 과정에서 몇 가지 초보적인 실수를 했기 때문에 언급해보고자 한다.  일단 배터리는 전압만 생각하고 충방전율을 고려하지 않아 네개의 모터에 충분한 전류를 공급하지 못했다. 원가절감차원에서 가지고 있던 11.1V Li-Po 배터리를 사용했지만 800mAh, 20C 배터리로는 60cm 크기의 쿼드콥터를 띄우기에는 무리였다. 특정 모터만 갑자기 세게 돌거나 느려지며 기체가 뒤집어졌던 기억이 있다. 견고하게 결선하지 않은채 테스트를 진행하던도중 모터의 진동에 의해 배터리 전원에 쇼트가 발생했다. 일반 점퍼 와이어를 쓴 탓에 피복은 금방 불에 타버렸고 깜짝놀라 배터리를 분리하다가 손가락을 데이고 말았다. 쿼드콥터의 진동은 생각보다 훨씬 심하다. 불확실한 외부 요인에 의해 전선이 open 혹은 short되지 않도록 미리 신경써주어야 한다. 과전류에 의해서 전선이 쉽게 녹는걸 방지하기 위해서 전선 선택시 AWG값을 고려해야 한다. 물통 네 개로 쿼드콥터를 날지못하게 잡겠다는 생각은 아주 초보적인 생각이었다. 네 개의 KV1000급 모터가 만들어내는 양력은 저렇게 물통 네 개를 달아서 제어할만한 성격의 것이 아니었다.

1. 모터가 동작중인 쿼드콥터 2. 쇼트로 인해 녹아버린 점퍼 와이어 3. 30cm 이상 기체가 떠버리는 것을 방지하기 위한 아마추어 장비
1. 모터가 동작중인 쿼드콥터
2. 합선으로 인해 녹아버린 점퍼 와이어
3. 30cm 이상 기체가 떠버리는 것을 방지하기 위한 아마추어 장비

8. Software Implementation

Software 블록다이어그램은 다음과 같다.

block_diagram

Quadcopter 드라이버가 “/dev/quadcopter_dev” 이름으로 Misc. (miscellaneous) Device를 등록한다. File operation을 통해 Userspace에 있는 daemon과 통신한다.  daemon은 부팅시에 서비스로 등록된다. 최초 알고리즘을 kernel에 두었으나 PID  제어 과정에서 Floating 연산이 많아지면서 알고리즘을 이러한 연산이 보다 용이한 framework로 이동시켰다. 쿼드콥터 알고리즘 모듈을 NDK로 빌드하고 ADB로 push만 하면 되기 때문에 개발이 훨씬 용이해졌다. 쿼드콥터를 야외에서 날리고자 할 경우에는 당연히 RF 관련 HW/SW 모듈이 추가되어야 하겠지만 첫 번째 프로젝트의 목표는 쿼드콥터의 원활한 자세제어이다.  실내에서 안정적으로 가만히 떠있는 게 목적이기 때문에 USB-UART 케이블을 이용해도 충분하다. 따라서 UART를 통해 커맨드를 받아 조종정보를 daemon에 알려주는 application을 PC에서 콘솔을 통해 실행시켰다. 쉽게 말하면 PC의 화살표를 누르면 방향 조정을 그리고 ‘+/-‘를 누르면 스로틀 상승/하강 명령을 케이블을 통해 BBB에 전달한다. 사용자의 커맨드는 framework에서 돌고 있는 daemon에 전달되며 커널의 Quadcopter driver에서 읽어온 가속도/자이로 센서의 정보 그리고 이전 모터의 속도 정보를 Flight Algorithm 모듈로 전달한다. 가속도 센서와 자이로 센서의 정보는 인터럽트가 뜰 때마다 Quadcopter driver가 읽어서 daemon에  제공한다. Flight Algorithm은 PID 제어등을 통해 네 개의 모터의 새로운 컨트롤 정보를 daemon으로 다시 전달한다. daemon은 이 정보를 커널의 Quadcopter driver로 전달하여 ESC가 각 모터를 제어할 수 있도록 한다.

Conclusion

호기롭게 시작되었던 나의 첫 번째 프로젝트는 아직까지 미완으로 남아있다. 하드웨어 및 기본적인 하드웨어 제어는 완료된 반면 비행알고리즘이 완성되지 못했다. 바쁘기도 했고, 더 하고 싶은 일이 생긴 탓도 있지만 생각보다 위험하다는 점과 아무데서나 날릴 수 없다는 점도 한 이유가 되었다. 날씨가 따듯해지고 다시 열정이 생기면 언젠가 다시 미완의 프로젝트를 마무리 할 날이 올 거라 믿는다. 현재까지는 실패였지만 절반의 성공이었고, 잊고 살던 무언가를 깨우쳐준 소중한 경험이라 여기에 남긴다.

Portable Bluetooth Speaker DIY

“일반 스피커를 휴대용 블루투스 스피커로 만들어 보자.”

Title

Backgrounds

Bluetooth Audio Module

일반적인 Bluetooth Audio 모듈의 사용 방법 다음을 찹고 하기 바랍니다. (http://mydiyrecipe.com/?cat=4)

Schematic

schematic

– SPK Switch가 ON일 경우 스피커가 켜지며 충전 회로는 꺼집니다.  BT Switch도 동일하게 동작하고 BT 오디오 잡음 문제로 인하여 BT와 SPK 회로는 전원 및 GND를 공유하지 않습니다.

– 배터리 전원을 공유할 경우 전류 사용량이 1A를 넘기는 경우가 발생하여 BT가 끊어지거나 SPK에 충분한 전류가 공급되지 않아 소리가 작아지는 문제가 발생합니다.  또한 SPK, BT의 GND가 공유되면서 BT 동작 상황에 따라 스피커에 심한 잡음이 발생하는 현상이 발생합니다.

– Lithum Ion 배터리는 충방전 보호회로가 꼭 필요하며 잘못 다루었다가는 폭발의 위험이 있습니다. 굳이 위험요소를 만들고 싶지 않아 휴대폰 보조 배터리용으로 많이 사용되는 배터리 파워 뱅크를 2개 사용하기로 했습니다.  2600mah 18650 battery 와 충방전 보호회로가 포함되어 개당 가격이 $4 안쪽입니다.

– BT의 경우 동작 전압이 최대 4.5V 이하이기 때문에 별도의 DC-DC 컨버터(개당 약 $2.45)를 이용하여 약 3.7V로 전압을 강하합니다.

 What You Need

1. General Speaker (Here I used BE-100 Soundbar by Britz) 2. SPK-B Bluetooth Stereo Speaker Module (FZ0050) 3. Rocker Switch, 15MM * 10MM 3A/250V 4. DC-DC Converter Step Down Module Adjustable 1V 5V 12V 16V (DSN-MINI-360) 5. Mobile Power bank 2600mah 6. Jumper wire, Enameled wire, Solder wire, Cable tie, Glue and Glue gun
1. General Speaker (Here I used BE-100 Soundbar by Britz)
2. SPK-B Bluetooth Stereo Speaker Module (FZ0050)
3. Rocker Switch, 15MM * 10MM 3A/250V
4. DC-DC Converter Step Down Module Adjustable 1 ~ 16 V (DSN-MINI-360)
5. Mobile Power bank 2600mah (x2)
6. Jumper wire, Enameled wire, Solder wire, Cable tie, Glue and Glue gun

Direction

1. 스피커를 준비합니다. 가지고 있는 스피커의 동작 전압에 따라  배터리의 수가 결정됩니다. 여기에서는 USB를 통해 5V를 공급받는 Britz사의 BE-100 Sound bar가 사용되었습니다. 저렴한 가격(2만원 초반)에 실망스럽지 않은 성능, 깔끔한 디자인에 가성비가 우수한 제품입니다.

be-100

2. (Optional) 스피커에 따라 기호에 따른 커스터마이징이 필요할 수도 있습니다. 예를 들면 BE-100 스피커에는 Line-In을 위해 항상 붙어있는 3.5 PI 는 포터블 스피커에 항상 달아놓기에는 거추장 스럽습니다. 대신 그렇게 쓰이질 않을 MIC 출력단자가 포함되어 있습니다. 3.5 PI 잭을 추가해도 괜찮지만 여기에서는 MIC 출력단자를 Line-In 으로 변경하는 작업을 진행했습니다.

jack_fix

3. (Optional) 먼저 과감히 Line-In 선을 제거합니다. 이 선은 보드에 바로 납땜되어져 있습니다. 약 7cm의 여유를 두고 이 선을 잘라냅니다. 이 선은 나중에 BT의 오디오 출력 세 라인(SPKN, SPKLP, SPKRP)에 각각 연결됩니다. MIC로 Line-In을 받기 위해서는 원래 Mono MIC input으로 연결된 선들을 잘라내고 조금 전 언급한 세 라인에 연결해야 합니다. Mono MIC 입력이기 떄문에 SPKLP, SPKRP 라인이 납으로 short되어 있습니다. 이 부분을 녹여 분리하고 각각 Left/Right 채널로 연결해야 합니다. 어느 쪽이 Left인지 Right인지 헷갈릴 경우에는 Left only 혹은 Right only 파일을 재생시켜보고 확인해보면 확실합니다.

4.  스위치를 이용하여 스피커를 On/Off 하기 위해서는 기존에 보드에 바로 연결되어 있던 DC 아답터 Jack을 보드에서 분리하고 글루건을 통해 견고히 스피커 뒷판에 붙여야 합니다. 아답터 Jack은 어느정도 힘을 받는 부분이기 때문에 충분히 견고히 붙여야 합니다. 이 때 Glue에 의해서 보드 실장이 어려워지는 일이 없도록 위치를 잘 설정한 후 작업을 진행합니다.

5. 스위치가 들어갈 위치를 결정하고 스피커 뒷판에 타공합니다. 2mm 정도는 족히 되는 플라스틱이라 처음에는 드릴로 대충 절개한 후 줄을 이용해 다듬고 크기를 넓혀갔습니다. 절개면이 깨끗하지 않더라도 구매한 Rocker 스위치가 절개면을 덮어주는 형태라 깔끔한 작업이 가능했습니다.

title_s2

6. 두 개의 배터리 파워 뱅크를 준비하고 함께 제공된 USB 충전 케이블을 절반으로 자릅니다. 잘라보면 충전만을 위한 케이블이라 데이터라인은 없고 +,-만 보입니다. 납땜으로 보드에서 +, -를 빼올 수도 있지만 파워 뱅크를 뜯기도 번거롭고 얇은 USB 라인에서 점퍼라인을 빼는것도 쉽지 않기에 그냥 절반으로 자른 USB 케이블을 IN/OUT에 연결하여 충전 및 전원 공급을 진행하기로 합니다.

work

7. DC-DC Converter를 준비합니다. 파워 뱅크로 부터 공급된 5V 전원을 BT 동작전압인 약3.7V로 낮춰주는 역할을 하며 드라이버로 가변저항을 돌려가며 전압계로 확인하여 3.7V가 출력될 때 까지 조정합니다.

dcdc

8. 이제 기본적인 모듈은 준비되었습니다. 회로도를 참고하고 아이디어를 발휘하여 각 모듈을 스피커 뒷판에 배치하고 결선을 진행합니다. 참고로 배터리 파워 뱅크는 Input 과 Output의 GND가 공유되기 때문에 Charger Input에 별도로 GND를 연결하지 않아도 됩니다.

9. 스위치를 OFF 하고 배터리 파워 뱅크에 충전히 정상적으로 이루어지는 지 확인합니다. 적색등이 들어올 경우 정상적인 충전이 되고 있다고 볼 수 있습니다.

10. 스위치를 ON하고 BT 동작과 스피커 동작을 확인합니다. 페어링을 하고 음악을 재생하여 잡음없이 소리가 잘 재생되는 지 확인합니다.

Conclusion

1. 총 비용 = 배터리 파워 뱅크(2개, $7.98) + DC-DC converter(1개, $2.45) + BT Audio 모듈(1개 , $4.908) + 스위치(2개, $0.891) = $16.229

2. 예기치 못했던 문제가 항상 발생하므로 Breadboard에서 검증 후 실제 스피커에서 작업을 시작하는 것이 도움이 됩니다.

3. BT Audio 모듈과 배터리 파워 뱅크에서 고주파성 백그라운드 잡음이 적잖이 발생합니다.  추후 Portable BT speaker 시즌2 에서 수정해 보는 걸로 하겠습니다.

Bluetooth Speaker DIY

손쉽게 만들어 보는 나만의 Bluetooth Speaker

“Bluetooth Audio의 편리함은 알지만 그 기능이 우리집 오디오에 없다면? Bluetooth Speaker를 사고 싶지만 가격때문에 선뜻 고르기가 쉽지 않다면? $10로 만들어보는 나만의 Bluetooth Speaker는 어떨까요?”

Backgrounds 

Bluetooth Audio Module Overview

Recommended Using Conditions

Recommended Using Conditions

– 전원만 인가(VBAT, GND연결)되면 별다른 설정없이 Bluetooth Pairing 및 기본 Bluetooth Audio동작은 OK.

– 기본적으로 Battery Charger를 포함하고 있으나 추가적인 회로 구성이 필요하므로 여기에서는 일반적인 Li-po Charger 모듈을 사용.

Schematics

schematic

 

– 배터리의 충전은 Micro USB 입력전원을 사용합니다.

– 오디오 출력은 일반적으로 많이 사용되는 3.5 PI Audio Jack 을 사용합니다.

What You Need

1. SPK-B Bluetooth Stereo Speaker Module (FZ0050) 2. 3.5PI Audio Socket 3. 3.7V LiPo Battery 4. LiPo Charging Module (FZ0776) 5. Jumper wire, Enameled wire, Solder wire
1. SPK-B Bluetooth Stereo Speaker Module (FZ0050)
2. 3.5PI Audio Socket
3. 3.7V LiPo Battery
4. LiPo Charging Module (FZ0776)
5. Jumper wire, Enameled wire, Solder wire

 

Directions

1. 위에서 소개된 회로도를 따라서 각 모듈들을 연결해줍니다.  Bluetooth Audio Module의 Pin 크기가 0.7mm 인 관계로 납땜이 쉽지 않습니다. 때문에 일반적인 전선보다는 에나멜선을 이용하여 연결하는 것을 추천합니다. 에나멜 코팅이 되어 있기때문에 끝부분만 살짝 납에 녹인 후 pin에 연결하면 됩니다.

2. 전원을 인가하고 Bluetooth Host Player에서 Bluetooth를 Pairing 합니다. Default Device Name은 ‘BT-Speaker’입니다.

pairing_screenshot

3. 스피커를 3.5PI Audio Jack에 연결하고 소리가 정상적으로 나는지 확인합니다.

4. 연결된 선들이 쉽게 끊어지는 것을 막기 위해서 글루건으로 약한 부분을 보강합니다.

5. 모양은 조금 빠지지만 일반 스피커에도 Bluetooth 기능을 제공해주는 멋진 녀석이 완성되었습니다. 여기에서 사용한 Bluetooth Audio Module에는 Bluetooth 2.1에서 제공하는 모든 기능과 그를 위한 Pin-out이 제공되니 필요해따라 더 많은 기능을 추가해보는 것도 좋을 것 같습니다. (예 – Paring 상태 표시 LED켜기, 뒤로감기, 앞으로 감기 등)

component