BLC-22H06P 모터 구동 드라이버 아두이노로 제어하기
감속 모터에 사용하는 BLC-22H06P 구동 드라이버
[㈜디엔지위드] BLDC감속모터+컨트롤러세트 BL3640A-24V-06P + RA35 with BLC-22H06P
BLC-22H06P
BLC-22H06P.
spec
아두이노로 구동 영상
회로 구성 사진
arduino source code
6번핀을 PWM으로 속도를 제어 하는데 사용하고
8번핀을 GPIO pin으로 방향 제어용도로 사용
UART로 “u” 입력 : 속도 5% 업 UART로 “d” 입력 : 속도 5% 다운 UART로 “w” 입력 : 방향전환 (속도를 줄였다가 방향 바꿔서 이전 속도까지 증가)
const int pwmPin = 6; // PWM 핀 (D6)
const int dirPin = 8; // 방향 제어 핀 (D8)
int speedPercent = 50; // 현재 속도 (%)
int targetSpeed = 50; // 목표 속도 (%)
bool direction = LOW; // 현재 방향
const int stepDelay = 20; // 감속/가속 단계 간 딜레이(ms)
void setup() {
pinMode(pwmPin, OUTPUT);
pinMode(dirPin, OUTPUT);
Serial.begin(9600);
analogWrite(pwmPin, map(speedPercent, 0, 100, 0, 255));
digitalWrite(dirPin, direction);
Serial.print("Init: speed=");
Serial.print(targetSpeed);
Serial.print("%, direction=");
Serial.println(direction ? "HIGH" : "LOW");
}
void loop() {
// 시리얼 입력 처리
if (Serial.available()) {
char cmd = Serial.read();
if (cmd == 'u') {
if (targetSpeed < 100) {
targetSpeed = targetSpeed + 5;
Serial.print("Target speed up: ");
Serial.print(targetSpeed);
Serial.println("%");
}
}
else if (cmd == 'd') {
if (targetSpeed > 0) {
targetSpeed = targetSpeed - 5;
Serial.print("Target speed down: ");
Serial.print(targetSpeed);
Serial.println("%");
}
}
else if (cmd == 'w') {
changeDirectionSmoothly();
}
}
// 목표 속도에 맞춰 현재 속도 조정
if (speedPercent < targetSpeed) {
speedPercent++;
analogWrite(pwmPin, map(speedPercent, 0, 100, 0, 255));
Serial.print("Speed up: ");
Serial.print(speedPercent);
Serial.println("%");
delay(stepDelay);
} else if (speedPercent > targetSpeed) {
speedPercent--;
analogWrite(pwmPin, map(speedPercent, 0, 100, 0, 255));
Serial.print("Speed down: ");
Serial.print(speedPercent);
Serial.println("%");
delay(stepDelay);
}
}
// 방향 전환 시 부드럽게 감속/정지 후 방향 변경, 다시 가속
void changeDirectionSmoothly() {
int prevTarget = targetSpeed;
// 1. 천천히 감속하여 정지
while (speedPercent > 0) {
speedPercent--;
analogWrite(pwmPin, map(speedPercent, 0, 100, 0, 255));
Serial.print("Speed down: ");
Serial.print(speedPercent);
Serial.println("%");
delay(stepDelay);
}
// 2. 방향 토글
direction = !direction;
digitalWrite(dirPin, direction);
Serial.print("Direction changed: ");
Serial.println(direction ? "HIGH" : "LOW");
// 3. 다시 이전 목표 속도까지 가속
while (speedPercent < prevTarget) {
speedPercent++;
analogWrite(pwmPin, map(speedPercent, 0, 100, 0, 255));
Serial.print("Speed up: ");
Serial.print(speedPercent);
Serial.println("%");
delay(stepDelay);
}
}