아두이노 스텝모터 (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 >> "); } |