Arduino Uno : 스테핑 모터 라이브러리 사용 방법
Stepper 라이브러리를 사용하는 방법을 소개
합니다.Stepper 라이브러리 설치 방법
Arduino IDE 실행 후 라이브러리 메니저에서 Stepper 를 검색 후 설치 합니다. 아래 그림을 캡쳐하기 위해 Arduino IDE 처음 설치한 PC에서 라이브러리르 실행하였는데, 해당 라이브러리가 이미 설치된 것으로 나옵니다. 라이브러리 매니저에서도 Built-In by Arduino 라고 명기가 되어 있어, 최신 버전은 Arduino IDE 설치시 기본적으로 설치 되는 것으로 보입니다.
Arduino Stepper 라이브러리 설치
Stepper 라이브러리
Stepper 라이브러리는 Unipolar, Bipolar 의 두 가지 방식의 스텝모터를 지원합니다. 이 라이브러리는 기본적으로 2상 여자 방식(2 Phase - Full Step)으로 스텝모터를 제어하는 것으로 확인 됩니다. 아래 예시에서 사용하고 있는 28BYJ-48 5V 는 5선식 유니폴라 방식의 스테핑모터입니다. Stepper 라이브러리는 스텝 모터를 제어하기 위해 아래의 4가지 함수들을 제공합니다. 1
- 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 연결 회로도 및 연결 예시
이와 같이 연결 후 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 라이브러리 사용 주의 사항
을 확인 하였습니다.끝까지 읽어 주셔서 감사합니다.😊
- Tomlgoe's Notes : http://www.tigoe.com/pcomp/code/circuits/motors/stepper-motors/ [본문으로]
'Embedded > Arduino' 카테고리의 다른 글
아두이노 강좌 #34 IR 적외선 통신 NEC Protocol 프로토콜 (1) | 2020.09.06 |
---|---|
아두이노 코딩 : 스텝 모터 위치 제어 28BYJ-48 5V (0) | 2020.09.02 |
아두이노 강좌 #32 스텝 모터 28BYJ-48 5V 라이브러리 없이 동작 - 여자 방식 비교 (2) | 2020.09.02 |
아두이노 강좌 #31 Step Stepper Motor 내부 구조 동작 원리 (0) | 2020.08.30 |
아두이노 코딩 : 시리얼 통신으로 서보 모터 SG90 제어 (1) | 2020.08.29 |