Hardware | 28BYJ-48 Step Motor 와 ULN2003 Driver 사용해 보기

Keyestudio 라는, arduino 관련 센서와 제품들을 생산하는 업체의 step motor 를 사용할 기회가 있어, 기록으로 남겨 봅니다.

이전에 DC motor driver 를 이용하여 analog motor 를 활용한 글은 아래와 같습니다.

* Hardware | L9110 2-Channel DC Motor Driver 사용해 보기

* Hardware | Arduino 로 Servo 를 움직여 보자




1. Specification

Keyestudio 는, 본인들이 생산한 제품에 대해서는 자세한 wiki page 를 만들어 놨습니다. 해당 wiki page 를 참고하여 스펙 확인해 봅니다.

* KS0327 Keyestudio Stepper Motor Drive Board + 5V Stepper Motor Kit (3PCS)


* 5V 4--Phase 5-Wire Stepper Motor
  - The rotation angle of the motor is proportional to the input pulse.
  - The motor has full torque at standstill (if the windings are energized)
  - Precise positioning and repeatability of movement since good stepper motors have an
accuracy of  -5% of a step and this error is non cumulative from one step to the next.
  - Excellent response to starting/stopping/reversing.
  - Very reliable since there are no contact brushes in the motor. Therefore the life of the motor is
simply dependent on the life of the bearing.
  - The motors response to digital input pulses provides open-loop control, making the motor
simpler and less costly to control.
  - It is possible to achieve very low speed synchronous rotation with a load that is directly
coupled to the shaft.
  - A wide range of rotational speeds can be realized as the speed is proportional to the frequency of the input pulses

* Parameters of Stepper Motor 28BYJ-48
  - Model: 28BYJ-48
  - Rated Voltage: 5VDC
  - Power Consumption : 240mA
  - Number of Phase: 4
  - Speed Variation Ratio: 1/64
  - Stride Angle: 5.625°/64
  - Frequency : 100Hz
  - DC Resistance: 50Ω ±7% (25℃)
  - Idle In-traction Frequency : > 600Hz
  - Idle Out-traction Frequency : > 1000Hz
  - In-traction Torque > 34.3mN.m (120Hz)
  - Self-positioning Torque > 34.3mN.m
  - Friction Torque : 600-1200 gf.cm
  - Pull in Torque : 300 gf.cm
  - Insulated Resistance > 10MΩ (500V)
  - Insulated Electricity Power: 600VAC/1mA/1s
  - Insulation Grade: A
  - Rise in Temperature <40K(120Hz)
  - Noise < 35dB (120Hz, No load)

참고로, Keyestudio 에서 arduino 와 센서 등을 활용할 수 있는 자료도 만들어 놨습니다. 참고할 수 있도록 링크 걸어 봅니다.

* keyestudio Super Learning Kit for Arduino



2. Driver

Step motor 는, 그냥 전기를 넣어서 되는 것이 아닌, 관련 driver 가 필요합니다. 왜냐하면, digital pulse 로 동작이 컨트롤 되기 때문입니다.


Driver 에 대해서는 다음과 같은 기술이 되어 있네요.

* ULN2003 Driver
The ULN2003 is one of the most common motor driver ICs, consisting of an array of 7 Darlington transistor pairs, each pair is capable of driving loads of up to 500mA and 50V.

Step motor 를 돌릴 수 있는 전류와 전압은 500mA / 50V 최대라고 합니다.



3. Tutorial

사실은 Last Minute Engineers 사이트에 잘 소개되어 있습니다. 내부에 기어가 물려 있어서, 기어비를 계산해 보면 64:1 이라고 합니다. 그래서 그런지, 돌아갈 때 손으로 멈추려고 해도 끄떡 안합니다.

