반응형
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 배터리 과방전 주의
반응형
'아두이노' 카테고리의 다른 글
| 아두이노로 스텝모터 제어하기!! 완벽 가이드 (0) | 2025.11.25 |
|---|---|
| 아두이노 서보모터 제어 - 라이브러리 없이 PWM 직접 만들기 (Tinkercad 한계 포함) (0) | 2025.04.22 |
| 아두이노 버튼(Pull-down, Pull-up) & LED 제어 예제 (0) | 2025.04.22 |
| 아두이노 버튼 풀업(Pull-up), 풀다운(Pull-down) 회로 예제 (0) | 2025.04.21 |
| 아두이노로 DC 모터 제어하기! L298N 모듈 완벽 가이드 (0) | 2025.04.18 |