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

팬 및 틸트 헤드가 있는 DIY 카메라 슬라이더 – Arduino 기반 프로젝트

<메인 클래스="사이트-메인" id="메인">

이 튜토리얼에서는 팬 및 틸트 헤드가 있는 전동 카메라 슬라이더를 만드는 방법을 배웁니다. 이 Arduino 기반 프로젝트는 100% DIY이며 MDF 및 합판과 같은 저렴한 재료로 제작되고 Arduino, 3개의 스테퍼 모터, 일부 버튼 및 맞춤형 설계 PCB에 부착된 조이스틱을 사용하여 제어됩니다. 그럼에도 불구하고 매우 부드러운 카메라 움직임으로 전문가 수준의 영화 같은 장면을 얻을 수 있어 최종 결과는 매우 인상적입니다.

다음 비디오를 보거나 아래에 작성된 튜토리얼을 읽을 수 있습니다.

개요

컨트롤러를 사용하여 수동으로 카메라를 움직이거나 시작점과 끝점을 설정하면 카메라가 자동으로 한 위치에서 다른 위치로 이동할 수 있습니다. 또한 지지 암을 사용하여 더 작은 삼각대에도 원하는 각도로 슬라이더를 장착할 수 있으며 여전히 안정적인 움직임을 얻을 수 있습니다.

우선 3D 모델링 소프트웨어를 사용하여 슬라이더를 디자인했습니다.

이 3D 모델을 찾아 다운로드하고 아래의 3D 모델에서 모든 치수를 얻을 수 있을 뿐만 아니라 Thangs의 브라우저에서 탐색할 수 있습니다.

Thangs에서 어셈블리 3D 모델을 다운로드합니다.

3D 인쇄된 GT2 풀리 링크:

 Thingiverse

카메라 슬라이더 만들기

그래서 22mm 틱 구리 파이프를 사용하는 슬라이더 레일을 만드는 것으로 시작했습니다. 슬라이더를 1미터 길이로 만들기로 해서 1미터 길이로 두 조각을 자릅니다. 구리 파이프는 쉽게 산화될 수 있으므로 금속 광택제로 연마해야 합니다. 제 경우에는 치약이 없어서 치약을 사용했습니다.

이것은 완벽한 솔루션은 아니었지만 차이점을 알 수 있었고 파이프가 조금 더 깨끗해졌습니다.

그런 다음 두 개의 파이프가 부착될 나무 받침대를 만드는 작업을 진행했으며 슬라이더를 삼각대에 장착하는 역할도 합니다. 원형 톱을 사용하여 21mm 눈금 합판 두 조각을 자르고 하나의 티커 조각을 얻기 위해 함께 붙였습니다. 그런 다음 단단한 나무를 사용하여 삼각대 장착판을 복제하고 목공풀과 나사를 사용하여 합판 조각에 부착했습니다. 이제 슬라이더 베이스를 삼각대에 쉽게 장착할 수 있습니다.

슬라이더 레일을 8mm 나사 막대를 사용하여 베이스에 장착할 것이므로 베이스에 두 개의 구멍을 만들고 이전에 크기에 맞게 자른 138mm 길이의 막대를 삽입했습니다. 다음으로 파이프에 8mm 눈금 구멍을 뚫어야 했는데 실제로 약간 까다로울 수 있습니다.

이를 위해 연필을 파이프 지름의 절반인 11mm 높이로 올리는 간단한 지그를 만들었습니다. 그런 다음 평평한 표면에 파이프를 고정하고 양쪽에서 파이프를 표시하는 지그를 사용합니다. 이렇게 하면 양쪽에서 정확하게 하강된 구멍을 얻을 수 있습니다. 그래서 먼저 날카로운 나사 팁으로 드릴링 지점을 표시한 다음 2, 4, 6 및 8mm 드릴 비트를 사용하여 점진적으로 드릴링했습니다.