* Control 28BYJ-48 Stepper Motor with ULN2003 Driver & Arduino

  - 1 rotation angle = 11.25° = 1 step
  - 1 turn = 360°/11.25° = 32 steps
  - 1/64 reduction gear set (1/63.68395)
     > 32 steps * 63.68395 steps per revolution = 2037.8864 ~ 2038 steps




4. Diagram

Arduino 와 연결은 다음과 같이 합니다. 기계적인 step motor 를 움직이기 위해서는 전원이 확실해야 하는데, driver 에 따로 전원을 인가하여 충당하게 합니다. 모터를 취급할 때는, 항상 전원이 중요한 것 같습니다.


빵판을 이용하여 실제 구현한 사진 입니다.




5. Sketch

아래는 간단한 코드 입니다.

#include "Stepper.h"
#define STEPS 2038 // the number of steps in one revolution of your motor (28BYJ-48)

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

void setup() {
	// nothing to do
}

void loop() {
	stepper.setSpeed(1); // 1 rpm
	stepper.step(2038); // do 2038 steps -- corresponds to one revolution in one minute
	delay(1000); // wait for one second
	stepper.setSpeed(6); // 6 rpm
	stepper.step(-2038); // do 2038 steps in the other direction with faster speed -- corresponds to one revolution in 10 seconds
}


RPM 과 step 을 정의하여 돌려볼 수 있습니다. 시계방향과 시계반대방향은 + / - 로 컨트롤 되네요. 관여하는 전선에 대하여 driver PCB 의 LED 에 불이 켜집니다.


동작중인 사진.


한바퀴를 2038 step 으로 정의하여 속도 조절하는 방법 입니다.

//Includes the Arduino Stepper Library
#include "Stepper.h"

// Defines the number of steps per rotation
const int stepsPerRevolution = 2038;

// Creates an instance of stepper class
// Pins entered in sequence IN1-IN3-IN2-IN4 for proper step sequence
Stepper myStepper = Stepper(stepsPerRevolution, 8, 10, 9, 11);

void setup() {
	// Nothing to do (Stepper Library sets pins as outputs)
}

void loop() {
	// Rotate CW slowly
	myStepper.setSpeed(100);
	myStepper.step(stepsPerRevolution);
	delay(1000);
	
	// Rotate CCW quickly
	myStepper.setSpeed(700);
	myStepper.step(-stepsPerRevolution);
	delay(1000);
}


동영상도 올려 봅니다. 2038 step 으로 끊으니, 거의 연속으로 움직이는 것 처럼 보이네요.




6. AccelStepper

Arduino library 에서 accelstepper 로 검색하면 유용한 라이브러리가 하나 잡힙니다. 다운로드 합니다.


라이브러리 이름 그대로, 가속도를 이용할 수 있습니다. 가속도 만큼 속도가 줄다가 멈추면, 반대방향으로 가속도를 내면서 빠르게 돌다가, 한바퀴 돌면 다시 속도를 줄이면서 한바퀴 돕니다. 두 바퀴 돌면, 방향을 바꾸는 코드 입니다.

// Include the AccelStepper Library
#include "AccelStepper.h"

// Define step constant
#define FULLSTEP 4

// Creates an instance
// Pins entered in sequence IN1-IN3-IN2-IN4 for proper step sequence
AccelStepper myStepper(FULLSTEP, 8, 10, 9, 11);

void setup() {
	// set the maximum speed, acceleration factor,
	// initial speed and the target position
	myStepper.setMaxSpeed(1000.0);
	myStepper.setAcceleration(50.0);
	myStepper.setSpeed(200);
	myStepper.moveTo(2038);
}

void loop() {
	// Change direction once the motor reaches target position
	if (myStepper.distanceToGo() == 0) 
		myStepper.moveTo(-myStepper.currentPosition());

	// Move the motor one step
	myStepper.run();
}


동영상도 올려 봅니다.


토크가 많이 실리는 운동이 필요할 경우, 이 driver 와 step motor 를 사용하면 되겠습니다.


FIN

댓글