본문 바로가기

Project/Gimbal

[액션캠 짐벌 제작] 07. 모터 컨트롤

보통은 BLDC 모터를 제어할 때는 ESC(Electronic Speed Controller)를 사용하여 제어를 한다.

 

[사진 : ESC]

 

하지만 ESC는 말 그대로 속도를 제어하는 제어기이기 때문에 각도 제어를 해야 하는 짐벌에서는 사용하기 부적합하다.

 

그렇다면 어떻게 BLDC 모터를 제어할까? 그러기 위해서는 먼저 BLDC 모터와 ESC의 원리를 알아야 한다.

 

[사진 : BLDC모터 구조]

 

BLDC 모터는 위와 같이 권선 되어있다.

 

전류를 흘려주면 자기장이 발생하면서 모터가 회전하게 되는 구조이다.

 

[영상 : BLDC모터 작동원리]

 

3개의 선과 전류의 방향을 계산해보면 전류를 흘려주기만 함으로써 총 6가지의 방향 제어가 가능하다.

 

[사진 : BLDC 모터 6 방향]

ESC는 이 6가지 방향을 하나하나씩 스위칭하여 모터를 회전하게 하고, 스위칭되는 속도를 조정하면 모터의 회전 속도가 결정된다.

 

그렇다면 우리는 전류의 방향과, 경로를 정해줄 수 있어야 한다.

 

모터에 흐르는 전류의 방향을 결정하는 데에는 대표적으로 H-bridge라는 회로가 사용된다.

 

[회로 : h-bridge]

 

H-bridge는 각각의 극에 (+) 극과 연결되는 스위치와 (-) 극 연결되는 스위치를 연결해 전류의 방향을 컨트롤할 수 있게 해 준다.

다음은 MOSFET 4개와 BLDC 모터의 2개 극을 사용하여 전류의 방향을 바꾸어 본 것이다.

[회로 : H-bridge]

 

void setup() {

  pinMode(8,OUTPUT);  // 8번 핀 OUTPUT으로 설정
  pinMode(9,OUTPUT);  // 9번 핀 OUTPUT으로 설정
  pinMode(10,OUTPUT); // 10번 핀 OUTPUT으로 설정
  pinMode(11,OUTPUT); // 11번 핀 OUTPUT으로 설정
  
}

void loop() { 

    delay(1000);  // 1000ms (1초) 지연
    digitalWrite(8,1);  // 8번 핀 ON
    digitalWrite(9,0);  // 9번 핀 OFF
    digitalWrite(10,1); // 10번 핀 ON
    digitalWrite(11,0); // 11번 핀 OFF
    delay(1000);
    digitalWrite(8,0);  // 8번 핀 OFF
    digitalWrite(9,1);  // 9번 핀 ON
    digitalWrite(10,0); // 10번 핀 OFF
    digitalWrite(11,1); // 11번 핀 ON
    
}

[코드 : H-brigde]

 

[GIF : H-bridge]

 

8, 9번 핀은 (+) 극, 10, 11번 핀은 (-) 극에 연결하고 전류를 1초마다 반대로 흐르게 한 코드이다.

 

하지만 BLDC 모터는 극이 3개이다. 3개의 극에 전류의 방향을 다르게 제어할 수 있으려면 3개의 H-bridge를 이용하여 다음과 같은 회로를 구성해야 한다.

다음은 3개의 극을 가진 H-bridge를 구성하고 6개 방향의 전류를 흘려 본 것이다.

 

[회로 : H-bridge]

 

#define p1 13   // 13번 핀 p1로 정의
#define p2 12
#define p3 11

#define m1 10
#define m2 9
#define m3 8
float ti = 20;  // ti = 20

void setup() {
  // put your setup code here, to run once:
    pinMode(p1, OUTPUT);  // p1(13번)핀 OUTPUT으로 설정 
    pinMode(p2, OUTPUT);
    pinMode(p3, OUTPUT);
  
    pinMode(m1, OUTPUT);  //  m1(10번)핀 OUTPUT으로 설정 
    pinMode(m2, OUTPUT);
    pinMode(m3, OUTPUT);
}

void loop() {
  // put your main code here, to run repeatedly:
  motor(1, 3);  // motor()함수 호출
  motor(2, 3);
  motor(2, 1);
  motor(3, 1);
  motor(3, 2);
  motor(1, 2);
  
}

void motor(int p, int m) {
  switch (p) {
    case 1: // p 가 1일때
      digitalWrite(p1, 1);  // p1(13번)핀 ON 
      digitalWrite(p2, 0);  // p2(12번)핀 OFF 
      digitalWrite(p3, 0);  // p3(11번)핀 OFF 
      break;
    case 2: // p 가 2일때
      digitalWrite(p1, 0);
      digitalWrite(p2, 1);
      digitalWrite(p3, 0);
      break;
    case 3: // p 가 3일때
      digitalWrite(p1, 0);
      digitalWrite(p2, 0);
      digitalWrite(p3, 1);
      break;
  }
  switch (m) {
    case 1:
      digitalWrite(m1, 1);  // m1(10번)핀 ON 
      digitalWrite(m2, 0);  // m2(9번)핀 OFF 
      digitalWrite(m3, 0);  // m3(8번)핀 OFF 
      break;
    case 2:
      digitalWrite(m1, 0);
      digitalWrite(m2, 1);
      digitalWrite(m3, 0);
      break;
    case 3:
      digitalWrite(m1, 0);
      digitalWrite(m2, 0);
      digitalWrite(m3, 1);
      break;
  }
  delay(ti);  // ti 만큼 지연
}

[코드 : H-brigde]

 

[GIF : H-bridge]

 

p1(13), p2(12), p3(11) 은 (+) 극, m1(10), m2(9), m3(8) 은 (-) 극에 연결하고 6가지 방향으로 ti 만큼의 지연시간을 두고(본 코드에서는 20ms (1000ms=1초) 만큼 지연) 전류의 방향을 바꾼 것이다.

 

3개의 극에 전류를 흘려주는 것으로 모터의 회전을 구현할 수 있게 되었다.

 

하지만 짐벌은 모터의 회전을 제어하는 것만으로는 구현할 수가 없다. 

 

짐벌을 모터의 각도를 제어할 수 있어야 한다.

 

모터의 각도를 제어하기 위해서는 정교한 제어가 필요할 것이다. 3극에 단순히 전류를 흘려주는 것으로는 모터가 12 폴 이므로 최대 24가지의 각밖에 제어하지 못한다.