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

팬/틸트 기능이 있는 DIY 모터라이즈드 카메라 슬라이더 - 아두이노 제어 프로젝트

이 튜토리얼에서는 팬과 틸트 헤드가 있는 모터라이즈드 카메라 슬라이더를 만드는 방법을 배웁니다. 이 아두이노 기반 프로젝트는 MDF와 합판 같은 저렴한 재료로 100% DIY로 제작되며, 아두이노, 스테퍼 모터 3개, 버튼 몇 개, 커스텀 설계 PCB에 장착된 조이스틱으로 제어됩니다. 그럼에도 불구하고 최종 결과물은 매우 인상적이며, 초부드러운 카메라 무브먼트로 전문적인 시네마틱 샷을 얻을 수 있습니다.

아래 비디오를 시청하거나 작성된 튜토리얼을 읽어보세요.

개요

컨트롤러를 사용해 카메라를 수동으로 움직이거나, 시작점과 끝점을 설정하면 카메라가 두 위치 사이를 자동으로 이동합니다. 지지암을 사용하면 작은 삼각대에도 슬라이더를 장착할 수 있고, 어떤 각도에서도 안정적인 움직임을 얻을 수 있습니다.

팬/틸트 기능이 있는 DIY 모터라이즈드 카메라 슬라이더 - 아두이노 제어 프로젝트

먼저 3D 모델링 소프트웨어로 슬라이더를 설계했습니다.

팬/틸트 기능이 있는 DIY 모터라이즈드 카메라 슬라이더 - 아두이노 제어 프로젝트

아래 3D 모델에서 이 조립 3D 모델을 찾아 다운로드하고 모든 치수를 확인할 수 있으며, Thangs에서 브라우저로 탐색할 수도 있습니다.

팬/틸트 기능이 있는 DIY 모터라이즈드 카메라 슬라이더 - 아두이노 제어 프로젝트

Thangs에서 조립 3D 모델 다운로드.

3D 프린트 GT2 풀리 링크:

Thingiverse

카메라 슬라이더 제작

슬라이더 레일 제작부터 시작했습니다. 22mm 두께의 구리 파이프를 사용했습니다. 슬라이더 길이를 1미터로 정해 두 조각을 1미터 길이로 잘랐습니다. 구리 파이프는 쉽게 산화되므로 금속 광택제로 연마해야 합니다. 저는 금속 광택제가 없어 치약을 사용했습니다.

팬/틸트 기능이 있는 DIY 모터라이즈드 카메라 슬라이더 - 아두이노 제어 프로젝트

완벽한 해결책은 아니었지만 차이가 눈에 띄고 파이프가 좀 더 깨끗해졌습니다.

두 파이프가 부착되고 삼각대 장착용으로도 쓰일 나무 베이스를 만들었습니다. 원형 톱으로 21mm 두께 합판 두 조각을 잘라 접착해 더 두꺼운 조각을 만들었습니다. 원목으로 삼각대 마운팅 플레이트 복제품을 만들어 합판 조각에 목재 접착제와 나사로 고정했습니다. 이제 슬라이더 베이스를 삼각대에 쉽게 장착할 수 있습니다.

팬/틸트 기능이 있는 DIY 모터라이즈드 카메라 슬라이더 - 아두이노 제어 프로젝트

슬라이더 레일을 베이스로 8mm 나사봉으로 고정하려 베이스에 두 구멍을 뚫고 미리 잘라둔 138mm 길이의 나사봉을 끼웠습니다. 파이프에 8mm 구멍을 뚫는 건 조금 까다로울 수 있습니다.

팬/틸트 기능이 있는 DIY 모터라이즈드 카메라 슬라이더 - 아두이노 제어 프로젝트

이를 위해 연필을 파이프 지름의 절반인 11mm 높이로 올린 간단한 지그를 만들었습니다. 파이프를 평평한 표면에 고정하고 지그로 양쪽에서 마킹했습니다. 이렇게 하면 양쪽에서 정확히 정렬된 구멍을 뚫을 수 있습니다. 먼저 날카로운 나사 끝으로 드릴링 포인트를 표시한 후 2, 4, 6, 8mm 드릴 비트로 단계적으로 뚫었습니다.

팬/틸트 기능이 있는 DIY 모터라이즈드 카메라 슬라이더 - 아두이노 제어 프로젝트

그 후 레일을 나사봉에 끼우고 와셔와 너트로 슬라이더 베이스에 고정했습니다. 비슷한 방식으로 합판 조각과 나사봉으로 레일 양끝을 고정했습니다.

