본문 바로가기
Hardware/3D Printing

3D프린터 타임랩스 촬영하기 - M240 코드로 스마트폰 카메라 트리거링

by lovey25 2020. 9. 15.

3D 프린팅을 좋아하시는 분들이라면 공감하실 수 있을 텐데요. 3D 프린터를 사용해서 만들어낸 결과물보다는 그걸 만들어 내는 과정 자체가 신기하고 재미있어서 필요는 없지만 그냥 뽑아보는 그런 경우도 종종 있습니다.

그러다 보니 그 순간으로 없어져버리는 출력 과정을 기록으로 남기고 싶다는 생각을 하게 되었습니다. 하지만 그렇다고 무작정 동영상으로 찍어놓기에는 너무 무모한 것 같습니다. 그래서 타임랩스 영상을 만들 수 있는 방법을 고민하기 시작했고 그 첫 번째 타임랩스 만들기 위한 방법을 공유합니다.

먼저 처음으로 만들어본 타입랩스 결과부터 먼저 보고 시작하시죠. ^^

타입랩스 영상을 만들기 가장 쉬운 방법은 3D 프린터 옆에 핸드폰을 고정하고 타임랩스를 찍어주는 앱을 깔아서 출력하는 동안 촬영을 하는 방법이 있겠죠. 하지만 이런 방법으로는 프린터기 헤드가 왔다 갔다 하는 동안 무작위 위치에서 사진이 찍히게 됩니다. 저는 주로 모델의 크기가 작은 몇 시간 이내의 출력만 주로 하기 때문에 이런 경우 카메라 앵글을 프린터 헤드가 거의 가려버리는 경우가 많고 그리고 헤드를 피해서 카메라 위치를 잡으면 모델의 옆통수만 찍게 되는 그런 아쉬움이 있었습니다. 그래서 제가 추구하는 타입랩스는 일정 출력이 진행되고 나면 사진을 찍을 수 있도록 프린터 헤드가 잠시 옆으로 비켜주고 그 사이에 사진이 찍혀서 마치 출력물이 자라나는듯한 그런 영상을 만들고 싶었습니다.

출력 시퀀스와 카메라를 동기화 하기 위해서 자료를 찾다가 Marlin에서 지원하는 gcode M240의 존재를 알게 되었습니다.

 

Trigger Camera

Trigger a camera shutter using a digital pin or by bumping a physical switch.

marlinfw.org

Marlin 홈페이지 설명을 보면 M240은 여분의 디지털 핀을 카메라 셔터를 동작시키는 신호를 내보내는 데 사용하거나 카메라 셔터를 물리적으로 누르게 하는 동작을 하도록 해서 사진을 촬영의 트리거를 실행시키는 gcode입니다. 

Marlin에서 M240 코드를 활성화

Marlin 2.0 기준으로 M240은 기본적으로 사용하지 않도록 되어 있는데요. 활성화하는 방법은 간단합니다. Marlin 설정 파일 중 추가적인 기능들을 담당하고 있는 파일인 "Configuration_adv.h"에서 "M240"을 검색해보면 아래와 같은 코드를 찾을 수 있습니다.

Configuration_adv.h에서 M240 관련 부분 활성화

여기서 2607행을 주석 해제해줍니다. 이렇게 하면 M240코드가 펌웨어에서 활성화가 됩니다. 그리고 추가적으로 카메라 트리거링 방식을 선택해야 하는데요. 저는 디지털 핀으로 시그널을 내보내는 방식을 사용할 예정이니 2620, 2626 행도 마찬가지로 주석을 풀어줍니다.

CHDK_PIN은 시그널이 발생할 핀 번호를 의미하는데 기본적으로 4번으로 되어 있네요. 그리고 PHOTO_SWITCH_MS는 시그널을 발생시킬 때 얼마나 오랫동안 유지하게 할 것인지 디폴트 시간 값을 ms단위로 지정하는 부분인데 필수적으로 같이 정의되어야 하기 때문에 같이 주석을 풀었습니다. 그리고 50ms이 기본으로 되어있는데 처음엔 어느 정도가 적당한지 몰라서 수정하지 않았고요 이 시간은 나중에 M240 코드를 사용할 때 D옵션을 추가해서 변경할 수 있기 때문에 크게 신경 쓰지 않았습니다.