그 후 나사산 막대를 통해 레일을 삽입하고 일부 와셔와 너트를 사용하여 슬라이더 베이스에 고정했습니다. 비슷한 방법으로 합판과 나사 막대를 사용하여 레일 끝을 고정했습니다.

다음은 슬라이딩 플랫폼입니다. 다시 8mm 눈금 MDF 보드를 3D 모델에 따라 크기로 자르기 위해 원형 톱을 사용했습니다. 또한 베어링을 부착할 나사산 막대를 위해 8mm 구멍을 만들었습니다. 플랫폼을 조립하기 위해 목공풀과 나사를 사용했습니다. 무선 드릴을 사용하여 먼저 파일럿 구멍을 만든 다음 카운터 싱크를 만들고 제자리에 3mm 나사를 조였습니다.

패널이 고정되면 베어링 시스템 조립을 계속했습니다. 제가 사용하고 있는 베어링은 608Z 외경 22mm입니다. 2개의 와셔와 2개의 베어링 사이에 너트가 있어 충분한 간격을 유지하여 22mm 레일과의 밀착이 잘 됩니다.

비스듬히 슬라이더를 사용할 때 플랫폼을 더 안전하게 만들기 위해 비슷한 방식으로 플랫폼 하단에 두 세트의 베어링을 더 삽입했습니다. 결국 슬라이딩 플랫폼은 완벽하게 작동하는 것으로 나타났습니다.

여기서 우리는 이제 소형 삼각대가 아닌 소형 삼각대의 슬라이더를 따라 플랫폼을 움직일 때 헤드가 플랫폼의 무게를 지탱할 수 없다는 것을 알 수 있습니다. 그래서 슬라이더를 안정화하기 위해 지지 암을 만들어야 했습니다. 그래서 두 조각의 나무와 약간의 너트와 볼트를 사용하여 삼각대 다리 중 하나에 고정할 수 있는 간단한 클램프를 만들었습니다.

클램프에는 지지 암을 고정할 수 있는 볼트가 있습니다. 다음으로 슬라이더를 다른 각도로 배치할 수 있도록 지지 암에 슬롯을 만들어야 했습니다. 저는 6mm 구멍을 서로 가깝게 여러 개 뚫고 갈고리를 사용하여 가는 직선을 만들어 슬롯을 만들었습니다. 이 지원 시스템은 완벽하게 작동했습니다.

삼각대를 사용하고 싶지 않거나 사용해야 하는 경우를 대비하여 슬라이더에 다리를 추가하여 이 빌드를 계속했습니다. 8mm MDF로 만들었습니다. 톱과 줄을 사용하여 원하는 다리 모양을 쉽게 얻었습니다. 그런 다음 약간의 접착제와 두 개의 너트를 사용하여 슬라이더 끝에 고정했습니다.

다음 단계는 슬라이딩 플랫폼 상단에 부착될 팬 및 틸트 시스템을 구축하는 것입니다. 원형 톱을 사용하여 3D 모델에서 가져온 치수로 필요한 모든 조각을 자릅니다. 슬라이더를 비스듬히 놓았을 때 카메라의 레벨링 플랫폼의 힌지 기구를 만들기 위해 합판 몇 장을 사용했고, 그 위에 모터와 패닝 시스템을 위한 베어링에 적절한 구멍을 만든 MDF 보드를 몇 개 사용했습니다.

슬라이딩 플랫폼용 스테퍼 모터와 타이밍 벨트 설치를 진행했습니다. 플랫폼의 한쪽에는 MDF 보드 조각과 나사 및 볼트로 스테퍼 모터를 고정했습니다. 그리고 슬라이더의 다른 쪽에는 아이들러 풀리를 고정하여 이제 타이밍 벨트를 설치할 수 있습니다. 두 개의 볼트와 집타이를 사용하여 타이밍 벨트를 슬라이딩 플랫폼에 쉽게 고정했습니다.

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

팬과 틸트 시스템의 윗부분을 계속 만들었습니다. 3D 모델에 따르면 스테퍼 모터와 베어링에 적절한 구멍을 모두 만들고 모든 것을 함께 붙이고 나사로 조였습니다.

