산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Manufacturing Technology >> 제조공정

블루투스 지원 아두이노 모터라이즈드 카메라 슬라이더로 매끄러운 시네마틱 샷 촬영하기

부품 목록

부품수량비고
아두이노 우노1
PCBWay 커스텀 PCB1프로젝트 공유 페이지
V-슬롯 20×40 리니어 레일1원하는 길이
솔리드 V-휠 키트4
드롭인 티 너트4
이심 스페이서2
9mm 알루미늄 스페이서2
3mm 알루미늄 스페이서2
로우 프로파일 M5 나사 20mm (너트 포함)4
로우 프로파일 M5 나사 10mm4
M3 앨런 육각 나사 16mm (너트 포함)8
8mm 셀프 얼라이닝 필로우 플랜지 블록 베어링2
GT2 보어 8mm 20치 타이밍 알루미늄 풀리1
8mm 리니어 레일 샤프트160mm 길이
GT2 보어 5mm 20치 타이밍 알루미늄 풀리1
GT2-6mm 오픈 타이밍 벨트1레일 길이에 따라 결정
바이폴라 NEMA17 스테퍼 모터1
A4988 스테퍼 모터 드라이버1
12V 3A 충전식 배터리1
HC-05 블루투스 모듈1

필요한 도구 및 장비

앱 및 온라인 서비스

프로젝트 개요

취미로 영상을 촬영하는 사람에게 모터라이즈드 카메라 슬라이더는 꽤 비싼 장비입니다. 그래서 직접 만들기로 했습니다. 이 튜토리얼에서는 블루투스로 무선 제어되는 모터라이즈드 카메라 슬라이더를 직접 제작하는 전 과정을 단계별로 안내합니다.

오늘 만들 슬라이더는 맞춤 제작한 안드로이드 모바일 앱을 통해 블루투스로 제어합니다. 앱은 MIT 앱 인벤터로 제작되었으며, 슬라이더 이동 속도, 이동 거리, 가감속 비율 등 다양한 파라미터를 조절할 수 있습니다. 앱에서 슬라이더 길이를 설정할 수 있어 최대 10미터까지 자유롭게 제작 가능합니다.

블루투스 지원 아두이노 모터라이즈드 카메라 슬라이더로 매끄러운 시네마틱 샷 촬영하기

구동부로는 NEMA17 스테퍼 모터를 사용하여 정밀한 스텝 제어가 가능합니다. 아두이노에서 스테퍼 모터를 제어하려면 모터가 이해할 수 있는 신호로 변환해주는 드라이버가 필요한데, 여기서는 A4988 폴로루 스테퍼 모터 드라이버를 사용합니다. 이 드라이버는 1/16 스텝까지 5가지 마이크로스텝 해상도를 제공하여 최대 정확도와 부드러운 움직임을 구현합니다.

블루투스 지원 아두이노 모터라이즈드 카메라 슬라이더로 매끄러운 시네마틱 샷 촬영하기

이 프로젝트는 팹랩/메이커스페이스/해커스페이스에서 제작 가능하도록 설계되었습니다.

CAD 및 3D 모델링

퓨전 360으로 카메라 슬라이더를 설계했습니다. 어디서든 온/오프라인으로 쉽게 구할 수 있는 표준 기계 부품을 사용했습니다.

블루투스 지원 아두이노 모터라이즈드 카메라 슬라이더로 매끄러운 시네마틱 샷 촬영하기

기계 구조에는 오픈빌드 하드웨어를 사용했습니다. V-슬롯 2040 리니어 레일을 카메라 이동 가이드로 쓰고, 두 개의 풀리(하나는 스테퍼 모터 축, 다른 하나는 반대편 8mm 리니어 샤프트)와 오픈 타이밍 벨트로 회전 운동을 직선 운동으로 변환합니다.

블루투스 지원 아두이노 모터라이즈드 카메라 슬라이더로 매끄러운 시네마틱 샷 촬영하기
블루투스 지원 아두이노 모터라이즈드 카메라 슬라이더로 매끄러운 시네마틱 샷 촬영하기