팬/틸트 기능이 있는 DIY 모터라이즈드 카메라 슬라이더 - 아두이노 제어 프로젝트

다음은 슬라이딩 플랫폼입니다. 다시 원형 톱으로 3D 모델 치수에 맞게 8mm MDF 보드를 잘랐습니다. 베어링이 부착될 나사봉용 8mm 구멍도 뚫었습니다. 플랫폼 조립에는 목재 접착제와 나사를 사용했습니다. 무선 드릴로 파일럿 홀을 뚫고 카운터싱크 후 3mm 나사를 조였습니다.

패널이 고정되면 베어링 시스템을 조립했습니다. 사용하는 베어링은 608Z로 외경이 22mm입니다. 두 베어링 사이에 와셔 두 개와 너트 하나를 두어 적절한 간격을 만들어 22mm 레일과 잘 접촉되게 했습니다.

팬/틸트 기능이 있는 DIY 모터라이즈드 카메라 슬라이더 - 아두이노 제어 프로젝트

슬라이더를 기울여 사용할 때 플랫폼이 더 안정되도록 플랫폼 바닥에도 같은 방식으로 베어링 두 세트를 더 추가했습니다. 최종적으로 슬라이딩 플랫폼이 완벽하게 작동했습니다.

팬/틸트 기능이 있는 DIY 모터라이즈드 카메라 슬라이더 - 아두이노 제어 프로젝트

작고 중량급이 아닌 삼각대에서 슬라이더를 움직여보니 헤드가 플랫폼 무게를 지탱하지 못해 슬라이더를 안정화할 지지암이 필요했습니다. 나무 조각 두 개와 너트, 볼트로 삼각대 다리 중 하나에 고정할 수 있는 간단한 클램프를 만들었습니다.

팬/틸트 기능이 있는 DIY 모터라이즈드 카메라 슬라이더 - 아두이노 제어 프로젝트

클램프에 볼트를 달아 지지암을 고정할 수 있게 했습니다. 지지암에 슬라이더를 다양한 각도로 위치시킬 수 있는 슬롯을 만들었습니다. 6mm 구멍을 촘촘히 뚫고 줄로 다듬어 직선 슬롯을 만들었습니다. 이 지지 시스템이 완벽하게 작동했습니다.

팬/틸트 기능이 있는 DIY 모터라이즈드 카메라 슬라이더 - 아두이노 제어 프로젝트

삼각대를 쓰지 않을 때를 대비해 슬라이더에 다리도 추가했습니다. 8mm MDF로 만들었습니다. 손톱과 줄로 3D 모델에 맞게 원하는 다리 모양을 쉽게 만들었습니다. 약간의 접착제와 너트 두 개로 슬라이더 양끝에 고정했습니다.

팬/틸트 기능이 있는 DIY 모터라이즈드 카메라 슬라이더 - 아두이노 제어 프로젝트

다음 단계는 슬라이딩 플랫폼 위에 부착될 팬/틸트 시스템 제작입니다. 원형 톱으로 3D 모델 치수에 맞게 필요한 모든 조각을 잘랐습니다. 카메라가 슬라이더가 기울어졌을 때 수평을 유지하는 힌지 메커니즘용 합판 몇 조각과 팬 시스템용 모터와 베어링 구멍을 뚫은 MDF 보드를 사용했습니다.

팬/틸트 기능이 있는 DIY 모터라이즈드 카메라 슬라이더 - 아두이노 제어 프로젝트

슬라이딩 플랫폼용 스테퍼 모터와 타이밍 벨트를 설치했습니다. 플랫폼 한쪽에 MDF 조각과 나사, 볼트로 스테퍼 모터를 고정했습니다. 슬라이더 반대쪽에는 아이들러 풀리를 고정해 타이밍 벨트를 설치할 수 있게 했습니다. 볼트 두 개와 케이블 타이를 사용해 타이밍 벨트를 슬라이딩 플랫폼에 쉽게 고정했습니다.

팬/틸트 기능이 있는 DIY 모터라이즈드 카메라 슬라이더 - 아두이노 제어 프로젝트

이제 슬라이딩 메커니즘이 완전히 완성되었습니다.

팬/틸트 시스템의 상부 제작을 이어갔습니다. 3D 모델에 따라 스테퍼 모터와 베어링용 적절한 구멍을 뚫고 접착제와 나사로 모두 조립했습니다.

친구가 80톱니 풀리 두 개를 3D 프린트해 주었습니다. 이렇게 하면 스테퍼 모터에 부착된 16톱니 풀리 대비 5배 감속비를 얻을 수 있습니다.

