지난 시간 PWM 제어를 통해서 LED 밝기를 조절하는 것에 대해 다뤄보았습니다. 오늘은 동일한 이론을 가지고 DC 모터의 속도를 조절하는 법에 대해 이야기 해볼까 합니다.

먼저 이론에 앞서 모터 제어에 필요한 준비물을 알아봅시다. 가장 먼저 모터는 부하가 크기 때문에 이전 수업 내용들과는 다르게 외부 전원이 필요합니다. 여기서 외부 전원은 일상에서 쉽게 접할 수 있는 건전지부터 해서 보조배터리와 같은 충전지를 말합니다. 외부 전원을 준비했다면, DC 모터 제어의 핵심인 모터 드라이버가 필요합니다. 그럼 핵심인만큼 모터 드라이버에대해 먼저 알아보도록 하죠.

* 모터 드라이버란?

 

왼쪽의 사진을 모터 드라이버라 부릅니다. 해당 모듈은 모터를 정방향 또는 역방향으로 회전하게하거나 회전 속도를 조절할 수 있도록 도와줍니다. 사실 회로 자체의 역할은 스위칭을 통하여 회전 방향을 바꿔주는데 의의가 있습니다. 모터 드라이버에는 다양한 종류의 회로를 내장하고 있는데, 이번 시간에 다뤄볼 회로는 H-Bridge라는 회로입니다. 가장 많이 쓰이기도 하고 간단하니 너무 겁먹지 않아도 됩니다. 회로부분에 있어서는 공학적인 내용보다 흐름정도만 설명하고 넘어가도록 하겠습니다.

  H-Bridge 회로는 회로의 모양이 H 모양 다리처럼 생겨서 붙은 이름인데 아래 그림을 보면 이해가 될 겁니다. 

 

H-Bridge 회로 

 

회로는 간단하게 스위치 4개와 모터 1개 그리고 외부전원으로 구성되어 있습니다. 하나씩 뜯어보면 먼저 스위치 역할을 해주는 4개의 반도체 소자가 보입니다. Q1~Q4가 반도체 소자인데, 보통 MOSFET이나 BJT라는 반도체 소자를 이용하여 스위치처럼 사용합니다. 밑에 적힌 PNP와 NPN은 반도체 극성을 의미하며 극성에 따라 특성이 달라지는데, 이건 중요한게 아니니 넘어가도록 하겠습니다. 이 4개의 스위치만 잘 조작하면, 모터의 방향을 조절할 수 있습니다. 이전 LED와 같은 극성 소자에서는 +와 -에 유의하면서 연결해줬었잖아요? 모터는 극성이 없습니다. 정확히 말해서 전류의 흐름에 따라 모터가 회전하는 방향이 달라진다는 이야기 입니다. 

 

 

예를 들어, 오른쪽 사진과 같이 Q1과 Q4 소자에 신호(5V)를 주게 되면 다음과 같이 전류가 흐르게 될 것입니다. 여기서 조건은 Q2와 Q3가 Off 상태야 합니다.  Q1과 Q4 스위치를 눌러주면서 전류가 흐를 수 있는 길을 터준것이고 전류는 빨간색 선과 같이 모터에 흘러들어가게 됩니다. 그렇게 되면 모터는 시계 방향 또는 시계 반대 방향으로 즉, 특정 방향으로 회전하게 됩니다. 여기서 특정 방향으로 회전한다 언급한 것은 모터마다 코일이 감겨있는 방향이나 여러가지를 고려했을 때, 어느 방향으로 회전한다를 단정지을 수 없기 때문에 '특정 방향으로 회전한다'라고 한겁니다. 여기서 반대로 Q1 스위치와 Q4 스위치를 Off하고 나서 Q2와 Q3 스위치를 On하게 된다면 어떤 동작을 보일까요?

 

왼쪽의 그림이 Q2, Q3 스위치를 On 시켰을 때, 전류의 흐름을 나타내보았습니다. 딱 봐도 위의 그림과 다르게 모터에 전류가 반대로 흘러 들어가는 것을 볼 수 있죠. 이런 회로에서는 그럼 모터는 어떤 동작 특성을 보일까요? 예상했던 대로, 위의 회로와는 반대로 모터가 회전하는 것을 볼 수 있습니다. 처음 도입부에서 말씀 드렸다 싶이 모터는 +단자와 -단자 구분이 없습니다. 그렇단 이야기는 전류가 들어오는 방향에 따라서 동작 특성이 결정된다는 이야기에요. 그럼 우리가 도출할 수 있는 결과는 모터에 전류를 흘려주는 방향 조절만 해준다면 회전 방향을 정할 수 있단 이야기죠. 여기서 문제가 하나 발생합니다. 우리는 보통 전압원(Vcc)에 직류전원(건전지, 충전지..)을 사용하기 때문에 전류 방향을 바꿔줄 수가 없어요! 그렇기 때문에 이러한 회로구성이 필요합니다. 단 스위치 4개만으로 전류의 흐름을 바꿔줄 수가 있죠. 

 