8mm 리니어 레일 샤프트는 상하단 플레이트에 장착된 두 개의 셀프 얼라이닝 필로우 플랜지 블록 베어링 사이에 고정되며, M5 나사 4개로 고정합니다.

블루투스 지원 아두이노 모터라이즈드 카메라 슬라이더로 매끄러운 시네마틱 샷 촬영하기

카메라 플레이트 중앙에는 표준 삼각대 나사(1/4인치) 구멍이 있어 카메라를 쉽게 장착할 수 있습니다. 네 개의 델린 V-슬롯 솔리드 휠이 V-슬롯 레일의 V-홈을 따라 미끄러져 매우 부드러운 움직임을 만듭니다.

블루투스 지원 아두이노 모터라이즈드 카메라 슬라이더로 매끄러운 시네마틱 샷 촬영하기

전자 장치를 수납할 인클로저까지 모든 부품은 M3×16mm 나사와 너트로 고정됩니다.

블루투스 지원 아두이노 모터라이즈드 카메라 슬라이더로 매끄러운 시네마틱 샷 촬영하기

디지털 제조 (3D 프린팅)

카메라 슬라이더 본체 전체를 3D 프린팅합니다. 레이어 높이 0.2mm, 인필 20%로 출력하되, 좌우 다리 파트는 인필 50%로 출력합니다.

STL 파일은 Thingiverse에서 다운로드할 수 있습니다.

V-휠 키트 조립

조립 과정은 매우 간단합니다. 먼저 네 개의 솔리드 V-휠을 조립합니다. 키트에는 고무 휠, 베어링 2개, 정밀 심, 잠금 너트가 포함되어 있습니다.

블루투스 지원 아두이노 모터라이즈드 카메라 슬라이더로 매끄러운 시네마틱 샷 촬영하기

고무 휠 한쪽에 베어링을 끼우고, 휠을 뒤집어 정밀 심을 넣은 뒤 반대쪽 면에서 두 번째 베어링을 끼웁니다.

블루투스 지원 아두이노 모터라이즈드 카메라 슬라이더로 매끄러운 시네마틱 샷 촬영하기
블루투스 지원 아두이노 모터라이즈드 카메라 슬라이더로 매끄러운 시네마틱 샷 촬영하기
블루투스 지원 아두이노 모터라이즈드 카메라 슬라이더로 매끄러운 시네마틱 샷 촬영하기

카메라 슬라이더 기계적 조립

먼저 카메라 플레이트와 네 개의 솔리드 V-휠을 9mm 알루미늄 스페이서, 정밀 심, 잠금 너트로 조립합니다.

블루투스 지원 아두이노 모터라이즈드 카메라 슬라이더로 매끄러운 시네마틱 샷 촬영하기
블루투스 지원 아두이노 모터라이즈드 카메라 슬라이더로 매끄러운 시네마틱 샷 촬영하기

나머지 세 바퀴도 같은 방식으로 조립합니다. 우측 두 바퀴에는 9mm 스페이서를, 좌측 두 바퀴에는 이심 스페이서와 3mm 스페이서를 사용합니다.

블루투스 지원 아두이노 모터라이즈드 카메라 슬라이더로 매끄러운 시네마틱 샷 촬영하기

카메라 홀더 플레이트를 V-슬롯 프로파일에 삽입합니다. 플레이트가 헐겁게 흔들리면 이심 너트를 조여 단단히 고정합니다.

블루투스 지원 아두이노 모터라이즈드 카메라 슬라이더로 매끄러운 시네마틱 샷 촬영하기
블루투스 지원 아두이노 모터라이즈드 카메라 슬라이더로 매끄러운 시네마틱 샷 촬영하기

V-슬롯 프로파일 양 끝에 드롭인 티 너트 두 개씩을 넣고, 좌우 다리와 연결합니다.

