본문 바로가기
Hobby/아두이노

[아두이노] 스테퍼 모터 2개 이상 멀티 컨트롤 하는 방법

by ZENEZ 2018.06.04

현재 제작하는 RC카 구조의 카메라 슬라이더 장착하려고 stepper motor 2개를 동시에 제어하는 부분을 찾아보고 있습니다. 아두이노 기본라이브러리는 동시 제어가 안됩니다.

구글링으로 AccelStepper라는 라이브러리를 구했는데 첨부된 샘플이 가속, 감속이 되도록 했더군요. 이 가, 감속 제어도 만만치 않고 제가 원하는 기능은 등속으로 회전하는 것입니다.

사용된 부품은 아두이노 uno, 브레드보드, 스테퍼 모터 28YBJ-48 2개, 모터 드라이버 ULN2003 2개, 전선 몇 개 입니다.

■ 28YBJ-48 2개, 모터 드라이버 ULN2003

모터와 드라이버가 한셋으로 된 것을 샀습니다. 비교적 저가인데 나름 정확하게 동작하네요. 내구성은 아직 모르겠습니다.

자세한 설명은 이곳에 더 잘되어 있으니 생략할께요. 스펙은 아래와 같습니다.

  • 4 Phase 5 Wire Connection
  • StepperMotor5V-2.jpg100% Brand New
  • Phase : 4
  • Current : 160 mA per winding (320 mA in 4-step mode) Measured: 250mA stopped, 200 mA running fast
  • Resistance : 31 Ω per coil winding (from Red wire to any coil) (Some 24-28 ohms)
  • Voltage : 5V DC
  • Step Angle (8-Step sequence: Internal Motor alone): 5.625° (64 steps per revolution)
  • Step Angle (4-Step sequence: Internal Motor alone): 11.25° (32 steps per revolution)
  • Gear Reduction ratio: 1 / 64 (Not really exact: probably 63.68395.:1 )
  • SO: it takes (64*64 = 4096 steps per output shaft revolution.. In 8-step sequence.
  • SO: it takes (32*64 = 2048 steps per output shaft revolution.. In 4-step sequence.
  • NOTE: Arduino "Stepper Library" runs in 4-step mode
  • No-Load Pull-Out Frequency : 800pps
  • No-Load Pull-In Frequency : 500pps
  • Pull-In Torque : ≥ 78.4mN.m
  • Wiring Instruction : A (Blue), B (Pink), C (Yellow), D (Orange), E (Red, Mid-Point)
  • Weight : 30g


■ 아두이노와 배선 방법

드라이버의 1, 2, 3, 4 번을 아두이노 8, 9, 10, 11 번 핀과 연결합니다. 모터가 하나더 추가될 때 마찬가지로 다른핀에 순서대로 연결만 해주면 됩니다. 저는 아두이노 4, 5, 6, 7 번 핀에 모터를 하나 더 연결 했습니다. 드라이버의 1 ~ 4번 핀 순서를 섞으면 안됩니다. 이유는 소스코드에서 설명됩니다.


■ Source Code

-> 먼저 라이브러리를 받아야 합니다. 라이브러리에 첨부된 예제는 가, 감속 함수로 되어 있습니다. 등속 회전이 필요한 경우는 소스나 라이브러리내 doc을 보고 찾아내야 하는데 그 부분은 아래 소스에 있습니다.

-> 기본 동작

w : 전진, d : 후진, a : 왼쪽, d : 오른쪽, q : 제자리 왼쪽 회전, e : 제자리 오른쪽 회전

-> Source Code download

stepper_AccelLib_Car.txt

-> 연결하기

  1. #define mtrPin1  8     // IN1 on the ULN2003 driver 1
  2. #define mtrPin2  9     // IN2 on the ULN2003 driver 1
  3. #define mtrPin3  10     // IN3 on the ULN2003 driver 1
  4. #define mtrPin4  11     // IN4 on the ULN2003 driver 1

  5. #define mtrPin_1  4     // IN1 on the ULN2003 driver 2
  6. #define mtrPin_2  5     // IN2 on the ULN2003 driver 2
  7. #define mtrPin_3  6     // IN3 on the ULN2003 driver 2
  8. #define mtrPin_4  7     // IN4 on the ULN2003 driver 2

  9. AccelStepper stepper1(HALFSTEP, mtrPin1, mtrPin3, mtrPin2, mtrPin4);
  10. AccelStepper stepper2(HALFSTEP, mtrPin_1, mtrPin_3, mtrPin_2, mtrPin_4);

모터 2개가 각각 아두이노의 8 ~ 11번, 4 ~ 7번 핀에 연결 되어 있습니다. 여기서 주의 할 점은 AccelStepper 클래스 생성할때 핀번호가 매개변수가 되는데  첫번째 세번째가 한쌍, 두번째 네번째가 한쌍입니다. 그래서 매개변수가 mtrPin1, mtrPin3, mtrPin2, mtrPin4 이렇게 됩니다.

-> 속도 방향 제어하기

가, 감속 제어는 라이브러리에 충분한 샘플이 있으므로 저는 등속 제어만 설명하겠습니다. 위에 첨부된 소스 코드도 등속 제어입니다.

  1.     stepper1.setMaxSpeed(2000.0);  // 최대속도는 항상 선언해주어야 합니다. setup()에 한번만 선언
  2.     stepper1.move(leftWheelForeward); // 가, 감속은 moveTo, 등속은 move 함수를 사용합니다.
  3.     stepper1.setSpeed(500); //move 후에 setSpeed를 호출해야 합니다.
  4.     stepper1.runSpeedToPosition(); // 가, 감속은 run, 등속은 runSpeedToPosition을 사용합니다.


모터를 2개 사용한다면

  1.     stepper1.move(leftWheelForeward);
  2.     stepper2.move(rightWheelForeward);
  3.     stepper1.setSpeed(500);
  4.     stepper2.setSpeed(500);
  5.     stepper1.runSpeedToPosition();
  6.     stepper2.runSpeedToPosition();

이렇게 각각의 인스턴스를 실행해주면 됩니다.

0:00 => 가속, 감속 모드 , 동일 스텝

0:40 => 가,속 감속 모드 , 다른 스텝

1:13 => 동일 속도 모드, RC카처럼 자유 컨트롤 됩니다. 첨부된 소스코드로 작동 되는 부분

컨트롤 종류 => w : 전진, d : 후진, a : 왼쪽, d : 오른쪽, q : 제자리 왼쪽 회전, e : 제자리 오른쪽 회전

댓글0