2013. 12. 17. 14:30

'Stepper.h'는 아두이노에서 스태핑모터를 다룰 때 기본적으로 사용하는 라이브러리입니다.

 

예전부터 뭔가 이상하다고 했는데.....

'Stepper.h'의 '.step()'를 호출하면 모터의 동작이 끝나기 전에 다음 코드가 동작하지 않는다는 것을 느꼈습니다.

 

 

연관글 영역

 

 

1. 테스트해 보기

 

테스트는 간단합니다.

'.step()'의 앞뒤로 LED를 끄고 켜 봅시다.

 

결선은 이전에 썼던 'ULN2004'을 이용한 스텝 모터 구성에 led만 추가합니다.

(참고 : [Arduino] ULN2004(ULN2003)칩을 이용한 스테핑 모터(stepping motor) 제어)

 

코드는 다음과 같이 심플하게 만듭니다.

#include <Stepper.h>

#define LED 13

Stepper stepper(200, 8, 9, 10, 11);


void setup()
{
  Serial.begin(9600);
  stepper.setSpeed(30);
  
  pinMode(LED, OUTPUT);
}

void loop()
{
  if (Serial.available())
  {
    Serial.read();
    digitalWrite(LED, HIGH);
    stepper.step(200);
    digitalWrite(LED, LOW);
    
  }
}

 

 

단순히 코드만 보면 신호만 들어오면 LED는 켜졌는지도 모르게 꺼져야 합니다.

하지만...

 

 

 

첫 번째 모터가 멈춰야 두 번째 모터가 동작합니다.

중간에 LED가 있다면 모터 동작이 끝나기 전에는 꺼지지 않겠죠.

 

 

 

2. 이런 동작의 이유

이거 이유를 모르고 별생각 없이 해결방법을 찾으려는데 딱히 나오는 자료도 없고-_-;;;

 

그래서 'Stepper.h'와 'Stepper.cpp'를 열어 봤더니....

 

 

아....이런.....

코드를 보니 '.step()'가 동작하는 중에는 'while()'문 안에 들어가 있기 때문에

 '.step()'가 동작을 끝내기 전에는 다음 코드가 실행되지 않는 것이 정상이라는 것입니다.

ㅡ,.ㅡ;;;;

 

그렇다는 것은 'Stepper.h'로는 한 번에 2개의 모터를 제어한다거나 다른 동작을 할 수 없다는 것이죠.

실제로 값을 출력하거나 아날로그값을 읽어오거나 하는 동작도 안된다는 것입니다.

 

 

 

왜 이런 구조가 되었나?

이건 아두이노의 문제라고 해야 하나....

이유는 모르겠는데 아두이노는 '쓰레드(Thread)'를 지원하지 않습니다.

 

그렇기 때문에 별도의 컨트롤러를 이용하여 'loop()'안에서 호출하는 구조를 같지 않으면 

라이브러리 자체가 별도로 'loop()'와 같은 역활을 할 수 없습니다.

 

이것은 약간 변태적인 구조라고 할 수 있습니다.

하지만 자체적으로 멀티쓰레드를 지원하지 않는 아두이노에서는 어쩔 수 없는 선택이죠-_-;;

(유저들이 구현한 쓰레드는 있습니다. 이건 다른 포스트에서 소개하도록 하죠 ㅎㅎ)

 

 

 

3. 해결방법은 없는가?

제가 검색어를 잘못 잡은 건지 충분히 있을 만한 내용인데.....

 

못 찾았습니다 ㅡ.-;;;;;

 

해결방법은 'Stepper.h'를 직접 구현하고 'loop()'에서 새로 만든 라이브러리를 호출하여 'while()'문 역활을 해주게 만들면 됩니다.

참~~암 쉽조잉?

그런데 'loop()'는 다른 요소에 의해 딜래이가 생길 수 있기 때문에 'Stepper.h'를 그냥 사용하면 동작에 문제가 있을 수 있기는 합니다.

(부드럽게 돌아가지 않는다거나 원하는 스탭만큼 안웁직일 수 있습니다.)

 

이것을 구현하는 것은 다음 포스트를 확인 하세요.

(참고 : [Arduino] 한번에 2개이상의 스테핑 모터를 제어하기)

 

 

 

마무리

아무리 제가 검색어를 잘못 잡았어도 이렇게까지 자료가 없는 건 이상하네요-_-;;

 

아두이노 포럼 - How to drive two steppers at a same time, two steppers with arduino

답변도 별 볼 일 없죠-_-;

 

조만간 코드 만들어서 올리도록 하겠습니다. ㅎㅎㅎ