• 엔코더 브레이크장착 마이터기어 유성감속기 BLDC모터 BG42-BL42100EB 1000cpr
  • 엔코더 브레이크장착 마이터기어 유성감속기 BLDC모터 BG42-BL42100EB 1000cpr
  • 엔코더 브레이크장착 마이터기어 유성감속기 BLDC모터 BG42-BL42100EB 1000cpr
  • 엔코더 브레이크장착 마이터기어 유성감속기 BLDC모터 BG42-BL42100EB 1000cpr
  • 엔코더 브레이크장착 마이터기어 유성감속기 BLDC모터 BG42-BL42100EB 1000cpr
  • 엔코더 브레이크장착 마이터기어 유성감속기 BLDC모터 BG42-BL42100EB 1000cpr

엔코더 브레이크장착 마이터기어 유성감속기 BLDC모터 BG42-BL42100EB 1000cpr

Φ42mm Encoder Brake장착 105W 1000CPR 유성감속기어 BLDC모터 DC24V감속비 1/4~1/504 10종
9~100kgf.cm

배송정보
0원 (조건부배송) 지역별 추가배송 주문시결제(선결제)
택배
구매안내

이 모터를 아두이노로 제어하려면 어떻게 하나요? (모터·엔코더 + 브레이크)

PG42-BL42100EB는 엔코더(1000CPR)와 무여자 작동형 전자 브레이크가 일체된 모터라 제어가 두 갈래로 나뉩니다. 모터 구동과 엔코더 피드백은 BLC-400R4E 드라이버의 RS485 통신(MC-RS485 프로토콜)으로, 브레이크는 통신 명령이 아니라 릴레이 모듈로 코일 전원을 넣고 끊는 방식으로 제어합니다 — 코일에 전원이 들어가면 풀리고, 끊기면(정전 포함) 자동으로 잠기는 구조입니다. 아래 예제는 두 채널을 하나의 스케치로 묶고, 브레이크가 잠긴 채 구동 명령이 나가지 않도록 안전 시퀀스를 내장했습니다.
RS485 모듈 연결
RO (수신 출력) 아두이노 D10
DI (송신 입력) 아두이노 D11
DE + RE (묶어서) 아두이노 D3
A / B (통신선) BLC-400R4E의 485 단자 (통신이 안 되면 A/B 교차)
VCC / GND 5V / GND (드라이버와 GND 공통)
릴레이 모듈 IN (브레이크) 아두이노 D7 — 릴레이 접점이 브레이크 코일 전원을 개폐
주의: 브레이크 코일은 아두이노 핀에 직결하지 마세요 — 반드시 릴레이(또는 MOSFET) 모듈을 거치고, 트랜지스터 직결 구성이라면 플라이백 다이오드가 필수입니다. 코일 정격 전압·전류는 본 페이지의 브레이크 배선도를 기준으로 하세요. 브레이크가 잠긴 상태에서 모터를 구동하면 과전류·브레이크 마모의 원인이 됩니다 — 예제 코드는 구동 명령 시 자동으로 해제하지만, 잠금(B)은 반드시 정지를 확인(v 명령, 속도 0)한 뒤 실행하세요. 분해능·감속비 등록(c, d)은 제어 Off 상태에서, 모든 GND는 공통으로 묶습니다.
//==============================================================
// PG42-BL42100EB + BLC-400R4E 아두이노 제어 예제 V1.0
// 모터·엔코더 = RS485(MC-RS485 프로토콜, 문서 전수 대조 완료)
// 브레이크(무여자 작동형) = 릴레이 모듈로 별도 제어
// 보드: Arduino Uno + RS485 컨버터 모듈(MAX485 등) + 릴레이 모듈 1채널
//
// [통신 설정] 9600bps(제품 초기값), 8 Data, No Parity, 1 Stop
// [프레임 구조] FF FE | ID | Data크기 | Checksum | Mode | Data...
//   Checksum = ~(ID + Data크기 + Mode + Data바이트 합)의 하위 1바이트
//
// [결선 - MAX485 모듈 기준] ※ 반드시 BLC-400R4E 상세페이지 결선도 기준
//   모듈 RO -> D10 / DI -> D11 / DE+RE(묶음) -> D3
//   모듈 A/B -> 드라이버 485 A/B (통신 안 되면 A/B 교차)
//   모듈 VCC -> 5V, GND -> 아두이노·드라이버 공통
// [브레이크 결선] 릴레이 모듈 IN -> D7, 릴레이 접점으로 브레이크 코일에 DC 인가/차단
//   ※ 무여자 작동형: 코일에 전원을 넣어야 풀리고, 끊으면 잠깁니다
//   ※ 코일 정격 전압·전류는 상품페이지 브레이크 배선도 기준 (아두이노 핀 직결 금지)
//
// [이 모터 전용 초기 설정] 반드시 제어 Off(E) 상태에서, 명령 간 0.3초 이상 간격:
//   c     : 분해능 등록 - 1000CPR 모터는 CPR/4 규칙에 따라 250이 입력됩니다
//   d14   : 감속비 등록 (★구매 옵션 값 - 예: 1/14 -> d14. 0.1비 단위로 자동 환산)
//   설정은 EEPROM에 기록되므로 최초 1회만 하면 되고, 등록 후에는
//   위치(도)·속도(RPM)가 감속기 출력축 기준으로 동작합니다.
//
// [시리얼 모니터 사용법] (9600bps, "새 줄" 설정)
//   e / E : 제어 On / Off (Off 상태에서는 제어 명령이 무시됩니다)
//   b / B : 브레이크 해제(코일 통전) / 잠금(차단) - f/r 실행 시 자동 해제됨
//   f1000 : CW  100.0RPM (0.1RPM 단위, 도달시간 1초 가감속)
//   r500  : CCW  50.0RPM
//   s     : 감속 정지
//   g9000 : CW  90.00도 위치 이동 (0.01도 단위, 절대위치 0~655.33도)
//   G9000 : CCW 90.00도 위치 이동
//   z     : 현재 위치를 0으로 초기화 (제어 Off 상태에서 권장)
//   p / v : 위치 / 속도 피드백 요청
// [안전 시퀀스] 구동: b(해제) -> f/r  |  정지: s -> v로 속도 0 확인 -> B(잠금) -> E
//==============================================================
#include <SoftwareSerial.h>

