본문 바로가기

아두이노

NodeMCU를 이용한 Stepper motor & Driver 제어

리니어 액추에이터가 Stepper로 동작을 하여, 해당 모터의 조작법을 익혔다. 

 

Stepper motor, Stepping motor, 스텝 모터, 펄스 모터 등 다양하게 불린다. 두산백과에 나온 내용을 참고하면, 

Stepper motor는 펄스 신호를 줄 때마다 일정한 각도씩 회전하는 모터이다. 다시 말해, 입력 펄스 수에 대응하여 일정 각도씩 움직이는 모터이며, 입력 펄스 수와 모터의 회전각도가 완전히 비례하므로 회전각도를 정확하게 제어할 수 있다고 한다. 

 

DC 모터의 경우, 전원만 공급해주면, 일정한 방향으로 회전하지만, Stepper motor는 펄스 신호에 따라 동작하기 때문에 Motor driver가 거의 필수적으로 사용된다. 

 

내가 보유하고 있는 모터(리니어 액추에이터)와 모터 드라이버에 대한 정보는 아래 링크를 참고하면 된다. 

 

- 리니어 액추에이터

scipia.com/product/500-리니어레일-슬라이드-cnc엑추에이터-아두이노/906/category/153/display/1/


- 모터 드라이버
www.devicemart.co.kr/goods/view?no=1061555&market=naver&NaPm=ct%3Dkefcccpk%7Cci%3D603a5e066de30567f37566341285df7b2ac88d8a%7Ctr%3Dsls%7Csn%3D876973%7Chk%3Dce9cff710e9b6aa1d9077fd528ea3093d6cc9a1e

 

모터 드라이버를 NodeMCU의 GPIO 핀과 연결하여 제어시켜 리니어 액추에이터를 구동시킬 계획이다. 

 

모터 드라이버의 각 핀은 다음과 같이 구성되어 있다. 

BOX 커넥터는 다음과 같이 구성되어 있다. 

아래 테이블에 나와 있듯이, 'Enable, PWN, IN 신호를 조합하여 Stepper motor를 컨트롤할 수가 있게 된다. 

내가 원하는 동작은 모터 회전이므로 아래 빨간색 박스 친 부분만 신경 쓰면 된다.

따라서 'Enable핀은 GND로, PWM핀은 5V로 고정시켰다. 

그리고 나머지 5V핀과 GND핀을 제외한 4개의 IN 핀은 각각 NodeMCU의 D5, D6, D7, D8에 연결하였다. 

다음은 모터 드라이버에 모터를 연결해야 한다. 모터의 핀은 아래와 같이 구성되어 있으며, 

모터 드라이버의 모터 연결 커넥터에 A는 왼쪽에, B는 오른쪽에, +는 위쪽에, -는 아래쪽에 각각 연결했다. 

 

마지막으로 모터에 공급해줄 전원을 연결해주면 된다. 어댑터는 12V~3A 또는 24V~1.5A를 사용하면 된다. 

 

위에 설명한 내용을 모두 반영한 회로 구성은 아래 이미지와 같다. 

 

이제 코드를 살펴보자. 코드는 Examples/Stepper/stepper_oneRevolution을 수정하였다. 

stepper_oneRevolution를 이용하면 rpm에 따라 Stepper motor를 제어할 수 있다. 

제품을 파는 사이트를 뒤져봐도 stepPerRevolution에 대한 정보가 없었다. 다만 몇 가지 숫자를 대입해 봤는데 원래 코드와 같이 200일 때 동작을 자연스럽게 했다. 

 

그리고 리니어 액추에이터 사양을 보면 최대 속도가 초당 20mm라고 나와 있고, 한 바퀴에 2mm 이동한다고 나와 있어서 이를 통해 최대 rpm을 유추해볼 수 있었다.

RPM은 분당 회전수이므로, 

해당 모터의 스펙에서 초당 20mm 이동 가능하며, 한 바퀴에 2mm 움직일 수 있다고 했으므로, 초당 10바퀴 회전 가능하며, 60초에 600바퀴 회전 가능하다는 결론이 나온다. 따라서 rpm은 최대 600까지 설정이 가능할 것 같았지만, 600을 넣으면, 잘 동작하지 않았다.(속도도 빠르지 않고 굉음을 낸다. ) rpm 역시 경험적으로 200에서 빠르고 꽤 조용히 움직였다. 

 

mutatedStepper_oneRevolution.ino

#include <Stepper.h>

const int stepsPerRevolution = 200;  // change this to fit the number of steps per revolution
// for your motor

// initialize the stepper library on pins 8 through 11:
Stepper myStepper(stepsPerRevolution, 14, 12, 13, 15);

void setup() {
  // set the speed at 200 rpm:
  myStepper.setSpeed(200);
  // initialize the serial port:
  Serial.begin(115200);
}

void loop() {
  // step one revolution  in one direction:
  Serial.println("clockwise");
  myStepper.step(stepsPerRevolution);

  // step one revolution in the other direction:
  //Serial.println("counterclockwise");
  //myStepper.step(-stepsPerRevolution);
}

코드의 myStepper.step의 파라미터로 stepsPerRevolution을 넣을지, -stepsPerRevolution을 넣을 지에 따라 모터의 방향이 결정된다. 

주의할 점은 레일을 따라 움직이는 물체가 레일의 양 끝단에 도달하게 하면 안 된다는 것이다. 모터의 힘이 워낙 강해서 양 끝단(특히 모터 반대쪽)에 도착할 때 마찰되는 부분을 파손시킬 염려가 있기 때문이다. 

이를 보안하기 위해, 이전 포스팅(taeminator1.tistory.com/20)에서 다룬 Limit Switch 결합해서 사용하면 좋을 것 같다.