고급 예제

다양한 도구들을 가지고 마음껏 응용해보세요.

스텝모터

2014-09-30 17:18:36

개요


출처 : 스텝모터를 이용한 3D 프린터 'Huxley' - reprap

오픈소스 3D 프린터 프로젝트인 랩랩(reprap)의 '헉슬리'입니다.
일반적으로 3D프린터는  X,Y,Z축을 정밀하게 이동하며
주원료인 필라멘트를 쌓아올리며 출력을 하게 됩니다.
이때 노즐과 베드의 움직임을 제어하는것이 바로 스텝모터(stepper motor) 입니다.
스텝모터는 정밀한 속도와 방향제어가 가능하여 각종 기계의 제어부에 많이 사용되고 있는데요,

이번 예제에서는 스텝모터(stepper motor)에 대해 알아보고,
스텝모터 드라이버를 이용하여 스텝모터의 속도와 방향을 제어해 보겠습니다.

출처 : 스텝모터의 구조 - wikipedia.org

스텝모터는 구동 방식에 있어서,
유니폴라(unipolar)방식과 바이폴라(bipolar)방식으로 분류되는데요,
유니폴라 방식은 모터의 권선(코일)에 흐르는 전류가 항상 한쪽 방향으로만 흐르는 구동 방식이고,
바이폴라 방식은 모터의 권선(코일)에 흐르는 전류의 방향이 바뀌는 구동 방식입니다.
그러면 이러한 방식은 각각 어떠한 장단점이 있을까요 ?

유니폴라 방식의 장점은 고속으로 구동시에 토크가 높아
탈조 될 위험이 적어서 고속회전에 용이 하고,
비교적 구동 회로가 간단합니다.
하지만 모터코일에 저장된 에너지를 회생 하지 않으므로 효율이 안좋습니다.
그리고 저속에서 구동시 토크가 바이폴라에 비해 적습니다.

바이폴라 방식의 장점은 저속 구동시 토크가 높고,
코일에 저장된 전류가 회생 되어 효율이 높습니다.
하지만 고속 구동시 토크가 급격하게 저하되어 탈조가 발생 할 우려가 있고,
구동 회로의 구성이 상대적으로 복잡 합니다.
 
스텝 모터의 구조를 살펴보면
고정자(stator) 회전자(rotar)가 있는데,
고정자는 코일이 감겨져있는 있는 부분이고,
회전 자는 중심의 회전하는 부분입니다.


출처 : 5상 스텝모터와 2상 스텝모터 - busch-machinery.com
 
이때 고정자의 위치와 개수에 따라 상(Phase)가 정해지게 됩니다.
일반적인 2상 스텝의 경우에는 십자 모양으로 
4개가 하나의 상을 이루고 45도 회전하여
총 2가지의 상태를 지니게 됩니다.


출처: 스텝모터의 작동원리 - wikipedia.org
 
이러한 고정자와 회전자를 제어하는 방식을
마이크로 스텝이라고 하는데
고정자에 인가하는 전류를 조절하여,
곡선식의 전류를 전해줌으로써 부드럽고 세밀한 제어가 가능한 것입니다.
또한 이 같은 방식은 소음이 적다는 것이 특징입니다.

그럼 실습을 통해 스텝모터를 제어해보고 
다양한 프로젝트에 적용해보세요!
 

미리보기 동영상


 

부품목록

 

 

NO 부품명 수량 상세설명
1 오렌지 보드 1 아두이노 호환보드 
2 바이폴라 스테핑 모터쉴드 1 A4988드라이버 2개 포함
3 바이폴라 스테핑 모터 1 SM-42byg011-25(4선 스텝모터 사용)
4 8v-35v DC 어댑터 1 전원공급장치

 

 

부품명 오렌지 보드 바이폴라 스테핑 모터쉴드 바이폴라 스테핑 모터 8v-35v DC 어댑터
사진 X1 X1 X1 X1