내 친구가 나를 위해 2개의 80 톱니 도르래를 3D로 인쇄했습니다. 이 방법으로 스테퍼 모터에 부착된 16개의 톱니 풀리에 비해 5배의 속도 감소를 얻었습니다.

이제 내 설정에 따라 폐쇄 루프 타이밍 벨트를 만들어야했기 때문에 필요한 벨트 길이를 측정하고 절단 한 다음 CA 접착제로 붙이고 그 위에 테이프를 추가했습니다. CA 접착제는 고무를 잘 사용하므로 폐쇄 루프 벨트가 문제 없이 작동합니다.

다음으로 팬 및 틸트 시스템의 최종 조립을 시작했습니다. 먼저 몇 개의 볼트를 사용하여 틸트 모터를 고정한 다음 에폭시로 슬롯에 고정하면서 두 개의 베어링을 제자리에 추가했습니다. 그런 다음 8mm 볼트를 사용하여 팬 플랫폼에 틸트 플랫폼을 고정하고 동시에 타이밍 벨트와 함께 80 톱니 풀리를 팬 플랫폼에 부착했습니다.

여기서 나는 벨트가 약간 느슨하다는 것을 알아차렸지만 스테퍼 모터 볼트가 벨트 텐셔너 역할을 하는 곳에 작은 베어링을 추가했습니다. 이 문제가 해결되어 이제 벨트가 제대로 작동하기에 충분한 장력을 갖게 되었습니다.

다음으로 팬 모터를 고정하고 레벨링 플랫폼의 상단과 하단에 베어링을 추가했습니다. 그런 다음 볼트를 삽입하고 스러스트 베어링, 80 톱니 풀리 및 타이밍 벨트를 추가하고 그 위에 이전에 조립한 틸트 헤드를 추가합니다. 마지막으로 볼트로 고정하고 이 단계로 슬라이더 구성이 완료됩니다.

회로도

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

따라서 3개의 NEMA 17 스테퍼 모터는 3개의 A4988 스테퍼 드라이버를 통해 제어됩니다. 슬라이더 움직임을 제어하기 위해 Arduino의 아날로그 입력에 연결된 전위차계를 사용하고 팬 및 틸트 헤드를 제어하기 위해 실제로 두 개의 전위차계로 구성된 조이스틱 모듈을 사용하므로 두 개의 아날로그 입력에 연결됩니다. 인 및 아웃 위치에서 자동 이동 속도를 설정하는 데 사용되는 또 다른 전위차계가 있습니다. 이러한 인 및 아웃 위치는 푸시 버튼의 도움으로 설정됩니다. 이 푸시 버튼에는 풀업 저항이 있으며 Arduino 보드의 디지털 핀에 연결됩니다. 리셋 푸시 버튼, 전원 스위치, 전원 잭, 슬라이더용 리미트 스위치, 인/아웃 상태를 표시하기 위한 2개의 LED도 있습니다. 9V 또는 12V로 이 프로젝트에 전원을 공급할 수 있습니다.

아래 링크에서 이 프로젝트에 필요한 구성요소를 얻을 수 있습니다.

PCB 디자인

다음으로 회로도에 따라 전자 부품을 정리하기 위해 맞춤형 PCB를 설계했습니다.

EasyEDA 무료 온라인 회로 설계 소프트웨어를 사용하여 그렇게 했습니다. 회로는 꽤 많은 연결이 있었기 때문에 상단과 하단 레이어를 모두 사용하여 기능적이고 보기 좋은 PCB를 얻을 수 있었습니다. 이 단계가 끝나면 PCB 제조에 ​​필요한 Gerber 파일을 생성했습니다. 그런 다음 실제로 이 튜토리얼의 후원자인 JLCPCB에서 PCB를 주문했습니다.

