모터 제어해보기-매운맛

3 분 소요

Intro

Application using this post

  • PID control

based post

  • 피지컬 컴퓨팅
  • MCU 기본

related post

  • 엔코더 센서

Contents

예시

모터를 왜 제어할까요? 일상 생활에서 규칙적이고, 안정적이고, 일정한 주기를 가지고 동작하는 기기들을 찾아볼 수 있습니다. 우리의 일상에서 살펴보면 로봇 청소기가 가장 대표적이네요. 로봇 청소기에는 2개의 DC모터가 장착되어 있어서 각속도와 선속도를 조절합니다.
이 포스트에서는 여러 종류의 모터 중에서 DC모터를 제어하는 방밥에 대해 알아볼 겁니다.

배경 지식

모터를 동작하기 위해서는
제어 보드 모터 출력을 만들어 낼 수 있는 MCU를 내장하고 있는 제어 보드가 필요합니다. 아두이노, 뉴클레오, 디스커버리 등의 보드가 필요합니다. 이 포스트에서는 아두이노를 사용합니다. 대부분의 MCU에는 기본적인 기능들이 들어가있습니다. 모터를 제어하기 위한 TIMER, PWM, UART 등등 다양한 peripheral 기능들이 하나의 MCU를 가지고 여러 어플리케이션을 다향하게 적용할 수 있도록 구성되어 있습니다.
DC모터: 2개의 단자가 있으며, 단자에 +극과 -극을 연결할 경우 모터가 동작하게 됩니다. 만약 극을 반대로 연결하게 된다면 모터는 반대방향으로 회전합니다.
H-Bridge
DC모터는 위 그림에서와 같이 고정자, 회전자, 브러시 및 정류자로 구성되어 있다. 고정자는 모터의 외부에 위치하며, 고정 자계를 발생시켜준다. 이러한 자계는 영구자석 또는 전자석에 의해서 발생되며, 일반적으로 영구자석 형태의 고정자를 가장 흔히 볼 수 있다. 회전자는 전기자라고 불리기도 하며, 하나 또는 그 이상의 권선으로 구성되어 있으며, 고정자의 내부에 즉, 모터의 중심부에 위치하고 있다. 모터에 전압이 인가되면 회전자의 권선에 전류가 흘러 이로 인해 자계를 발생시키게 된다. 이들 자계에서 발생시킨 작은들이 반대편 즉, 고정자의 자극과 서로 인력과 척력이 발생하여 반대극성을 갖는 위치에 정렬하고자 하는 성질로 인하여 회전자는 회전을 하게 된다. DC모터는 다른 모터와 달리 모터 권선에 단순히 직류를 흘려줌으로써 회전하게 되는데 이것이 가능한 이유는 바로 브러시와 정류자가 기계적으로 모터 권선에 흐르는 전류의 방향을 바꾸어주는 역항를 하기 때문이다.
모터드라이버: 입력받은 신호를 바탕으로 모터를 구동할 수 있는 출력을 만들어냅니다. 모터 드라이버에는 H-Bridge라는 회로가 내장되어있습니다. 기본적인 구성은 아래 회로도와 같은 방식으로 되어있으며 H 모양으로 구성된 회로이기 때문에 H-Bridge라고 합니다.
H-Bridge
위 그림을 보면 전자 스위치가 4귀퉁이에 장착되어 있고 이 스위치를 입력 신호에 따라 동시에 제어하면서 모터의 방향을 변경할 수 있도록 해 줍니다.
H-Bridge
그래서 모터드라이버의 입력을 보면 PWM wave(구형파) 신호와 DIR신호를 입력하는것을 알 수 있습니다. 모터 드라이버에 구형파 신호와 방향 신호를 입력해주면 해당하는 방향으로 구형파를 증폭하여 출력합니다.
구형파
구형파의 high 신호를 더 많이 발생시키면 그에 해당하는 만큼 모터에 인가되는 전력의 주기도 많아지게 됩니다. 이렇게 모터의 출력을 조절할 수있습니다. 센서를 통해 모터의 회전수를 입력받으면 일정한 속도로 유지할 수있도록 할 수도 있습니다. 이건 나중에 자세하게 다뤄보도록 하죠!

