티스토리 뷰

현재 제작하는 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 : 제자리 오른쪽 회전

1 ··· 35 36 37 38 39 40 41 42 43 ··· 1290