블루투스 지원 아두이노 모터라이즈드 카메라 슬라이더로 매끄러운 시네마틱 샷 촬영하기
블루투스 지원 아두이노 모터라이즈드 카메라 슬라이더로 매끄러운 시네마틱 샷 촬영하기
블루투스 지원 아두이노 모터라이즈드 카메라 슬라이더로 매끄러운 시네마틱 샷 촬영하기

두 카메라 슬라이더 다리를 V-슬롯 프로파일에 밀어 넣고 M5×10mm 나사 4개로 고정합니다.

블루투스 지원 아두이노 모터라이즈드 카메라 슬라이더로 매끄러운 시네마틱 샷 촬영하기
블루투스 지원 아두이노 모터라이즈드 카메라 슬라이더로 매끄러운 시네마틱 샷 촬영하기
블루투스 지원 아두이노 모터라이즈드 카메라 슬라이더로 매끄러운 시네마틱 샷 촬영하기

NEMA 17 스테퍼 모터를 모터 플레이트에 장착한 뒤 M3×16mm 나사 4개로 고정합니다.

블루투스 지원 아두이노 모터라이즈드 카메라 슬라이더로 매끄러운 시네마틱 샷 촬영하기
블루투스 지원 아두이노 모터라이즈드 카메라 슬라이더로 매끄러운 시네마틱 샷 촬영하기
블루투스 지원 아두이노 모터라이즈드 카메라 슬라이더로 매끄러운 시네마틱 샷 촬영하기
블루투스 지원 아두이노 모터라이즈드 카메라 슬라이더로 매끄러운 시네마틱 샷 촬영하기

좌측 다리 상단 너트 자리에 너트 두 개를 넣습니다.

블루투스 지원 아두이노 모터라이즈드 카메라 슬라이더로 매끄러운 시네마틱 샷 촬영하기
블루투스 지원 아두이노 모터라이즈드 카메라 슬라이더로 매끄러운 시네마틱 샷 촬영하기

NEMA 17 모터 플레이트를 좌측 다리 위에 올리고 M3×16mm 나사 두 개로 고정합니다.

블루투스 지원 아두이노 모터라이즈드 카메라 슬라이더로 매끄러운 시네마틱 샷 촬영하기
블루투스 지원 아두이노 모터라이즈드 카메라 슬라이더로 매끄러운 시네마틱 샷 촬영하기
블루투스 지원 아두이노 모터라이즈드 카메라 슬라이더로 매끄러운 시네마틱 샷 촬영하기
블루투스 지원 아두이노 모터라이즈드 카메라 슬라이더로 매끄러운 시네마틱 샷 촬영하기

모터 축에 GT2 보어 5mm 풀리를 끼우고 앨런 키로 세트 스크류를 조여 고정합니다.

블루투스 지원 아두이노 모터라이즈드 카메라 슬라이더로 매끄러운 시네마틱 샷 촬영하기
블루투스 지원 아두이노 모터라이즈드 카메라 슬라이더로 매끄러운 시네마틱 샷 촬영하기

우측 다리에는 M3 너트 네 개를 너트 자리에 넣습니다.

블루투스 지원 아두이노 모터라이즈드 카메라 슬라이더로 매끄러운 시네마틱 샷 촬영하기
블루투스 지원 아두이노 모터라이즈드 카메라 슬라이더로 매끄러운 시네마틱 샷 촬영하기

우측 다리 상단에 베어링 플레이트 두 개를 올리고 M3×16mm 나사 4개로 고정합니다.

블루투스 지원 아두이노 모터라이즈드 카메라 슬라이더로 매끄러운 시네마틱 샷 촬영하기
블루투스 지원 아두이노 모터라이즈드 카메라 슬라이더로 매끄러운 시네마틱 샷 촬영하기
블루투스 지원 아두이노 모터라이즈드 카메라 슬라이더로 매끄러운 시네마틱 샷 촬영하기
블루투스 지원 아두이노 모터라이즈드 카메라 슬라이더로 매끄러운 시네마틱 샷 촬영하기
블루투스 지원 아두이노 모터라이즈드 카메라 슬라이더로 매끄러운 시네마틱 샷 촬영하기
블루투스 지원 아두이노 모터라이즈드 카메라 슬라이더로 매끄러운 시네마틱 샷 촬영하기