팬/틸트 기능이 있는 DIY 모터라이즈드 카메라 슬라이더 - 아두이노 제어 프로젝트

내 설정에 맞는 폐루프 타이밍 벨트를 만들어야 했습니다. 필요한 벨트 길이를 측정해 자르고 CA 접착제로 붙인 뒤 위에 테이프를 한 겹 감았습니다. CA 접착제는 고무에 잘 먹어서 폐루프 벨트가 문제없이 작동합니다.

팬/틸트 시스템 최종 조립을 시작했습니다. 먼저 볼트로 틸트 모터를 고정하고 두 베어링을 제자리에 넣은 뒤 에폭시로 슬롯에 고정했습니다. 틸트 플랫폼을 팬 플랫폼에 8mm 볼트로 고정하면서 동시에 80톱니 풀리와 타이밍 벨트도 부착했습니다.

팬/틸트 기능이 있는 DIY 모터라이즈드 카메라 슬라이더 - 아두이노 제어 프로젝트

벨트가 좀 느슨해 보였지만 스테퍼 모터 볼트가 들어가는 자리에 작은 베어링을 추가해 벨트 텐셔너 역할을 하게 했습니다. 이 방법으로 벨트에 충분한 텐션이 생겨 제대로 작동했습니다.

팬 모터를 고정하고 레벨링 플랫폼 위아래에 베어링을 추가했습니다. 볼트를 관통시키고 스러스트 베어링, 80톱니 풀리, 타이밍 벨트를 넣고 그 위에 앞서 조립한 틸트 헤드를 올렸습니다. 마지막으로 볼트로 고정하면 슬라이더 제작이 완료됩니다.

팬/틸트 기능이 있는 DIY 모터라이즈드 카메라 슬라이더 - 아두이노 제어 프로젝트

회로도

이제 전자 부품 설치라는 재미있는 부분입니다. 이 DIY 카메라 슬라이더 프로젝트의 회로도입니다.

팬/틸트 기능이 있는 DIY 모터라이즈드 카메라 슬라이더 - 아두이노 제어 프로젝트

세 개의 NEMA 17 스테퍼 모터를 세 개의 A4988 스테퍼 드라이버로 제어합니다. 슬라이더 이동 제어용으로 아두이노 아날로그 입력에 연결된 포텐쇼미터, 팬/틸트 헤드 제어용으로 두 개의 포텐쇼미터로 구성된 조이스틱 모듈(두 개의 아날로그 입력 연결)을 사용합니다. 자동 이동 시 인/아웃 위치 간 속도 설정을 위한 포텐쇼미터도 하나 더 있습니다. 이 인/아웃 위치는 풀업 저항이 있는 푸시 버튼으로 설정합니다. 이 푸시 버튼은 아두이노 디지털 핀에 연결됩니다. 리셋 푸시 버튼, 전원 스위치, 전원 잭, 슬라이더용 리미트 스위치, 인/아웃 상태 표시용 LED 두 개도 있습니다. 9V 또는 12V로 전원 공급 가능합니다.

이 프로젝트에 필요한 구성품은 아래 링크에서 구할 수 있습니다:

  • 스테퍼 모터 (NEMA17)
  • A4988 스테퍼 드라이버
  • 12V 2A 어댑터
  • 조이스틱
  • 전원 잭
  • 아두이노 보드

PCB 설계

회로도에 따라 전자 부품을 정리하기 위해 커스텀 PCB를 설계했습니다.

팬/틸트 기능이 있는 DIY 모터라이즈드 카메라 슬라이더 - 아두이노 제어 프로젝트

EasyEDA 무료 온라인 회로 설계 소프트웨어로 설계했습니다. 연결이 꽤 많아서 탑과 바텀 레이어를 모두 사용해 기능적이고 깔끔한 PCB를 만들었습니다. 설계가 끝나면 PCB 제조용 거버 파일을 생성합니다. JLCPCB(이 튜토리얼의 후원사)에 PCB를 주문했습니다.

팬/틸트 기능이 있는 DIY 모터라이즈드 카메라 슬라이더 - 아두이노 제어 프로젝트

거버 파일을 업로드하면 거버 뷰어에서 PCB를 다시 검토할 수 있습니다. 모든 게 정상이면 원하는 PCB 속성을 선택하고 합리적인 가격에 주문합니다. JLCPCB 첫 주문 시 최대 10개 PCB를 단 2달러에 받을 수 있습니다.

팬/틸트 기능이 있는 DIY 모터라이즈드 카메라 슬라이더 - 아두이노 제어 프로젝트

일주일 후 PCB가 도착했습니다. 품질이 훌륭하고 직접 설계한 PCB가 제조되어 온 것이 매우 만족스럽습니다.

