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