8mm 플랜지 블록 베어링 하나를 우측 다리 상단 플레이트에 M5×20mm 나사 두 개와 M5 너트 두 개로 고정합니다.

블루투스 지원 아두이노 모터라이즈드 카메라 슬라이더로 매끄러운 시네마틱 샷 촬영하기
블루투스 지원 아두이노 모터라이즈드 카메라 슬라이더로 매끄러운 시네마틱 샷 촬영하기
블루투스 지원 아두이노 모터라이즈드 카메라 슬라이더로 매끄러운 시네마틱 샷 촬영하기

두 번째 8mm 플랜지 베어링 블록을 우측 다리 하단 플레이트에 동일하게 고정합니다.

블루투스 지원 아두이노 모터라이즈드 카메라 슬라이더로 매끄러운 시네마틱 샷 촬영하기
블루투스 지원 아두이노 모터라이즈드 카메라 슬라이더로 매끄러운 시네마틱 샷 촬영하기
블루투스 지원 아두이노 모터라이즈드 카메라 슬라이더로 매끄러운 시네마틱 샷 촬영하기

8mm 리니어 레일 샤프트를 하단 베어링 블록에서 위로 밀어 넣고, 8mm 보어 풀리를 샤프트에 끼운 뒤 세트 스크류를 조여 고정합니다.

블루투스 지원 아두이노 모터라이즈드 카메라 슬라이더로 매끄러운 시네마틱 샷 촬영하기
블루투스 지원 아두이노 모터라이즈드 카메라 슬라이더로 매끄러운 시네마틱 샷 촬영하기
블루투스 지원 아두이노 모터라이즈드 카메라 슬라이더로 매끄러운 시네마틱 샷 촬영하기

이제 타이밍 벨트만 남았습니다. 6mm 타이밍 벨트를 NEMA17 모터의 5mm 보어 풀리와 우측 다리의 8mm 보어 풀리에 걸고, 카메라 플레이트에 벨트를 고정하여 장력을 조절합니다.

블루투스 지원 아두이노 모터라이즈드 카메라 슬라이더로 매끄러운 시네마틱 샷 촬영하기
블루투스 지원 아두이노 모터라이즈드 카메라 슬라이더로 매끄러운 시네마틱 샷 촬영하기
블루투스 지원 아두이노 모터라이즈드 카메라 슬라이더로 매끄러운 시네마틱 샷 촬영하기

스테퍼 모터 테스트 제어

모든 부품을 조립한 후 정상 동작 확인을 위해 스테퍼 모터를 아두이노와 A4988 드라이버로 연결하고 테스트 코드를 실행합니다.

A4988 스테퍼 모터 드라이버

아두이노 등 마이컴으로 스테퍼 모터를 제어하려면 드라이버가 필수입니다. A4988은 코일당 최대 2A 출력, 스텝/방향 두 핀만으로 제어, 온보드 포텐셔미터로 전류 조절, 1/16 마이크로스텝까지 지원합니다.

블루투스 지원 아두이노 모터라이즈드 카메라 슬라이더로 매끄러운 시네마틱 샷 촬영하기
블루투스 지원 아두이노 모터라이즈드 카메라 슬라이더로 매끄러운 시네마틱 샷 촬영하기

주요 핀 설명:

NEMA17 스테퍼 모터

스테퍼 모터는 DC 펄스로 정밀 제어되는 모터로 3D 프린터, CNC 등에 쓰입니다. 1.8° 스텝 앵글, 9V 정격(12V로 최대 토크), 바이폴라 4선식입니다.

블루투스 지원 아두이노 모터라이즈드 카메라 슬라이더로 매끄러운 시네마틱 샷 촬영하기
블루투스 지원 아두이노 모터라이즈드 카메라 슬라이더로 매끄러운 시네마틱 샷 촬영하기

배선도

스테퍼 모터, A4988, 아두이노 우노, 12V 3A 리튬이온 배터리를 연결합니다.

