[아두이노] Stepper Motor 라이브러리로 제어

IOT/아두이노|2019. 5. 1. 09:00

[아두이노] Stepper Motor 라이브러리로 제어



오늘은 복잡하게 Stepper Motor의 4핀을 직접 제어할 필요 없이 Stepper Motor 라이브러리를 사용하여 쉽게 제어하는 실험을 하겠습니다.


1. Stepper Motor 회로도



  • 준비물 : 5V 스템모터, ULN2003 모터드라이버, 아두이노우노
  • 내용 : 8,9,10,11핀을 순서대로 IN1, IN2, IN3, IN4에 연결하고 스템모터와 UNL2003 모터쉴드에 연결하시오.


Stepper Motor 라이브러리를 실험하기 위해 따로 새롭게 만들 필요가 없기에 그냥 지난 시간에 만든 회로도를 그대로 사용하겠습니다.


2. 코딩



함수

#include <Stepper.h>
  • Stepper stepper(STEPS, IN1, IN2, IN3, IN4) : 사용하는 Stepper Motor 스템수, 각 4핀을 세팅.
  • stepper.setSpeed(값) : Stepper Motor의 속도 설정.
  • stepper.step(스텝수) : 스템수로 회전 각을 표현 한다.

아두이노 IDE Stepper 예제에 보시면 MotorKnob 예제가 있습니다. 원래 동작은 A0에 입력되는 아날로그 신호에 의한 회전인데 아마도 조이스틱과 가변저항으로 조정한 값을 Stepper Motor의 회전각을 만드는 것 같더군요. 오늘 실험은 이걸 하기 위한게 아니라 간단히 회전을 시킬 수 있는지에 대해 테스트 실험이기 때문에 수정을 하겠습니다.

[소스] : MotorKnob 예제입니다.

#include <Stepper.h>

#define STEPS 100
Stepper stepper(STEPS, 8, 9, 10, 11);
int previous = 0;

void setup() {
  stepper.setSpeed(30);
}

void loop() {
  int val = analogRead(0);
  stepper.step(val - previous);
  previous = val;
}

위 소스를 가지고 수정을 합시다.

우선,

#define STEPS 100

Stepper Motor의 Step의 총수입니다. 즉, 360도 회전에 Step 수라고 생각하시면 됩니다. 이부분은 여러분들이 변경해야 합니다. 자신이 사용하는 Stepper Motor의 종류에 따라서 계산해야 합니다.



STEPS = (360/step angle)* Gear ratio


예) [ 28BYJ-48 5V DC Stepper Motor]

  • Number of Phase : 4

  • Speed Variation Ratio : 1/64

  • Stride Angle : 5.625° /64

  • STEPS = (360/5.625)*64 = 4096


실제로 4096으로 입력하면 제 모터에서는 2바퀴를 회전하더군요. 2048로 STEPS을 잡으니깐 360도 회전을 할 수 있었습니다.

다음으로 핀 연결인데 위 회로도 대로 연결해서 돌리면 사실 돌아가지 않아서 처음 공부 할 당시 애를 먹었던 부분입니다. 처음에 삽질 했는데 핀 위치가 문제였더군요. 위 회로도로 연결했을 때 핀위치는 바뀌어야 합니다.

Stepper stepper(STEPS, 8, 9, 10, 11);

변경,

Stepper stepper(STEPS, IN1, IN3, IN2, IN4);
Stepper stepper(STEPS, 8, 10, 9, 11);

이렇게 설정하여 STEPS로 회전 시키니깐 시계방향으로 360도 회전 하였네요. -SEPS로 하니깐 반시계방향으로 360도 회전이 되었고요.

그 다음, stepper Motor의 회전 속도를 steup()함수에서 설정합니다. 하지만 이 speed값은 STEPS의 수와 관계가 있습니다. 만약 4096으로 잡고 돌릴 경우에는 5~7정도의 speed를 잡아야 정상적으로 회전이 일어나고 10정도 입력하면 회전을 하지 않습니다. 2048의 경우는 10~14사이가 정상적으로 회전을 하더군요.

stepper.setSpeed(12);

실제 회전 명령은 step()함수로 step수는 회전각입니다.

stepper.step(step수);

종합해서 수정하면, 정방향으로 360도 회전 후 역방향으로 360도 회전

#include <Stepper.h>

#define STEPS 2048

Stepper stepper(STEPS, 8, 10, 9, 11);

void setup() {
  stepper.setSpeed(12);
}

void loop() {
  stepper.step(STEPS);
  delay(1000);
  stepper.step(-STEPS);
  delay(1000);
}

4. 결과


회전은 깔끔하게 되긴 했는데 오차각이 좀 생기네요. Stepper Motor 싼거라 분해능력이 떨어져서 각이 약간 오차가 발생해서 정교한 각도 제어는 제가 실험한 Stepper Motor는 다소 무리가 있네요.


마무리


복잡하게 생각을 하지 않아도 Stepper Motor라이브러리로 쉽게 회전을 시킬 수 있겠죠. 코딩량도 대폭 줄어 들고 간단히 세개의 함수의 의미만 이해하면 Stepper Motor를 회전 시킬 수 있습니다.

Stepper stepper(STEPS, 8, 10, 9, 11);
stepper.setSpeed(12);
stepper.step(STEPS);

Stepper 객체변수 선언하고 Stepper 객체변수의 setSpeed()함수의 회전속도와 step()회전 스템수로 각도f를 회전 하게 됩니다. 이 세개의 함수만 이해하시면 쉽게 제어 할 수 있게 됩니다. 그런데 사실 쉽지는 않습니다. STEPS의 수를 계산하기가 약간 어려울 수 있습니다. Stepper Motor의 부품 사양을 보고 계산해서 구해야 하기 때문에 이부분이 어려울 수 있지만 이부분만 제대로 지정해 주시면 그 다음 부분들은 어렵지 않을 꺼에요.

참고로, 다른 Stepper Motor를 사용하실 때에는 해당 Stepper Motor 라이브러리를 검색하시셔 라이블러리에 추가해서 사용하시면 됩니다. 혹시 라이브러리가 없는데 그냥 따라서 include만 시킨다고 되는게 아니니깐요. 자신이 사용하는 부품명으로 우선 검색하시고 있으면 그걸 사용하세요. 없다면 공용 Stepper Motor 라이브러리를 사용하시고요.

마지막으로, 여러분들은 360도 회전을 할 수 있다면 어떤 것을 해보고 싶은지 상상의 나래를 펼쳐 보세요.


댓글()