팬/틸트 기능이 있는 DIY 모터라이즈드 카메라 슬라이더 - 아두이노 제어 프로젝트

전자 부품 조립

이제 전자 부품을 조립합니다. PCB에 핀 헤더를 납땜해 부품을 쉽게 연결/분리할 수 있게 했습니다. 커패시터와 저항은 PCB에 직접 납땜하고 나머지는 모두 핀 헤더를 사용했습니다. 따라서 모든 전자 부품에 점퍼 와이어를 납땜했습니다.

이렇게 하면 부품을 컨트롤러 케이스에 쉽게 장착하면서 동시에 PCB에 연결할 수 있습니다.

팬/틸트 기능이 있는 DIY 모터라이즈드 카메라 슬라이더 - 아두이노 제어 프로젝트

컨트롤러 케이스는 모든 전자 부품의 아름다움을 보이기 위해 4mm 두께의 투명 아크릴로 만들었습니다. 원형 톱으로 케이스 패널을 크기에 맞게 자르고, 드릴과 포스너 비트로 전면 패널에 버튼, 포텐쇼미터, 전원 스위치, 조이스틱용 구멍을 뚫었습니다. 5분 에폭시로 케이스를 조립했고, 상단에는 볼트 두 개를 끼워 넣고 접착한 뒤 전면 패널을 너트로 고정할 수 있게 했습니다.

팬/틸트 기능이 있는 DIY 모터라이즈드 카메라 슬라이더 - 아두이노 제어 프로젝트

아두이노 보드와 A4988 스테퍼 드라이버를 PCB에 장착한 뒤 전면 패널에 버튼과 다른 부품들을 장착하고 고정했습니다.

팬/틸트 기능이 있는 DIY 모터라이즈드 카메라 슬라이더 - 아두이노 제어 프로젝트

부품들을 고정한 후 PCB의 적절한 핀 헤더에 연결했습니다. 케이스 측면 패널에 전원 잭을 달고 PCB를 케이스에 넣었습니다. 같은 패널에 구멍을 뚫어 드라이버와 스테퍼 모터, 리미트 스위치(슬라이더 끝부분에 위치) 연결용 점퍼 와이어를 통과시켰습니다.

팬/틸트 기능이 있는 DIY 모터라이즈드 카메라 슬라이더 - 아두이노 제어 프로젝트

열수축 튜브로 컨트롤러 케이스에서 나오는 점퍼 와이어들을 정리하고, 컨트롤러를 세 개의 스테퍼 모터와 리미트 스위치에 연결했습니다.

팬/틸트 기능이 있는 DIY 모터라이즈드 카메라 슬라이더 - 아두이노 제어 프로젝트

슬라이더 전원으로는 3.7V 리튬이온 배터리 세 개를 직렬 연결해 약 11V를 만들었습니다. 이제 슬라이더가 완성되어 완벽하게 작동합니다.

팬/틸트 기능이 있는 DIY 모터라이즈드 카메라 슬라이더 - 아두이노 제어 프로젝트

DIY 카메라 슬라이더 아두이노 코드

이제 아두이노 코드를 살펴보고 프로그램이 어떻게 작동하는지 설명하겠습니다. 코드가 좀 길어서 이해를 돕기 위해 섹션별로 소스 코드를 올리고 각 섹션에 설명을 달겠습니다. 글 마지막에 전체 소스 코드를 올리겠습니다.

이 프로그램은 마이크 맥컬리의 AccelStepper 라이브러리 기반입니다. 이 라이브러리는 여러 스테퍼 모터를 동시에 쉽게 제어할 수 있게 해주는 놀라운 라이브러리입니다. 이 라이브러리와 그 일부인 MultiStepper.h를 포함시킨 후, 사용할 모든 아두이노 핀을 정의하고 스테퍼 인스턴스, 프로그램에 필요한 변수들을 정의합니다.

#include <AccelStepper.h> 
#include <MultiStepper.h> 
#define JoyX A0 // 조이스틱 X 핀 
#define JoyY A1 // 조이스틱 Y 핀 
#define slider A2 // 슬라이더 포텐쇼미터 
#define inOutPot A3 // 인/아웃 속도 포텐쇼미터 
#define JoySwitch 10 // 조이스틱 스위치 연결 
#define InOutSet 12 // 설정 버튼 
#define limitSwitch 11 
#define inLED 8 
#define outLED 9 
// 스테퍼 모터와 사용할 핀 정의 
AccelStepper stepper1(1, 7, 6); // (Type:driver, STEP, DIR) 
AccelStepper stepper2(1, 5, 4); 
AccelStepper stepper3(1, 3, 2); 
MultiStepper StepperControl; // MultiStepper 인스턴스 생성 
long gotoposition[3]; // 각 스테퍼 모터의 인/아웃 위치 저장용 배열 
int JoyXPos = 0; 
int JoyYPos = 0; 
int sliderPos = 0; 
int currentSpeed = 100; 
int inOutSpeed = 100; 
int XInPoint = 0; 
int YInPoint = 0; 
int ZInPoint = 0; 
int XOutPoint = 0; 
int YOutPoint = 0; 
int ZOutPoint = 0; 
int InandOut = 0;

