아두이노 스텝모터 (28BYJ-48) 구동하기
아래의 스텝모터는 인터넷에서 쉽게 구할 수 있으며 스텝모터(28BYJ-48)와 모터 드라이브(ULN2003)가 함께 판매되고 있다.
아래의 예제는 모터가 한바퀴 회전하고 다시 역방향으로 한바퀴 회전하는 예제이다.
아래의 순서대로 점퍼 케이블을 연결한다.
주황색 케이블 : 아두이노 8번핀, 스텝모터 IN1
초록색 케이블 : 아두이노 9번핀, 스텝모터 IN2
파란색 케이블 : 아두이노 10번핀, 스텝모터 IN3
노란색 케이블 : 아두이노 11번핀, 스텝모터 IN4
하얀색 케이블 : 아두이노 5V, 스텝모터 +
검은색 케이블 : 아두이노 GND, 스텝모터 -
예제 소스1
#include <Stepper.h> // 2048:한바퀴(360도), 1024:반바퀴(180도)... const int stepsPerRevolution = 2048; // 모터 드라이브에 연결된 핀 IN4, IN2, IN3, IN1 Stepper myStepper(stepsPerRevolution,11,9,10,8); void setup() { myStepper.setSpeed(14); } void loop() { // 시계 반대 방향으로 한바퀴 회전 myStepper.step(stepsPerRevolution); delay(500); // 시계 방향으로 한바퀴 회전 myStepper.step(-stepsPerRevolution); delay(500); }
예제소스2
#include <Stepper.h> const int stepsPerRevolution = 64; Stepper myStepper(stepsPerRevolution, 11,9,10,8); void setup() { myStepper.setSpeed(300); } void loop() { // 시계 반대 방향으로 한바퀴 회전 for(int i=0; i<32; i++) { // 64 * 32 = 2048 한바퀴 myStepper.step(stepsPerRevolution); } delay(500); // 시계 방향으로 한바퀴 회전 for(int i=0; i<32; i++) { myStepper.step(-stepsPerRevolution); } delay(500); }
스텝모터 (28BYJ-48)와 모터 드라이브 (ULN2003)으로 구성되어 있다.
주황색 IN1, 초록색 IN2, 파란색 IN3, 노란색 IN4에 연결한다.
주황색 8번핀, 초록색 9번핀, 파란색 10번핀, 노란색 11번핀에 연결한다.
아두이노의 5V는 +에 연결하고 GND는 -에 연결한다.
소스코드를 업로드하면 모터가 회전하는 것을 확인 할 수 있다.
#include <Stepper.h>
#define BUADRATE 9600
#define IN1 11 // IN1
#define IN2 10 // IN2
#define IN3 9 // IN3
#define IN4 8 // IN4
#define STEPS 2048 // 1봐퀴 스텝수
#define RPM 10 // 10 이하로 설정을 권장
// Stepper 클래스 객체 생성
Stepper myStepper(STEPS, IN1, IN3, IN2, IN4);
// 시리얼 포트로 angle 값을 저장할 문자열
String myString;
int angle = 0; // 현재 각도를 저장할 전역 변수
int flag = 0; // 시리얼 통신으로 각도 입력시 활성 flag
void setup(){
myStepper.setSpeed(RPM);
Serial.begin(BUADRATE);
while(!Serial){
;
}
delay(1000);
Serial.println("Program Start..");
Serial.print("Input Angle >> ");
}
void loop(){
int temp;
if(flag == 1){
temp = myString.toInt();
// angle 은 현재 추가된 각도를 계속 저장 0 ~ 360도 단위
angle = (angle + temp) % 360;
// temp 의 각도를 step 으로 변환
temp = toStep(temp);
myString = "";
myStepper.step(temp);
Serial.print("Present Angle : ");
Serial.println(angle);
delay(20);
Serial.print("Input Angle >> ");
flag = false;
}
delay(100);
}
void serialEvent()
{
char cTemp = (char)Serial.read();
// 시리얼 포트에서 입력 받을 수 있는 문자는 숫자, Backspace, - 기호만 허용
if (isDigit(cTemp) || cTemp == '\b'|| cTemp == '-'){
myString += cTemp;
}
// 엔터 입력시 각도를 다 입력 한 것으로 침
else if(cTemp == '\n'){
flag = true;
}
// 아무 값 입력없이 Enter 를 치면 경고 메세지 출력
else if(cTemp == '\r'){
if (myString == "") ErrorHadler();
}
else /* if (cTemp < '0' || cTemp > '9') */{
ErrorHadler();
}
}
// 시리얼 통신으로 부터 입력 받은 각도를 step 으로 변환
// CW, CCW 각도 모두 사용 가능
// 360도를 초과할 때도 처리 가능
int toStep(int angle){
int quotient = angle / 360;
int remainder = angle % 360;
remainder = map(remainder, -360, 360, -2048, 2048);
if(abs(quotient) > 0)
return (2048 * quotient) + remainder;
else
return remainder;
}
void ErrorHadler()
{
Serial.print('\r');
Serial.print('\n');
Serial.println("Error! Input Angle Number..");
myString = "";
Serial.print("Input Angle >> ");
}