공대스러운/액추에이터 프로젝트

액추에이터 프로젝트2 - 스텝모터 기본동작(회전방향, 전원공급)

통학하는 공대생 2023. 8. 29. 21:37

이전 게시글에서 유튜브 영상 튜토리얼을 통해 배운 정말 기본 스텝모터 컨트롤을 다루었습니다!

https://study4machine.tistory.com/4

 

액추에이터 프로젝트1 - 스텝모터 컨트롤 기본

아두이노로 서보모터를 컨트롤 하는것은 인터넷, 책을 비롯해 많은 기본 예제 및 강의에서 다루고 있고, 저 또한 이를 응용해서 많은 경험을 했습니다. 하지만 어느샌가 각도제어의 제한도 없고

study4machine.tistory.com


오늘은 이 기본적인 모터 구동방식을 활용할 수 있도록 코드만 살짝 수정 해 볼게요

우선, 아두이노는 c언어를 기반으로 한 언어 이기 때문에 c언어와 거의 유사한 문법을 공유합니다.
그 중에서 for문 이라는 반복문 함수를 사용 해 볼건데요,

일단 회로도와 코드는 이렇습니다

이전 게시글에서 사용했던 회로도와 동일합니다

int en = 2;
int step = 3;
int dir = 4;

void setup() {
	pinMode(en, OUTPUT);
	pinMode(step, OUTPUT);
	pinMode(dir, OUTPUT);

	digitalWrite(en, LOW);       // 모터에 전원을 인가합니다
	digitalWrite(step, LOW);     
	digitalWrite(dir, LOW);      // 모터의 회전 방향을 반시계로 기본 설정 합니다

	delay(1000);                 // 1초간 대기
}

void loop() {

  int i;                        // for문을 위한 변수 i선언

  for (i = 0; i < 800; i++ ){   // for( 초기값; i가 800이 되기 전까지; 반복문 한 사이클당 1씩 증가)
    digitalWrite(step, HIGH);   // 본 회로도 대로 연결할 경우, 800스텝이 한바퀴 회전 입니다.
  	delay(1);
	  digitalWrite(step, LOW);
  	delay(0.1);                  // 여기까지가 한 스텝 움직이는 코드, 이걸 800번 반복하여 한바퀴를 돌립니다.
  }

  digitalWrite(dir, HIGH);      // 회전 방향을 시계방향으로 설정
 
  for (i = 0; i < 800; i++ ){   // 딜레이 없이 바로 한바퀴 회전
    digitalWrite(step, HIGH);   
  	delay(1);
	  digitalWrite(step, LOW);
  	delay(0.1);
  }
  
  digitalWrite(dir, LOW);       // 회전 방향을 다시 반시계로 설정

  digitalWrite(en, HIGH);       // 모터에 전원 공급 off
  delay(2000);                  // 2초간 대기
  digitalWrite(en, LOW);        // 모터에 전원 공급 다시 on
  delay(2000);                  // 2초간 대기

}


이 코드를 입력하면 결과적으로

반시계 방향으로 한바퀴 회전 -> 시계방향으로 한바퀴 회전 -> 2초동안 모터멈춤(모터 전원 off) -> 2초동안 모터멈춤(모터 전원 on)


이 실행됩니다.
여기서 시계방향으로 회전한 뒤 처음으로 모터가 멈추었을 때, 축을 잡고 돌리면 힘없이 돌아가버립니다. 그러고서 2초가 지나면 모터에 힘이 꽉 물리는? 느낌으로 축이 고정되어 안돌아가구요.

같은 코드의 내용을 아두이노 함수 기능을 통해 구현하면 다음과 같습니다.

int en = 2;
int step = 3;
int dir = 4;

void setup() {
	pinMode(en, OUTPUT);
	pinMode(step, OUTPUT);
	pinMode(dir, OUTPUT);

	digitalWrite(en, LOW);
	digitalWrite(step, LOW);
	digitalWrite(dir, LOW);

	delay(1000);
}

void loop() {

  CWrotation();               // loop 문의 내용이 간략화 되었습니다.
  CCWrotation();

  digitalWrite(en, HIGH);
  delay(2000);
  digitalWrite(en, LOW);
  delay(2000);

}

void CWrotation() {          // 시계방향 회전에 대한 내용
  int i;
 
  for (i = 0; i < 800; i++ ){
    digitalWrite(step, HIGH);
  	delay(1);
	  digitalWrite(step, LOW);
  	delay(0.1);
  }

  digitalWrite(dir, HIGH);
}


void CCWrotation() {        // 반시계방향 회전에 대한 내용
  int j;
  
  for (j = 0; j < 800; j++ ){
    digitalWrite(step, HIGH);
  	delay(1);
	  digitalWrite(step, LOW);
  	delay(0.1);
  }
  
  digitalWrite(dir, LOW);
}


loop문 의 시계방향, 반시계방향 회전 내용을 함수를 통해 밖으로 뺀것이기 때문에 실행결과는 동일합니다.
지금 당장엔 코드가 더 길어졌지만, 나중엔 이러한 함수를 활용하여 동작을 구현 하는것이 더 효율적일 수도 있겠네요.

이상으로 스텝모터의 기본 동작에 대해 다뤄봤습니다 :)

궁금한 것이 있다면, 댓글 혹은 통학하는 공대생 인스타 DM으로 연락 주세요!

https://www.instagram.com/study_4_machine/


감사합니다