setup 섹션에서는 스테퍼의 초기 속도값을 설정하고 핀 모드를 정의하며, 세 개의 스테퍼를 "StepperControl"이라는 멀티 스테퍼 제어 인스턴스에 추가합니다. while 루프를 사용해 슬라이더를 초기 위치로 이동시키는데, 리미트 스위치가 눌릴 때까지 이동한 뒤 200스텝 뒤로 이동해 리미트 스위치를 해제합니다.

void setup() { 
  // 스테퍼 초기 속도값 설정 
  stepper1.setMaxSpeed(3000); 
  stepper1.setSpeed(200); 
  stepper2.setMaxSpeed(3000); 
  stepper2.setSpeed(200); 
  stepper3.setMaxSpeed(3000); 
  stepper3.setSpeed(200); 
  pinMode(JoySwitch, INPUT_PULLUP); 
  pinMode(InOutSet, INPUT_PULLUP); 
  pinMode(limitSwitch, INPUT_PULLUP); 
  pinMode(inLED, OUTPUT); 
  pinMode(outLED, OUTPUT); 
  // MultiStepper 인스턴스 생성 - 3개 스테퍼를 StepperControl 인스턴스에 추가 
  StepperControl.addStepper(stepper1); 
  StepperControl.addStepper(stepper2); 
  StepperControl.addStepper(stepper3); 
  // 슬라이더를 초기 위치로 이동 - 호밍 
  while (digitalRead(limitSwitch) != 0) { 
    stepper1.setSpeed(3000); 
    stepper1.runSpeed(); 
    stepper1.setCurrentPosition(0); // 리미트 스위치 눌리면 위치를 0 스텝으로 설정 
  } 
  delay(20); 
  // 리미트 스위치에서 200 스텝 뒤로 이동 
  while (stepper1.currentPosition() != -200) { 
    stepper1.setSpeed(-3000); 
    stepper1.run(); 
  } 
}

loop 섹션에서는 슬라이더가 리미트 위치(리미트 스위치 또는 반대쪽 80cm)에 도달했는지 먼저 확인합니다.

// 이동 제한 - 리미트 스위치 눌리거나 반대 방향 이동 거리가 80cm 초과하면 아무것도 안 함 
while (digitalRead(limitSwitch) == 0 || stepper1.currentPosition() < -64800) {}

다음 if 문에서는 조이스틱 스위치를 누를 때마다 팬/틸트 속도를 높입니다.

// 조이스틱 눌리면 팬/틸트 속도 증가 
if (digitalRead(JoySwitch) == 0) { 
  currentSpeed = currentSpeed + 50; 
  delay(200); 
}

설정 버튼(Set button)을 눌렀는지 확인합니다. 이 버튼은 인(IN)과 아웃(OUT) 위치를 설정하는 데 쓰입니다. 첫 번째 누름으로 스테퍼 모터들의 인(IN) 위치를 저장하고 인(IN) LED를 켭니다.

