아두이노 강좌 #33 Stepper 라이브러리 기본 사용법 및 주의사항
Lucy Archive
Lucy 2023
2020. 9. 2. 02:06

Arduino Uno Stepper LibraryArduino Uno Stepper Library

Arduino Uno : 스테핑 모터 라이브러리 사용 방법

지난 포스트에서 Step Motor 28BYJ-48 5V 의 동작 방법에 대해 설명하고, 라이브러리 없이 동작시키는 코드를 소개하였습니다. 이번 포스트에서는 아두이노에서 제공되는

Stepper 라이브러리를 사용하는 방법을 소개

합니다.


Stepper 라이브러리 설치 방법

Arduino IDE 실행 후 라이브러리 메니저에서 Stepper 를 검색 후 설치 합니다. 아래 그림을 캡쳐하기 위해 Arduino IDE 처음 설치한 PC에서 라이브러리르 실행하였는데, 해당 라이브러리가 이미 설치된 것으로 나옵니다. 라이브러리 매니저에서도 Built-In by Arduino 라고 명기가 되어 있어, 최신 버전은 Arduino IDE 설치시 기본적으로 설치 되는 것으로 보입니다.

Arduino Stepper 라이브러리 설치Arduino Stepper 라이브러리 설치

Stepper 라이브러리

Stepper 라이브러리는 Unipolar, Bipolar 의 두 가지 방식의 스텝모터를 지원합니다. 이 라이브러리는 기본적으로 [각주:1]2상 여자 방식(2 Phase - Full Step)으로 스텝모터를 제어하는 것으로 확인 됩니다. 아래 예시에서 사용하고 있는 28BYJ-48 5V 는 5선식 유니폴라 방식의 스테핑모터입니다. Stepper 라이브러리는 스텝 모터를 제어하기 위해 아래의 4가지 함수들을 제공합니다.

  • Stepper(steps, pin1, pin2) : 2핀 사용 스텝모터 클래스의 객체를 생성 - 초기화
  • Stepper(steps, pin1, pin2, pin3, pin4) : 4핀 사용 스텝모터 클래스의 객체를 생성 - 초기화
  • setSpeed(rpm) : Rotations Per Minute(RPM) 단위의 스텝 속도 설정
  • step(Steps) : 회전할 스텝 수 입력

4가지 함수의 상세한 사용법은 아래를 참고해주세요

Stepper()

Stepper() 는 Stepper 클래스의 객체를 만듭니다. 이 행위는 스텝모터 사용을 초기화하는 코드로 이해하시면 됩니다. 

Syntax

  • Stepper(steps, pin1, pin2, pin3, pin4)
  • Stpeer(steps, pin1, pin2)

Parameters

  • steps : 사용할 스텝 모터의 1봐퀴 스텝 수 입력
  • pin1, pin2 : 2핀으로 연결되는 스텝 모터 초기화
  • pin1, pin2, pin3, pin4 : 4핀으로 연결되는 스텝 모터 초기화

Returns : Stepper 모터의 클래스

Example

  • Stepper myStepper = Stepper(2048, 8, 9, 10, 11) : 스텝수가 2048이고 4개의 핀을 사용하는 myStepper 객체 선언

setSpeed(rpm)

모터 속도를 PRM 단위를 사용하여 설정합니다. 일반적으로 void setup() 에서 초기화 하지만, void loop() 문 내에서 속도 변경이 가능합니다.

Example

  • myStepper.setSpeed(30) : myStepper 객체의 회전 속도를 30RPM 으로 설정

step(steps)

모터를 특정한 스텝 수 만큼 회전 시킵니다. 회전 속도는 이전 setSpeed() 로 설정된 속도로 회전 됩니다. 

Example

  • myStepper.step(2048) : myStepper 를 플러스 방향으로 2048 스텝을 인가합니다.
  • myStepper.step(-2048) : myStepper 를 마이너스 방향으로 2048 스텝을 인가합니다.

1봐퀴 스텝 수가 2048인 모터의 경우, setSpeed(1) 설정하고 myStepper.step(2048) 을 실행하면 1분 동안 1봐퀴 회전합니다.


Stepper 라이브러리로 스텝모터 제어

Stepper 라이브러를 사용하여 스텝모터 제어를 하기 위해 Arduino Uno 보드와 스텝 모터 28BYJ-48 5V 모터를 아래와 같이 연결 하였습니다. 모터 드라이브 모듈로 보편적으로 많이 사용되는 ULN2003 모터 드라이브 보드를 사용하였습니다. 

아두이노 28BYJ-48 5V 연결아두이노 28BYJ-48 5V 연결 회로도 및 연결 예시

이와 같이 연결 후 Stepper 라이브러리를 사용하면 코드 몇 줄로 스텝 모터를 간단하게 제어 할 수 있습니다.

Servo Motor Sweep

아래 코드는 10 RPM의 속도로 Step 모터가 CW 방향 1봐퀴, CCW 방향 1봐퀴 회전 하는 코드 입니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <Stepper.h>
 
#define STEPS 2048
#define RPM 10
#define IN1 11 // IN1
#define IN2 10 // IN2
#define IN3 9 // IN3
#define IN4 8 // IN4
 
Stepper my28BJY48(2048, IN4, IN2, IN3, IN1);
 
void setup(){
    my28BJY48.setSpeed(RPM);
}
 
