아두이노 스텝모터

이번 포스팅에서는 아두이노로 스텝모터를 동작시켜 보도록 하겠습니다.

 

 


 

스텝모터란

모터의 회전을 잘게 쪼개서 쪼갠 조각(스텝)을 이용해서 제어하는 모터를 말합니다.

스텝모터는 펄스(Puls)에 의해 디지털적으로 제어하기 때문에 정밀한 제어가 가능하고, 아두이노, 라즈베리파이등으로 동작시키기에 편리합니다. 또한 제어부가 비교적 간단해서 가격이 저렴하고 브러시리스(Brushless)모터이기 때문에 오래 사용할 수 있다는 장점이 있습니다. 

 

 

왼쪽이 브러시 모터, 오른쪽이 브러시리스 모터 입니다.

 

 

브러시리스 모터 (Brushless Motor)

브러시리스 모터는 말 그대로 브러시가 없는 모터를 말합니다, 브러시리스 모터는 전원에서 코일로 바로 전류를 흘려보내주기 때문에 수명이 길고 에너지 효율이 높은편 입니다.

브러시 모터 (Brushed Motor)

브로시 모터는 브러시가 있는 모터 입니다. 브러시란 전원에서 코일로 전류를 흘려보내주는 모터의 부품입니다. 아래 그림과 같이 점은색 육변체 부분을 브러시라고 하는데 주로 흑연성분으로 구성되어 있습니다, 브러시 모터는 가격이 저렴한 반면 에너지 효율이 낮고 사용할 수 록 브러시가 닳아 없어지기 때문에 브러시리스 모터에 비해 수명이 짧습니다. 

 

 


 

스텝모터의 구조 및 원리

 

출처:https://en.wikipedia.org/wiki/Stepper_motor

 

 

스텝모터는 크게 회전하는 회전자 (Rotor : 위 그림의 빨간색 부분)와 코엘에 감겨 고정되어 있는 고정자(Stator : 위 그림의 코일에 감긴 4개의 부품)로 구성되어 있습니다. 


구동방식은 다음과 같습니다.
1. 1번 전자석에 전류가 들어오면 회전자가 전류가 들어온 전자석 방향으로 회전합니다.
2. 1번 전자석에 들어오는 전류가 없어지고 2번 전자석에 전류가 들어오면 한스텝(3.6°)회전합니다.
3. 2번 전자석에 들어오는 전류가 없어지고 3번 전자석에 전류가 들어오면 한스텝(3.6°)회전합니다.
4. 이런 방식으로 1-2, 2-3, 3-4, 4-1로 전자석에 들어오는 전류에 따라 회전자가 회전을 하게됩니다.

결과적으로 위의 방식으로 100번을 반복하게되면 360°회전하여 한바퀴를 돌게 됩니다.



스텝모터의 분류
스텝모터는 작동 방식에 따라 크게 유니폴라 (Unipolar)와 바이폴라 (Bipolar)로 구분 됩니다.
유니폴라 방식은 권선에 전류를 한쪽 방향으로만 흘리는 방식으로 큰 토크(힘)가 나오지 않지만 탈조 위험이 낮고 고속회전이 가능하다는 장접이 있습니다. 
주로 SLA7024칩을 이용해서 제어합니다.

바이폴라 방식은 권선에 흐르는 전류의 방향을 바꿔서 모터를 구동하는 방식으로 회로구성이 복잡하지만 저속에서 토크 성능이 좋고 유니폴라 방식에 비해 높은 정밀도를 가진다는 장접이 있습니다 
L297, ULN2003등 H-bridge를 포함한 IC칩을 이용해서 제어합니다.

위와같이 스텝모터의 종류에 따라서 모터 드라이버가 달라지기 때문에 스텝모터를 구매할 때에는 사용하고자 하는 스텝모터의 스펙을 확인한 후에 구매해야 합니다.


스텝모터 작동

스텝모터도 고유의 라이브러리를 가지고 있습니다. 라이브러리를 이용해서 스텝모터를 작동 시켜 보도록 하겠습니다. 이번 포스팅에서 사용된 스텝모터는 28byj-48이라는 스텝모터 입니다.

 

 


 

---------------------------------------------------------------------------------------------

 


#include

 
const int stepsPerRevolution = 1024;
Stepper myStepper(stepsPerRevolution,11,9,10,8); 
 
void setup() {
  myStepper.setSpeed(30); 
  Serial.begin(9600);     
}

void loop() {
  Serial.println("counterclockwise");
  myStepper.step(stepsPerRevolution);
  delay(1000);
 
  Serial.println("clockwise");
  myStepper.step(-stepsPerRevolution);
  delay(1000);

}

 

---------------------------------------------------------------------------------------------

 

라이브러리에서 제공하는 기본 예제 (oneRevolution)를 조금 변형시켜 보았습니다.

예제의 내용은 스텝모터를 시계방향과 반시계방향으로 회전시키는 코드 입니다.

코드설명
#include
스텝모터 구동을 위한 라이브러리를 가져옵니다.

const int stepsPerRevolution = 1024;
1024는 180도를 의미하며 스텝모터가 한번 동작할 때 마다 180를 움직이게 됩니다.

Stepper myStepper(stepsPerRevolution,11,9,10,8); 
스텝 당 회전각도와 연결할 핀 번호를 설정합니다. (IN4, IN2, IN3, IN1)

 myStepper.setSpeed(30); 
스텝모터의 회전속도를 지정합니다, 회전속도가 너무 빠르거나 느리면 탈조현상이 일어납니다.

  myStepper.step(-stepsPerRevolution);
스텝모터를 한스텝 작동시킵니다.

 

 

 

스텝모터 & 가변저항

 


---------------------------------------------------------------------------------------------

 

#include

const int stepsPerRevolution = 1024;  

Stepper myStepper(stepsPerRevolution, 11, 9, 10, 8); 

 

void setup() {
}

 

void loop() {
  int sensorReading = analogRead(A0);
  int motorSpeed = map(sensorReading, 0, 1023, 0, 100);
  if (motorSpeed > 0) {
    myStepper.setSpeed(motorSpeed);
    myStepper.step(stepsPerRevolution / 100);
  } 

}

 

---------------------------------------------------------------------------------------------

 

위 예제는 가변저항을 이용해 스텝모터의 회전속도를 바꿔보는 예제를 조금 변형한 소스코드 입니다.


int sensorReading = analogRead(A0);

 

A0핀에 가변저항을 연결해서 변화하는 저항값을 읽어옵니다.


int motorSpeed = map(sensorReading, 0, 1023, 0, 100);
map함수를 이용해서 0~1023까지 들어오는 아날로그 값을 0 ~ 100으로 매칭 시켜줍니다.

  if (motorSpeed > 0) {
    myStepper.setSpeed(motorSpeed);
    myStepper.step(stepsPerRevolution / 100);
  }

motorSpeed 값이 0 ~ 100사이의 값일 경우에 스텝모터의 스피드를 motorSpeed와 동일하게 지정해주고 지정된 스피드로 스템모터를 한스텝 동작시킵니다.

 

 


 

 

  •  9,090
  •  0
  •  0

댓글을 남겨 주세요.