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

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

Homemade Garlic Bread

“세상에서 제일 맛있는 마늘빵 레시피”

garlic_bread_title

아내가 만들어준 세상에서 제일 맛있는 명란 파스타에는 내가 만든 홈메이드 마늘빵이 함께 해줘야 제 맛. 나름 역사와 전통이 깃든 스페셜 마늘빵 레시피 대공개!

What You Need

1. 바게뜨 빵 2. 마늘 4쪽 3. 버터 1.5cm 한 블록 4. 조청 혹은 올리고당 5. 파슬리 가루
1. 바게뜨 빵
2. 마늘 4쪽
3. 버터 75g
4. 조청 혹은 올리고당
5. 파슬리 가루

Direction

1. 재료를 준비합니다. 여기에서는 바게뜨 한 개분의 마늘빵을 만들어보기로 합니다. 바삭바삭한 마늘빵을 위해서는 조직이 치밀한 바게뜨보다는 구멍이 많은 바게뜨를 추천합니다.

2. 마늘 네 쪽을 다져서 그릇에 준비합니다. 취향에 따라 마늘을 더 넣으셔도 됩니다. 버터는 75g 정도 준비하시고 풍부한 맛을 원하시면 더 넣으시면 됩니다.  버터가 부족할 경우 올리브유 혹은 카놀라유 등을 포함시켜도 되지만 확실히 고소한 맛이 떨어집니다. 마늘과 버터가 준비되면 전자렌지 중에 2분 정도 돌립니다. 전자레인지에 따라 다르지만 이 정도면 버터가 왠만큼 녹을 정도가 됩니다. 완전히 녹지 않더라도 어느정도 열이 있기 때문에 저어주면 금방 다 녹습니다.

butter_and_garlic

3. 바삭바삭하면서도 쫀득쫀득한 맛을 위해서 특별히 조청을 넣습니다. 일반적으로 올리고당을 넣지만 어느 날 우연히 넣어본 조청의 식감이 최고였습니다. 조청은 큰 수저로 듬뿍 두 스푼이면 됩니다. 네 큰술 정도 되겠습니다. 역시 기호에 따라 가감합니다.  조청을 넣고 충분히 섞어줍니다.

garlic_butter_honey

4. 오븐을 180도로 예열해줍니다.  이와는 별도로 오븐 트레이에 바게뜨빵을 깔아주고 3을 골고로 펴발라줍니다.  마지막으로 파슬리를 먹음직스럽게 뿌려줍니다.

spread

5. 예열이 끝나면 오븐에 트레이를 넣고 13분간 돌려줍니다. 오븐마다 다르지만 이층으로 구워줄 때 윗층은 적당하고 아랫층은 약 2분이 더 필요한 상황이 됩니다. 노릇노릇해질때 까지 적당히 구워줍니다.

oven

6. 완성된 마늘빵을 옮겨 닮고 특제 명란 파스타와 함께 먹으면 Two thumbs up!

finish

dinner

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 에서 수정해 보는 걸로 하겠습니다.