이번 게시물에서 다룰 제품은 ULN2003 스텝모터 드라이버입니다. (제품정보는 아래 클릭)
스텝모터는 펄스를 각위치로 변환하여 주는 부품입니다. 그렇기 때문에 스텝모터에 어떤 펄스 신호를 주게 되면 스텝모터는 그 펄스 신호에 맞게 각을 틀어 움직이게 할 수 있습니다.
그리고 펄스의 주파수를 이용하여 스텝모터의 움직이는 속도 또한 제어가 가능합니다.
ULN2003 스텝 모터 드라이버와 연결하여 테스트할 스텝모터는 28BYJ 스텝모터입니다.
이 모터는 5.625도의 Stride angle을 가지고 있고 64 기어비를 가지고 있습니다.
스텝모터의 스텝은 steps = Number of steps in One Revolution * Gear ratio 이기 때문에 steps= (360°/5.625°)*64"Gear ratio" = 64 * 64 =4096 해서 4096 스텝을 가지게 됩니다.
이 스텝모터의 스위칭 시퀜스는 아래와 같습니다.
스위칭 시퀜스를 다시 정리하면 아래의 테이블이 나오고 이 신호를 순차적으로 주면 모터를 1/4096 회전 시키는 제어신호 입니다.line | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
---|
| | | | | | | | |
---|
orange | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 1 |
---|
yellow | 0 | 1 | 1 | 1 | 0 | 0 | 0 | 0 |
---|
pink | 0 | 0 | 0 | 1 | 1 | 1 | 0 | 0 |
---|
blue | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 |
---|
여기서는 이해하기 쉽게 각 핀을 하나하나 LOW, HIGH로 변경하여 제어하지만, 코드가 길어지는 것이 보기 싫어하시는 분은 16진수 형태로 변환하여서 아두이노 포트를 직접 입력 제어하는 형식으로 코드를 작성하실 수 도 있습니다.
그럼 모터를 연결하고
아래의 아두이노 코드를 업로드합니다.
/*
BYJ48 Stepper motor code
Connect :
IN1 >> D8
IN2 >> D9
IN3 >> D10
IN4 >> D11
VCC ... 5V Prefer to use external 5V Source
Gnd
*/
#define IN1 8
#define IN2 9
#define IN3 10
#define IN4 11
int Steps = 0;
boolean Direction = true;// gre
unsigned long last_time;
unsigned long currentMillis ;
int steps_left=4095;
long time;
void setup()
{
Serial.begin(115200);
pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
pinMode(IN3, OUTPUT);
pinMode(IN4, OUTPUT);
// delay(1000);
}
void loop()
{
while(steps_left>0){
currentMillis = micros();
if(currentMillis-last_time>=1000){
stepper(1);
time=time+micros()-last_time;
last_time=micros();
steps_left--;
}
}
Serial.println(time);
Serial.println("Wait...!");
delay(2000);
Direction=!Direction;
steps_left=4095;
}
void stepper(int xw){
for (int x=0;x<xw;x++){
switch(Steps){
case 0:
digitalWrite(IN1, LOW);
digitalWrite(IN2, LOW);
digitalWrite(IN3, LOW);
digitalWrite(IN4, HIGH);
break;
case 1:
digitalWrite(IN1, LOW);
digitalWrite(IN2, LOW);
digitalWrite(IN3, HIGH);
digitalWrite(IN4, HIGH);
break;
case 2:
digitalWrite(IN1, LOW);
digitalWrite(IN2, LOW);
digitalWrite(IN3, HIGH);
digitalWrite(IN4, LOW);
break;
case 3:
digitalWrite(IN1, LOW);
digitalWrite(IN2, HIGH);
digitalWrite(IN3, HIGH);
digitalWrite(IN4, LOW);
break;
case 4:
digitalWrite(IN1, LOW);
digitalWrite(IN2, HIGH);
digitalWrite(IN3, LOW);
digitalWrite(IN4, LOW);
break;
case 5:
digitalWrite(IN1, HIGH);
digitalWrite(IN2, HIGH);
digitalWrite(IN3, LOW);
digitalWrite(IN4, LOW);
break;
case 6:
digitalWrite(IN1, HIGH);
digitalWrite(IN2, LOW);
digitalWrite(IN3, LOW);
digitalWrite(IN4, LOW);
break;
case 7:
digitalWrite(IN1, HIGH);
digitalWrite(IN2, LOW);
digitalWrite(IN3, LOW);
digitalWrite(IN4, HIGH);
break;
default:
digitalWrite(IN1, LOW);
digitalWrite(IN2, LOW);
digitalWrite(IN3, LOW);
digitalWrite(IN4, LOW);
break;
}
SetDirection();
}
}
void SetDirection(){
if(Direction==1){ Steps++;}
if(Direction==0){ Steps--; }
if(Steps>7){Steps=0;}
if(Steps<0){Steps=7; }
}
모터가 동작되는 것을 확인하셨나요?
가치창조기술