[아두이노] [강좌] 35. DC 모터 (1) - DC 모터 동작 방식
요즘 회사 일 관계로 강좌 업로드 간격이 길어져서 죄송. 사실 모터에 대해서 정리할 시간이 엄청나게 필요했던 것도 한 몫 했음. ㅜㅜ 모터 드라이버 종류는 왜케 많아!
암튼, 늦어진 점 사과드리며 다시 강좌 시작!
(기다렸다고 말해줘)
모터의 종류는 생각보다 많다. 내가 알고 있는 것만해도 DC 모터, 스텝 모터(또는 스테핑 모터), 서보 모터, 세 가지다. 실제로는 이거보다 종류가 더 많겠지. 내가 알고 있는 건 이 세 가지이므로, 이 세 가지에 대해서 알아보고 동작도 해보자.
그러려면 우선 모터가 있어야 하는데, 모터는 모터 단독으로 동작하기보다 모터 드라이버를 이용해서 제어하는 경우가 대부분. 모터 드라이버에 따라 제어하는 방법도 천차만별이다. 그래서 예제 소스를 올려도 내가 가지고 있는 드라이버랑 같은 게 아니면 맞지 않을거야…
그래서 이 강좌에서는 모터 구동 예제보다는 모터 동작 원리에 대해 집중해서 살펴보자. 예제는 참고용.
DC 모터
DC 모터는 내 기준에서 가장 간단하게 사용할 수 있었던 모터이다. PWM 신호만 넣어주면 동작했으니까. 보통 DC 모터의 경우 입력 핀 2개만으로 제어가 가능한데, 두 핀의 전압 차이를 이용해서 동작하는 거라 생각하면 쉽다.
이 전에 PWM 신호를 주는 함수를 왜 “analogWrite”라고 이름 붙였는지에 대해 설명한 적이 있던가?? 기억이 안나노.
신호를 HIGH와 LOW를 번갈아 빠른 속도로 주게 되면 받는 쪽에서 하드웨어적인 특성(나 하드웨어는 잘 몰라요. ㅜㅜ 그래서 특성이라고밖에 설명할 수 없음.)에 의해 HIGH와 LOW 신호를 대충 절충한 전압 신호를 받아들이게 되는 경우가 있는데, 이 절충한 전압의 크기는HIGH/LOW 비율에 따라 달라지게 되어 DAC(Digital to Analog Converter)처럼 동작할 수 있게 된다.
대충 그림으로 나타내면 이런 느낌이려나?
위 그림은 그냥 이해를 돕기 위해 그린 것이니 참고만 하면 된다.
아무튼 모터에 입력되는 전압이 PWM 듀티비에 따라 달라져서 모터의 속도를 조절할 수 있게 된다. 단, 속도를 정확하게 제어할 수는 없다. 같은 듀티비에서도 모터에 따라 약간씩 차이가 날 수도 있고. 그래서 DC 모터는 정밀 제어 필요 없이 간단한 속도 조절만을 사용할 때, 또는 아예 속도 조절이 필요 없을 때 사용된다.
그런데 DC모터는 입력 핀이 2개, 두 핀의 전압 차이를 이용한다고 했었다. 전압 차를 이용하려면 두 핀의 입력 전압이 달라야 한다는 이야기. 위 그림처럼 PWM 신호에 따라 모터의 속도를 제어하려면 PWM이 입력되는 핀 말고 나머지 한 핀에는 0V가 고정으로 입력되어야 한다. 또는 5V가 고정으로 입력되던지. 단, 5V가 입력될 경우에는 모터 입력 전압이 높을수록 속도가 낮고, 낮을수록 속도가 빠를 것이다. 전압 차이로 동작하니까, 5V와 차이가 큰 듀티비 20% 구간에서 속도가 더 빠르다는 말.
그럼 나머지 한 핀은 신호 고정용으로 사용하는 것인가? 아니다. DC 모터는 어느 핀의 전압이 더 높은가에 따라 모터의 방향이 결정된다. 1번 핀이 전압이 높으면 정방향, 2번 핀이 높으면 역방향, 뭐 이런 식으로.
예제를 보면 쉽게 이해가 갈 것이다. DC 모터의 핀 2개를 각각 아두이노 보드의 7, 8번 핀에 연결하여 구동하는 소스이다. 하지만 아래 소스로 모터를 구동하지는 말자. 모터 드라이버가 없는 상태에서 아두이노와 모터를 직접 연결하여 구동하는 것은 아주아주 위험한 일이다. 소스는 그냥 참고용.
DCMotorTest01.ino |
void setup() { // 핀 모드 설정 pinMode(7, OUTPUT); pinMode(8, OUTPUT);
// 신호 초기화 (LOW) digitalWrite(7, LOW); digitalWrite(8, LOW); delay(1000); }
void loop() { // 7번 핀에 듀티비 증가 (8번 핀 LOW 유지) for(int i=0; i<256; i++) { analogWrite(7, i); delay(20); } // 7번 핀에 듀티비 감소 (8번 핀 LOW 유지) for(int i=255; i>0; i--) { analogWrite(7, i); delay(20); } // 8번 핀에 듀티비 증가 (7번 핀 LOW 유지) for(int i=0; i<256; i++) { analogWrite(8, i); delay(20); } // 8번 핀에 듀티비 감소 (7번 핀 LOW 유지) for(int i=255; i>0; i--) { analogWrite(8, i); delay(20); } // Motor 정지 analogWrite(7, LOW); analogWrite(8, LOW); delay(1000);
} |
소스를 살펴보자.
우선 setup() 함수에서 DC모터에 연결된 두 핀을 출력 모드로 설정한다. 7번 핀과 8번 핀을 사용하므로 해당 핀 번호를 넣어준다. PWM 신호를 출력할 것이기 때문에 PWM 핀 중 선택하여 사용하면 된다.
그리고 두 핀을 LOW로 초기화시켜 준다. 위에서 말했다시피 DC모터는 두 핀의 전압 차로 동작하기 때문에 두 핀이 모두 LOW이면 모터는 정지한다. 마찬가지로 두 핀이 모두 HIGH 상태여도 모터는 동작하지 않는다. delay(1000) 구문으로 1초간 정지 상태를 유지한다.
for 반복문으로 각 핀에 듀티비를 증가시켰다가 감소시킨다. 이 코드를 실행시켜보면 모터가 천천히 돌다가 점점 빨라지고 다시 느려진다. 그리고 반대 방향으로 한번 더 속도가 증가하며 돌다가 다시 감소하여 정지한다.
듀티비가 증가하면 모터 속도가 빨라지고, 감소하면 줄어들다가 듀티비 0이되면 완전히 정지한다. 사실 0이 되기 전에 모터가 정지하는데, 이건 모터가 동작하기 위한 최소의 전압이 충족되지 않기 때문. 그래서 일정 듀티비 이하에서는 모터가 동작하지 않을 수 있다.
PWM 신호를 주는 핀에 따라 모터 동작 방향이 바뀌는 것도 기억하도록.
자, 이건 일반적인 DC 모터의 구동 방식이고, 실제로 아두이노로 모터를 구동하기 위해서는 모터 드라이버가 필수로 사용되어야 한다. 아두이노에서 핀으로 출력되는 전압은 5V지만, 모터에서 요구하는 전압이 5V보다 높을 수 있기 때문이다. 또 출력되는 전류 값 역시 모터를 구동할 만큼 크지 않다. 모터는 모터가 구동되기 위한 최소의 전류가 충족되어야 동작하기 때문에 만일 맞지 않는 전압과 전류로 모터를 구동하려 한다면, 모터에서 구동에 필요한 전류를 강제로 쫘~악 땡기면서 둘 다 사망에 이를 수도 있다. 농담 아님.
그래서 모터 드라이버의 사용은 필수!
다음 강좌에서 모터드라이버(TB6612FNG)를 이용하여 DC 모터를 동작시키는 실습을 진행해보자.
그럼 이번 강좌는 여기서 이만. 안녕!
[출처] [아두이노 강좌] 35. DC 모터 (1) - DC 모터 동작 방식|작성자 몽구스