여기에서 간단히 Gerber 파일을 업로드할 수 있으며 업로드되면 Gerber 뷰어에서 PCB를 다시 검토할 수 있습니다. 모든 것이 정상이면 계속해서 PCB에 대해 원하는 속성을 선택한 다음 합리적인 가격에 PCB를 주문할 수 있습니다. JLCPCB에서 처음 주문하는 경우 단돈 2달러에 최대 10개의 PCB를 얻을 수 있습니다.

그럼에도 불구하고 일주일 후에 PCB가 도착했습니다. PCB의 품질은 훌륭하고 자신의 PCB 디자인을 제조하는 것이 상당히 만족스럽다는 것을 인정해야 합니다.

전자제품 조립

자, 다음으로 전자 부품 조립으로 넘어갔습니다. 나는 핀 헤더 PCB를 납땜하는 것으로 시작했습니다. 이를 통해 필요할 때 구성 요소를 더 쉽게 연결 및 분리할 수 있습니다. 실제로 PCB에 직접 납땜한 커패시터와 저항을 제외한 모든 것에 핀 헤더를 사용했습니다. 그래서 계속해서 모든 전자 부품에 점퍼 와이어를 납땜했습니다.

이런 식으로 컨트롤러 케이스에 구성 요소를 쉽게 장착하는 동시에 PCB에 연결할 수 있습니다.

컨트롤러 케이스는 모든 전자 부품의 아름다움을 보여주고 싶었기 때문에 4mm 눈금 투명 아크릴로 만들기로 결정했습니다. 원형톱을 사용하여 크기에 맞게 패널을 자릅니다. 그런 다음 드릴과 Forstner 비트를 사용하여 전면 패널에 버튼, 전위차계, 전원 스위치 및 조이스틱용 구멍을 만들었습니다. 그 후 5분 에폭시를 사용하여 케이스를 조립하고, 상단은 전면 패널을 삽입하고 그 위에 너트를 사용하여 고정할 수 있는 볼트 2개를 삽입하고 접착했습니다.

마지막으로 Arduino 보드와 A4988 스테퍼 드라이버를 PCB에 삽입하여 전자 장치를 조립하기 시작했습니다. 그런 다음 전면 패널에 버튼과 기타 구성 요소를 삽입하고 고정하는 작업을 계속했습니다.

일단 고정되면 구성 요소를 PCB의 적절한 핀 헤더에 연결했습니다. 케이스 측면 패널에 전원 잭을 추가한 다음 PCB를 케이스에 삽입했습니다. 같은 패널에는 드라이버와 스테퍼 모터를 연결하기 위한 점퍼 와이어와 슬라이더 끝에 배치한 리미트 스위치를 넣는 구멍도 있습니다.

열수축 튜브를 사용하여 컨트롤러 케이스에서 나오는 점퍼 와이어를 정리하고 마지막으로 컨트롤러와 3개의 스테퍼 모터 및 리미트 스위치를 연결하는 일만 남았습니다.

슬라이더에 전원을 공급하기 위해 직렬로 연결된 3개의 3.7V 리튬 이온 배터리를 사용하여 약 11V를 생성했습니다. 이제 슬라이더가 완성되고 완벽하게 작동합니다.

DIY 카메라 슬라이더 Arduino 코드

이제 이 튜토리얼에서 남은 것은 Arduino 코드를 살펴보고 프로그램이 어떻게 작동하는지 설명하는 것입니다. 코드가 조금 더 길기 때문에 이해를 돕기 위해 프로그램의 소스 코드를 섹션별로 설명과 함께 게시하겠습니다. 그리고 이 기사의 끝에 완전한 소스 코드를 게시할 것입니다.

이 프로그램은 Mike McCauley의 AccelStepper 라이브러리를 기반으로 합니다. 이것은 동시에 여러 스테퍼 모터를 쉽게 제어할 수 있는 놀라운 라이브러리입니다. 따라서 이 라이브러리와 그 일부인 MultiStepper.h 라이브러리를 포함하고 나면 사용할 모든 Arduino 핀을 정의하고 스테퍼에 대한 인스턴스와 아래 프로그램에 필요한 일부 변수를 정의해야 합니다.

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