일반 개별 소자로 H-Bridge를 구성하기 위해서는 구조가 복잡해지고 점퍼선을 생각보다 많이 사용해야 합니다. 그래서 한 칩 또는 소자들이 집약되어있는 보드에 내장된 H-Bridge를 사용하는 이유이기도 합니다!

예를 들어서, 우리가 사용해볼 L298N의 데이터 시트의 블록 다이어그램은 아래와 같이 그려져 있습니다.
IN1, IN2, EnA를 통해 모터를 제어하고 AND게이트와 트랜지스터로 구성하여 모터의 방향을 바꿔주는것을 확인할 수 있습니다. 이렇게 보면 간단히 보여지지만 실제로 손으로 직접 만든다고 했을 때는 많은 노력이 추가되어야 할 것입니다.

모터 하나를 돌리기 위해서 가장 기본적인 3가지를 공부해 보았습니다.
그럼 다음에 이어서 배선 연결과 코딩까지 알아보겠습니다.

만들어보기

아래 모터드라이버는 L298N 이라는 모터 드라이버입니다. 모터 드라이버에는 입력 핀들과 출력 핀들이 있습니다.
자세히 보면 Motor AMotor B로 표시된 신호입력 채널이 2개가 있네요.
각 채널마다 IN1, IN2, PWM 3가지의 입력 핀들이 있습니다. IN1과 IN2의 입력을 1과 0으로 했을 때 모터가 정방향으로 회전한다면 IN1과 IN를 0과 1로 설정했을 때는 그 반대가 됩니다. 그리고 PWM신호를 통해서 모터의 출력을 조절합니다. 이를 통해 모터 2개를 하나의 모터 드라이버에서 동작하게 할 수 있는것을 의미합니다.
또한 모터의 전원을 따로 입력하는 것도 포인트입니다. 만약 아두이노와 같은 전원을 사용하면 모터의 역기전력등에 의해서 아두이노의 전압이 불안정해질 수 있습니다.
아두이노 IDE로 작성한 코드는 아래와 같습니다.
void setup() {
  pinMode(7, OUTPUT);       // Motor A 방향설정1
  pinMode(8, OUTPUT);       // Motor A 방향설정2
  pinMode(4, OUTPUT);       // Motor B 방향설정1
  pinMode(5, OUTPUT);       // Motor B 방향설정2
}

void loop() {
  /*모터A설정*/
  digitalWrite(7, HIGH);
  digitalWrite(8, LOW);
  analogWrite(9, 100);
  /*모터B설정*/
  digitalWrite(4, LOW);
  digitalWrite(5, HIGH);
  analogWrite(3, 50);
  delay(3000);

  /*모터A설정*/
  digitalWrite(7, LOW);
  digitalWrite(8, HIGH);
  analogWrite(9, 200);
  /*모터B설정*/
  digitalWrite(4, HIGH);
  digitalWrite(5, LOW);
  analogWrite(3, 150);
  delay(3000);
}
digitalWrite()함수는 흔히 보아서 알수 있을거라 생각됩니다. 그럼 analogWrite()함수는 무었알까요? 아래 이미지는 아두이노 홈페이지에서 가져온 함수 설명부분입니다. 보면 아날로그 출력을 설정을 할수 있고 디지털 경우에는 PWM 파형 설정까지 할수 있다고 볼 수 있습니다. 그럼 이 함수를 통해서 위에서 공부한 구형파를 출력시킬 수 있습니다.

Outro

이 포스트에서 간단한 모터 동작 방법에 대해 알아 봤습니다.
모터를 직접 동작해보는 활동을 초등학교때 접했었는데, 그때는 아~ 도는구나~ 라고 막연하게 생각했었는데,,,
어떻게 제어하는지에 대해서는 대학교 와서야 알게 되었네요 :)
예제에서 analogWrite()함수로 모터로 인가되는 출력의 정도를 조절하는것을 볼 수 있었습니다.
기구가 무겁거나, 오르막 내리막이 심한 상황에서 모터의 속도를 일정하게 유지하려면 어떻게 출력 조절을 해야 할까요? 다음 시간에 알아보도록 하겠습니다!

참고

  • colson