[아두이노] [강좌] 39. 스텝 모터 (3) - 모터 드라이버 EasyDriver(A3967) 사용하기
아두이노에서 스텝 모터를 구동하기 위한 모터 드라이버로 이 제품을 많이 사용하..는지는 잘 모르겠고, 내가 이걸 가지고 있어서 여기에 대한 설명.
이제 구매 추천 사이트는 빼야겠.. 뭔가 다른 사이트들에 죄짓는 기분.
EasyDriver로 검색하면 나와요.
이 드라이버의 입력 핀은 많다. 우선 스텝 신호를 주기 위한 STEP 핀과 모터 회전 방향을 설정하는 DIR 핀, 스텝 모드를 설정하는 MS1, MS2 핀과 ENABLE 핀, SLEEP(SLP) 핀이 있다. 출력 핀은 4개로 A, /A, B, /B 순서대로 연결해주면 되고. ENABLE 핀과 SLEEP 핀은 따로 연결해주지 않아도 사용할 수 있는 모양.
STEP 핀으로 LOW와 HIGH를 한 번 반복하는 신호를 주면 스텝 모터로 연결된 출력 핀으로 하나의 스텝 신호가 출력된다. 200 스텝을 주려면 STEP 핀에 LOW, HIGH를 200번 반복하면 된다는 뜻.
다른 핀의 역할은 핀 이름에 대충 나와있고(Enable, Sleep. 음??), 처음 보는 MS1, MS2 핀에 대한 설명만 간단히 하자.
다음 표는 A3967SLB 데이터시트에 나와있는 표다.
“Full step (2 phase)”는 2상 여자방식으로 구동되는 풀 스텝 모드라는 말. 풀 스텝은 1 스텝 당 1 회전각(모터에 표시된. 내가 가진 모터는1.8°.)을 회전한다는 말이고, 하프 스텝은 1 스텝에 1/2 회전각만큼 회전한다는 뜻. 즉, 한 스텝에 1.8° 회전하는 스텝 모터의 경우 하프 스텝 모드에서는 1 스텝에 0.9° 회전한다. 쿼터 스텝은 1/4 회전각만큼, 에잇θ 스텝(Eighth 한글 발음이..)은 1/8 회전각만큼 이동한다.
예제에서는 연결하지 않았지만, 만일 ENABLE 핀과 SLEEP 핀을 연결한다면 두 핀은 Low Active 핀이라는 사실에 유의하자. Low Active란 핀의 신호가 LOW일 때 핀의 기능을 수행한다는 뜻. 즉, SLEEP 핀이 LOW일 때 드라이버가 슬립 모드로 설정되며, ENABLE 핀이 LOW일 때 드라이버가 활성화 된다는 뜻.
그래서 모터를 동작하기 위해서는 SLEEP 핀은 HIGH, ENABLE 핀은 LOW 신호를 줘야 한다. 드라이버 보드 상에서 기본으로 풀업, 풀다운 저항이 장착되어 신호가 없을 경우에는 HIGH, LOW 신호가 자동으로 설정된다.
아두이노 보드와 연결해보자.
모터가 엄청 크네, 그려. 허허허.
+ 핀 연결 표 추가
Easy Driver | PWR IN (GND) | PWR IN (M+) | STEP | DIR | MS1 | MS2 | GND |
아두이노 | GND | VIN | 7 | 6 | 5 | 4 | GND |
모터 드라이버에 직접 외부 전원을 연결하거나 아두이노 보드에 외부 전원을 연결하여 VIN 핀에서 모터 드라이버의 전원으로 연결하면 된다. 외부 전원을 왜 넣어야 하는지에 대해서는 이제 설명하지 않겠어요.
예제를 볼까.
StepMotorTest_EasyDriver.ino |
int stepPin=7; int dirPin=6; int ms1Pin=5; int ms2Pin=4;
int stepPerRevolution=200; int stepDelayMicros=2500;
void setup() { pinMode(stepPin, OUTPUT); pinMode(dirPin, OUTPUT); pinMode(ms1Pin, OUTPUT); pinMode(ms2Pin, OUTPUT); }
void loop() { // 시계 방향, Full-Step 모드 설정 digitalWrite(dirPin, HIGH); digitalWrite(ms1Pin, LOW); digitalWrite(ms2Pin, LOW);
for(int i=0; i<stepPerRevolution; i++) { digitalWrite(stepPin, HIGH); delayMicroseconds(stepDelayMicros); digitalWrite(stepPin, LOW); delayMicroseconds(stepDelayMicros); } delay(500);
// 반시계 방향 설정 digitalWrite(dirPin, LOW); for(int i=0; i<stepPerRevolution; i++) { digitalWrite(stepPin, HIGH); delayMicroseconds(stepDelayMicros); digitalWrite(stepPin, LOW); delayMicroseconds(stepDelayMicros); } delay(500);
// 시계 방향, Half-Step 모드 설정 digitalWrite(dirPin, HIGH); digitalWrite(ms2Pin, HIGH); for(int i=0; i<stepPerRevolution; i++) { digitalWrite(stepPin, HIGH); delayMicroseconds(stepDelayMicros); digitalWrite(stepPin, LOW); delayMicroseconds(stepDelayMicros); } delay(500);
// 반시계 방향 설정 digitalWrite(dirPin, LOW); for(int i=0; i<stepPerRevolution; i++) { digitalWrite(stepPin, HIGH); delayMicroseconds(stepDelayMicros); digitalWrite(stepPin, LOW); delayMicroseconds(stepDelayMicros); } delay(500); } |
+) 수정
소스 내용 중 delayMicroseconds() 함수가 delay()로 사용된 오류를 수정함. 죄송합니다. ㅜㅜ
긴 것처럼 느껴진다면 그건 착각. 같은 내용이 반복되는 부분이 많다.
우선 핀 번호를 저장한다. 저장한 핀 번호대로 아두이노 보드와 모터 드라이버를 연결해야 한다. 핀 연결 잘못해놓고 왜 안되냐고 묻는 경우 많이 봤음. 특히 A, /A, B, /B 핀 순서를 꼭 확인한 후 연결할 것! 모터마다 순서가 다를 수 있다규.
그리고 360° 회전하는데 필요한 스텝 수와 딜레이 시간을 설정한다.
loop() 함수에서는 모터를 구동한다. 우선 dirPin 핀을 HIGH로 설정하고, ms1Pin 핀과 ms2Pin 핀은 모두 LOW로 설정하여 풀 스텝 모드를 설정한다. 그리고는 for() 반복문으로 stepPerRevolution 값 만큼 스텝을 반복한다. 스텝 딜레이는 최소 1 마이크로초 이상이어야 한다고 데이터시트에 명시되어 있다. 여기서는 2500 마이크로초, 즉 2.5 밀리초 딜레이므로 한 스텝 당 5 밀리초의 시간이 걸린다. 200 스텝을 진행하면 총 1초. 1분에 60바퀴를 도는 속도(60 RPM)를 가진다.
정확히 360°를 회전한 후 500 밀리초만큼 대기. 그리고 dirPin 핀을 LOW로 바꾼 후 다시 360° 회전. dirPin 핀 설정이 바뀌었으므로 반대 방향으로 회전한다.
그 다음엔 ms2Pin 핀을 HIGH로 설정하여 하프 스텝 모드로 설정한다. 하프 스텝 모드는 한 스텝 당 0.9° 씩 회전하므로, for() 반복문으로stepPerRevolution 스텝만큼 회전하면 정확히 180° 회전한다. 그리고는 다시 반대 방향으로 180° 회전.
쉽죠잉?? 쿼터 스텝과 에잇θ 스텝 동작은 여러분께 맡길께요. 퐈이팅!
난 여기서 이만. 뿅.
아, 다음 시간엔 서보 모터에 대해서 알아볼 예정.