#define JoyX A0       // Joystick X pin
#define JoyY A1       // Joystick Y pin
#define slider A2     // Slider potentiometer
#define inOutPot A3   // In and Out speed potentiometer
#define JoySwitch 10  // Joystick switch connected
#define InOutSet 12   // Set Button
#define limitSwitch 11
#define inLED 8
#define outLED 9

// Define the stepper motors and the pins the will use
AccelStepper stepper1(1, 7, 6); // (Type:driver, STEP, DIR)
AccelStepper stepper2(1, 5, 4);
AccelStepper stepper3(1, 3, 2);

MultiStepper StepperControl;  // Create instance of MultiStepper

long gotoposition[3]; // An array to store the In or Out position for each stepper motor

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;Code language: Arduino (arduino)

설정 섹션에서 스테퍼의 초기 속도 값을 설정하고 일부 핀 모드를 정의하고 "StepperControl"이라는 다중 스테퍼 제어 인스턴스에 3개의 스테퍼를 추가합니다. while 루프를 사용하여 슬라이더를 초기 위치로 이동하거나 제한 스위치를 누를 때까지 이동한 다음 제한 스위치를 해제하기 위해 200단계 뒤로 이동합니다.

void setup() {
  // Set initial seed values for the steppers
  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);

  // Create instances for MultiStepper - Adding the 3 steppers to the StepperControl instance for multi control
  StepperControl.addStepper(stepper1);
  StepperControl.addStepper(stepper2);
  StepperControl.addStepper(stepper3);

  // Move the slider to the initial position - homing
  while (digitalRead(limitSwitch) != 0) {
    stepper1.setSpeed(3000);
    stepper1.runSpeed();
    stepper1.setCurrentPosition(0); // When limit switch pressed set position to 0 steps
  }
  delay(20);
  // Move 200 steps back from the limit switch
  while (stepper1.currentPosition() != -200) {
    stepper1.setSpeed(-3000);
    stepper1.run();
  }
}Code language: Arduino (arduino)

루프 섹션에서 슬라이더가 리미트 위치에 도달했는지 또는 리미트 스위치 또는 반대쪽의 80cm인지 확인하는 것으로 시작합니다.

// Limiting the movement - Do nothing if limit switch pressed or distance traveled in other direction greater then 80cm
  while (digitalRead(limitSwitch) == 0 || stepper1.currentPosition() < -64800) {}Code language: Arduino (arduino)

다음 if 문으로 조이스틱 스위치를 누를 때마다 Pan 및 Tilt 속도가 증가합니다.

// If Joystick pressed increase the Pan and Tilt speeds
  if (digitalRead(JoySwitch) == 0) {
    currentSpeed = currentSpeed + 50;
    delay(200);
  }Code language: Arduino (arduino)

그런 다음 IN 및 OUT 위치를 설정하는 데 사용되는 설정 버튼을 눌렀는지 확인합니다. 버튼을 처음 누르면 스테퍼 모터의 IN 위치가 저장되고 IN LED도 켜집니다.

