스텝모터 제어 실험

스텝모터는 펄스를 사용하여 정해진 각도만큼 회전하는 모터입니다. 실제로는 스텝모터 구동을 위해 스텝모터 드라이버가 사용되며 스텝모터 드라이버가 펄스 신호를 받으면 스텝모터를 구동하여 정해진 각도(스텝각)로 설정된 방향으로 회전시킵니다. 위치 및 회전 각도 제어를 위해서는 펄스의 수를 사용하며 회전 속도는 펄스의 주파수로 제어하게 됩니다.

아래는 여기서 사용하는 스텝모터와 스텝모터 드라이버 보드입니다.

스텝모터의 구동원리는 다음과 같습니다. 스텝모터의 회전축은 영구자석으로 구성되고 고정자의 권선에 전류를 통하게 하여 생성된 전자기장에 의해 영구자석 회전자가 이동하게 됩니다. 아래 그림에서 A->B->C->D 순서로 전류를 통하게 하면 자계가 이동하면서 영구자석이 회전하게 됩니다. 순서를 반대로 하게 되면 회전자는 반대로 회전하게 됩니다.

여기서 사용하는 스텝모터는 4상 5선식 스텝모터로서 구동을 위해 코일에 전류를 흘려주는 방법이 AB-BC-CD-DA-AB 또는 A-AB-B-BC-C-CD-D-DA-A 이 있으며 여기서는 두 번째 방법을 사용합니다.

 

 

소스코드

아래는 소스코드입니다. 아두이노 IDE에 붙여넣기 하여 컴파일하고 업로드합니다.

//스텝모터 구동실험

int IN1 = 7;   //IN1
int IN2 = 6;   //IN2
int IN3 = 5;  // IN3
int IN4 = 4;  // IN4
int beep= 3;  // 액티브부저 -극에 연결
char time = 0, i = 0, count = 0;

void setup()
{
  //출력 모드로 모터 드라이브 IO 초기화
  pinMode(IN1, OUTPUT); // PIN 7 
  pinMode(IN2, OUTPUT); // PIN 6 
  pinMode(IN3, OUTPUT); // PIN 5 
  pinMode(IN4, OUTPUT); // PIN 4
  pinMode(beep, OUTPUT); //PIN 3
  digitalWrite(beep, HIGH);
  Serial.begin(9600);//시리얼 전송속도 9600bps
}
/*******************************4상8스텝***********************************/
void Coil_A()
{
  digitalWrite(IN1, LOW); digitalWrite(IN2, HIGH); digitalWrite(IN3, HIGH); digitalWrite(IN4, HIGH);
}
void Coil_AB()
{
  digitalWrite(IN1, LOW); digitalWrite(IN2, LOW); digitalWrite(IN3, HIGH); digitalWrite(IN4, HIGH);
}
void Coil_B()
{
  digitalWrite(IN1, HIGH); digitalWrite(IN2, LOW); digitalWrite(IN3, HIGH); digitalWrite(IN4, HIGH);
}
void Coil_BC()
{
  digitalWrite(IN1, HIGH); digitalWrite(IN2, LOW); digitalWrite(IN3, LOW); digitalWrite(IN4, HIGH);
}
void Coil_C()
{
  digitalWrite(IN1, HIGH); digitalWrite(IN2, HIGH); digitalWrite(IN3, LOW); digitalWrite(IN4, HIGH);
}
void Coil_CD()
{
  digitalWrite(IN1, HIGH); digitalWrite(IN2, HIGH); digitalWrite(IN3, LOW); digitalWrite(IN4, LOW);
}
void Coil_D()
{
  digitalWrite(IN1, HIGH); digitalWrite(IN2, HIGH); digitalWrite(IN3, HIGH); digitalWrite(IN4, LOW);
}
void Coil_DA()
{
  digitalWrite(IN1, LOW); digitalWrite(IN2, HIGH); digitalWrite(IN3, HIGH); digitalWrite(IN4, LOW);
}
/*******************************************************************/

void beep_once()//부저를 한 번 울린다.
{
   digitalWrite(beep, LOW);
   delay(100);
   digitalWrite(beep, HIGH);
}

void loop()
{
  unsigned long now_time = micros(); //현재 시스템 런타임을 불러옵니다.
  while ((micros() - now_time) < 14648); //   60 000 000us/4096
  switch (i)
  {
    case 0: Coil_A(); i++; break;
    case 1: Coil_AB(); i++; break;
    case 2: Coil_B(); i++; break;
    case 3: Coil_BC(); i++; break;
    case 4: Coil_C(); i++; break;
    case 5: Coil_CD(); i++; break;
    case 6: Coil_D(); i++; break;
    case 7: Coil_DA(); i = 0; break;
    default: break;
  }
  count++;
  if (count == 68)//1초이면 시간을 표시하고 부저를 한번 울립니다.
  {
    count = 0;
    time++;
    if (time == 60)
      time = 0;
    Serial.print("second: " ) ;
    Serial.print(time, DEC) ;
    Serial.println("s" ) ;
    beep_once();
  }
}