하드웨어적인 개념은 여기까지 하고 이제 이 회로를 어떻게 제어할 것이냐를 고민해봅시다. 

이번 강의의 포인트는 2가지입니다. 모터의 회전 방향을 제어하는것, 모터의 회전 속도를 제어하는 것 입니다. 모터의 회전 방향은 위의 하드웨어를 제어함으로써 해결되지만 여기서 모터의 속도 제어는 또 다른 문제입니다.

 
속도 제어를 위해서는 마이컴의 기능을 활용해야합니다. 바로 이전 LED 밝기 제어 강의때 다뤘던 PWM입니다. 동일한 이론을 바탕으로 모터에 출력의 변화를 줄 수 있습니다. 근데 여기서 추가 회로의 도움 없이 컨트롤러에 모터를 꽂을 경우 과전류로 인해 보드가 망가질 수 있으니 조심해야합니다. 마이크로 컨트롤러의 경우 각 보드가 허용하는 출력 전류가 정해져있어 그 이상 뽑아내려하면 죽어버립니다. 이러한 이유로도 H-Bridge와 같은 회로가 필요한 것이죠.
다시 본론으로 들어가서 우리는 위의 회로에서 1가지만 추가하여 모터의 속도를 제어할 것입니다. 바로 스위치를 켜는 부분에 PWM 신호를 인가해 볼 겁니다. PWM 신호에 따라 스위치가 깜빡깜박하게 된다면 모터는 스위치가 켜지는 시간만큼 빨라질겁다. 머릿속으로 한번 상상해보면서 따라와보세요! 10초의 주기를 가지고 실험을 한다고 했을때, 1초 눌렀다가 9초 떼고있을때와 5초 누르고있다가 5초 떼는것 중 어느게 더 빨리 돌까요?? 물론 초단위라 사실 속도는 비슷할지 모릅니다. 하지만 이게 ms, us단위로 껐다 켰다하게 되면 확실하게 모터가 회전하는 속도 차이가 보일겁니다. 즉, 제가 말씀드리고 싶은 말은 PWM의 Duration을 조절하면 모터의 속도를 제어할 수 있단말을 하고싶었던 겁니다. Duration이 30%일때보다 70%일때 더 빠르게 되겠죠.

이 두 이론을 합쳐서 코드를 짜보고 직접 눈으로 확인해봅시다.
우선 회로도는 아래와 같이 구성하면 됩니다.
(준비물: 아두이노, DC 모터, 모터드라이버 L298N, 외부 전원)

  • IN1 & IN2 는 왼쪽 출력에 관여, IN3 & IN4 는 오른쪽 출력에 관여
  • IN3와 IN4는 모터의 출력 방향을 결정하는 Switch 역할
  • ENA와  ENB는 모터의 출력 속도를 결정하는  PWM 신호 핀
  • 외부 전원은 VCC와 GND에 연결하며 GND의 경우 Arduino와 같이 물려주어야함

 

#define IN3         5
#define IN4         4
#define Motor2_PWM  3

int value = 0;

void setup() {
  // put your setup code here, to run once:
  pinMode(IN3, OUTPUT);               // H-Bridge Switch 1
  pinMode(IN4, OUTPUT);               // H-Bridge Switch 2
}

void loop() {
  // put your main code here, to run repeatedly:
  digitalWrite(IN3, HIGH);            // H-Bridge Switch ON
  digitalWrite(IN4, LOW);             // H-Bridge Switch LOW
  for (int i = 0; i < 255; i += 50) {
    analogWrite(Motor2_PWM, value);   // PWM 신호를 value만큼 인가
    delay(1000);                      // 1초 delay
  }
  for (int i = 255; i > 0; i -= 50) {
    analogWrite(Motor2_PWM, value);   // PWM 신호를 value만큼 인가
    delay(1000);                      // 1초 delay
  }

  digitalWrite(IN3, LOW);            // H-Bridge Switch LOW
  digitalWrite(IN4, HIGH);             // H-Bridge Switch ON
  for (int i = 0; i < 255; i += 50) {
    analogWrite(Motor2_PWM, value);   // PWM 신호를 value만큼 인가
    delay(1000);                      // 1초 delay
  }
  for (int i = 255; i > 0; i -= 50) {
    analogWrite(Motor2_PWM, value);   // PWM 신호를 value만큼 인가
    delay(1000);                      // 1초 delay
  }
}
  1.  스위치 핀으로 이용할 핀번호를 출력으로 설정해준다. (PWM 핀은 이전 시간에 확인했든 함수 내부에서 출력 설정을 해주고 있음.
  2.  모터가 회전할 방향을 설정. (IN3와 IN4는 늘 반대 출력을 가져야 한다)
  3.  PWM의 Duty 값을 조절하면서 속도 변화를 확인.
  4.  이전 설정했던 것과 반대로 IN3와 IN4를 변화를 주고 방향이 바뀌는 것을 확인.

+ Recent posts