스테핑 모터

스테핑 모터

B-Robot 은 두 개의 NEMA 17 (42BYGHW609) 스테핑 모터가 사용됩니다. 스테핑 모터는 일반 모터와 달리 축의 위치를 검출하기 위한 별도의 피드백 없이 원하는 회전각도와 속도 제어가 쉽기 때문에 로보트의 구동부에 많이 사용 됩니다. 외부에서 입력되는 펄스의 수에 따라 회전 각도가 정확하고, NEMA17 의 경우 1.8도,  속도가 펄스의 속도에 비례하여 간편하게 제어 할 수 있습니다. 2상의 펄스를 입력하여 구동 되는데 외부의 선의 개수에 따라 2상 6선식 스테핑 모터와 2상 4선식 스테핑 모터가 있습니다.

2상  6선식 스테핑 모터의 경우 각상의 중간에 탭이 나와  있어 동작 방식에 따라 유니폴라 및 바이폴라 구동이 가능 하지만 2상 4선식 스테핑 모터는 바이폴라 방식의 구동만 가능 합니다.

sku128202-5-500x500_2

 

유니폴라(Unipolar) 구동방식

유니폴라는 모터의 코일에 흐르는 전류가 항상 한쪽 방향으로만 흐르는 구동 방식입니다.고속회전에사 토크가 높아 탈조 될 위험이 적어 고속회전에 용이 하며 비교적 구동 회로가 간단 합니다. 하지만 모터에 저장된 에너지를 회생 하지 않아 효율이 안좋고 저속에서 토크가 바이폴라에 비해 적습니다.

아두이노와 포트로 직접 스테핑 모터를 구동 하기에는 전압과 전류가 부족하기 때문에 외부전원과 ULN2004A 와 같은 외부 구동 칩이 필요 합니다.

Unipolar Motor Knob Circuit

Unipolar Motor Knob Schematic

바이폴라(Bipolar) 구동방식
바이폴라 구동 방식은 모터의 권선에 흐르는 전류의 방향이 바뀌는 구동 방식입니다. 이 방식은 저속 구동에 토크가 높고 코일에 저장된 전류가 회생 되어 효율이 높습니다. 하지만 고속 구동시 토크가 급격하게 저하되어 탈조가 될 수 있으며 구동회로의 구성이 복잡 합니다.
바이폴라 구동 방식도 유니폴라 구동 방식과 같이 외부 드라이버 칩이 필요하며 결선이 유니폴라 방식에 비해 복잡 합니다. 
 

Bipolar Motor Knob Circuit

Bipolar Motor Knob Schematic

코드

구동방식에 상관없이 코드는 같은 코드가 사용 되었습니다. Stepper 라이브러리를 사용 합니다.

A0 아날로그 값을 읽어 속도를 설정하고  stepsPerRevolution 에 정의된 값 만큼 반복적으로 회전 하는 예제 입니다.

이 방식은 스테핑 모터를 회전 하기 위해 모터 선 하나에 하나의 포트를 사용하고 소프트웨어로 회전 할 때 마다 출력되는 포트 값을 변경해야 하기 때문에 정확하게 원하는 속도와 방향으로 변경이 용이 하지 않은 단점이 있습니다.

/*
Stepper Motor Control – speed control
This program drives a unipolar or bipolar stepper motor.
The motor is attached to digital pins 8 – 11 of the Arduino.
A potentiometer is connected to analog input 0.
The motor will rotate in a clockwise direction. The higher the potentiometer value,
the faster the motor speed. Because setSpeed() sets the delay between steps,
you may notice the motor is less responsive to changes in the sensor value at
low speeds.
Created 30 Nov. 2009
Modified 28 Oct 2010
by Tom Igoe
*/
#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, 8, 9, 10, 11);
int stepCount = 0;  // number of steps the motor has taken
void setup() {
// nothing to do inside the setup
}
void loop() {
// read the sensor value:
int sensorReading = analogRead(A0);
// map it to a range from 0 to 100:
int motorSpeed = map(sensorReading, 0, 1023, 0, 100);
// set the motor speed:
if (motorSpeed > 0) {
myStepper.setSpeed(motorSpeed);
// step 1/100 of a revolution:
myStepper.step(stepsPerRevolution / 100);
}
}

스테핑 모터 드라이버 모듈

아두이노 포트로 직접 모터 입력를 제어하면 정확한 속도와 방향 제어가 어렵기 때문에 B-Robot 에서는 전용 모터 드라이버 모듈 A4988 을 사용하여 제어 합니다. 이런 스테핑 모터 드라이버 모듈은 방향과 펄스만 입력하면 드라이버 칩에서 자동으로 모터 입력을 변경해 줍니다.

다음은 결선도 입니다. 아두이노 13번 핀을 A4988 모듈의 STEP,  12번 핀을 DIR에  연결 하였습니다.

A4988은 디바이스 마트에서 6,000 원에 구입 가능 합니다.

A4988 모듈을 사용한 경우의 코드 입니다.

Stepper 라이브러리 없이도 펄스 입력과 방향만으로 스테핑 모터를 구동 시킬 수 있습니다.

const int stepPin = 13;    
const int dirPin =  12;    
const int stepsInFullRound = 400;

// Set pins
void setup() {
  pinMode(stepPin, OUTPUT);     
  pinMode(dirPin, OUTPUT);
  digitalWrite(stepPin, LOW);
  digitalWrite(dirPin, LOW); 
}

void run(boolean runForward, double speedRPS, int stepCount) {
  digitalWrite(dirPin, runForward);
  for (int i = 0; i < stepCount; i++) {
    digitalWrite(stepPin, HIGH);
    holdHalfCylce(speedRPS);
    digitalWrite(stepPin, LOW);
    holdHalfCylce(speedRPS);
  }
}

void holdHalfCylce(double speedRPS) {
  long holdTime_us = (long)(1.0 / (double) stepsInFullRound / speedRPS / 2.0 * 1E6);
  int overflowCount = holdTime_us / 65535;
  for (int i = 0; i < overflowCount; i++) {
    delayMicroseconds(65535);
  }
  delayMicroseconds((unsigned int) holdTime_us);
}

// Runs the motor once in forward direction and once to the opposite direction.
// Holds the motor still for 1 sec after both movements.
void runBackAndForth(double speedRPS, int rounds) {
  run(true, speedRPS, stepsInFullRound * rounds);
  delay(1000);
  run(false, speedRPS, stepsInFullRound * rounds);
  delay(1000);
}

// Tests various speeds for 10 full rotations
void loop(){
  runBackAndForth(1, 10);
  runBackAndForth(5, 10);
  runBackAndForth(7, 10);
}

 

참조 사이트

http://www.ntrexgo.com/archives/21591

https://www.arduino.cc/en/Tutorial/StepperSpeedControl

https://github.com/TheLINUXPROFI/arduino_stepper_test