[아두이노] Stepper Motor 원하는 각도 회전(1)

IOT/아두이노|2019. 5. 2. 09:00

[아두이노] Stepper Motor 원하는 각도 회전(1)



지난 시간에 Stepper Motor를 간단히 360도 회전 실험을 했습니다. 이제는 Stepper Motor로 자유자재로 회전을 시켜 봐야 겠지요. 그럼 원하는 각도로 회전 시키는 방법을 알아보도록 합시다.


1. Stepper Motor 회전의 원리


회전을 제어하는 Motor는 대표적으로 두 종류가 있습니다. Servo Motor와 Stepper Motor 입니다. 둘은 비슷하게 회전하지만 실제 회전 명령을 내릴 때는 약간의 차이가 있습니다. Servo Motor의 경우 0~180도 사이 각으로 회전을 하게 됩니다. 여기서 90도 회전 할 경우 servo.write(90도) 이라고 표현하면 90도 만큼 회전 됩니다. 그리고 90도 위치에서 다시 120도 위치로 갈려면 servo.write(120도) 이라고 표현하면 됩니다. 즉, 원하는 각도로 가고 싶으면 해당 각도값을 넣으면 해당된 위치로 Servo Motor가 회전하게 됩니다.

하지만 Stepper Motor의 경우 좀 다릅니다. 360도 회전 시킬 수 있는 Motor 입니다. 여기서, 90도 회전시 stepper.step(90도스텝수) 표현하면 90도 만큼 회전 됩니다. 그런데 90도 위치에서 120도 위치로 갈려면 stepper.step(120도스텝수) 이라고 하면 안됩니다. stepper.step(120도스템수)이라고 하면 현재 90도 위치이지만 그 시점에서 새롭게 120도 만큼 회전을 하여 210도를 위치로 회전 됩니다. 즉, 회전이 끝난 지점이 새로운 회전이 시작되는 지점이니깐 90도 회전 후 120도 위치로 회전 될려면 Stepper Motor는 30도 회전을 시켜야 합니다. 이점을 생각하시고 코딩을 하셔야 합니다. 즉, 매번 회전 명령을 내리는 곳이 시작점이 되는 거라고 생각하시면 됩니다.

Servo Motor와 Stepper Motor의 회전는 이점을 생각하고 코딩하면 됩니다.

2. Stepper Motor 회로도



  • 준비물 : 5V 스템모터, ULN2003 모터드라이버, 아두이노우노
  • 내용 : 8,9,10,11핀을 순서대로 IN1, IN2, IN3, IN4에 연결하고 스템모터와 UNL2003 모터쉴드에 연결하시오.


지난 시간과 동일한 회로도를 사용하였습니다.


3. 코딩



함수

#include <Stepper.h>
  • Stepper stepper(STEPS, IN1, IN2, IN3, IN4) : 사용하는 Stepper Motor 스템수, 각 4핀을 세팅.
  • stepper.setSpeed(값) : Stepper Motor의 속도 설정.
  • stepper.step(스텝수) : 스템수로 회전 각을 표현 한다.

시리얼 통신

  • Serial.begin(9600) : 시리얼 통신 시작(9600 통신속도)
  • Serial.println(값) : 시리얼모니터 출력
  • Serial.available() : 시리얼통신으로 데이터가 들어놨는지 상태 확인
  • Serial.parseInt() : Int형으로 데이터를 읽음

[지난 시간 소스]

#include <Stepper.h>

#define STEPS 2048

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

void setup() {
  stepper.setSpeed(12);
}

void loop() {
  stepper.step(STEPS);
  delay(1000);
  stepper.step(-STEPS);
  delay(1000);
}

위 소스를 가지고 수정을 합시다.

우선, 아두이노 IDE 시리얼모니터에서 입력으로 회전각을 입력한다고 가정하면 아래와 같이 회전 각을 int형으로 읽어서 val변수에 회전각을 저장하게 표현 했습니다. 참고로 정수로 입력하는 방식으로 정수로 읽게 parseInt()함수로 표현 했고요.

if(Serial.available()) {
    int val=Serial.parseInt();
}

이제 val이라는 변수는 회전각도 값이 들어 있으니깐 이 각도를 실제 Stepper Motor의 회전 스템수로 변환 시켜야 겠죠. 스템수가 회전각이니깐요. 가독성으로 각도로 입력을 했습니다. 각도에 대한 스템수를 구하는 식이 필요 하겠죠. 예로 180도라고 입력을 하면 180도에 대한 스템수 1024값을 구해야 합니다.

그러기 위해서는 다음과 같이 map()함수를 이용합니다.

val=map(val,0,360,0,2048);

map() 함수에 입력각 val에 대한 입력 범위 0~360에서 출력 0~2048의 스템수를 세팅하면 회적 각도에 따라 스템수를 만들어 낼 수 있습니다. val이 180이면 스템수는 1023이 나오고 만약 -180도면 -1023 스템수가 나오게 됩니다. 이렇게 해서 각도에 대한 스템수를 만들어 냈습니다.

회전은,

stepper.step(val);

마무리로 step() 명령으로 실제 Stepper Motor를 회전을 시켜 원하는 각도에 제어할 수 있게 됩니다.

종합해서 코딩하면,

#include <Stepper.h>

const int STEPS = 2048;
Stepper stepper(STEPS, 8,10,9,11);

void setup()
{
  stepper.setSpeed(14);
  Serial.begin(9600);
}

void loop()
{
   if(Serial.available()) {
    int val=Serial.parseInt(); //회전각 int형으로 읽기
    
    val=map(val,0,360,0,2048); //회전각 스템 수
    stepper.step(val);
    Serial.println(val);
    delay(10);
  }
}

아두이노 IDE 시리얼모니터에서 입력한 각도에 따라 원하는 각도로 Stepper Motor를 회전을 시킬 수 있게 되었습니다.

4. 결과


아두이노 IDE 시리얼모니터에서 각도를 입력하면 Stepper Motor가 그 각도에 맞에 회전을 하는 영상입니다.


마무리


아두이노 IED 시리얼 모니터에서 입력한 회적각을 map()함수로 회전 스템수로 구하고 step()함수로 실제 Stepper Motor를 회전 키는 로직을 완성 했습니다. 시리얼 통신으로 회전을 제어 할 수 있게 되었으니깐 이걸로 블루투스 통신으로 하면 스마트폰으로 쉽게 Stepper Motor를 회전 시킬 수 있겠죠. 아니면 processing 으로 이미지로 버턴을 만들어서 Stepper Motor를 회전 시킬 수 도 있습니다. 그것도 아니면, 입력을 조이스틱이나 가변저항 같은 것들로 외부의 다른 Sensor를 이용해서 회전을 시킬 수 도 있습니다. 선택은 여러분의 상상력에 따라 달라집니다.

추가로, Bluetooth를 이용해서 스마트폰으로 회전을 시켰는데 오늘 전부 다 올리려고 하니 좀 내용이 길어질 것 같아서 나눠서 내일 post에 올리도록 하겠습니다.

여러분들은 Stepper Motor를 가지고 어떻게 회전을 할지 상상력을 펼쳐 보세요.


댓글()