Translated in English!! (by Chang-Han Jeon)
.
RetroBand는 오픈소스로 제공되는 아두이노 웨어러블 프로젝트의 두 번째 결과물입니다. 스마트 밴드라고 하기에는 굉장히 단순한 기능만 제공하기 때문에 Activity Tracker라고 부르는 것이 더 어울려 보이긴 하지만… 일단 사람들에게 익숙한 이름을 붙여봤습니다. 어차피 스마트 밴드의 핵심은 블루투스로 모바일과 연결해서 움직임을 추적하는 거니까요.
아두이노로 구현한 RetroBand가 가진 기능은 하나입니다. 가속도 센서를 이용해서 수집한 데이터를 모바일 폰으로 보내주는 겁니다. 그럼 모바일 폰에서 수집한 데이터를 처리해서 걸음 수와 칼로리를 계산해 줍니다. 기능이 단순한 대신 RetroWatch 프로젝트 보다 구조도 더 단순하고 직접 DIY 하기가 쉽습니다.
안드로이드 앱에서는 수집한 데이터를 분석해서 걸음 수를 측정하는데, 사용된 알고리즘이 비교적 단순합니다. 이 분야에 능숙하신 분이라면 더 세련된 알고리즘으로 교체해서 만들어 보실 수 있을겁니다. 앱에서는 계산된 칼로리를 누적해서 저장하므로 월/일/시간 별 그래프로 확인 할 수 있습니다.
참고로 아두이노의 메모리 한계로 밴드가 가속도 센서 데이터를 자체적으로 저장해 둘 수가 없습니다. 즉, RetroBand는 모바일 폰과 블루투스로 연결된 상태에서만 폰에 데이터를 전송해서 분석할 수 있습니다. 밴드만 따로 들고다니면서 데이터를 축적 할 수 없는 한계점이 있습니다. 추후 아두이노가 성능이 좋아지면 이 부분을 수정할 수 있겠지요.
.
1. 동작 구조
RetroBand는 크게 아두이노 파트와 안드로이드 앱 파트로 구성되어 있습니다.
아두이노 파트는 4개의 주요 부품으로 구성되어 있습니다. 아두이노 보드, 가속도 센서(MPU-6050), 블루투스(HC-06), 리튬-폴리머 배터리(충전보드는 옵션).
안드로이드 앱은 크게 4개 부분으로 구성되어 있습니다. 안드로이드 UI, 블루투스 매니저, 알고리즘 처리부, 백그라운드 서비스.
먼저 아두이노 보드에 전원을 넣고 RetroBand 앱과 블루투스 페어링 과정을 마치면 아두이노 보드에서 1초에 20회씩 가속도 센서값을 측정합니다. 그리고 1초에 한번씩 데이터를 모바일 폰으로 전송해줍니다. 가속도 센서는 측정시 X, Y, Z 축에 해당하는 값을 측정하므로 1초에 총 60개 (20회 x 3축)의 데이터를 모아서 전송합니다.
안드로이드 앱은 이 값을 받아서 2초 동안의 데이터를 누적한 다음 움직임이 갑자기 증가하는 구간을 찾아냅니다. 움직임이 증가하는 횟수가 걸음 수 입니다. 앱은 걸음 수와 체중을 바탕으로 칼로리를 계산하고 칼로리를 시간, 일, 월 별로 누적합니다.
.
2. 준비물
전 Ebay 를 통해 부품을 구입했습니다. 아래 부품 리스트입니다. 국내에도 카페에서 공동구매나 혹은 devicemart.co.kr 등 부품몰을 통해 구매하실 수 있으실겁니다. 비교적 많이 사용되는 모듈로 구성되어 그리 구하기 어렵지 않습니다.
- 아두이노 Pro mini 3.3v – Ebay link
- MPU-6050 가속도+자이로 센서 – Ebay link
- Bluetooth HC-06 – Ebay link
- USB to UART 변환모듈(FTDI) – Ebay link
.
2.1 밴드 HW 준비물
2.1.1 아두이노(Arduino)
아두이노 보드는 RetroWatch 때 사용했던 것과 같은 Arduino Pro Mini 3.3v (ATmega328) 입니다. 사이즈와 3.7v 리튬-폴리머 배터리와의 궁합때문에 이걸 선택했지만, 배터리와 사이즈를 크게 고려치 않으시거나 테스트 용이라면 Arduino Nano 보드도 좋습니다.(구현과 테스트가 좀 더 편합니다)
아두이노 Pro mini 보드는 USB 변화 칩이 없으므로 PC 연결 후 소스 업로드를 위해서는 별도의 변환 모듈이 필요합니다. FTDI 혹은 USB to UART(Serial) 변환 모듈이라 부르는데 이 모듈을 같이 준비해야 합니다.
하드웨어를 모두 제작하고 소스 업로드 후 테스트까지 끝난다면 더 이상 변환 모듈은 필요 없으니 제거하고 사용하시면 됩니다. 자세한 변환 모듈사용법은 링크를 참조하세요. [USB to UART 모듈 사용법]
그리고 아두이노 Pro mini 보드는 3.3v/5v 버전 두 가지가 있고, 각각은 ATmega128, ATmega328 칩셋 버전이 있습니다. 즉 총 4가지 버전이 있습니다만 우리가 필요한건 Pro mini 3.3v – ATmega328 입니다. 참고로 3.3v는 8MHz 속도로 동작하고 5v는 16MHz 로 동작합니다.(속도에 연연할 필요 없습니다. 어차피 우리가 할 작업은 8MHz로 충분합니다.)
결론은… Arduino Pro Mini 3.3v + USB to UART 모듈을 준비한다.
.
2.1.2 블루투스 모듈 (HC-06)
역시 RetroWatch 에서와 같은 블루투스 모듈로 일반적으로 많이 사용하는 HC-06 블루투스 슬레이브 모듈입니다. 메인 모듈, 또는 여기에 Interface base board 가 달린 것 두 가지로 판매하는데 인터페이스 보드가 없는 모듈이 사이즈가 작지만 굉장히 세밀한 납땜이 필요합니다. 납땜 초심자는 고생 좀 하실겁니다. 사이즈를 좀 희생하고 편리함을 얻으려면 인터페이스 보드가 달린 걸 쓰세요. 디지털 핀 두 개로 아두이노에 연결되며(일반적으로 2번, 3번) Software Serial 라이브러리를 통해 데이터를 주고 받을 수 있습니다.
size: 28mm x 15 mm x 2.35mm (35.7mm x 15.2mm with base board)
.
2.1.3 가속도 센서 (MPU-6050)
가속도 센서는 MPU-6050 센서를 사용했습니다. 가속도 뿐 아니라 자이로 센서, 온도 센서를 함께 탑재하고 있는 모듈이라 분에 넘치기는 하지만 쿼드콥터 및 자세제어가 필요한 DIY를 할 때 많이 쓰이는 일반적인 센서라 이걸 사용했습니다. 가속도 센서는 종류에 따라서 초당 측정 가능한 횟 수가(Hz) 틀립니다. 이 프로젝트에서는 초당 20회 (테스트 결과 이 정도 되어야 걸음 측정의 정확도가 어느정도 보장됩니다.) 를 측정하므로 이 기준에만 맞다면 다른 센서를 사용하셔도 됩니다. 다만 센서에 맞게 아두이노 스케치(소스코드)는 손봐야겠죠.
.
2.1.4 리튬-폴리머(Li-Po) Battery
LiPo 배터리 1셀 타입이 3.7v를 출력해줘서 아두이노 프로 미니 보드의 3.3v와 궁합도 좋고 무엇보다 다양한 사이즈와 용량을 지원해줍니다. 100mAh 이하의 배터리는 사이즈는 작지만 아두이노 보드에 공급할 전원이 좀 딸리는 듯 했습니다. 100mAh 이상을 권장하며, 배터리 보호회로가 장착된 제품이 더 안전합니다. 이베이 등을 뒤지시면 쿼드콥터 용으로 나온 배터리를 묶음으로 저렴하게 파는 경우가 있으니 참고하세요. 그리고 배터리 충전 모듈을 같이 조립하면 충전을 USB로 쉽게 할 수 있습니다. 배터리 충전 모듈은 [여기에] 보다 자세한 정보가 있습니다.
.
2.1.5 기타
납땜을 위한 인두기 및 연결선 등등을 추가로 준비합니다. 블루투스 모듈의 경우 워낙 납땜 부위가 작아서 쉽게 떨어질 수 있으므로 글루건으로 굳혀서 고정해 버리는 것도 좋습니다!! 능력이 되신다면 하드웨어 제작 후 3D 프린터를 활용해서 예쁜 케이스도 만들어보세요.
.
2.2 안드로이드 준비물
RetroBand 안드로이드 앱은 안드로이드 4.0 버전 이상을 지원합니다.
안드로이드 4.0 아래의 버전을 쓰시는 분, 아이폰 유저분들에게는.. 죄송합니다. iOS는 제가 능력이 안되서 제작을 못했습니다. iOS 버전을 만들어 주신다면 밴드 부품 무상 제공해 드리겠습니다.
3. 밴드 조립
배터리를 제외한 나머지 모듈들을 연결한 모습은 아래와 같습니다. 당장은 USB 변환 모듈이 전원을 공급해 주므로 배터리는 필요 없습니다.
3.1 아두이노 – 블루투스 모듈 연결
일반적인 아두이노와 블루투스 연결 및 테스트 방법은 [여기를] 참고하세요. 일단 링크의 내용을 참고하셔서 장치 이름이나 비번 등을 재설정 하시고 진행하셔도 되고.. 전 귀찮아서 그냥 기본 장치명과 비번을 그대로 사용 했습니다. 링크의 내용은 인터페이스 보드가 결합된 블루투스 모듈인데 연결 방법은 거의 유사합니다. VCC, GND, TXD, RXD 핀을 똑같이 연결해주면 됩니다. VCC -> 3.3V, GND -> GND, TX -> D2, RX -> D3. 블루투스 모듈은 다른 전도성 물체에 칩이나 안테나가 닿으면 수신이 잘 안되는 현상이 발생한다는 보고가 있으니 조심하세요.
인터페이스 보드가 없는 상태의 블루투스 모듈은 아래와 같이 굉장히 세밀한 납땜이 필요합니다. 납땜 후 정상동작이 확인되면 글루건 등으로 고정해주는 것이 좋습니다.
3.2 아두이노 – 가속도 센서(MPU-6050) 연결
가속도 센서 모듈은 I2C 인터페이스를 사용합니다. I2C 인터페이스에 대한 자세한 설명은 [여기를] 참고하세요. 굳이 I2C 인터페이스를 자세히 알 필요는 없습니다. 가속도 센서 모듈의 VCC(+), GND(-) 핀으로 전원을 공급받고 SCL, SDA 핀으로 데이터 통신을 한다는 점만 아시면 됩니다. 아래는 UNO 보드 기준으로 연결법이 나와 있지만 Pro mini 보드도 같은 핀에 연결해주면 됩니다. 가속도 센서 모듈(MPU-6050)에 대한 자세한 설명은 [여기를] 참고하세요.
3.3 아두이노 – USB to UART 모듈 연결
USB 시리얼 통신으로 소스코드 업로딩을 하기 위해 USB to UART 변환 모듈을 연결합니다. [여기서] 상세 내용을 확인하실 수 있습니다. 아래와 같이 연결하면 됩니다. 보통 RX-TX 를 엇갈리게 연결합니다.
USB to UART 모듈 | 아두이노 (Pro mini) |
3.3V | VCC |
TXD | RXD |
RXD | TXD |
GND | GND |
주의!! : USB to UART 모듈은 칩셋 종류나 제품에 따라 핀 연결 및 사용방법이 조금씩 틀립니다. 미리 확인하고 구매하는 것이 좋습니다.
3.4 아두이노 – 배터리 연결
배터리는 간단히 (+) -> RAW, (-) -> GND로 연결하면 전원이 공급 됩니다만 충전의 편리함을 위하여 Li-Po 충전 모듈을 사용할 수 있습니다. 이 경우는 배터리의 (+), (-)를 충전 모듈 B+, B-로 연결하고 충전 모듈의 out+, out- 를 아두이노 보드의 RAW, GND 핀으로 연결하면 됩니다. 자세한 내용과 주의사항은 [여기서] 확인하세요.
3.5 연결 확인
최종 연결이 끝나면 아래와 같은 모습이 됩니다. 아래에서 일단 배터리는 빼고 연결합니다. FTDI 모듈에서 전원을 공급받으므로 소스 업로드와 테스트가 끝날 때 까지는 배터리를 연결하지 않습니다. 모든 테스트가 끝나면 FTDI 모듈을 제거하고 배터리(혹은 LiPo 충전모듈)를 연결하면 됩니다.
4. 밴드용 아두이노 소스 업로드
밴드용 아두이노 Sketch(소스)는 GitHub에서 받으실 수 있습니다. 아래 링크를 이용하세요.
https://github.com/godstale/retroband
4.1 아두이노 소스 컴파일
밴드용 아두이노 소스를 컴파일하기 위해서는 아래 3개의 라이브러리가 필요합니다.
math.h / Wire.h / SoftwareSerial.h
math.h는 연산 관련 함수를 사용하기 위해서, Wire.h 는 가속도 센서 모듈과 I2C 통신을 하기 위해서, SoftwareSerial.h 는 블루투스 모듈과 Serial 통신하기 위해서 사용됩니다. 대부분 최신 아두이노 IDE(개발환경) 에서는 기본으로 가지고 있을겁니다.
아두이노 IDE에서 컴파일 버튼을 눌러보세요. OK 사인이 떨어지면 다음 단계로…
4.2 아두이노 소스 업로드
아두이노 소스 컴파일이 완료되면 아두이노에 업로드 해야합니다. 업로드 전에 보드 종류를 Arduino Pro Mini 3.3v (ATmega328) 로 선택하세요. 그리고 아두이노 Pro Mini 에서는 소스를 업로드 할 때 reset 버튼을 직접 눌러줘야 합니다. 이 과정이 실패할 경우 아래와 같은 메시지가 나올겁니다.
avrdude: stk500_getsync(): not in sync: resp=0×00
이런 메시지가 뜨는 이유는 다양하겠지만 주로 다음과 같은 원인으로 발생합니다.
- 아두이노 IDE에서 선택된 보드와 물리적으로 연결된 보드가 다른 경우
- TX, RX 핀 연결이 잘못되어 있는 경우
- 아두이노 보드의 시리얼 TX, RX 로 예약된 핀이 다른 용도로 사용되는 경우
- 타겟 보드의 부트로더에 이상이 있는 경우
- 오토리셋 기능이 지원되지 않는 USB 모듈을 사용할 때 사용자가 리셋을 적절히 하지 않는 경우
먼저 1번의 경우 아두이노 IDE에서 [도구 > 보드] 메뉴를 통해 적절한 보드를 선택함으로써 해결 가능. 2번의 경우 TX, RX 핀이 제대로 연결되었는지 확인합니다. 3번의 경우에 해당하는지 확인하고 D0, D1 핀 연결을 제거.
5번의 경우 사용자가 직접 리셋 버튼을 눌러줘야 합니다. 아두이노 IDE에서 업로드 버튼을 누르고 유심히 IDE 하단에 뜨는 메시지를 체크하세요. 컴파일.. 진행하다가 업로딩으로 넘어가는 순간이 있을 겁니다. 이 타이밍에 맞춰서 보드의 리셋 버튼을 눌러줘야 합니다. 그러면 USB 모듈의 TX/RX LED가 마구 깜빡거리면서 업로드가 정상적으로 진행될 겁니다.
드물게 4번의 문제가 있는 경우도 있다고 합니다. 이때는 정상적으로 업로딩이 가능한 아두이노 UNO 보드를 이용해 문제가 있는 보드의 부트로더를 구워줘야 합니다. 내용이 많고 여기서 자세히 설명할 주제는 아닌지라 링크로 대체합니다.
https://forum.sparkfun.com/viewtopic.php?f=32&t=27960
http://arduino.cc/en/Tutorial/ArduinoISP/
4.3 디버깅
모듈들이 정상적으로 연결되어 잘 동작하는지 확인하는 과정이 필요합니다.
먼저 가속도 센서 모듈이 정상적으로 동작하는지 보기 위해서 아두이노 IDE에서 [시리얼 모니터]를 실행합니다. (아두이노에 소스 업로드 후 보드에 LED가 정상적으로 빛나는 상태에서 실행) 아두이노 소스에는 아래와 같은 디버깅용 코드가 있으므로 정상적으로 연결이 되어 있다면 가속도 센서에서 읽어온 값을 출력해야 합니다. 이 값이 출력되지 않는다면 가속도 센서 모듈과의 연결에 문제가 있는 것입니다. (정상 동작한다면 아래 코드는 지우셔도 됩니다.)
// Print the raw acceleration values Serial.print(F("accel x,y,z: ")); Serial.print(accel_t_gyro.value.x_accel, DEC); Serial.print(F(", ")); Serial.print(accel_t_gyro.value.y_accel, DEC); Serial.print(F(", ")); Serial.print(accel_t_gyro.value.z_accel, DEC); Serial.print(F(", at ")); Serial.print(iAccelIndex); Serial.println(F(""));
이제 블루투스를 체크해야 합니다. 블루투스는 전원 VCC, GND 핀만 정확히 연결되어 있어도 폰에서 블루투스 기기를 스캔할 때 검색이 됩니다. HC-06 블루투스 모듈이 보이지 않는다면 전원 핀 연결을 확인하세요. 여기까지 완료되었다면 이제 안드로이드 앱을 준비할 차례입니다.
# 참고 : 블루투스 기기는 보이지만 RetroBand 안드로이드 앱에서 정상적으로 연결 된 후 데이터를 받지 못한다면 TX, RX 핀 연결에 문제가 있는겁니다. 데이터가 제대로 아두이노에서 블루투스로 전달되지 못하는 경우입니다.
5. 안드로이드 앱 설치 및 동작 확인
안드로이드 소스 컴파일 및 수정 방법은 여기서 다루기에는 방대한 양이므로 넘어갑니다. 하지만 RetroBand Android 앱 소스 전체는 GitHub 에서 자유롭게 받으실 수 있고 수정, 배포도 자유롭습니다. 단지 소스에 포함된 LICENSE 단락만 유지해 주시면 됩니다. 아래 GitHub 페에지에서 받은 소스에서 [RetroBand_Android\RetroBand] 폴더를 보시면 됩니다.
https://github.com/godstale/retroband
마켓에도 앱을 등록했으므로 폰에서 직접 설치하셔도 됩니다. (RetroBand 로 검색)
안드로이드 v4.0 이상 : https://play.google.com/store/apps/details?id=com.hardcopy.retroband
이제 앱을 실행하고 RetroBand와 연결해서 데이터가 제대로 수신되는지 확인하세요. 앱은 3개의 탭 메뉴로 구성되어 있습니다.
- Timeline : 시간별로 누적된 칼로리 소모량을 집계합니다. 월/일/시간 별로 확인할 수 있습니다.
- Graph : 매 초 마다 실시간으로 들어오는 가속도 값을 그래프로 그려줍니다. XYZ 축 별로 값이 어떻게 변화하는지 확인 할 수 있습니다.
- Settings : 앱 동작에 대한 설정을 변경할 수 있습니다. 여기서 본인의 체중을 입력할 수 있습니다. 추후 몇 몇 기능이 업데이트 될 예정입니다.
여기까지 테스트가 모두 완료되고 정상 동작하면 밴드에 LiPo 배터리를 연결하고 마무리 작업을 하시면 됩니다.
RetroBand 최종 스펙:
- 프로세서 : ATmega328 – 3.3v (8MHz)
- 32KB Flash (2KB is shared for Bootloader), 2KB RAM, 1KB EEPROM
- 안드로이드 전용 앱과 연결 (v4.0 이상 지원)
- 걸음 수 측정을 통해 칼로리 계산
- 측정된 칼로리를 누적해서 월/일/시간 별 통계 제공
- 실시간 가속도 센서 변화량 그래프 제공 (X, Y, Z축)
- Open source
아래는 아두이노+가속도센서+블루투스모듈+충전모듈+LiPo배터리+on/off 스위치를 조합해서 만든 프로토타입입니다. 글루건으로 떡칠을 해서 보기에는 좀 그래도 동작은 잘 하는군요.
6. 패키징
3D 프린터 사용이 가능한 환경이라면 직접 3D 프린터로 케이스를 만들어보세요.
배터리 충전 모듈까지 포함한 프로토타입과 케이스. 테스트용.
배터리 충전 모듈을 제외한 나머지를 밴드 형태로 만든 모습.
실습 교육용으로 제작한 PCB에 모듈을 결합한 형태와 케이스.
7. 프로젝트 후기
스마트 워치 만들기(RetroWatch)에 이어 RetroBand 프로젝트도 마무리가 되었네요. 비록 상업용 Activity Tracker 기기들에 비하면 무척 단순하지만 블루투스와 가속도 센서는 다양한 프로젝트에 활용할 수 있는 기본 모듈들이라 여기에 사용된 소스를 활용하시면 다양한 작품들을 만드실 수 있을겁니다.
Maker 분들에게는 아직 척박한 국내 환경이라 힘드시겠지만, 아무쪼록 이런 노력이 조금이나마 도움이 되었으면 합니다. 그리고 이 프로젝트와 관련 내용을 비전공자도 보다 쉽게 접근하실 수 있도록 전용 보드 제작과 웨어러블 DIY 워크샵(스마트 밴드)을 계획하고 있습니다. 무작정 시작할 수가 없어 아래 링크에서 일단 수요 조사를 하고자 합니다. 관심 있으신 분들께서는 아래 링크로 가셔서 댓글로 참여 부탁드립니다.
웨어러블 전용 보드 제작, 구매 : http://cafe.naver.com/hardcopyworld/110
웨어러블 DIY 워크샵 : http://cafe.naver.com/hardcopyworld/109
그 동안 여러모로 도와준 지인들께 감사드립니다. 잠시 쉬면서 코드와 문서를 정리하고 다른 재밌는 프로젝트로 다시 인사 드리겠습니다.
2014. 08. 01. GodsTale (godstale@hotmail.com)
아두이노, 안드로이드 소스 다운로드 : https://github.com/godstale/retroband
RetroBand 안드로이드 앱 다운로드 : https://play.google.com/store/apps/details?id=com.hardcopy.retroband
홈페이지 : HardCopyWorld
커뮤니티 : HardCopyWorld naver cafe (RetroBand 보드 제작과 워크샵 진행을 위한 설문이 진행중입니다.)