SM-42BYG011-25 스테핑 모터 스펙 

 

  • 스텝 각도 - Step Angle (degrees) :1.8도
  • 2  상-(2phase)
  • 정격전압- Rated Voltage : 12V
  • 정격전류 -Rated Current : 0.33A
  • 최대정지토크- Holding Torque : 2.3kg*cm
  • 5mm Diameter Drive Shaft
  • Winding resistance: 32.6 Ω
  • Winding inductance: 48 mH
  • Max flux linkage: 1.8 Vs
  • Maximum Detent Torque: 0.016 N.M
  • Total inertia (kg.m.m): 3.5 Kg.m.m
  • Total friction (kg.m/s): 4 Kg.m/s


바이폴라 스테핑 모터쉴드

 

 

 

 

  • 입력전압:8-35V DC(모터드라이버 구동 전압)
  • 프레스 커넥터 (스크류단자와 달리 쉽게 연결 가능)
  • 사용하는 디지털 입/출력 :D4,D5,D6,D7
  • 10 채널의 디지털 입/출력 &6 채널의 아날로그 입/출력 사용가능 
  • A4988 마이크로 바이폴라 스텝퍼 모터 드라이버 사용
  • 전류 제한 조정 가능
  • 코일당  2 A(암페어)  출력
  • 다섯 단계의 마이크로 출력 해상도 (down to 1/16-step)

 

 

 

하드웨어 Making

 

브레드보드 레이아웃





 

사진 : 스텝모터 드라이버 A4988 연결도 (Full-Step 모드)

해당 쉴드는 좌측 상,하부에 위치한 스위치로
마이크로 스텝 해상도를 조절할 수 있습니다.

 
이 기능은 기본적으로 1.8도/200단계로 작동하는 스텝모터를
중간단계의 위치를 허용하여 800단계의 마이크로 스텝으로제어할수 있습니다.
MS1과 MS3는 내부 100킬로옴의 풀다운 저항을 지니고,
MS2는 50킬로옴의 풀다운 저항을 갖습니다.
단, 마이크로 모드가 정상 작동하려면,
모터의 전원은 허용되는것(전류제한 없이)보다 높은것을 사용하되
전류 제한을 충분히 낮게 설정해야 합니다.
일반적인 스텝모터는 5옴의 코일저항을 가진 최대 1A전류 등급을 지니고 있으며,
이는 모터의 최대 전압이 5V 라는 것을 의미합니다.
이러한 스텝모터에 12V를 공급하여 더 높은 스텝율을 얻을 수 있지만,
모터가 손상되는 것을 막기 위해 전류는 1A이하로 제한되어야 하는 것입니다.


 

전류 제한 설정은  쉴드에 장착된  A4988드라이버의 가변저항을 통해 제어합니다.
전류 제한을 설정하는 방법은 드라이버를 Full - Step 모드에 놓고,
STEP입력을  Clocking하지 않은 싱글 모터 코일에 흐르는 전류를 측정합니다.
측정된 전류는 전류 제한의 0.7배가 되는데,
두개의 코일은 항상 켜져 있으며 Full-Step모드에서 두개의 코일은 전류제한 셋팅의 70%로 제한되어 있기 때문입니다.
전류제한을 설정하는 다른 방법은 REF(리퍼런스)핀상의 전압을 측정하고 예상되는 전류제한 값을 계산하는 것입니다.
전류 센스 저항은 0.05옴이며,
Current Limit(전류제한) = VREF(리퍼런스 전압) X 2.5의 공식을 지니는데
예를 들어 리퍼런스 전압이 0.3V 라면 전류 제한은 0.75A 입니다.
위에서 언급한대로,  Full-Step 모드에서 코일에 흐르는 전류는 전류제한의 70%로 제한되어 있어,
1A의 Full-Step 코일 전류를 얻기 위해서는 전류제한은 1A/0.7=1.4A가 되어야 합니다.
이값은 VREF(리퍼런스전압)을 1.4A/2.5=0.56V로 계산할 수 있게 합니다.
*전류측정계를 갖다댈 위치는 스텝모터 코일 중 하나와 직렬로 연결된 부분입니다.
전원 전류에서 측정된 전류값을 전류제한으로 사용하지 마세요.
보다 자세한 사항은 A4988의 데이터시트를 참고하세요.