그럼 4번 핀을 사용해도 문제가 없는지 보드를 확인해 봅니다. 저는 ATMEGA2560 기반의 Trigorilla  보드를 사용하고 있는데요. 다행히 4번 핀은 사용하지 않고 있고 보드에도 핀이 노출되어 있었습니다. 친절하게도 스위치 전원용 5V, GND 단자도 같이 구성이 되어 있네요. 사용이 가능해 보이니 일단 수정한 펌웨어로 다시 업로드합니다. 그리고 D4단자도 사용하기 쉽게 헤더 핀을 달아주겠습니다.

D4 단자에 헤더핀 설치

자 그럼 3D프린터기는 준비가 끝났는데 M240코드가 잘 동작하는지 확인해 보겠습니다. 

프린터기를 켜도 M240 코드를 입력해서 HIGH 시그널인 5V 전압이 D4핀에 걸리는지 테스터기로 확인해 봤습니다. "M240D2000" 코드는 카메라 트리거 신호를 2초 동안 발생하라는 명령어입니다. 테스터기에서 쉽게 확인할 수 있게 충분한 시간으로 테스트해 봤는데요. 신호가 잘 나오고 있네요. ^^

핸드폰 카메라용 릴리즈 만들기

프린터기 부분은 준비가 끝났으니 이제 카메라 부분을 준비해보죠. 처음에는 디지털카메라를 이용해서 사진을 찍으려고 생각을 했었는데 제가 가지고 있는 디지털 카메라 중에는 외부 릴리즈를 연결할 수 있는 모델이 없기 때문에 집안에 굴러다니는 오래된 핸드폰을 사용하기로 결정했습니다. 왜냐하면 핸드폰 카메라는 이어폰을 연결했을 때 볼륨 버튼을 누르면 사진을 찍어주는 기능이 있죠?! 이 부분을 이용하면 핸드폰 카메라용 릴리즈를 만들 수 있겠다는 생각을 했거든요.

얼마 전 포스팅한 내용인데 이어폰의 볼륨 버튼이 동작하는 원리(kwonkyo.tistory.com/386)도 알았겠다 앞서 M240 코드로 신호가 발생하면 이걸 이용해서 어떤 식으로든 핸드폰 카메라 트리거링이 가능할 것 같았습니다.

기본 개념은 이렇습니다. 약 350~730Ω의 저항으로 이어폰 단자의 GND-Mic. 를 쇼트해주면 핸드폰은 볼륨 낮추기로 인식을 하기 때문에 이때 카메라가 켜져 있으면 사진 찍기가 가능하죠. 그래서 4극 3.5파이 케이블을 준비해서 적당한 저항을 연결하고 중간에 TR이나 릴레이를 달아서 프린터에서 나오는 신호에 따라 GND, Mic. 가 연결되도록 구성하기만 하면 될 것 같네요.

일단 4극 이어폰 단자가 필요합니다. 역시 굴러다니는 안 쓰는 이어폰을 끄집어 왔습니다.

오래된 LG폰의 번들 이어폰인 것 같은데 가지고 있으니 사용할 데가 있네요.

리모컨 부분을 열어보니 내부는 이렇게 생겼네요. 

중요한 GND단자와 Mic. 단자가 어떻게 구성되어 있나 봤더니 위 그림처럼 연결되어 있습니다. 혹시나 써먹을 수 있는 뭔가가 있을까 확인해 봤는데 부품들도 너무 작고 머리 아파서 그냥 버리기로 했습니다.

과감하게 잘라버립니다. 

잘라서 외부 피복을 벗겨보면 이런 선들이 나오는데 케이블 외부를 둘러싸고 있는 금색 선을 모아서 정리해보면 이렇게 4개의 선으로 구분되네요. 여기서 제가 필요한 건 금색과 검은색입니다. 앞에서 구상한 대로 이 2 선에 저항을 달고 스위치를 연결하기 편하게 헤더 핀을 달았습니다.

