[아두이노] [강좌] 36. DC 모터 (2) - DC 모터 드라이버 실습하기 (TB6612FNG)
아두이노로 모터를 구동하기 위해서는 모터 드라이버가 필수로 사용되어야 한다. 모터에 필요한 전압, 전류를 아두이노로는 충분히 공급하기 어렵기 때문. 필요한 전압과 전류는 모터마다 다르므로, 모터의 사양을 반드시 확인하고 그에 맞는 모터 드라이버를 선정해야 한다.
아무튼 모터 드라이버의 사용은 필수!
다음은 이번 실습에 사용할 모터 드라이버인 “TB6612FNG”이다.
각 핀의 기능은 다음과 같다.
VM은 외부 전원으로, 실제 DC 모터에서 요구하는 입력 전압과 같은 전원을 연결해야 한다. 외부 전원의 GND는 아두이노의 GND와 연결되어야 한다.
VCC는 아두이노의 전원이 연결되고, AOUT1~BOUT1 핀으로 모터 드라이버의 출력 신호가 출력된다. 이 신호가 DC 모터의 입력 신호로 연결되는 신호이다. TB6612FNG는 모터 2개를 동시에 제어할 수 있는 드라이버이므로, 입력과 출력 핀이 모두 2 쌍. A가 붙은 것과 B가 붙은 것이 각각의 모터를 제어하는 핀이다.
그리고 오른 쪽에 있는 핀들이 아두이노와 연결되는 핀들로, PWMA/PWMB 핀으로는 각 PWM 신호가, AIN1,2/BIN1,2 핀으로는 방향 제어가, STBY 핀으로는 모터 상태 신호가 입력된다.
다음은 모터 드라이버 칩의 데이터 시트 중 핀의 상태에 대한 모터 동작을 나타낸 표이다.
IN1 신호가 LOW, IN2 신호가 HIGH이고 PWM으로 신호를 출력할 경우 시계 반대 방향으로 회전, IN1 신호가 HIGH, IN2 신호가 LOW이고PWM으로 신호를 출력할 경우 시계 방향으로 회전한다. 그 외의 경우에는 모두 Stop 상태라고 보면 된다.
그럼 모터와 연결해보자.
외부 전원의 전압 크기는 모터 사양에 따라 다르다는 것을 반드시 명심. 모터마다 다르니까 꼭 모터 스펙을 확인할 것!!
다음은 제조사에서 제공하는 모터 드라이버(TB6612FNG)의 참고 사이트
TB6612FNGTest.ino |
int STBY = 10; //standby
int PWMA = 3; //Speed control int AIN1 = 9; //Direction int AIN2 = 8; //Direction
void setup() { pinMode(STBY, OUTPUT);
pinMode(PWMA, OUTPUT); pinMode(AIN1, OUTPUT); pinMode(AIN2, OUTPUT); }
void loop() { for(int i=0; i<255; i++) { move(i, 0); delay(20); }
for(int i=255; i>0; i--) { move(i, 0); delay(20); }
for(int i=0; i<255; i++) { move(i, 1); delay(20); }
for(int i=255; i>0; i--) { move(i, 1); delay(20); }
stop(); delay(1000); }
void move(int speed, int direction) { digitalWrite(STBY, HIGH);
if(direction == 1) { // CCW digitalWrite(AIN1, HIGH); digitalWrite(AIN2, LOW); } else { // CW digitalWrite(AIN1, LOW); digitalWrite(AIN2, HIGH); } analogWrite(PWMA, speed); }
void stop() { digitalWrite(STBY, LOW); }
|
동작은 지난 시간에 참고용으로 봤던 소스와 동일하다. 정방향으로 속도를 점점 올리면서 돌다가, 다시 0까지 줄이면서 돌고. 다시 반대 방향으로 속도를 올리면서 돌다가, 255에서 다시 0으로 감소하면서 동작.
뭔가 돌다 마는 듯한 찝찝한 느낌이 드는 영상이지만, 내 모터는 4.5V 모터라 속도가..ㅜㅜ 출력이 큰 모터일수록 속도나 힘에서 차이가 난다.
자세히 봐야 할 부분은 move() 함수와 stop() 함수. stop() 함수는 STBY 신호를 LOW로 만들어 모터를 정지시키는 기능을 한다.
void move(int speed, int direction) { digitalWrite(STBY, HIGH);
if(direction == 1) { // CCW digitalWrite(AIN1, HIGH); digitalWrite(AIN2, LOW); } else { // CW digitalWrite(AIN1, LOW); digitalWrite(AIN2, HIGH); } analogWrite(PWMA, speed); } |
move() 함수는 모터 속도를 설정하는 speed 값과 회전 방향을 설정하는 direction 값을 매개 변수로 받는 함수이며, direction 값에 따라AIN1, AIN2 신호를 HIGH, LOW로 변경하고 있다. 신호는 위에서 보여준 표를 기준으로 한다.
그리고는 analogWrite() 함수를 이용해 PWMA 핀으로 PWM 신호를 출력한다. 매개 변수로 받은 speed 값만큼. 이때 STBY 신호는 HIGH여야 한다는 것에 유의.
왜 speed 값을 PWM 신호에 넣어주는지는 지난 강좌를 참조.
loop() 함수에서는 for() 문을 이용해서 speed와 direction 값을 변경해가며 모터를 동작시키고, 1초 정지하는 동작을 반복한다.
이제까지 배웠던 함수들만 나온 것이므로 어렵지 않다.
중요한 건 다음 4가지.
1. DC 모터를 사용하기 위해서는 DC 모터의 사양에 맞는 모터 드라이버가 필요하다.
2. DC 모터의 동작을 위해서 DC 모터의 사양에 맞는 외부 전원이 필요하다.
3. 모터 드라이버에 따라 동작 방식이 다를 수 있으므로 모터 드라이버의 자료를 꼭 참고할 것.
4. 대부분의 DC 모터는 PWM에 의해 속도 조절이 가능하다.
모터 드라이버에 따라 핀 동작이 다를 수 있다는 걸 꼭 유의하고, 동작 방법은 해당 드라이버의 데이터시트 또는 설명서를 꼭 참조하길!
그럼 이번 시간은 여기서 이만. 다음 강좌에서는 스텝 모터에 대해 알아봐요, 안녕~
(이번 강좌는 뭔가 진지 -_-)