블루투스 지원 아두이노 모터라이즈드 카메라 슬라이더로 매끄러운 시네마틱 샷 촬영하기

아두이노 코드

AccelStepper 라이브러리 설치

아두이노 IDE → 스케치 → 라이브러리 포함 → 라이브러리 관리에서 "AccelStepper" 검색 후 Mike McCauley 버전 설치.

블루투스 지원 아두이노 모터라이즈드 카메라 슬라이더로 매끄러운 시네마틱 샷 촬영하기
블루투스 지원 아두이노 모터라이즈드 카메라 슬라이더로 매끄러운 시네마틱 샷 촬영하기
블루투스 지원 아두이노 모터라이즈드 카메라 슬라이더로 매끄러운 시네마틱 샷 촬영하기

테스트 코드

// Bounce stepper test program
// Make a single stepper bounce from one limit to another
// Copyright (C) 2020 makesomestuff.org

#include <AccelStepper.h>
#define stepPin 2
#define dirPin 3

AccelStepper stepper(AccelStepper::DRIVER, stepPin, dirPin);

void setup() {
  stepper.setMaxSpeed(100);
  stepper.setAcceleration(20);
  stepper.moveTo(500);
}

void loop() {
  if (stepper.distanceToGo() == 0)
    stepper.moveTo(-stepper.currentPosition());
  stepper.run();
}

코드 로직: AccelStepper 객체 생성, setup에서 최대 속도/가속도/목표 위치 설정, loop에서 목표 도달 시 방향 반전.

카메라 슬라이더 완전 무선 제어

테스트 완료 후 모바일 앱과 아두이노 펌웨어를 구현하여 무선 제어를 실현합니다.

블루투스 지원 아두이노 모터라이즈드 카메라 슬라이더로 매끄러운 시네마틱 샷 촬영하기

모바일 앱 제작

MIT 앱 인벤터로 안드로이드 앱을 제작했습니다. 드래그 앤 드롭으로 로직과 UI를 구성하며, 소스 코드는 오픈소스로 공개되어 있습니다.

블루투스 지원 아두이노 모터라이즈드 카메라 슬라이더로 매끄러운 시네마틱 샷 촬영하기
블루투스 지원 아두이노 모터라이즈드 카메라 슬라이더로 매끄러운 시네마틱 샷 촬영하기
블루투스 지원 아두이노 모터라이즈드 카메라 슬라이더로 매끄러운 시네마틱 샷 촬영하기

앱은 블루투스(HC-05)를 통해 슬라이더와 통신합니다. 다음 단계로 블루투스 모듈을 회로에 추가하고 통신 코드를 올립니다.

배선도 (블루투스 추가)

기존 회로에 HC-05 블루투스 모듈을 연결합니다. HC-05는 마스터/슬레이브 모두 가능하며 SPP(시리얼 포트 프로토콜)로 아두이노와 시리얼 통신합니다.

블루투스 지원 아두이노 모터라이즈드 카메라 슬라이더로 매끄러운 시네마틱 샷 촬영하기

회로도 및 PCB 제작

브레드보드 배선 대신 아두이노 우노 쉴드 형태의 커스텀 PCB를 설계했습니다. A4988, HC-05, 배터리 소켓이 모두 보드에 실장되어 조립이 간편합니다.

블루투스 지원 아두이노 모터라이즈드 카메라 슬라이더로 매끄러운 시네마틱 샷 촬영하기
블루투스 지원 아두이노 모터라이즈드 카메라 슬라이더로 매끄러운 시네마틱 샷 촬영하기
블루투스 지원 아두이노 모터라이즈드 카메라 슬라이더로 매끄러운 시네마틱 샷 촬영하기

PCBWay에서 제작했으며 품질 우수, 5달러로 저렴합니다. 주문 진행 상황을 온라인으로 실시간 확인 가능합니다.

블루투스 지원 아두이노 모터라이즈드 카메라 슬라이더로 매끄러운 시네마틱 샷 촬영하기