저항값은 제가 가지고 있는 저항 종류가 다양하지 않아서 대충 1kΩ 2개를 병렬로 연결해서 500Ω으로 만들었습니다. 최종적으로는 이런 모양이 되었는데 최대한 간단하게 해 보려고 예전에 WIFI 업그레이드를 하면서 만들어둔 모듈에서 5V와 GND 단자를 공유하도록 하게 하려고 릴레이를 이어 붙여서 누더기 모듈로 만들었습니다. 아! 그리고 잘은 모르지만 이런 스위칭 회로에는 TR을 사용하는 게 맞을 것 같은데 제가 가지고 있는 부품 중에 TR은 없고 릴리즈가 있어서 이런 구성이 되었습니다. 

핸드폰 카메라와 3D 프린터 연결

핸드폰과 프린터를 연결하고 적당한 위치에 핸드폰을 잘 고정해 줍니다. 이제 출력 준비가 끝났습니다.

 

타입랩스를 위한 Gcode 후처리

마지막으로 출력하기 전에 타입랩스 명령을 출력물의 Gcode에 삽입해야 하는데요. Gcode파일을 텍스트 편집기로 열어서 필요한 부분에 코들을 삽입할 수도 있지만 수십만 줄이나 되는 코드를 편집하는 게 쉽지는 않습니다. 그런데 다행히도 Cura에서는 타입랩스를 사용할 수 있도록 해주는 후처리 기능이 있습니다. 그러니까 슬라이싱 설정이 끝나고 gcode로 파일 내보내기를 하면 그때 적재적소에 타입랩스 코드가 들어간 파일을 만들어주는 거죠.

Cura에서 보통의 출력과 마찬가지로 다른 모든 작업을 완료했다면 "Extensions > Post Processing > Modify G-Code" 메뉴로 이동합니다.

다음과 같이 후처리를 위한 창이 열리는데요. 여기서 Time Lapse를 선택해주고 옵션을 조정합니다.

카메라 트리거 명령어를 저는 M240D100으로 수정했는데요. 릴레이를 사용하다 보니 너무 짧은 시그널로는 인식이 되지 않아서 100ms으로 설정하였습니다. 그리고 Pause length는 사진을 촬영하는 동안 대기하는 시간을 설정하는 부분인데 2초로 하였습니다. 다음으로 프린터 헤드가 카메라를 가리지 않도록 사진 찍을 동안 대기하고 있는 위치를 지정하는 옵션입니다. 적당한 자리를 찾아서 X와 Y 좌표로 입력해 줍니다. 마지막 FEED rate는 적당히 빠른 속도로 넣고 마무리해 줍니다.

이렇게 후처리를 하고 나서 완성된 Gcode를 보면 위와 같이, 레이어가 끝나고 새로운 레이어가 시작되는 사이사이에 타임랩스 촬영을 위한 코드가 추가된 것을 확인할 수 있습니다.

마무리

이제 수정된 Gcode를 프린터기에 옮기고 출력을 하면! 아래 동영상처럼 한 개 레이어 작업이 완료되면 프린터 헤드가 구석으로 살짝 이동하고 그동안 핸드폰이 사진을 찍습니다. 그리고 다시 노즐이 돌아와서 그다음 레이어의 출력을 이어갑니다.

요건 두 번째 완성한 영상입니다. 이번엔 하얀색 필라멘트라서 좀 더 잘 보이는것 같네요.

앞으로 손봐야 할 부분이 좀더 있는데요. 사진 촬영을 할 때 멈추어 있는 동안에 노즐에서 필라멘트가 조금씩 흘러나와서 필라멘트 똥이 만들어지고 출력물 벽면에 들러붙는 현상이 생기고 있습니다. 타임랩스 전에 리트랙션을 하도록 코드를 추가해 봤지만 충분하지 않았던 건지 완전히 해결이 되지 않았습니다. 아니면 최적화된 출력 온도를 찾아야 하는 건지 타임랩스를 완성하기 위해서 남아있는 숙제네요. 계속 시도해 보면서 천천히 방법을 계속 찾아봐야겠습니다.

 

끝!

728x90

댓글0