const int RS485_RX = 10, RS485_TX = 11, RS485_EN = 3;
const byte MOTOR_ID = 0x00;   // 제품 초기 ID 0x00 (변경했다면 수정)
const unsigned int ENC_PPR = 250;   // 1000CPR / 4 (프로토콜 규칙: CPR은 4로 나눠 입력)

const int BRAKE_PIN = 7;            // 릴레이 모듈 IN
#define BRAKE_ACTIVE  LOW           // 릴레이 동작 레벨 (LOW 트리거 모듈 기준, 모듈에 맞게 수정)
#define BRAKE_IDLE    HIGH
const int BRAKE_RELEASE_MS = 150;   // 해제 후 구동까지 대기(ms) - 브레이크 사양 확인 후 조정
bool brakeReleased = false;

SoftwareSerial rs485(RS485_RX, RS485_TX);

// 프레임 송신: mode + data -> 헤더/크기/체크섬 자동 구성
void sendFrame(byte mode, const byte *data, byte dlen) {
  byte size = dlen + 2;                    // Mode + Data + Checksum
  int sum = MOTOR_ID + size + mode;
  for (byte i = 0; i < dlen; i++) sum += data[i];
  byte chk = (~sum) & 0xFF;

  byte f[16]; byte n = 0;
  f[n++] = 0xFF; f[n++] = 0xFE;
  f[n++] = MOTOR_ID; f[n++] = size; f[n++] = chk; f[n++] = mode;
  for (byte i = 0; i < dlen; i++) f[n++] = data[i];

  while (rs485.available()) rs485.read();  // 수신버퍼 비우기
  digitalWrite(RS485_EN, HIGH);
  rs485.write(f, n);
  rs485.flush();
  digitalWrite(RS485_EN, LOW);

  Serial.print(F("TX:"));
  for (byte i = 0; i < n; i++) { Serial.print(' '); if (f[i]<16) Serial.print('0'); Serial.print(f[i], HEX); }
  Serial.println();
}