PCB 설계 파일 다운로드 및 주문: PCBWay 프로젝트 페이지

블루투스 지원 아두이노 모터라이즈드 카메라 슬라이더로 매끄러운 시네마틱 샷 촬영하기
블루투스 지원 아두이노 모터라이즈드 카메라 슬라이더로 매끄러운 시네마틱 샷 촬영하기
블루투스 지원 아두이노 모터라이즈드 카메라 슬라이더로 매끄러운 시네마틱 샷 촬영하기
블루투스 지원 아두이노 모터라이즈드 카메라 슬라이더로 매끄러운 시네마틱 샷 촬영하기

아두이노 코드 및 블루투스 통신

최종 펌웨어 코드입니다. 시리얼로 2바이트 데이터를 수신하여 명령 파싱 후 AccelStepper로 모터 제어.

/*
 TODO:: 마이크로스텝 모드 선택 기능 추가
 TODO:: 앱에서 호밍 위치/마이크로스텝만 최초에 묻도록 수정
 TODO:: setup에서만 호밍/마이크로스텝 루프 돌도록 수정

 DATA::왼쪽 화살표 → 1
 DATA::오른쪽 화살표 → 2
 DATA::정지 버튼 → 3

 DATA::레일 길이(1~1000cm) → (201~1200)

 DATA::가속도 매우 높음 → 14
 DATA::가속도 높음 → 11
 DATA::가속도 중간 → 12
 DATA::가속도 낮음 → 13
 DATA::가속도 매우 낮음 → 15

 DATA::속도 슬라이더(1~4000 step/sec) → (5001~9000)

 DATA::지연 시작 체크 true → 7
 DATA::지연 시작 체크 false → 8

 DATA::좌측 끝 호밍 → 16
 DATA::우측 끝 호밍 → 17

 DATA::부드러운 이동(1/4 스텝) → 18
 DATA::매우 부드러운 이동(1/16 스텝) → 19

 1301 ~ 2300
*/

#include <MultiStepper.h>
#include <AccelStepper.h>

#define stepPin 2
#define dirPin 3

bool homingPositionFlag = false;
int startupSetupFlag = 0;
bool delayedStart = false;

int incomingData = 0;
int movementDistance = 50;
long steps = 0; // 50cm 레일 기본값 @1/8 마이크로스텝
int microStepResolution = 0; // 4 또는 16
long railLength = 0;
int sliderSpeed = 10;

AccelStepper stepper(AccelStepper::DRIVER, stepPin, dirPin);

void setup() {
  pinMode(stepPin, OUTPUT);
  pinMode(dirPin, OUTPUT);
  Serial.begin(9600);

  stepper.setMaxSpeed(10.00);
  stepper.setAcceleration(500.00);

  while (startupSetupFlag < 3) {
    if (Serial.available() > 1) {
      unsigned int dataOne = Serial.read();
      unsigned int dataOne1 = Serial.read();
      unsigned int incomingData = (dataOne1 * 256) + dataOne;

      // 모터 호밍 파트
      if (incomingData == 16) { // 좌측 끝 호밍
        stepper.setCurrentPosition(steps);
        homingPositionFlag = false;
        startupSetupFlag++;
      } else if (incomingData == 17) { // 우측 끝 호밍
        stepper.setCurrentPosition(-(steps));
        homingPositionFlag = true;
        startupSetupFlag++;
      }

      // 마이크로스텝 해상도 파트
      if (incomingData == 18) {
        microStepResolution = 4; // 1/4 스텝
        startupSetupFlag++;
      } else if (incomingData == 19) {
        microStepResolution = 16; // 1/16 스텝
        startupSetupFlag++;
      }

      // 레일 길이 파트 (1301~2300)
      if (incomingData >= 1301 && incomingData <= 2300) {
        railLength = incomingData - 1300; // cm 단위
        if (microStepResolution == 4) {
          steps = ((6100L * railLength) / 50L);
          startupSetupFlag++;
        } else if (microStepResolution == 16) {
          steps = ((25000L * railLength) / 50L);
          startupSetupFlag++;
        }
      }
    }
  }
}

