아두이노 스텝모터 제어 코드 - adu-ino seutebmoteo jeeo kodeu

아두이노 스텝모터 (28BYJ-48) 구동하기

아래의 스텝모터는 인터넷에서 쉽게 구할 수 있으며 스텝모터(28BYJ-48)와 모터 드라이브(ULN2003)가 함께 판매되고 있다.

아래의 예제는 모터가 한바퀴 회전하고 다시 역방향으로 한바퀴 회전하는 예제이다.

아래의 순서대로 점퍼 케이블을 연결한다.

주황색 케이블 : 아두이노  8번핀, 스텝모터 IN1

초록색 케이블 : 아두이노  9번핀, 스텝모터 IN2

파란색 케이블 : 아두이노 10번핀, 스텝모터 IN3

노란색 케이블 : 아두이노 11번핀, 스텝모터 IN4

하얀색 케이블 : 아두이노 5V, 스텝모터 +

검은색 케이블 : 아두이노 GND, 스텝모터 -

아두이노 스텝모터 제어 코드 - adu-ino seutebmoteo jeeo kodeu

예제 소스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, -360360-20482048);

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 >> ");

}