switch (InandOut) { 
      case 0:   // Set IN position
        InandOut = 1;
        XInPoint = stepper1.currentPosition(); // Set the IN position for steppers 1
        YInPoint = stepper2.currentPosition(); // Set the IN position for steppers 2
        ZInPoint = stepper3.currentPosition(); // Set the IN position for steppers 3
        digitalWrite(inLED, HIGH); // Light up inLed
        break;Code language: Arduino (arduino)

같은 방식으로 두 번째 푸시로 OUT 위치를 저장하고 OUT LED를 켭니다.

case 1: // Set OUT position
        InandOut = 2;
        XOutPoint = stepper1.currentPosition(); //  Set the OUT Points for both steppers
        YOutPoint = stepper2.currentPosition();
        ZOutPoint = stepper3.currentPosition();
        digitalWrite(outLED, HIGH);
        break;Code language: Arduino (arduino)

그런 다음 다음 버튼을 누르면 모터의 최대 속도를 설정하는 데 사용되는 자동 속도 전위차계의 값을 읽습니다. 또한 IN 위치를 모든 스테퍼에 필요한 속도를 별도로 계산하는 moveTo() 함수에서 사용되는 "gotoposition" 배열에 넣습니다. 그런 다음 runSpeedToPosition() 함수를 사용하여 슬라이더가 자동으로 In 위치로 이동합니다.

case 2: // Move to IN position / go to case 3
        InandOut = 3;
        inOutSpeed = analogRead(inOutPot); // Auto speed potentiometer
        // Place the IN position into the Array
        gotoposition[0] = XInPoint;
        gotoposition[1] = YInPoint;
        gotoposition[2] = ZInPoint;
        stepper1.setMaxSpeed(inOutSpeed);
        stepper2.setMaxSpeed(inOutSpeed);
        stepper3.setMaxSpeed(inOutSpeed);
        StepperControl.moveTo(gotoposition); // Calculates the required speed for all motors
        StepperControl.runSpeedToPosition(); // Blocks until all steppers are in position
        delay(200);
        break;Code language: Arduino (arduino)

정확히 같은 방식으로 3번의 경우 또는 버튼을 다시 누르면 슬라이더를 OUT 위치로 이동합니다.

case 3: // Move to OUT position / go back to case 2
        InandOut = 2;
        inOutSpeed = analogRead(inOutPot);
        // Place the OUT position into the Array
        gotoposition[0] = XOutPoint;
        gotoposition[1] = YOutPoint;
        gotoposition[2] = ZOutPoint;
        stepper1.setMaxSpeed(inOutSpeed);
        stepper2.setMaxSpeed(inOutSpeed);
        stepper3.setMaxSpeed(inOutSpeed);
        StepperControl.moveTo(gotoposition); // Calculates the required speed for all motors
        StepperControl.runSpeedToPosition(); // Blocks until all are in position
        delay(200);
        break;Code language: Arduino (arduino)

Set 버튼을 0.5초 이상 누르고 있으면 4번째 case 문이 실행되어 IN 및 OUT 위치를 재설정하여 새로운 위치를 설정할 수 있습니다.

다음은 조이스틱 팬 및 틸트 컨트롤입니다. 조이스틱에서 얻는 아날로그 값은 0에서 1024 사이이며, 중간에 있을 때 값은 약 500입니다. 따라서 조이스틱을 왼쪽으로 움직이고 아날로그 값이 600보다 크면 속도를 설정합니다. 특정 모터를 양수로, 반대 방향으로 조이스틱을 오른쪽으로 움직이면 모터 속도를 음수로 설정하여 반대 방향으로 회전합니다.

// Joystick X - Pan movement
  JoyXPos = analogRead(JoyX);
  // if Joystick is moved left, move stepper 2 or pan to left
  if (JoyXPos > 600) {
    stepper2.setSpeed(currentSpeed);
  }
  // if Joystick is moved right, move stepper 2 or pan to right
  else if (JoyXPos < 400) {
    stepper2.setSpeed(-currentSpeed);
  }
  // if Joystick stays in middle, no movement
  else {
    stepper2.setSpeed(0);
  }Code language: Arduino (arduino)

중간에 있는 경우 속도를 0으로 설정합니다. 이 방법은 조이스틱의 축과 슬라이더 포텐셔미터 모두에 사용됩니다. 실제로, 전위차계의 경우 아날로그 값을 사용하여 전위차계를 더 돌릴 때 모터의 속도도 증가시킵니다.

// Slider potentiometer
  sliderPos = analogRead(slider);
  // If potentiometer is turned left, move slider left
  if (sliderPos > 600) {
    sliderPos = map(sliderPos, 600, 1024, 0, 3000);
    stepper1.setSpeed(sliderPos); // Increase speed as turning
  }
  // If potentiometer is turned right, move slider right
  else if (sliderPos < 400 ) {
    sliderPos = map(sliderPos, 400, 0, 0, 3000);
    stepper1.setSpeed(-sliderPos); // Increase speed as turning
  }
  // If potentiometer in middle, no movement
  else {
    stepper1.setSpeed(0);
  }Code language: Arduino (arduino)

마지막으로 3개의 스테퍼 모터 각각에 대해 runSpeed() 함수를 호출하고 위 명령을 실행하거나 모터를 적절하게 회전시킵니다.

// Execute the above commands - run the stepper motors
  stepper1.runSpeed();
  stepper2.runSpeed();
  stepper3.runSpeed();Code language: Arduino (arduino)

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

/*
  DIY Camera Slider with Pan and Tilt Head
  by Dejan Nedelkovski
  www.HowToMechatronics.com

  Library - AccelStepper by Mike McCauley:
  http://www.airspayce.com/mikem/arduino/AccelStepper/index.html

*/

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

#define JoyX A0       // Joystick X pin
#define JoyY A1       // Joystick Y pin
#define slider A2     // Slider potentiometer
#define inOutPot A3   // In and Out speed potentiometer
#define JoySwitch 10  // Joystick switch connected
#define InOutSet 12   // Set Button
#define limitSwitch 11
#define inLED 8
#define outLED 9

// Define the stepper motors and the pins the will use
AccelStepper stepper1(1, 7, 6); // (Type:driver, STEP, DIR)
AccelStepper stepper2(1, 5, 4);
AccelStepper stepper3(1, 3, 2);

MultiStepper StepperControl;  // Create instance of MultiStepper

long gotoposition[3]; // An array to store the In or Out position for each stepper motor

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() {
  // Set initial seed values for the steppers
  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);

  // Create instances for MultiStepper - Adding the 3 steppers to the StepperControl instance for multi control
  StepperControl.addStepper(stepper1);
  StepperControl.addStepper(stepper2);
  StepperControl.addStepper(stepper3);

  // Move the slider to the initial position - homing
  while (digitalRead(limitSwitch) != 0) {
    stepper1.setSpeed(3000);
    stepper1.runSpeed();
    stepper1.setCurrentPosition(0); // When limit switch pressed set position to 0 steps
  }
  delay(20);
  // Move 200 steps back from the limit switch
  while (stepper1.currentPosition() != -200) {
    stepper1.setSpeed(-3000);
    stepper1.run();
  }

}

