Table Of Contents

Introduction

모바일 앱을 테스트하고 버그를 찾는 것은 어렵습니다. 모바일 환경 특성상 변수가 많고, 폐쇄적이기 때문입니다. 물론, 각 제조사들은 테스트를 위한 다양하고도 적극적으로 디버깅을 위한 도구와 API를 제공하고 있습니다. 또, 이를 더 쉽게 활용가능하게 해주는 appium과 같은 자동화 framework의 개발과 활용도 활발히 진행중입니다.

그러나 이러한 UI 자동화 테스트에는 한계가 있습니다. 우선 보안과 저작권 침해와 같은 시스템의 악용과 같은 다양한 이유로 모든 제어 방식에 대해서 API가 제공되는 것은 아닙니다. 여러 앱을 오가거나, 개발용앱과 상용앱을 오가는 경우를 생각해 볼 수 있습니다. 3rd party library/service를 사용하는 경우나 새로운 주변기기를 개발하는 경우에도 API를 이용한 테스트는 어렵습니다. 또, 각종 보안모듈은 API를 오동작하게 만들거나, 동작이 불가능하도록 설계되어 있습니다.

개발자 입장에서 가장 답답한 경우는 테스트가 성능과 동작에 영향을 주는 경우입니다. 모바일 기기 특성상 리소스는 한정적입니다. 리소스가 debuging에 할당되면서 기존과 또 다른 문제가 발생하거나, 혹은 버그 재현이 불가능해지곤 합니다. 사실 저가형 기기의 경우 제조사의 지원도 받기 어렵기 때문에, 더 어렵습니다.

사람이 직접 테스트를 반복적으로 하는 것 외에 이 모든 것의 가장 효율적인 대안은 로봇을 사용하는 것입니다. 또, 이러한 일을 해 줄 로봇이나 각종 장비도 충분히 개발되어 있습니다. 다만, 그러한 정교한 작업을 할 로봇이나 장비가 수백에서 수천만원정도로 비쌉니다. 그래서 이 글에서는 FDM 방식의 3d 프린터를 이용해서 저비용으로 물리적 자동화를 할 방법에 대해서 이야기 합니다.

Background

3D프린터 / plotter

3D프린터에는 다양한 방식이 존재합니다. 다른 방식의 프린터도 활용할 수 있겠지만, 현재 가장 저렴하고 활용이 쉬운 방식은 FDM방식입니다. FDM방식의 3d프린터는 주로 필라민트형태로 된 플라스틱을 녹인 다음 이를 이용해서 일정하게 쌓아 삼차원 물체를 출력합니다. 이와 관련된 이야기는 꽤 긴이야기이기 때문에 여기서는 이야기 하지 않습니다.

FDM 방식의 3d프린터는 결국 노즐의 위치를 정할 3개의 축을 제어하는 모터와 필라멘트를 밀어내는 모터까지 총 모터 4개를 제어하는 것으로 구현됩니다. 슬라이서라고 불리는 프로그램들이 모터들을 어떻게 제어할 것인지 명령어를 순서대로 정리하여 기록하고, 3d프린터는 이렇게 작성된 명령어 목록을 받아 실행합니다. 즉, 이 명령어를 잘 작성하면 3d프린터의 모터들을 원하는대로 제어할 수 있습니다. 이러한 명령어는 보통 g-code라는 형식으로 기록됩니다.

G-code