소프트웨어 Coding

아래의 코드를 아두이노에 업로드 합니다.

//A4988 드라이버를 이용한 스테핑 모터 제어 예제
//VDD 는 Arduino 3.3v 나 5v에 연결합니다.
//GND 는 Arduino의 GND에 연결합니다.
//1A 와 1B 는 stepper coil 1에 연결합니다.
//2A 와 2B 는 stepper coil 2에 연결합니다.
//VMOT 는 외장전원의 +극에 연결합니다.
//GRD 는 외장전원의 -극에 연결합니다.
// 최종수정 : www.kocoafab.cc
int m1stp = 5;  //첫벗째 스텝모터의 stp를 5번핀에 연결합니다.
int m1dir = 4;  //첫번째 스텝모터의 dir를 4번핀에 연결합니다.
int m2stp = 6;  //두번째 스텝모터의 stp를 6번핀에 연결합니다.
int m2dir = 7;  //두번째 스텝모터의 dir을 7번핀에 연결합니다.
int a = 0;      //a라는 변수를 통해 스텝을 카운트 합니다.
int d;//d라는 변수를 선언하여 임의의 딜레이 값으로 활용합니다. 

void setup() 
{    

  d = 1;  // d의 초기값을 1로 설정하여 1밀리초만큼의 대기시간으로 회전합니다
  Serial.begin(9600);//시리얼통신을 시작합니다.
  pinMode(m1stp, OUTPUT);//m1stp를 출력으로 설정합니다.
  pinMode(m1dir, OUTPUT);//m1dir을 출력으로 설정합니다.    
  pinMode(m2stp, OUTPUT);//m2stp를 출력으로 설정합니다.
  pinMode(m2dir, OUTPUT);//m2dir을 출력으로 설정합니다.
}

void loop() 


{
  if (Serial.available())// 시리얼 통신이 가능할때,{
    d = Serial.read() - 48;// 입력된 문자값을 읽고 -48을 빼준값을 d(딜레이)값으로 사용합니다.
    Serial.println(d);//시리얼 모니터에 d값을 출력합니다.
  }



  if (a <  1000)  //만약 a가 1000보다 작을때, 
  {
    a++;//a의 값을 계속 증가시키고,
    digitalWrite(m1stp, HIGH);  //각각의 stp를 HIGH로 합니다,
    digitalWrite(m2stp, HIGH); 
    delay(d);               //d밀리초만큼 대기한뒤
    digitalWrite(m1stp, LOW);  // stp를 LOW로 합니다.
    digitalWrite(m2stp, LOW); 
    delay(d); // d밀리초만큼 대기합니다.
  } else     //아닐경우,
  {
    digitalWrite(m1dir, HIGH);//dir을 HIGH로 출력하고,
    digitalWrite(m2dir, HIGH);
    a++;//a값을 증가시킵니다.
    digitalWrite(m1stp, HIGH);//stp를 HIGH로 출력하고,
    digitalWrite(m2stp, HIGH);  
    delay(d);               //d밀리초 만큼 대기한뒤,
    digitalWrite(m1stp, LOW);//stp를 LOW로 출력합니다.
    digitalWrite(m2stp, LOW); 
    delay(d);//d밀리초만큼 대기합니다.

    if (a>2000)  //a가 2000보다 커지면,
    {
      a = 0;//초기화를 합니다.
      digitalWrite(m1dir, LOW);
      digitalWrite(m2dir, LOW);
    }
  }
}
 


스케치 설명

 

