Post

손목시계 개발 일기

손목시계의 3단 변화가 아니라..어쨌든..N단 변화
손목시계 개발 일기

손목시계 개발기

처음 시작하기도 했고 꽤 의미가 큰 프로젝트이다. 코딩을 시작하면서 개발하고 완성하고 끝이 아니라 사용하면서 피드백을 주어 개선점을 찾아가 고민하고 있는 손목시계 개발기에 대해 끄적하려고 한다.

어쩌면 지금 생각해보면 오랜 시간 만든 프로젝트를 사용해보면서 개선점을 찾아 주기적으로 유지보수했던 첫 프로젝트가 아닐까 싶다. 그래서 더 의미있고 더 뜻깊은 프로젝트였다.

시작은 어릴 때 봤던 만화영화 주인공이 차고 있던 손목시계에서 시작했다. 항상 붙어있고 가볍게 만질 수 있는 물건을 DIY (Do It Yourself)하는 정신이 있어 그 나이 때에 손목시계를 사서 분해하기도 헀고 손목시계에 손에 보이는 요상한 것을 테이프로 붙이기도 했다. 예를 들어 MP3라던가..

그 이후로 20살이 지나 아두이노라는 기판을 알게되면서 유년 시절 품었던 상상의 날개짓이 시작되었다.

학부생 때 대회에 나가면서 간단한 하드웨어를 직접 만들게 되었다. 이 당시는 개발을 쉽게 할 수 있도록 만들어진 기성 보드가 많아 임베디드를 어렵지 않게 배우고 흥미를 가질 수 있었다.

하드웨어를 만들 수 있고 거기에 프로그래밍을 얹어서 생각한 대로 무엇인가 동작하는 것을 본 것은 너무 큰 즐거움을 주었다.

후에 뭔가를 더 만들어보고 싶기도 하고 예전부터 만들어보고 싶었던 시계를 만들어보고자 시작해보았다.

오픈소스 손목시계

우연한 기회로 하드웨어 DIY 손목시계 키트를 볼 수 있었고 해당 하드웨어를 만들고 소프트웨어 코드가 오픈소스로 이뤄져있다는 걸 알았다.

추가하고 싶은 하드웨어 기능들과 더 만들고 싶은 기능들을 구성해보았다.

전원 방식 교체

관심 있는 분야에서 접근하기 쉬운 부분으로 맨 처음 시도한 것은 하드웨어에서 전원 방식을 교체하는 것이다. 프로그래밍을 자주 하고 테스트하는 환경이니까 동전 건전지가 비교적 빨리 소모되었다. Micro 5 pin을 사용하는 충전 모듈로 충전식으로 전원 방식을 바꿨다.

충전이 가능한 3.7V 소형 리튬배터리

맞는 크기에 배터리를 구하여 동전 전지 소켓을 제거하고서 배터리를 연결하였다. 전압은 3.7V 250mah를 사용하였다.

동전 건전지 대신 리튬배터리 연결

충전 모듈 없이 배터리만 연결한 모습이다.

체결 완료한 모습

충전 모듈을 장착 후 그때그때 충전하여 사용에 불편함이 없도록 구상하였다.

배터리 교체

수명이 다할 경우 배터리를 교체해주면 된다.

레이저와 손전등 기능

손전등 기능도 구현하고 레이저도 구현하고 알람기능부터 간단한 업다운 게임과 숫자야구까지 구현하면서 하고 싶었던 아이디어들과 구현하고 싶었던 기능 등 구현하였다. 여러가지 기능을 구현할 때 어려움보다 아이디어를 현실화할 수 있다는 점이 매력적으로 다가와 더 즐기면서 개발할 수 있었다.

LED 장착

LED 모듈을 장착한 모습

Release-Type(Right)과 Proto-Type(Left)

추가된 하드웨어 기능은 아래에서 확인할 수 있다.

한계점

BLE 모듈 장착

여러 기능을 넣다보니 디바이스 하나로만 무언가를 구현하기에는 넘을 수 없는 벽이 있었다. GPS모듈과 블루투스 모듈을 사용하여 스마트폰과 연동하려 했으나 이전보다 더 많은 전류를 소모하는 문제에 부딪혔다. 또 7-Segment 디스플레이를 사용하는 것으로 사용자가 기능의 이해를 하는데 어려움이 있는 걸 발견하여 이부분을 해결하고자 초점을 맞췄다.

Raspberry Pi Watch

SNS에 만든 작품을 올리다보니 여러 사람들이 관심을 가져주었다. 그러다 많은 사람들이 다른 기성품에 관련해서 링크를 보내주면서 관심을 가졌다. 새로운 기성 모델을 찾아서 가지고 있는 코드 기반으로 프로그래밍을 시작하였다.