void loop() {
  if (Serial.available() > 1) {
    unsigned int dataOne = Serial.read();
    unsigned int dataOne1 = Serial.read();
    unsigned int incomingData = (dataOne1 * 256) + dataOne;

    // 모터 제어 파트
    if (incomingData == 1 && stepper.isRunning() == false && stepper.currentPosition() != 6050 && homingPositionFlag == true) {
      if (delayedStart == true) delay(15000);
      stepper.setCurrentPosition(0);
      stepper.moveTo(steps);
      homingPositionFlag = false;
    } else if (incomingData == 2 && stepper.isRunning() == false && stepper.currentPosition() != -6050 && homingPositionFlag == false) {
      if (delayedStart == true) delay(15000);
      stepper.setCurrentPosition(0);
      stepper.moveTo(-(steps));
      homingPositionFlag = true;
    } else if (incomingData == 3 && stepper.isRunning() == true) {
      homing();
    }

    // 최대 속도 설정
    else if (incomingData >= 5001 && incomingData <= 9000) {
      sliderSpeed = incomingData - 5000;
      stepper.setMaxSpeed(sliderSpeed);
    }

    // 지연 시작 설정
    else if (incomingData == 7) delayedStart = true;
    else if (incomingData == 8) delayedStart = false;

    // 이동 거리 설정 (201~1200 → 1~1000cm)
    else if (incomingData >= 201 && incomingData <= 1200) {
      movementDistance = incomingData - 200;
      if (microStepResolution == 4) steps = ((6100L * movementDistance) / 50L);
      else if (microStepResolution == 16) steps = ((25000L * movementDistance) / 50L);
    }

    // 가속도 설정
    else if (incomingData == 11 && stepper.isRunning() == false) stepper.setAcceleration(3000); // 높음
    else if (incomingData == 12 && stepper.isRunning() == false) stepper.setAcceleration(1000); // 중간
    else if (incomingData == 13 && stepper.isRunning() == false) stepper.setAcceleration(500);  // 낮음
    else if (incomingData == 14 && stepper.isRunning() == false) stepper.setAcceleration(4000); // 매우 높음
    else if (incomingData == 15 && stepper.isRunning() == false) stepper.setAcceleration(10);   // 매우 낮음
  }
  stepper.run();
}

void homing() {
  if (stepper.currentPosition() > 0) homingPositionFlag = true;
  else homingPositionFlag = false;
  stepper.moveTo(0);
}

코드 로직 설명

AccelStepper 라이브러리로 2핀 드라이버 모드 스테퍼를 객체 지향적으로 제어합니다.

#define stepPin 2
#define dirPin 3

bool homingPositionFlag = false;
int startupSetupFlag = 0;
bool delayedStart = false;
int incomingData = 0;
int movementDistance = 50;
long steps = 0;
int microStepResolution = 0;
long railLength = 0;
int sliderSpeed = 10;

AccelStepper stepper(AccelStepper::DRIVER, stepPin, dirPin);

앱 연결 시 마이크로스텝 모드(1/4=부드러움, 1/16=매우 부드러움)를 먼저 묻습니다. 잘못 선택하면 거리 계산 오류로 캐리지가 끝단에 부딪힐 수 있습니다.

블루투스 지원 아두이노 모터라이즈드 카메라 슬라이더로 매끄러운 시네마틱 샷 촬영하기
if (incomingData == 18) { microStepResolution = 4; startupSetupFlag++; }
else if (incomingData == 19) { microStepResolution = 16; startupSetupFlag++; }

호밍 위치는 좌측(16) 또는 우측(17) 끝단 중 캐리지가 놓인 쪽을 선택합니다.

블루투스 지원 아두이노 모터라이즈드 카메라 슬라이더로 매끄러운 시네마틱 샷 촬영하기
if (incomingData == 16) { stepper.setCurrentPosition(steps); homingPositionFlag = false; startupSetupFlag++; }
else if (incomingData == 17) { stepper.setCurrentPosition(-(steps)); homingPositionFlag = true; startupSetupFlag++; }

