• 마이터기어 BLDC모터 BG42BL4281B 24V B타입 브레이크장착
  • 마이터기어 BLDC모터 BG42BL4281B 24V B타입 브레이크장착

마이터기어 BLDC모터 BG42BL4281B 24V B타입 브레이크장착

DC24V 4,000 rpm 77.5W 고정밀 BLDC모터 장수명, 고출력, 의료기, 프린터, 컨베이어, 검사장비

소비자가289,300
판매가265,100
제조사
(주)로봇마트
원산지
한국
브랜드
motorbank
배송정보
0원 (조건부배송) 지역별 추가배송 주문시결제(선결제)
택배
구매안내

RS-485 통신 제어 — 아두이노 예제 코드 (BLC-200 / BLC-400 / BLC-400R4E 공용)

아래 세 드라이버는 동일한 MC-RS485 프로토콜을 사용하므로 이 예제 코드를 그대로 함께 쓸 수 있습니다. 사용하실 모터의 용량과 엔코더 유무에 맞는 드라이버를 선택하세요:
· BLC-200 구매하기 → — 200W급 · 홀센서 BLDC 모터용 (엔코더 미지원)
· BLC-400 구매하기 → — 400W급 · 홀센서 BLDC 모터용 (엔코더 미지원)
· BLC-400R4E 구매하기 → — 400W급 · 엔코더 장착 홀센서 BLDC 모터용
통신 사양은 9600bps 기본, 8 Data·No Parity·1 Stop이며, 프레임 구조는 FF FE(헤더) + ID + 데이터크기 + 체크섬 + 모드 + 데이터, 체크섬은 헤더·체크섬을 제외한 전체 바이트 합의 하위 1바이트에 NOT 연산을 한 값입니다 (PLC·PC 등 다른 상위 장치도 이 구조를 그대로 구현하면 됩니다). 예제는 아두이노 우노 + RS485 컨버터(MAX485 등) 기준이고, 시리얼 모니터에서 f1000(CW 100.0RPM) / r500(CCW 50.0RPM) / s(정지) / g9000(CW 90.00도 이동) / z(위치 초기화) / p(위치 피드백) / v(속도 피드백)로 조작합니다. 결선: 모듈 RO→D10, DI→D11, DE+RE→D3, A/B→드라이버 485 단자(통신이 안 되면 A/B 교차), GND 공통. 아두이노 확장쉴드 MAS-001을 쓰면 쉴드의 485 단자에 연결하면 됩니다. 송수신 HEX 로그가 출력되므로 문제 발생 시 로그를 상품문의에 붙여 주시면 빠르게 확인해 드립니다.
//==============================================================
// MotorBank BLC 시리즈 아두이노 RS485(MC-RS485 프로토콜) 공용 예제 V1.1
// 적용 제품: BLC-200 / BLC-400 / BLC-400R4E (통신 프로토콜 동일)
// 기능: 속도제어(가감속) / 위치제어(가감속) / 위치·속도 피드백 읽기
// 보드: Arduino Uno + RS485 컨버터 모듈(MAX485 등)
// 근거: 통신프로토콜 MC-RS485 V1.0.1 (문서 예제 체크섬 10건 검증 일치)
//
// [통신 설정] 9600bps(제품 초기값), 8 Data, No Parity, 1 Stop
// [프레임 구조] FF FE | ID | Data크기 | Checksum | Mode | Data...
//   Checksum = ~(ID + Data크기 + Mode + Data바이트 합)의 하위 1바이트
//
// [결선 - MAX485 모듈 기준]
//   모듈 RO -> D10 / DI -> D11 / DE+RE(묶음) -> D3
//   모듈 A/B -> 드라이버 485 A/B (통신 안 되면 A/B 교차)
//   모듈 VCC -> 5V, GND -> 아두이노·드라이버 공통
//   * MAS-001 확장쉴드 사용 시 쉴드의 485 단자에 연결 (MAS-001 상세페이지 참조)
//
// [시리얼 모니터 사용법] (9600bps, "새 줄" 설정)
//   f1000 : CW  100.0RPM (0.1RPM 단위, 도달시간 1초 가감속)
//   r500  : CCW  50.0RPM
//   s     : 정지(속도 0)
//   g9000 : CW  90.00도 위치 이동 (0.01도 단위, 도달시간 1초)
//   G9000 : CCW 90.00도 위치 이동
//   z     : 현재 위치를 0으로 초기화
//   p     : 위치 피드백 요청(방향/각도/속도/전류 표시)
//   v     : 속도 피드백 요청
//==============================================================
#include <SoftwareSerial.h>

const int RS485_RX = 10, RS485_TX = 11, RS485_EN = 3;
const byte MOTOR_ID = 0x00;   // 제품 초기 ID 0x00 (변경했다면 수정)

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();
  // 프레임 헤더 탐색(자기 에코 뒤에 응답이 붙을 수 있어 마지막 FFFE 기준 해석)
  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]
          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도]
          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 setup() {
  Serial.begin(9600);
  rs485.begin(9600);                 // 제품 초기값 9600bps
  pinMode(RS485_EN, OUTPUT);
  digitalWrite(RS485_EN, LOW);
  Serial.println(F("BLC MC-RS485 ready."));
  Serial.println(F("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 'f': speedMove(0x01, constrain(v, 1, 65533), 10); break;        // CW, 도달 1.0s
    case 'r': 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': posMove(0x01, constrain(v, 0, 65533), 10); break;          // CW 위치
    case 'G': posMove(0x00, constrain(v, 0, 65533), 10); break;          // CCW 위치
    case 'z': sendFrame(0x0E, nullptr, 0); Serial.println(F("위치 0 초기화")); break;
    case 'p': sendFrame(0xA1, nullptr, 0); readFeedback(); return;
    case 'v': sendFrame(0xA2, nullptr, 0); readFeedback(); return;
    default:  Serial.println(F("? f1000 r500 s g9000 G9000 z p v")); return;
  }
  readFeedback();  // 명령 후 응답/에코 로그 표시
}
작성: MotorBank 기술팀 · 아두이노 우노 기준 · 최종 업데이트: 2026-08-14
640_154031.jpg
side_154035.jpg

 

 

 


102e6c265e83fa1d.jpg


bg42-bl4281b_900x11404_113235_144740.jpg




e22589fbdf0360f2.jpg

cfae4ddb89952bb9.jpg









dd5d8afb7127bad0.jpg

b8fe5394a08e9a8c.jpg









640X640_113728.jpg
연장커넥터 구매하기 버튼




비밀번호 인증

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

확인