void loop() {
  // Limiting the movement - Do nothing if limit switch pressed or distance traveled in other direction greater then 80cm
  while (digitalRead(limitSwitch) == 0 || stepper1.currentPosition() < -64800) {}

  // If Joystick pressed increase the Pan and Tilt speeds
  if (digitalRead(JoySwitch) == 0) {
    currentSpeed = currentSpeed + 50;
    delay(200);
  }
  // If Set button is pressed - toggle between the switch cases
  if (digitalRead(InOutSet) == 0) {
    delay(500);
    // If we hold set button pressed longer then half a second, reset the in and out positions
    if (digitalRead(InOutSet) == 0) {
      InandOut = 4;
    }
    switch (InandOut) { 
      case 0:   // Set IN position
        InandOut = 1;
        XInPoint = stepper1.currentPosition(); // Set the IN position for steppers 1
        YInPoint = stepper2.currentPosition(); // Set the IN position for steppers 2
        ZInPoint = stepper3.currentPosition(); // Set the IN position for steppers 3
        digitalWrite(inLED, HIGH); // Light up inLed
        break;

      case 1: // Set OUT position
        InandOut = 2;
        XOutPoint = stepper1.currentPosition(); //  Set the OUT Points for both steppers
        YOutPoint = stepper2.currentPosition();
        ZOutPoint = stepper3.currentPosition();
        digitalWrite(outLED, HIGH);
        break;

      case 2: // Move to IN position / go to case 3
        InandOut = 3;
        inOutSpeed = analogRead(inOutPot); // Auto speed potentiometer
        // Place the IN position into the Array
        gotoposition[0] = XInPoint;
        gotoposition[1] = YInPoint;
        gotoposition[2] = ZInPoint;
        stepper1.setMaxSpeed(inOutSpeed);
        stepper2.setMaxSpeed(inOutSpeed);
        stepper3.setMaxSpeed(inOutSpeed);
        StepperControl.moveTo(gotoposition); // Calculates the required speed for all motors
        StepperControl.runSpeedToPosition(); // Blocks until all steppers are in position
        delay(200);
        break;

      case 3: // Move to OUT position / go back to case 2
        InandOut = 2;
        inOutSpeed = analogRead(inOutPot);
        // Place the OUT position into the Array
        gotoposition[0] = XOutPoint;
        gotoposition[1] = YOutPoint;
        gotoposition[2] = ZOutPoint;
        stepper1.setMaxSpeed(inOutSpeed);
        stepper2.setMaxSpeed(inOutSpeed);
        stepper3.setMaxSpeed(inOutSpeed);
        StepperControl.moveTo(gotoposition); // Calculates the required speed for all motors
        StepperControl.runSpeedToPosition(); // Blocks until all are in position
        delay(200);
        break;

      case 4: // If Set button is held longer then half a second go back to case 0
        InandOut = 0;
        digitalWrite(inLED, LOW);
        digitalWrite(outLED, LOW);
        delay(1000);
        break;
    }
  }

  // Joystick X - Pan movement
  JoyXPos = analogRead(JoyX);
  // if Joystick is moved left, move stepper 2 or pan to left
  if (JoyXPos > 600) {
    stepper2.setSpeed(currentSpeed);
  }
  // if Joystick is moved right, move stepper 2 or pan to right
  else if (JoyXPos < 400) {
    stepper2.setSpeed(-currentSpeed);
  }
  // if Joystick stays in middle, no movement
  else {
    stepper2.setSpeed(0);
  }

  //Joystick Y - Tilt movement
  JoyYPos = analogRead(JoyY);
  if (JoyYPos > 600) {
    stepper3.setSpeed(currentSpeed);
  }
  else if (JoyYPos < 400) {
    stepper3.setSpeed(-currentSpeed);
  }
  else {
    stepper3.setSpeed(0);
  }

  // Slider potentiometer
  sliderPos = analogRead(slider);
  // If potentiometer is turned left, move slider left
  if (sliderPos > 600) {
    sliderPos = map(sliderPos, 600, 1024, 0, 3000);
    stepper1.setSpeed(sliderPos); // Increase speed as turning
  }
  // If potentiometer is turned right, move slider right
  else if (sliderPos < 400 ) {
    sliderPos = map(sliderPos, 400, 0, 0, 3000);
    stepper1.setSpeed(-sliderPos); // Increase speed as turning
  }
  // If potentiometer in middle, no movement
  else {
    stepper1.setSpeed(0);
  }
  // Execute the above commands - run the stepper motors
  stepper1.runSpeed();
  stepper2.runSpeed();
  stepper3.runSpeed();
}Code language: Arduino (arduino)

So that would be all, I hope you enjoyed this Arduino project and learned something new. Feel free to ask any question in the comments section below and check my Arduino Projects Collection.


제조공정

  1. Arduino Bluetooth 제어 전동 카메라 슬라이더
  2. Arduino를 사용하여 모니터 Ambilight 만들기
  3. Python과 함께 Arduino 및 RFID를 사용한 출석 시스템
  4. Arduino와 스마트폰을 사용한 DIY 전압계
  5. Arduino 및 Nokia 5110 디스플레이가 있는 DIY 전압계
  6. Arduino 및 OLED 기반 Cellular Automata
  7. 새롭고 더 빠른 알고리즘이 포함된 Arduino 기반 RPM 카운터
  8. Arduino 및 RDA8057M을 사용하는 FM 라디오
  9. Arduino 및 Google 스프레드시트 기반 출석 시스템
  10. Arduino로 음악을 만드는 방법