라즈베리파이를 사용하여 손목시계를 구현하려고 시도했었으나 강한 성능에 비해 작은 전원을 써서 구동 시간이 안나와 개발하기에 어려웠다. 다시 기회가 되면 문제를 해결하고 싶다.

Raspberry Pi Zero W 로 만든 시계

GUI 그리기

디자인과 하드웨어 그리고 추후 바라보는 기능들을 고려할 때 선택한 기성품을 찾았으나 기성품에 내장된 모듈을 사용해서 구현된 코드는 존재하지 않았고 비슷한 코드가 있어서 짜집기를 시도하거나 여러 소스를 참고하여도 원하는 결과를 도출하기까지 한계가 있었다. 결국엔 IDE를 닫고 A4 종이와 펜을 들고 손코딩으로 시작하여 처음으로 머릿속에 순서도와 알고리즘을 그려나가며 바닥부터 알고리즘을 설계했다.

손코딩 뇌컴파일 눈디버깅이라는 말이 있다. 프로그래밍을 하다보면 컴파일 하기가 귀찮은 경우가 있다. 여러가지를 세팅하고 그에 오는 버그가 두려운 마음에 그냥 머릿속으로 컴파일 하는 경우가 많은데 결국엔 버그를 잡아야 하는 건 마찬가지이다. 어떻게 보면 안 좋은 습관인데 여기서 장점으로 잦은 코드리뷰 습관을 들이다보니 손코딩이 좀 더 편하게 다가오고 코드리뷰하는 것이 재밌게 느껴졌다.

보통 코딩을 하면 검색해서 필요한 코드를 가져온다. 검색 방법에 따라 검색 히스토리에 따라 검색 결과가 많이 갈리는데 한동안 필요한 코드를 검색하여 찾는데 도저히 나오지 않았다. 비슷한 모듈이나 비슷한 통신방식을 사용한 라이브러리는 많아 이들을 이용하려고 했지만 내부적으로 레지스터를 건드리면서 설계한 부분이라 갈등이 심했다.

타인의 코드를 쓰지 않고 펜과 종이를 들어 원하는 기능을 그림으로 구현하고자 마음 먹었고 이내 알고리즘을 설계해나갔다.

글로 알고리즘 구현해보기

하드웨어 제한 사항을 극복하기

추가 기능

Raspberry Pi 시계 만들기

이전에 Raspberry Pi에서 구현한 휴대용 NAS를 손목시계에 결합하고 싶은 마음이 언제부터인가 생겼다. 전원 장치와, 무게, 크기 등을 고려했을 때 너무 뜬구름 잡는 생각인거 같아 아이디어랑 기록으로만 남겨두려고 한다.

하드웨어 교체

디바이스로는 충분하나 만족하지 못하는 부분이 있었다. 메인 보드를 새로 뽑지 않는 이상 기능의 확장은 한계가 있었고 이미 목적에 맞게 뽑힌 보드라 하드웨어적인 추가도 한계가 있엇다. 이때 가장 간단한 하드웨어 추가로 폭 넓은 기능의 확장의 수단이 있었으니 그것은 블루투스 연동이었다. 어느 문서에 따르면 단일 디바이스로 사용하는 것 보다 스마트폰과 연동하여 사용할시 그 기능은 수십배로 확장한다고 한다. 배터리가 이전보다 용량이 비교적 증가하여 이전 디바이스에서 해결하지 못한 블루투스 모듈을 이식하여 기능을 확장하는 것을 다시 시도하였다.

BLE 추가

이전 손목시계에서 손전등이나 레이저를 장착하면서 같이 블루투스 모듈도 장착을 하였다. 그러나 짧은 구동시간과 유연하지 않는 기능 구현은 해결해야 하는 과제로 남았다. 블루투스를 장착한 가장 대표적인 이유는 당연히 스마트폰과 연동을 하기 위함이다. 기성품인 스마트워치에 기능을 구현해보고자 도전했다.

BLE 포기 못하지

이전에 해결하지 못한 블루투스 문제를 새로운 디바이스에서 해결할 수 있었다. 배터리도 기존보다 용량이 크고 필요할 때마다 Wake-Up을 제어할 수 있는 점에서 많은 도움이 되었다.

App 구현

손목시계를 공부하면서 여러 자료를 찾다가 웨어러블과 어플리케이션의 연동에 대해 고민을 갖게 된 일이 있다.

개발할 때 알아본 방법으로는 단순하게 디바이스만 구현하거나 스마트폰과 연동하여 앱을 구현하는 방법이 있었다. 디바이스만 구현하게 된다면 디바이스 단독으로 기능들을 구사할 수 있지만 한계가 있었다. 반면에 스마트폰과 연동하면 그 기능이 확장되어 다양한 퍼포먼스를 발휘할 수 있었다.