// 수신 프레임 읽기 + 위치/속도 피드백(0xD1/0xD2) 해석
void readFeedback() {
  byte buf[24]; byte n = 0;
  unsigned long t0 = millis();
  while (millis() - t0 < 300 && n < 24) {
    if (rs485.available()) buf[n++] = rs485.read();
  }
  if (n == 0) { Serial.println(F("RX: (응답 없음 - 결선/ID/전원 확인)")); return; }
  Serial.print(F("RX:"));
  for (byte i = 0; i < n; i++) { Serial.print(' '); if (buf[i]<16) Serial.print('0'); Serial.print(buf[i], HEX); }
  Serial.println();
  for (int i = n - 4; i >= 0; i--) {
    if (buf[i] == 0xFF && buf[i+1] == 0xFE) {
      byte mode = buf[i+5];
      if ((mode == 0xD1 || mode == 0xD2) && i + 11 < (int)n + 1) {
        byte dir = buf[i+6];
        unsigned int a = ((unsigned int)buf[i+7] << 8) | buf[i+8];
        unsigned int b = ((unsigned int)buf[i+9] << 8) | buf[i+10];
        byte cur = buf[i+11];
        if (mode == 0xD1) {  // 위치 피드백: 위치[0.01도] 속도[0.1RPM] 전류[100mA]
          Serial.print(F("위치: ")); Serial.print(dir ? F("CW ") : F("CCW "));
          Serial.print(a / 100.0); Serial.print(F("도, 속도 "));
          Serial.print(b / 10.0); Serial.print(F("RPM, 전류 "));
          Serial.print(cur * 0.1); Serial.println(F("A"));
        } else {             // 속도 피드백: 속도[0.1RPM] 위치[0.1도] 전류[100mA]
          Serial.print(F("속도: ")); Serial.print(dir ? F("CW ") : F("CCW "));
          Serial.print(a / 10.0); Serial.print(F("RPM, 위치 "));
          Serial.print(b / 10.0); Serial.print(F("도, 전류 "));
          Serial.print(cur * 0.1); Serial.println(F("A"));
        }
      }
      break;
    }
  }
}

void speedMove(byte dir, unsigned int spd01rpm, byte time01s) {   // 가감속 속도제어 0x03
  byte d[4] = { dir, (byte)(spd01rpm >> 8), (byte)(spd01rpm & 0xFF), time01s };
  sendFrame(0x03, d, 4);
}
void posMove(byte dir, unsigned int pos001deg, byte time01s) {    // 가감속 위치제어 0x02
  byte d[4] = { dir, (byte)(pos001deg >> 8), (byte)(pos001deg & 0xFF), time01s };
  sendFrame(0x02, d, 4);
}
void setU16(byte mode, unsigned int v) {                          // 2바이트 설정값 송신
  byte d[2] = { (byte)(v >> 8), (byte)(v & 0xFF) };
  sendFrame(mode, d, 2);
}
void ctrlOnOff(bool on) {                                         // 제어 On/Off 0x0C
  byte d[1] = { on ? (byte)0x00 : (byte)0x01 };
  sendFrame(0x0C, d, 1);
}
void brakeRelease() {               // 코일 통전 -> 브레이크 풀림
  digitalWrite(BRAKE_PIN, BRAKE_ACTIVE);
  brakeReleased = true;
  Serial.println(F("브레이크 해제 (코일 통전)"));
}
void brakeLock() {                  // 코일 차단 -> 브레이크 잠김 (전원 차단 시에도 자동 잠김)
  digitalWrite(BRAKE_PIN, BRAKE_IDLE);
  brakeReleased = false;
  Serial.println(F("브레이크 잠금"));
}
void ensureBrakeReleased() {        // 구동 전 안전 시퀀스
  if (!brakeReleased) {
    brakeRelease();
    delay(BRAKE_RELEASE_MS);        // 브레이크가 물리적으로 풀릴 때까지 대기
  }
}

void setup() {
  Serial.begin(9600);
  rs485.begin(9600);                 // 제품 초기값 9600bps
  pinMode(RS485_EN, OUTPUT);
  digitalWrite(RS485_EN, LOW);
  pinMode(BRAKE_PIN, OUTPUT);
  digitalWrite(BRAKE_PIN, BRAKE_IDLE);   // 시작은 잠금 상태 (안전)
  Serial.println(F("PG42-BL42100EB + BLC-400R4E ready. (V1.0)"));
  Serial.println(F("초기 1회(제어 Off에서): c(분해능) d<감속비> | b/B e/E f1000 r500 s g9000 G9000 z p v"));
}