switch (InandOut) { 
  case 0: // 인(IN) 위치 설정 
    InandOut = 1; 
    XInPoint = stepper1.currentPosition(); // 스테퍼 1의 인 위치 설정 
    YInPoint = stepper2.currentPosition(); // 스테퍼 2의 인 위치 설정 
    ZInPoint = stepper3.currentPosition(); // 스테퍼 3의 인 위치 설정 
    digitalWrite(inLED, HIGH); // 인 LED 켜기 
    break;

두 번째 누름으로 아웃(OUT) 위치를 저장하고 아웃(OUT) LED를 켭니다.

  case 1: // 아웃(OUT) 위치 설정 
    InandOut = 2; 
    XOutPoint = stepper1.currentPosition(); // 두 스테퍼의 아웃 포인트 설정 
    YOutPoint = stepper2.currentPosition(); 
    ZOutPoint = stepper3.currentPosition(); 
    digitalWrite(outLED, HIGH); 
    break;

세 번째 누름(케이스 2)에서는 자동 속도 포텐쇼미터 값을 읽어 모터 최대 속도로 사용합니다. 인(IN) 위치를 "gotoposition" 배열에 넣고, 이 배열은 각 스테퍼별 필요 속도를 계산하는 moveTo() 함수에서 사용합니다. runSpeedToPosition() 함수로 슬라이더가 자동으로 인(IN) 위치로 이동합니다.

  case 2: // 인(IN) 위치로 이동 / 케이스 3으로 
    InandOut = 3; 
    inOutSpeed = analogRead(inOutPot); // 자동 속도 포텐쇼미터 
    // 인(IN) 위치를 배열에 저장 
    gotoposition[0] = XInPoint; 
    gotoposition[1] = YInPoint; 
    gotoposition[2] = ZInPoint; 
    stepper1.setMaxSpeed(inOutSpeed); 
    stepper2.setMaxSpeed(inOutSpeed); 
    stepper3.setMaxSpeed(inOutSpeed); 
    StepperControl.moveTo(gotoposition); // 모든 모터에 필요한 속도 계산 
    StepperControl.runSpeedToPosition(); // 모든 스테퍼가 위치할 때까지 블로킹 
    delay(200); 
    break;

똑같은 방식으로 케이스 3(버튼 한 번 더 누름)에서는 아웃(OUT) 위치로 이동합니다.

  case 3: // 아웃(OUT) 위치로 이동 / 케이스 2로 돌아감 
    InandOut = 2; 
    inOutSpeed = analogRead(inOutPot); 
    // 아웃(OUT) 위치를 배열에 저장 
    gotoposition[0] = XOutPoint; 
    gotoposition[1] = YOutPoint; 
    gotoposition[2] = ZOutPoint; 
    stepper1.setMaxSpeed(inOutSpeed); 
    stepper2.setMaxSpeed(inOutSpeed); 
    stepper3.setMaxSpeed(inOutSpeed); 
    StepperControl.moveTo(gotoposition); 
    StepperControl.runSpeedToPosition(); 
    delay(200); 
    break;

설정 버튼을 0.5초 이상 길게 누르면 4번 케이스가 실행돼 인/아웃 위치를 리셋해 새로운 위치를 설정할 수 있게 합니다.

다음은 조이스틱 팬/틸트 제어입니다. 조이스틱에서 얻는 아날로그 값은 0~1024이고, 중앙에 있을 때는 약 500입니다. 조이스틱을 왼쪽으로 움직여 아날로그 값이 600보다 크면 해당 모터 속도를 양수로 설정하고, 오른쪽으로 움직여 400보다 작으면 음수로 설정해 반대 방향으로 회전시킵니다.

// 조이스틱 X - 팬 움직임 
JoyXPos = analogRead(JoyX); 
// 조이스틱을 왼쪽으로 움직이면 스테퍼 2(팬)를 왼쪽으로 
if (JoyXPos > 600) { 
  stepper2.setSpeed(currentSpeed); 
} 
// 조이스틱을 오른쪽으로 움직이면 스테퍼 2(팬)를 오른쪽으로 
else if (JoyXPos < 400) { 
  stepper2.setSpeed(-currentSpeed); 
} 
// 조이스틱이 중앙에 있으면 움직임 없음 
else { 
  stepper2.setSpeed(0); 
}

중앙에 있으면 속도를 0으로 설정합니다. 이 방식은 조이스틱의 양축과 슬라이더 포텐쇼미터 모두에 적용됩니다. 포텐쇼미터의 경우 아날로그 값을 사용해 포텐쇼미터를 더 돌릴수록 모터 속도도 빨라지게 합니다.

// 슬라이더 포텐쇼미터 
sliderPos = analogRead(slider); 
// 포텐쇼미터를 왼쪽으로 돌리면 슬라이더 왼쪽 이동 
if (sliderPos > 600) { 
  sliderPos = map(sliderPos, 600, 1024, 0, 3000); 
  stepper1.setSpeed(sliderPos); // 돌릴수록 속도 증가 
} 
// 포텐쇼미터를 오른쪽으로 돌리면 슬라이더 오른쪽 이동 
else if (sliderPos < 400 ) { 
  sliderPos = map(sliderPos, 400, 0, 0, 3000); 
  stepper1.setSpeed(-sliderPos); // 돌릴수록 속도 증가 
} 
// 포텐쇼미터가 중앙에 있으면 움직임 없음 
else { 
  stepper1.setSpeed(0); 
}

마지막으로 세 스테퍼 모터 각각에 대해 runSpeed() 함수를 호출해 위 명령들을 실행합니다(모터를 적절히 회전시킴).

// 위 명령 실행 - 스테퍼 모터 구동 
stepper1.runSpeed(); 
stepper2.runSpeed(); 
stepper3.runSpeed();

전체 소스 코드는 다음과 같습니다:

/* 팬/틸트 헤드가 있는 DIY 카메라 슬라이더 by Dejan Nedelkovski www.HowToMechatronics.com 라이브러리 - AccelStepper by Mike McCauley: https://www.airspayce.com/mikem/arduino/AccelStepper/index.html */ 
#include <AccelStepper.h> 
#include <MultiStepper.h> 
#define JoyX A0 // 조이스틱 X 핀 
#define JoyY A1 // 조이스틱 Y 핀 
#define slider A2 // 슬라이더 포텐쇼미터 
#define inOutPot A3 // 인/아웃 속도 포텐쇼미터 
#define JoySwitch 10 // 조이스틱 스위치 연결 
#define InOutSet 12 // 설정 버튼 
#define limitSwitch 11 
#define inLED 8 
#define outLED 9 
// 스테퍼 모터와 사용할 핀 정의 
AccelStepper stepper1(1, 7, 6); // (Type:driver, STEP, DIR) 
AccelStepper stepper2(1, 5, 4); 
AccelStepper stepper3(1, 3, 2); 
MultiStepper StepperControl; // MultiStepper 인스턴스 생성 
long gotoposition[3]; // 각 스테퍼 모터의 인/아웃 위치 저장용 배열 
int JoyXPos = 0; 
int JoyYPos = 0; 
int sliderPos = 0; 
int currentSpeed = 100; 
int inOutSpeed = 100; 
int XInPoint = 0; 
int YInPoint = 0; 
int ZInPoint = 0; 
int XOutPoint = 0; 
int YOutPoint = 0; 
int ZOutPoint = 0; 
int InandOut = 0; 
void setup() { 
  // 스테퍼 초기 속도값 설정 
  stepper1.setMaxSpeed(3000); 
  stepper1.setSpeed(200); 
  stepper2.setMaxSpeed(3000); 
  stepper2.setSpeed(200); 
  stepper3.setMaxSpeed(3000); 
  stepper3.setSpeed(200); 
  pinMode(JoySwitch, INPUT_PULLUP); 
  pinMode(InOutSet, INPUT_PULLUP); 
  pinMode(limitSwitch, INPUT_PULLUP); 
  pinMode(inLED, OUTPUT); 
  pinMode(outLED, OUTPUT); 
  // MultiStepper 인스턴스 생성 - 3개 스테퍼를 StepperControl 인스턴스에 추가 
  StepperControl.addStepper(stepper1); 
  StepperControl.addStepper(stepper2); 
  StepperControl.addStepper(stepper3); 
  // 슬라이더를 초기 위치로 이동 - 호밍 
  while (digitalRead(limitSwitch) != 0) { 
    stepper1.setSpeed(3000); 
    stepper1.runSpeed(); 
    stepper1.setCurrentPosition(0); // 리미트 스위치 눌리면 위치를 0 스텝으로 설정 
  } 
  delay(20); 
  // 리미트 스위치에서 200 스텝 뒤로 이동 
  while (stepper1.currentPosition() != -200) { 
    stepper1.setSpeed(-3000); 
    stepper1.run(); 
  } 
} 
void loop() { 
  // 이동 제한 - 리미트 스위치 눌리거나 반대 방향 이동 거리가 80cm 초과하면 아무것도 안 함 
  while (digitalRead(limitSwitch) == 0 || stepper1.currentPosition() < -64800) {} 
  // 조이스틱 눌리면 팬/틸트 속도 증가 
  if (digitalRead(JoySwitch) == 0) { 
    currentSpeed = currentSpeed + 50; 
    delay(200); 
  } 
  // 설정 버튼 눌림 - 스위치 케이스 토글 
  if (digitalRead(InOutSet) == 0) { 
    delay(500); // 설정 버튼을 0.5초 이상 길게 누르면 인/아웃 위치 리셋 
    if (digitalRead(InOutSet) == 0) { 
      InandOut = 4; 
    } 
    switch (InandOut) { 
      case 0: // 인(IN) 위치 설정 
        InandOut = 1; 
        XInPoint = stepper1.currentPosition(); 
        YInPoint = stepper2.currentPosition(); 
        ZInPoint = stepper3.currentPosition(); 
        digitalWrite(inLED, HIGH); 
        break; 
      case 1: // 아웃(OUT) 위치 설정 
        InandOut = 2; 
        XOutPoint = stepper1.currentPosition(); 
        YOutPoint = stepper2.currentPosition(); 
        ZOutPoint = stepper3.currentPosition(); 
        digitalWrite(outLED, HIGH); 
        break; 
      case 2: // 인(IN) 위치로 이동 / 케이스 3으로 
        InandOut = 3; 
        inOutSpeed = analogRead(inOutPot); 
        gotoposition[0] = XInPoint; 
        gotoposition[1] = YInPoint; 
        gotoposition[2] = ZInPoint; 
        stepper1.setMaxSpeed(inOutSpeed); 
        stepper2.setMaxSpeed(inOutSpeed); 
        stepper3.setMaxSpeed(inOutSpeed); 
        StepperControl.moveTo(gotoposition); 
        StepperControl.runSpeedToPosition(); 
        delay(200); 
        break; 
      case 3: // 아웃(OUT) 위치로 이동 / 케이스 2로 돌아감 
        InandOut = 2; 
        inOutSpeed = analogRead(inOutPot); 
        gotoposition[0] = XOutPoint; 
        gotoposition[1] = YOutPoint; 
        gotoposition[2] = ZOutPoint; 
        stepper1.setMaxSpeed(inOutSpeed); 
        stepper2.setMaxSpeed(inOutSpeed); 
        stepper3.setMaxSpeed(inOutSpeed); 
        StepperControl.moveTo(gotoposition); 
        StepperControl.runSpeedToPosition(); 
        delay(200); 
        break; 
      case 4: // 설정 버튼을 0.5초 이상 길게 누르면 케이스 0으로 
        InandOut = 0; 
        digitalWrite(inLED, LOW); 
        digitalWrite(outLED, LOW); 
        delay(1000); 
        break; 
    } 
  } 
  // 조이스틱 X - 팬 움직임 
  JoyXPos = analogRead(JoyX); 
  if (JoyXPos > 600) { 
    stepper2.setSpeed(currentSpeed); 
  } 
  else if (JoyXPos < 400) { 
    stepper2.setSpeed(-currentSpeed); 
  } 
  else { 
    stepper2.setSpeed(0); 
  } 
  // 조이스틱 Y - 틸트 움직임 
  JoyYPos = analogRead(JoyY); 
  if (JoyYPos > 600) { 
    stepper3.setSpeed(currentSpeed); 
  } 
  else if (JoyYPos < 400) { 
    stepper3.setSpeed(-currentSpeed); 
  } 
  else { 
    stepper3.setSpeed(0); 
  } 
  // 슬라이더 포텐쇼미터 
  sliderPos = analogRead(slider); 
  if (sliderPos > 600) { 
    sliderPos = map(sliderPos, 600, 1024, 0, 3000); 
    stepper1.setSpeed(sliderPos); 
  } 
  else if (sliderPos < 400 ) { 
    sliderPos = map(sliderPos, 400, 0, 0, 3000); 
    stepper1.setSpeed(-sliderPos); 
  } 
  else { 
    stepper1.setSpeed(0); 
  } 
  // 위 명령 실행 - 스테퍼 모터 구동 
  stepper1.runSpeed(); 
  stepper2.runSpeed(); 
  stepper3.runSpeed(); 
}

이상으로 튜토리얼을 마칩니다. 이 아두이노 프로젝트를 즐기셨고 새로운 것을 배우셨기를 바랍니다. 아래 댓글 섹션에서 자유롭게 질문해 주시고 제 아두이노 프로젝트 모음도 확인해 보세요.

제조공정

  1. 블루투스 지원 아두이노 모터라이즈드 카메라 슬라이더로 매끄러운 시네마틱 샷 촬영하기
  2. 아두이노로 모니터 앰비라이트(Ambilight) 시스템 직접 만들기
  3. 파이썬 연동 아두이노 RFID 출석 관리 시스템 구축하기
  4. 아두이노와 스마트폰으로 만드는 스마트 전압계 – 초간단 DIY 프로젝트
  5. 아두이노와 노키아 5110 LCD로 만드는 DIY 전압계 - 단계별 가이드
  6. 아두이노 나노 + 128x64 OLED로 실시간 셀룰러 오토마타 (생명 게임) 구현
  7. 아두이노 고속 RPM 카운터 – 레이저 + IR 센서 싱글샷 알고리즘으로 40ms 초고속 측정
  8. 아두이노 나노와 RDA8057M으로 소형 FM 라디오 만들기
  9. 아두이노와 구글 시트로 구현하는 실시간 RFID 출석 시스템
  10. 아두이노로 음악 톤 만들기: 88키 피아노 음계 구현 가이드