마침 얼마 전 부터 머릿 속에 갖고 있던 기술공부가 안드로이드 공부였다. 아무것도 모르던 고등학교 1학년 때 구글 스토어를 막연하게 구경하다가 어느 한 커플의 100일을 기록한 앱을 보았다. 여기서 감명을 받아 나만의 기억을 남기는 커스텀 할 수 있는 앱을 만들 수 있다는 부분이 인상적이게 다가왔다.

하고자 하는 구현이 가능한지 더불어 도움되는 내용을 찾기 위해 학술지에서 관련 논문을 찾던 도중 많은 이들이 저마다 비슷한 아이디어를 기반으로 구현한 것을 확인하였고 무엇보다 시중에 나와있는 기성제품인 스마트워치에서 그 가능성을 의심하지 않고 볼 수 있었다. 이를 기반으로 디자인하고 이전에 개발된 코드들을 수집해나갔다. 막상 생각과 다르게 기능 구현을 위해 첫 앱을 만들었는데 디자인부터 최악이었다.

App 개발 입문

프로토콜 이슈 잡기

손목시계와 스마트폰을 블루투스로 연동하는 가장 주요 모듈로는 블루투스 모듈이 가장 중요하다. 이때 블루투스 4.0 BLE를 사용하는데 서로 연동이 되지 않는 문제에 부딪혔다. 주변에 관련 프로젝트를 하는 지인들도 개발할 때 같은 이슈로 연동하지 못해서 어려움을 겪었다고 한다.

왜 안될까? , 어디서 문제일까?

문제의 원인을 파악하고자 하나씩 고려할 수 있는 문제들을 나열하고 하나씩 지워가며 답을 찾아갔다. 답은 가장 가까운 곳에서 찾을 수 있었다.
비슷한 기능을 런칭한 개발자에게 자문을 구한 결과 위치 권한과 SDK 버전 업데이트를 신경써야 한다는 답변을 받았다.

메신저 알림

블루투스를 이용하여 스마트폰에서 알림을 받으면 디바이스로 알려주는 알람 역할입니다.

내 폰 찾기

디바이스 연동

스마트폰에서 디바이스를 찾는 것과 디바이스에서 스마트폰을 찾을 수 있게 기능을 구현하고 있다.

정리하며

어느 책에 따르면 프로그래머는 아이디어를 스스로 구현할 수 있는 점에서 생명을 탄생시키는 힘이라고 표현한다.
이에 동의하여 개발하면서 더 추가하고 싶은 기능과 개선하는 기능들을 넣어 기능 확장에 초점을 가했다.

스마트워치 기능을 구현해보고 싶었다. 개발자의 특권 중 하나는 손 끝에서 머릿속의 그림을 그릴 수 있다는 것이다. 시중에 나와있는 제품들과 비슷한 기능을 만들 수 있고 ProtoType으로 원하는 기능을 접목할 수 있다는 점에서 강점이 된다.

Exposure therapy - 스스로를 궁지에 몰아 넣다

심리학에 보면 노출치료라는 용어가 있다. 위험의 요소라고 느끼는 환경이나 궁지로 몰아 어떠한 피해 없이 문제의 근원을 치료하는 방법인데 이러한 방법을 다른 의미로 개발하면서 사용하고 있었다.

초기에는 워터풀 방식으로 개발을 하였다. 물론 단계가 매우 길었고 스스로 피드백 반영이 자유로웠지만 진행 단계가 진전이 없었다. 후에 애자일 프로세스로 개발을 진행하며 단계마다 피드백을 반영하였다. 기능 하나 하나를 구현할 때 스스로 피드백을 받고 오류를 정정하고 추후 구현할 기능에 반영하고 하나의 프로세스가 돌아갈 때 전력을 쏟아 구현하고자 했다.

팀으로 움직이지 않고 현재 혼자 진행하면서 난이도 있는 프로세스에 도전해보기도 하고 기능 보강 및 자동화 등 여러 환경에 노출시켜 한계를 극복하고 문제 해결 능력에 넓은 안목을 가질 수 있었다.

전공 수업 시간에 듣길 애자일 프로세스를 제대로 진행하면 살아남는 개발자가 없어 버티기 어렵다한다. 개인이 혼자 진행해서 그런지 숨 쉴 여유가 많았는데 팀으로 움직일 때는 얘기가 조금은 다를 거 같다.

OledWatch 프로젝트를 기반으로 SNS에서 좋은 기회를 얻어 오픈소스 프로젝트에 합류해 활동하게 되었다. 협업 방법이나 Git을 자주 사용하여 사용법을 더 깊게 공부할 수 있는 기회의 장이었다.

This post is licensed under CC BY 4.0 by the author.
If you find any errors, please let me know by comment or email. Thank you.

© Ruffalo. Some rights reserved.

I'm

Using the Chirpy theme for Jekyll.