레일 길이(1301~2300)를 입력받아 마이크로스텝 해상도에 따라 총 스텝 수(steps)를 계산합니다.

블루투스 지원 아두이노 모터라이즈드 카메라 슬라이더로 매끄러운 시네마틱 샷 촬영하기
if (incomingData >= 1301 && incomingData <= 2300) {
  railLength = incomingData - 1300;
  if (microStepResolution == 4) steps = ((6100L * railLength) / 50L);
  else if (microStepResolution == 16) steps = ((25000L * railLength) / 50L);
  startupSetupFlag++;
}

loop()에서는 수신 데이터에 따라 모터 정/역회전, 정지, 속도/가속도/이동거리 변경 등을 처리합니다.

카이로 카메라 슬라이더 사용자 가이드 및 문제 해결

12V 전원 연결 후 스마트폰 블루투스에서 HC-05와 페어링, 앱 실행 후 "Press here to connect with Cairo camera slider" 버튼을 눌러 HC-05 선택.

블루투스 지원 아두이노 모터라이즈드 카메라 슬라이더로 매끄러운 시네마틱 샷 촬영하기
블루투스 지원 아두이노 모터라이즈드 카메라 슬라이더로 매끄러운 시네마틱 샷 촬영하기

연결 성공 후 설정 마법사 진행:

  1. 마이크로스텝 해상도 선택 (A4988 설정과 일치해야 함)
  2. 블루투스 지원 아두이노 모터라이즈드 카메라 슬라이더로 매끄러운 시네마틱 샷 촬영하기
  3. 알루미늄 레일 길이 입력 (cm 단위, 예: 50)
  4. 블루투스 지원 아두이노 모터라이즈드 카메라 슬라이더로 매끄러운 시네마틱 샷 촬영하기
  5. 캐리지 호밍 위치 선택 (레일 양끝 중 현재 캐리지 위치)
  6. 블루투스 지원 아두이노 모터라이즈드 카메라 슬라이더로 매끄러운 시네마틱 샷 촬영하기

캐리지가 중간 등에 있으면 작동 시 끝단 충돌 발생. 설정 완료 후 파라미터 확인 뒤 OK 누르면 사용 준비 완료.

블루투스 지원 아두이노 모터라이즈드 카메라 슬라이더로 매끄러운 시네마틱 샷 촬영하기
블루투스 지원 아두이노 모터라이즈드 카메라 슬라이더로 매끄러운 시네마틱 샷 촬영하기

카이로 카메라 슬라이더 작동 영상

(영상 참조)

코드

카이로 카메라 슬라이더 최종 코드

/* 최종 펌웨어 코드 (위와 동일) */

커스텀 파트 및 인클로저

카이로 카메라 슬라이더 STL 파일

Thingiverse에서 CAD 파일 다운로드

회로도

블루투스 지원 아두이노 모터라이즈드 카메라 슬라이더로 매끄러운 시네마틱 샷 촬영하기

제조공정

  1. 현대 카메라의 진화와 설계: 필름에서 디지털까지
  2. 카메라 렌즈의 이해: 설계, 역사, 그리고 미래의 혁신
  3. BrickPi Bookreader: 라즈베리 파이와 레고 마인드스톰으로 킨들 독서 자동화
  4. 블루투스 제어 아두이노 스파이봇(Spybot) 만들기
  5. 플릭모트(FlickMote): 스마트 홈을 위한 제스처 제어 IR 리모컨
  6. DIY 아두이노 TV B-Gone: 모든 TV를 끄는 만능 리모컨
  7. 아두이노로 만드는 대형 LED 마스터 시계 (알람 기능 포함, 12m 거리에서도 식별 가능)
  8. 아두이노와 블루투스로 만드는 스마트 물건 찾기 'Find Me'
  9. 아두이노 프로젝트를 위한 최적화된 전원 솔루션
  10. 첨단 테라헤르츠 이미징 카메라, 고체 내부 고해상도 가시화