void loop() {
  if (!Serial.available()) return;
  String cmd = Serial.readStringUntil('\n');
  cmd.trim();
  if (cmd.length() == 0) return;
  char c = cmd.charAt(0);
  long v = cmd.substring(1).toInt();
  switch (c) {
    case 'e': ctrlOnOff(true);  Serial.println(F("제어 On"));  break;
    case 'E': ctrlOnOff(false); Serial.println(F("제어 Off")); break;
    case 'b': brakeRelease(); return;
    case 'B': brakeLock(); return;   // 반드시 정지(v로 속도 0 확인) 후 잠글 것
    case 'f': ensureBrakeReleased();
              speedMove(0x01, constrain(v, 1, 65533), 10); break;        // CW, 도달 1.0s
    case 'r': ensureBrakeReleased();
              speedMove(0x00, constrain(v, 1, 65533), 10); break;        // CCW
    case 's': speedMove(0x01, 1, 5); delay(600); speedMove(0x01, 1, 1);
              Serial.println(F("감속 정지")); break;
    case 'g': ensureBrakeReleased();
              posMove(0x01, constrain(v, 0, 65533), 10); break;          // CW 위치
    case 'G': ensureBrakeReleased();
              posMove(0x00, constrain(v, 0, 65533), 10); break;          // CCW 위치
    case 'c': setU16(0x0A, ENC_PPR);   // 분해능 설정(10번) - EEPROM 기록, 제어 Off에서
              Serial.println(F("분해능 등록: 1000CPR -> 250 입력 (CPR/4 규칙)")); break;
    case 'd': if (v < 1) { Serial.println(F("감속비를 입력하세요 (예 d14)")); return; }
              setU16(0x0B, (unsigned int)(v * 10));   // 감속비 설정(11번) - 0.1비 단위
              Serial.print(F("감속비 1/")); Serial.print(v);
              Serial.print(F(" 등록 (전송값 ")); Serial.print(v * 10); Serial.println(F(")")); break;
    case 'z': sendFrame(0x0F, nullptr, 0); Serial.println(F("위치 0 초기화 (15번 명령)")); break;
    case 'p': sendFrame(0xA1, nullptr, 0); readFeedback(); return;
    case 'v': sendFrame(0xA2, nullptr, 0); readFeedback(); return;
    default:  Serial.println(F("? b/B e/E c d14 f1000 r500 s g9000 G9000 z p v")); return;
  }
  readFeedback();  // 명령 후 응답/에코 로그 표시
}
사용 순서: 최초 1회 제어 Off(E) 상태에서 c(분해능, 1000CPR→250 자동 적용)와 d14처럼 구매하신 감속비를 등록하고(설정 간 0.3초 이상 간격), 이후 운전은 b(해제) → f/r 또는 g/G → s(정지) → v로 속도 0 확인 → B(잠금) → E 순서를 지키면 됩니다. 속도는 0.1RPM 단위, 위치는 0.01도 단위(절대위치 0~655.33도)이며 감속비 등록 후 출력축 기준으로 동작합니다. 송수신 HEX 로그가 출력되므로 문제 발생 시 로그를 상품문의에 붙여 주세요.
필요한 구성 — 본품(감속비 옵션 선택) + BLC-400R4E 드라이버 → + 아두이노 UNO + RS485 컨버터 모듈 + 릴레이 모듈 1채널(별도 준비)
동작이 안 되면 상품문의 게시판에 ①구매하신 감속비 옵션 ②결선 사진(브레이크 릴레이 포함) ③시리얼 모니터의 TX/RX 로그를 남겨 주세요. 기술팀이 확인해 드립니다.
작성: MotorBank 기술팀 · 최종 업데이트: 2026-08-16
bg42-bl42100eb_900x11404_n_01_101826.jpg
bg42-bl42100eb_900x11404_n_02_101833.jpg

a1804d3422e88fbabae345c571f008a8_182705.jpg
01a935c2ffbeeb985b8b0dac448c9bbf_182706.jpg







bg42-bl42100eb_900x11404_n_06_101910.jpg
bg42-bl42100eb_900x11404_n_07_101918.jpg

비밀번호 인증

비밀번호를 입력해 주세요.

확인