본문 바로가기
아두이노

아두이노로 BLDC 모터 제어하기!! 완벽 가이드

by 꼬맹님 2025. 11. 18.
반응형

BLDC(Brushless DC) 모터는 드론, RC카, 공구, 선풍기 등 다양한 제품에 사용되는 고효율·고성능 모터입니다.
이번 글에서는 아두이노로 BLDC 모터를 제어하는 방법을 단계별로 정리해 보겠습니다.

 

 BLDC 모터란?

BLDC 모터는 이름처럼 **브러시(Brush)**가 없는 DC모터입니다.
내부에는 3개의 코일(3상)과 영구자석이 있고, 코일의 전류를 순서대로 바꿔주면서 회전합니다.

장점

  • 높은 효율
  • 긴 수명
  • 고속 회전 가능
  • 소음/진동 적음

 

BLDC 제어에 필요한 것들

1. 아두이노(UNO, Nano 등)

PWM 신호 출력 용도로 사용됩니다.

2. ESC(전자식 스피드 컨트롤러)

BLDC를 직접 아두이노로 구동할 수 없습니다.
전류 제어 + 3상 전환 + 안전 보호 기능을 ESC가 담당합니다.

"PREDATOR ESC 20A 2-4S 브러쉬리스 변속기를 사용했습니다."

3. BLDC 모터

드론용(2212, 2208, 2207) 또는 소형 BLDC 아무거나 가능.

4. 배터리 (전원 공급 장치)

12V DC 전원 사용

대부분 2S~4S LiPo를 사용.


BLDC와 ESC 연결 방법 (아두이노 기준)

기본 연결도

 

⚠ 절대 USB로 ESC나 모터에 전원 공급 불가!
BLDC 모터 ESC는 반드시 배터리, DC POWER SUPPLY로 전원을 공급해야 합니다.


아두이노 코드 예제 (ESC 제어)

ESC는 서보모터와 동일한 PWM 1000~2000us 신호로 속도를 제어합니다.

가장 기본적인 BLDC 제어 코드

 
#define ESC_PIN 9  // ESC가 연결된 핀

void setup() {
     pinMode(ESC_PIN, OUTPUT);
     Serial.begin(115200);

     // Timer1을 50Hz(20ms 주기) PWM 모드로 설정
     setupTimer1();

     Serial.println("ESC 캘리브레이션 시작!");

     Serial.println("최대 스로틀 설정 (2000µs)");
     escSignal(2000);  // 최대값
     delay(3000);

     Serial.println("최소 스로틀 설정 (1000µs)");
     escSignal(1000);  // 최소값
     delay(3000);

     Serial.println("ESC 초기화 중...");
     escSignal(1000);  // 초기 신호 (1000µs = 최소 스로틀)
     delay(1000);
     escSignal(1000);  // 초기 신호 (1000µs = 최소 스로틀)
     delay(1000);
     escSignal(1000);  // 초기 신호 (1000µs = 최소 스로틀)
     delay(1000);
     escSignal(1000);  // 초기 신호 (1000µs = 최소 스로틀)
     delay(1000);
     Serial.println("ESC 초기화 완료!");
}

void loop() {
     escSignal(1100);
     Serial.println("속도 1100 유지");
     delay(3000);

     escSignal(1080);
     Serial.println("속도 1080 유지");
     delay(3000);

     escSignal(1060);
     Serial.println("속도 1060 유지");
     delay(5000);

     escSignal(1050);
     Serial.println("속도 1050 유지");
     delay(5000);

     escSignal(1040);
     Serial.println("속도 1040 유지");
     delay(5000);
     /*
     escSignal(1300);
     Serial.println("속도 1300 유지");
     delay(3000);

     escSignal(1500);
     Serial.println("속도 1500 유지");
     delay(3000);

     escSignal(1700);
     Serial.println("속도 1700 유지");
     delay(3000);
     
     escSignal(2000);
     Serial.println("속도 2000 유지");
     delay(3000);
     */
}

// Timer1 설정: 50Hz(20ms) PWM 생성
void setupTimer1() {
     TCCR1A = (1 << WGM11) | (1 << COM1A1);  // Fast PWM 모드, 비반전 모드
     TCCR1B = (1 << WGM13) | (1 << WGM12) | (1 << CS11);  // 프리스케일 8로 설정 (16MHz / 8 = 2MHz 클럭 사용)
     ICR1 = 40000;  // 50Hz 주파수 생성 (ICR1 = 2MHz / 50Hz = 40000)
     OCR1A = 3000;  // 초기 PWM 값 설정 (1000µs)
}

// ESC 신호 전송 (1000µs ~ 2000µs)
void escSignal(int pulseWidth) {
     pulseWidth = constrain(pulseWidth, 1000, 2000);  // 최소/최대 제한
     OCR1A = map(pulseWidth, 1000, 2000, 2000, 4000);  // 50Hz PWM 값으로 변환
}

ESC 초기화(캘리브레이션) 방법

BLDC + ESC를 처음 사용할 때는 스로틀 캘리브레이션을 해야 합니다.

ESC 캘리브레이션 코드

 
#include <Servo.h>
Servo esc;

void setup() {
  esc.attach(9);

  esc.writeMicroseconds(2000);  // 최대 스로틀
  delay(2000);                  // ESC에서 "삐삐삐" 비프음

  esc.writeMicroseconds(1000);  // 최소 스로틀
  delay(2000);                  // "삐-" 비프음 후 완료
}

void loop() { }

캘리브레이션 후에는 모터 속도 제어가 정상적으로 됩니다.


BLDC 제어 시 주의할 점

1. ESC와 모터는 강한 전류가 흐른다

모터가 멈추거나 배선이 잘못되면 ESC가 쉽게 타버립니다.

2. 아두이노 GND와 ESC GND 반드시 공유

신호 기준 전압이 맞지 않으면 모터가 갑자기 폭주할 수 있음.

3. 프로펠러는 테스트 시 반드시 제거

초보자가 가장 많이 다치는 부분입니다.

4. LiPo 배터리 과방전 주의

반응형