G-code는 원래 CNC머신 / 컴퓨터를 이용한 공작기계를 위해 개발되었고 FDM 3d printer에서도 차용되어 사용됩니다. 기초적인 표준은 있지만, 명확한 표준은 없어, 각 기기별로 업체별로 펌웨어 별로 조금씩 다른 코드를 사용합니다. 3d프린터 업계에서 사실상 표준이라고 볼 수 있는 언어는 marlin firmware의 g-code입니다. Marlin firmware의 g-code는 [https://marlinfw.org/meta/gcode/] 기술되어 있습니다. 많은 코드가 정의 되어 있으나, 기초적인 2~4개 정도만으로도 필요한 기능을 구현할 수 있습니다.

G28 - Auto Home

G28은 원점을 맞추는데 사용됩니다. 작업을 시작하기 전 위치초기화를 위해 실행합니다.

G28 X Y Z

G0 - Linear move

G0 은 head를 직선으로 움직입니다.

G0 F300 X20 Y20 Z20

다음의 코드는 특정 위치로 움직여 Z축방향으로 내려갔다가 다시 올라오는 코드 입니다. 즉, touch를 다음과 같은 코드 3줄로 구현할 수 있습니다.

G0 F300 X20 Y20 Z20
G0 F300 X20 Y20 Z0
G0 F300 X20 Y20 Z20

G4 - Dwell

사실 G28, G0 두개의 코드면 모든 작업을 할 수 있지만, Marlin Firmware의 경우 출력물의 보정등을 위해서 연속적인 이동 코드에 대해서 내부적으로 쌓아두고 처리 합니다. Dwell을 이용해서 이러한 명령어 누적을 피할 수 있습니다.

G4 P0

M18, M84 - Disable steppers

스텝 모터의 동작을 종료해서 자유롭게 움직이게 합니다. 여러 테스트 기기를 사용할거나 테스트가 끝났을때 적용해두면 유용합니다.

M84 X Y

터치 디스플레이

터치스크린은 감압식과 정전식 디스플레이로 나뉩니다. 최근 출시되는 스마트폰의 대부분은 정전식 디스플레이 입니다. 특히, 멀티 터치구현을 위해서 상호정전방식이 사용됩니다. 단순히 압력을 주는 것으로 입력이 되는 감압식과는 달리 정전식 디스플레이에 기계를 통해 입력을 주기 위해서는 약간의 관련지식이 더 필요합니다. 이 역시 자세한 내용은 매우 긴 내용입니다.

정전식 디스플레이는 손가락을 터치했을때 생기는 전기적 변화를 인식합니다. 우리가 직접 손을 대고 있을 수는 없기 때문에, 로봇으로 어떻게 전기적인 변화를 어떻게 만들지 고민이 필요합니다. 다행히도 터치부가 도체로 되어 있는 정전식 터치스크린을 지원하는 스타일러스펜은 구하기가 쉽습니다. 스타일러스펜 만으로도 인식 되는 경우도 많지만, 용량이 작기 때문에, 빠른 입력이 들어가는 경우, 불안정하게 인식됩니다. 별도의 전선을 이용하여 접지 혹은 다른 물체에 연결하는 것으로 펜을 안정적으로 인식 시킬 수 있습니다.

3D 프린터를 이용한 테스트

준비

준비물

  • 3d 프린터
  • USB 케이블
  • 스타일러스 펜
  • Optional
    • Raspberry Pi (3세대 이상)
    • 3d 프린터용 필라멘트 (거치대 출력시)
    • 전선

펜 부착하기

펜을 부착할때는 적당히 테이프와 같은 것으로 프린터 헤드에 고정해도 됩니다. 좀 더 안정적인 부착을 위해서는 3d printer를 plotter로 사용할때 사용하는 각종 3d 모델을 사용할 수 있습니다. 가지고 있는 3d 프린터 모델 + plotter와 같은 키워드로 검색하시면 금방 찾을 수 있습니다. 부착방법과 관련없이 전선등을 이용해 접지 하는 것을 추천드립니다.

USB의 연결

대부분의 3d 프린터는 serial 연결을 가지며, 이를 통해서 g-code를 전달하는 기능이 있습니다. 더불어 Serial(TTL) to usb도 내장하고 있는 경우가 많습니다. 관련 정보가 부족한 경우 slicer 프로그램 연결 등으로 찾아보면 관련 정보를 찾을 수 있습니다. Serial to USB와 익숙하지 않은 분들은 Ardiuno와 관련된 정보들을 찾아보면 도움이 될 것입니다.

예시

다음은 스도쿠 앱에서 답을 얻고 푸는 예시 입니다.

https://github.com/gofeel/sudoku_robot

닫는 글

어찌보면 실물 로봇을 테스트에 이용하는 것은 일반적인 접근법에 비해서는 과합니다. 하지만 몇몇 경우에는 더 안정적이거나 유일한 테스트 방법이 되기도 합니다.

3D프린터를 이용한 테스트의 가장 큰 장점은 범용성 있는 기기를 별도의 개조없이 사용한다는 점입니다. 중고로 구매하고 되파는 경우 비용을 0원까지도 줄일 수 있습니다.

이 레시피가 필요한 사례는 많지만, 직접 실천에 옮길 사람은 솔직히 거의 없을 것 같습니다. 유사 서비스를 cloud로 제공하는 업체도 있다는 점을 알려드립니다. 또, 물리적인 제어가 앱을 테스트하는 하나의 좋은 방법이 될 수 있음만 기억해주시면 좋을 것 같습니다. :)