BDD-480을 아두이노로 제어하려면 어떻게 하나요?
가장 간단한 구성은
MAS-001 확장쉴드를 아두이노 우노에 꽂고 BDD-480을 장착하는 방식입니다. 아래 코드를 업로드하면 쉴드의 볼륨으로 속도, BTN1으로 구동, BTN2로 회전 방향을 제어할 수 있습니다. BDD-480은 BDD-240과 같은 제조사의 형제 모델로 핀맵·제어 방식이 동일하므로(차이는 전원 전압과 출력 용량), 라이브러리의 bdd240 클래스를 그대로 사용합니다.
// BDD-480 BLDC 드라이버 아두이노 제어 예제 (MAS-001 사용)
// BTN1: 구동 / BTN2: 방향 전환 / 볼륨: 속도 조절
// BDD-240과 같은 제어 방식(EN/방향/속도 PWM)이므로 bdd240 클래스를 사용합니다.
#include "mas001.h"
#include "bdd240.h"
MAS001 myShield;
BDD240 myDevice; // BDD-480에 그대로 적용
void setup() {
myDevice.init(); // Timer1 초기화 - 반드시 setup()에서 호출
Serial.begin(115200);
}
void loop() {
if (myShield.button1Clicked()) { // BTN1 누르는 동안 구동
myDevice.enable(LOW);
if (myShield.button2Clicked()) { // BTN2로 방향 전환
myDevice.setSpeed((float)myShield.getPot() * 0.098); // 정방향 0~100%
} else {
myDevice.setSpeed(-(float)myShield.getPot() * 0.098); // 역방향 0~100%
}
} else { // 버튼을 놓으면 정지
myDevice.enable(HIGH);
myDevice.setSpeed(0);
}
delay(100);
}
MAS-001 없이 아두이노 UNO만으로도 제어할 수 있나요?
가능합니다. BDD-480의 제어부는 속도(VSP, 0~5V PWM), 기동/정지(EN), 속도 출력(FG)으로 구성되며, 아래 표처럼 직접 결선하면 같은 라이브러리로 제어할 수 있습니다. 신호 레벨은 5V 기준이며, 3.3V 보드(라즈베리파이·ESP32 등)도 동작은 하지만 최고 속도 등 스펙이 낮아지므로 5V 레벨 사용을 권장합니다.
| BDD-480 신호 |
아두이노 UNO |
| VSP (속도 지령, 0~5V PWM) |
D9 |
| EN (기동/정지) |
D5 |
| DIR (방향) |
D6 |
| FG (속도 펄스 출력, 선택) |
D2 |
| GND |
GND (공통 연결 필수) |
주의: 모터 전원(DC 24V 이상, 제품 사양 범위 내)은 드라이버의 전원 단자에 별도로 연결하고, 아두이노와 드라이버의 GND는 반드시 공통으로 묶으세요. 모터는 드라이버 정격(10A) 대비 여유 있게 선정해야 하며, 정격이 딱 10A인 모터는 과부하 알람(레드 LED 4회 점멸)으로 정지할 수 있습니다. 브레이크 기능은 없으며 EN을 통한 기동·정지만 가능합니다.
// BDD-480 직결 제어 예제 (MAS-001 없이 아두이노 UNO만 사용)
// 결선: VSP->D9(속도 PWM), EN->D5, 방향 단자->D6, GND 공통
// FG->D2 (속도 펄스 측정, 선택) ※ 모터 전원(DC 24V 이상)은 드라이버에 별도 연결
// 같은 핀을 사용하므로 MotionTree-MAS 라이브러리(bdd240.h)를 그대로 사용합니다.
// 시리얼 모니터(115200bps)에서 명령 입력:
// f / r : 정방향 / 역방향 구동
// s : 정지
// t<n> : 속도 설정 0~100% (예 t40)
// e / E : EN 신호 LOW(구동 허가) / HIGH
// g : FG 펄스 주파수 출력 (속도 확인)
#include "bdd240.h" // 라이브러리 설치는 위 깃허브 저장소 참고
BDD240 myDevice;
const int PIN_FG = 2; // FG 입력 (인터럽트 0)
volatile unsigned long fgCount = 0;
float duty = 30; // 속도 기본값(%)
int dir = 1; // 1=정방향, -1=역방향
void fgISR() { fgCount++; }
void setup() {
myDevice.init(); // Timer1 초기화 (D9 = 100Hz PWM)
pinMode(PIN_FG, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(PIN_FG), fgISR, RISING);
Serial.begin(115200);
Serial.setTimeout(50);
myDevice.enable(HIGH); // 대기 상태로 시작
Serial.println(F("BDD-480 Direct Ready. f/r/s/t/e/E/g"));
}
void loop() {
if (!Serial.available()) return;
char c = Serial.read();
switch (c) {
case 'f': dir = 1; myDevice.enable(LOW); myDevice.setSpeed(duty); Serial.println(F("정방향 구동")); break;
case 'r': dir = -1; myDevice.enable(LOW); myDevice.setSpeed(-duty); Serial.println(F("역방향 구동")); break;
case 's': myDevice.setSpeed(0); Serial.println(F("정지")); break;
case 't': {
long v = Serial.parseInt();
if (v < 0 || v > 100) { Serial.println(F("범위 0~100")); break; }
duty = (float)v;
myDevice.setSpeed(duty * dir); // 구동 중이면 즉시 반영
Serial.print(F("속도: ")); Serial.print(v); Serial.println(F("%"));
break;
}
case 'e': myDevice.enable(LOW); Serial.println(F("EN=LOW (구동 허가)")); break;
case 'E': myDevice.enable(HIGH); Serial.println(F("EN=HIGH")); break;
case 'g': { // 1초간 FG 펄스 수 = 주파수(Hz)
noInterrupts(); fgCount = 0; interrupts();
delay(1000);
noInterrupts(); unsigned long hz = fgCount; interrupts();
Serial.print(F("FG: ")); Serial.print(hz); Serial.println(F(" Hz"));
// RPM 환산은 모터 극수에 따라 다릅니다. 설명서의 FG 사양을 참고하세요.
break;
}
default: break;
}
}
g 명령으로 출력되는 FG 주파수(Hz)를 RPM으로 환산하려면 모터 극수에 따른 계수가 필요합니다 —
사용설명서의 FG 사양을 참고하세요. 라이브러리(bdd240.h)와 전체 예제는
깃허브 MotionTree-MAS 저장소에서 내려받을 수 있습니다. (아두이노 IDE → 스케치 → 라이브러리 포함하기 → .ZIP 라이브러리 추가)
동작이 안 되거나 알람(레드 LED 점멸)이 반복되면 상품문의 게시판에 ①사용하시는 모터 모델명과 홀센서/센서리스 여부 ②전원 전압 ③점멸 횟수와 시리얼 모니터 출력을 남겨 주세요. 기술팀이 확인해 드립니다.
작성: MotorBank 기술팀 · 최종 업데이트: 2026-08-16