void loop(){
    my28BJY48.step(STEPS);
    delay(1000);
    my28BJY48.step(-STEPS);
    delay(1000);
}
cs

코드 설명은 간단해서 따로 설명은 필요 없을 것 같습니다. 코드를 실행하면 서브 모터가 시계 방향 1봐퀴, 반 시계 방향 1봐퀴 회전 하는 것을 볼 수 있습니다. 


부록 : Stepper 라이브러리 주의 사항

위의 예제 코드의 10 Line 코드는 Stepper my28BJY48(2048, IN4, IN2, IN3, IN1) 로 ULN2003 핀 연결 기준 IN1~IN4 순서대로 되어있지 않습니다. 이 부분은 확인을 하지 않고, IN1 ~ IN4 순서대로 또는 IN4 ~ IN1 순서대로 입력하면 스텝 모터가 동작하지 않습니다. 

그 이유는 라이브러리 stepper.cpp 파일내 스텝모터를 실제로 드라이브하는 코드(대략 253번라인 이후 부터)  void Stepper::stepMotor(int thisStep) 의 내부가 아래와 같이 작성되어 있기 때문입니다. 아래 코드에서 motor_pin1 ~ 4는 클래스 객체 생성시 아래의 구문을 따르게 됩니다. 

Stepper(int number_of_steps, int motor_pin1, int motor_pin_2, int motor_pin_3, int motor_pin_4) 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
void Stepper::stepMotor(int thisStep)
{
    .
    .
    .
  if (this->pin_count == 4) {
    switch (thisStep) {
      case 0:  // 1010
        digitalWrite(motor_pin_1, HIGH);
        digitalWrite(motor_pin_2, LOW);
        digitalWrite(motor_pin_3, HIGH);
        digitalWrite(motor_pin_4, LOW);
      break;
      case 1:  // 0110
        digitalWrite(motor_pin_1, LOW);
        digitalWrite(motor_pin_2, HIGH);
        digitalWrite(motor_pin_3, HIGH);
        digitalWrite(motor_pin_4, LOW);
      break;
      case 2:  //0101
        digitalWrite(motor_pin_1, LOW);
        digitalWrite(motor_pin_2, HIGH);
        digitalWrite(motor_pin_3, LOW);
        digitalWrite(motor_pin_4, HIGH);
      break;
      case 3:  //1001
        digitalWrite(motor_pin_1, HIGH);
        digitalWrite(motor_pin_2, LOW);
        digitalWrite(motor_pin_3, LOW);
        digitalWrite(motor_pin_4, HIGH);
      break;
    }
  }
  .
  .
  .
}
cs

결론적으로, Stepper 클래스 객체 생성시 사용하는 함수의 핀 번호 순서를 순서대로 하시면 안됩니다. 매번 이게 혼동이 있으면 stepper.cpp 코드에서 위 부분을 아래와 같이 변경하면 Stepper my28BJY48(2048, IN4, IN3, IN2, IN1) 와 같이 핀을 순서대로 입력하여 사용 할 수 있습니다. 저는 개인적으로 이게 변해서 제 라이브러리에 수정하였지만, 수정 하는 것을 권장하지는 않습니다. 참고해주세요.

수정 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
  if (this->pin_count == 4) {
    switch (thisStep) {
      case 0:  // 1010
        digitalWrite(motor_pin_1, HIGH);
        digitalWrite(motor_pin_2, HIGH);
        digitalWrite(motor_pin_3, LOW);
        digitalWrite(motor_pin_4, LOW);
      break;
      case 1:  // 0110
        digitalWrite(motor_pin_1, LOW);
        digitalWrite(motor_pin_2, HIGH);
        digitalWrite(motor_pin_3, HIGH);
        digitalWrite(motor_pin_4, LOW);
      break;
      case 2:  //0101
        digitalWrite(motor_pin_1, LOW);
        digitalWrite(motor_pin_2, LOW);
        digitalWrite(motor_pin_3, HIGH);
        digitalWrite(motor_pin_4, HIGH);
      break;
      case 3:  //1001
        digitalWrite(motor_pin_1, HIGH);
        digitalWrite(motor_pin_2, LOW);
        digitalWrite(motor_pin_3, LOW);
        digitalWrite(motor_pin_4, HIGH);
      break;
    }   
  }
cs

※ stepper 라이브러리는 2 Phase Full Step 방식을 사용하고 있지만, 해당 라이브러리를 수정하여 쉽게 1 Phase Full Step 방식으로 변경이 가능합니다. 추가적으로 1-2 Phase Half Step 방식으로 수정이 가능하지만, 해당 코드 부분 이외의 부분도 수정되어야 합니다.


마무리

이번 포스트에서 아두이노에서 제공하는

stepper 라이브러리를 사용하여 28BYJ-48 5V 스텝모터를 제어하는 예제 코드

를 설명하였습니다. 추가적으로

stepper 라이브러리 사용 주의 사항

을 확인 하였습니다.

끝까지 읽어 주셔서 감사합니다.😊

관련포스트

👉 아두이노 STEPPER MOTOR 관련글 목록 보기

👉 아두이노 모터 관련글 목록 보기

👉 아두이노 관련글 전체 목록 보기


  1. Tomlgoe's Notes : http://www.tigoe.com/pcomp/code/circuits/motors/stepper-motors/ [본문으로]