int m1stp = 5;  //첫벗째 스텝모터의 stp를 5번핀에 연결합니다.
int m1dir = 4;  //첫번째 스텝모터의 dir를 4번핀에 연결합니다.
int m2stp = 6;  //두번째 스텝모터의 stp를 6번핀에 연결합니다.
int m2dir = 7;  //두번째 스텝모터의 dir을 7번핀에 연결합니다.
int a = 0;      //a라는 변수를 통해 스텝을 카운트 합니다.
int d;//d라는 변수를 선언하여 임의의 딜레이 값으로 활용합니다. 


stp는 스텝모터의 상을 제어합니다.
상이 HIGH,LOW(켜고 꺼짐)속도에 따라 회전속도가 변화합니다.
dir는 스텝모터의 방향을 제어합니다.
a라는 변수는 스텝모터의 스텝을 카운트 합니다.
d라는 변수는 시리얼 모니터 통신을 통해 속도를 제어하기 위해 사용됩니다.

 

 

 

  if (Serial.available())// 시리얼 통신이 가능할때,{
  d = Serial.read() - 48;// 입력된 문자값을 읽고 -48을 빼준값을 d(딜레이)값으로 사용합니다.
  Serial.println(d);//시리얼 모니터에 d값을 출력합니다.


시리얼 통신을 통해 앞서 선언한 변수 'd'의 값을 제어하는데,
d는 앞으로 delay값으로 사용되며 스텝모터의 회전속도에 영향을 줍니다.
이는 지연시간을 통해 펄스 신호의 주파수를 제어합니다.
입력된 문자값에 -48을 빼줍니다.
-48이라는 연산이 없으면,
숫자 1을 입력 했을때 , 49라는 값이 출력됩니다.
시리얼 모니터를 통해
1-9의 숫자입력으로 속도를 제어되고,
0을 입력하면 스텝모터가 멈추게 됩니다.

 

 

 

 

  if (a <  1000)  //만약 a가 1000보다 작을때, 
  {
    a++;//a의 값을 계속 증가시키고,
    digitalWrite(m1stp, HIGH);  //각각의 stp를 HIGH로 합니다,
    digitalWrite(m2stp, HIGH); 
    delay(d);               //d밀리초만큼 대기한뒤
    digitalWrite(m1stp, LOW);  // stp를 LOW로 합니다.
    digitalWrite(m2stp, LOW); 
    delay(d); // d밀리초만큼 대기합니다.
  } else     //아닐경우,
  {
    digitalWrite(m1dir, HIGH);//dir을 HIGH로 출력하고,
    digitalWrite(m2dir, HIGH);
    a++;//a값을 증가시킵니다.
    digitalWrite(m1stp, HIGH);//stp를 HIGH로 출력하고,
    digitalWrite(m2stp, HIGH);  
    delay(d);               //d밀리초 만큼 대기한뒤,
    digitalWrite(m1stp, LOW);//stp를 LOW로 출력합니다.
    digitalWrite(m2stp, LOW); 
    delay(d);//d밀리초만큼 대기합니다.

    if (a>2000)  //a가 2000보다 커지면,
    {
      a = 0;//초기화를 합니다.
      digitalWrite(m1dir, LOW);
      digitalWrite(m2dir, LOW);
    }
  }
}


a라는 카운터를 통해 일정 스텝이상 진행되면,
방향을 바꾸도록 설정하였습니다.
또한 2000스텝 이상일 경우,
초기화하여 0부터 다시 스텝카운터가 진행됩니다.
따라서 0부터 시작하여 스텝카운터가 1000 이상이되면, 방향을 반대 방향으로 바꾸고,
2000보다 커지면 다시 방향을 바꾸게 됩니다.

 

 

 

 

 

kocoafabeditor

항상 진취적이고, 새로운 것을 추구하는 코코아팹 에디터입니다!

스텝모터, 아두이노, 오렌지보드