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

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

 

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