Arduino/Step Motor

Step Motor를 연결하고 작동해보기

DesignatedRoom 2020. 11. 12. 17:45

하드웨어 연결

연결은 쉽다.

Step Motor의 각 연결핀 IN4핀을 아두이노의 11번핀에 연결하고   

Step Motor의 각 연결핀 IN2핀을 아두이노의 9번핀에 연결하고   

Step Motor의 각 연결핀 IN3핀을 아두이노의 10번핀에 연결하고

Step Motor의 각 연결핀 IN1핀을 아두이노의 8번핀에 연결한다.

Step Motor의 -5핀은 아두이노의 GND핀에 연결하고

Step Motor의 +12V핀은 아두이노의 5V핀에 연결한다.

 

우선, 라이브러리를 써보고 구현을 직접해보자.

소스 코드

더보기
#include <Stepper.h>

//  회전각도 설정.  2048 한 바퀴 (360도), 1024 : 반바퀴(180도)
const int stepsPerRevolution = 2048;

//  모터 드라이브에 연결된 핀 IN4 IN2 IN3 IN1(핀 연결 설정)
Stepper myStepper(stepsPerRevolution, 11, 9, 10, 8);

void setup() {
  // put your setup code here, to run once:
  myStepper.setSpeed(14); //  모터의 회전속도 조절

  Serial.begin(9600);
}

void loop() {
  // put your main code here, to run repeatedly:
  //  반 시계 반대 방향으로 한바퀴 회전
  Serial.println("counterclockwise");
  myStepper.step(stepsPerRevolution);
  delay(1000);

  //  시계 반대 방향으로 한바퀴 회전
  Serial.println("clockwise");
  myStepper.step(-stepsPerRevolution);
  delay(1000);
}

 

 

 

구현에 앞서, bitRead함수에 대해 알아보자.

소스 코드

더보기
void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);

  //  15를 대입하면 아래에서 모두 1이 출력된다.
  Serial.print(bitRead(0b1000,0));  //  해당 2진수의 0번째 자리 수를 구하기
  Serial.print(bitRead(0b1000,1));  //  해당 2진수의 1번째 자리 수를 구하기
  Serial.print(bitRead(0b1000,2));  //  해당 2진수의 2번째 자리 수를 구하기
  Serial.print(bitRead(0b1000,3));  //  해당 2진수의 3번째 자리 수를 구하기
}

void loop() {}

실행결과

 

 

아래는 직접 구현한 예제이다.

모터를 시계방향으로 360도 회전하고 다시 반시계방향으로 360도 회전하는 예제이다.

소스 코드

더보기
#define   IN1   8
#define   IN2   9
#define   IN3   10
#define   IN4   11

#define   STEP  2048

int pinArray[4] = {IN1,IN2,IN3,IN4}; //  핀 배열

int CW[4] = {0b1000, 0b0100, 0b0010, 0b0001};
int CCW[4] = {0b0001, 0b0010, 0b0100, 0b1000};

void setup() {
  // put your setup code here, to run once:
  for (int i = 0; i < 4; i++)
  {
    pinMode(pinArray[i],OUTPUT);
  }
}

void loop() {
  // put your main code here, to run repeatedly:
  int temp;

  for (int i = 0; i < STEP; i++)
  {
    temp = i % 4;
  
    digitalWrite(pinArray[0],bitRead(CW[temp],0));
    digitalWrite(pinArray[1],bitRead(CW[temp],1));
    digitalWrite(pinArray[2],bitRead(CW[temp],2));
    digitalWrite(pinArray[3],bitRead(CW[temp],3));
    delay(3);
  }
  delay(1000);

  for (int i = 0; i < STEP; i++)
  {
    temp = i % 4;
  
    digitalWrite(pinArray[0],bitRead(CCW[temp],0));
    digitalWrite(pinArray[1],bitRead(CCW[temp],1));
    digitalWrite(pinArray[2],bitRead(CCW[temp],2));
    digitalWrite(pinArray[3],bitRead(CCW[temp],3));
    delay(3);
  }
  delay(1000);
}

 

 

소스 코드

더보기
#define   IN1   8
#define   IN2   9
#define   IN3   10
#define   IN4   11

#define   STEP  2048

int pinArray[4] = {IN1,IN2,IN3,IN4}; //  핀 배열

int CW[4] = {0b1100, 0b0110, 0b0011, 0b1001};
int CCW[4] = {0b1001, 0b0011, 0b0110, 0b1100};

void setup() {
  // put your setup code here, to run once:
  for (int i = 0; i < 4; i++)
  {
    pinMode(pinArray[i],OUTPUT);
  }
}

void loop() {
  // put your main code here, to run repeatedly:
  int temp;

  for (int i = 0; i < STEP; i++)
  {
    temp = i % 4;
  
    digitalWrite(pinArray[0],bitRead(CW[temp],0));
    digitalWrite(pinArray[1],bitRead(CW[temp],1));
    digitalWrite(pinArray[2],bitRead(CW[temp],2));
    digitalWrite(pinArray[3],bitRead(CW[temp],3));
    delay(3);
  }
  delay(1000);

  for (int i = 0; i < STEP; i++)
  {
    temp = i % 4;
  
    digitalWrite(pinArray[0],bitRead(CCW[temp],0));
    digitalWrite(pinArray[1],bitRead(CCW[temp],1));
    digitalWrite(pinArray[2],bitRead(CCW[temp],2));
    digitalWrite(pinArray[3],bitRead(CCW[temp],3));
    delay(3);
  }
  delay(1000);
}

 

 

소스 코드

더보기
#define   IN1   8
#define   IN2   9
#define   IN3   10
#define   IN4   11

#define   STEP  4096 // (2098 * 2)

int pinArray[4] = {IN1,IN2,IN3,IN4}; //  핀 배열

int CW[8] = {0b1000, 0b1100, 0b0100, 0b0110,0b0010,0b0011,0b0001,0b1001};
int CCW[8] = {0b1000, 0b1001, 0b0001, 0b0011,0b0010,0b0110,0b0100,0b1100};

void setup() {
  // put your setup code here, to run once:
  for (int i = 0; i < 4; i++)
  {
    pinMode(pinArray[i],OUTPUT);
  }
}

void loop() {
  // put your main code here, to run repeatedly:
  int temp;

  for (int i = 0; i < STEP; i++)
  {
    temp = i % 8;
  
    digitalWrite(pinArray[0],bitRead(CW[temp],0));
    digitalWrite(pinArray[1],bitRead(CW[temp],1));
    digitalWrite(pinArray[2],bitRead(CW[temp],2));
    digitalWrite(pinArray[3],bitRead(CW[temp],3));
    delay(1);
  }
  delay(1000);

  for (int i = 0; i < STEP; i++)
  {
    temp = i % 8;
  
    digitalWrite(pinArray[0],bitRead(CCW[temp],0));
    digitalWrite(pinArray[1],bitRead(CCW[temp],1));
    digitalWrite(pinArray[2],bitRead(CCW[temp],2));
    digitalWrite(pinArray[3],bitRead(CCW[temp],3));
    delay(1);
  }
  delay(1000);
}