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

in #kr-arduino6 years ago (edited)

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를 가지고 어떻게 회전을 할지 상상력을 펼쳐 보세요.

Sort:  

codingman 님 아두이노 나노... 그냥 꽂기만 했는데 업로드 에러가 나는데요. 이유가 뭘까요? 기본 셋팅은 보드> nano 프로세스>atmega 168로 했거든요. 포트는 com4 이런 거 밖에 안 떠서 그걸로 했는데요. 계속 업로드 에러가 나네요. 아... 미칠 것 같아서 여쭤봅니다. 좀 도와주세요. ㅎㅎㅎ

포트 문제인 것 같은데요.
보드는 나노했을 거고, 프로세서는 urobotics님이 사용하는 사양으로 atmega 168 했다면 포트 문제일꺼에요.
com4가 되어 있다고 해서 그게 아두이노 포트가 아닌 경우가 있어요.
장치관리자 가셔서 느낌표 포트를 찾아보세요.
만약 있다면 그것을 업데이트 하는데 아두이노 IDE 폴도의 드라이브로 직접 지정해주셔야 진짜 아두이노 포트가 잡힐꺼에요.
저도 과거 처음 com숫자 포트가 있는데 지정했는데 업로드 안되어서 왜 안되지 하고 삽질한 적 있어요.
알고 봤더니 아두이노포트가 안잡혀있고 장치관리자에서 느낌표로 있더군요.

https://steemit.com/kr-arduino/@codingman/5hqum8

그래도 안되면 잠시 전원잭 연결 끊었다가 좀 쉬었다가 나중에 접속하면 업로드 되는 경우가 있어요.

CH340 보드 썼거든요. 근데 그거 드라이버만 깔면 된다고 해서 깔고 잡혔는데요.그래도 안 되네요. 느낌표 포트는 없습니다. ㅎㅎㅎ 윱. 큰일입니다. ㅋㅋㅋ

http://blog.naver.com/PostView.nhn?blogId=eduino&logNo=220905318389&redirect=Dlog&widgetTypeCall=true&directAccess=false

위 블로그 처럼 하신건가요. 드라이브 설치하고 업데이트 할 때 해당 아두이노 폴더의 drivers에 클릭하고 눌렀는지요.

했는데 안 되네요. ㅎㅎㅎ 아놬... 돌겠습니다. ㅎㅎㅎ

이상하네요. 드라이브 설치하고 나서 장치관리자에서 해당 드라이브에 포트 잡혀 있으면 거기서 해당 드라이브를 업데이트 해서 아두이노 폴더 드라이브로 연결해서 진행하면 잡힐텐데요.
혹시 bluetooth같은거 시리얼포트쪽에 연결해놓고 업로드 시킨 건 아니죠.

pairplay 가 kr-dev 컨텐츠를 응원합니다! :)

응원해 주셔서 감사합니다.

짱짱맨 호출에 출동했습니다!!
짱짱맨 x 마나마인! 색연필과학만화
https://steemit.com/kr/@mmcartoon-kr/4cmrbc
존버앤캘리에 이은 웹툰입니다
아이들이 보기에도 좋을꺼 같아요^^ 글작가님이 무려 스탠포드 물리학박사라고......

색연필 만화가 확실히 금손 작품이라서 그런가 멋지네요.

Coin Marketplace

STEEM 0.19
TRX 0.15
JST 0.029
BTC 63498.69
ETH 2645.91
USDT 1.00
SBD 2.80