• BLC-200 홀센서타입BLDC모터 RS485통신 드라이버 콘트롤러겸용 최대200W
  • BLC-200 홀센서타입BLDC모터 RS485통신 드라이버 콘트롤러겸용 최대200W
  • BLC-200 홀센서타입BLDC모터 RS485통신 드라이버 콘트롤러겸용 최대200W

BLC-200 홀센서타입BLDC모터 RS485통신 드라이버 콘트롤러겸용 최대200W

기능 및 성능1. 200W 급 BLDC모터 컨트롤러2. 12~35V BLDC모터 제어3. 24V 모터 제어 시 정격 8A, 최대 80A4. 모터 위치, 속도제어5. 직렬통신으로 쉽게 제어(RS485통신 규격)6. 홀센서 신호 피드백으로 모터 1개 제어7. 과전류 보호회로 내장

제조사
(주)로봇마트
원산지
한국
브랜드
모터뱅크
배송정보
3,500원 (조건부배송) 지역별 추가배송 주문시결제(선결제)
택배
구매안내

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
5708d087aaaae98860e56c31e790ad9f_160131.png
107f7cadaa6f7ee29fd4ec40fa6317ee_175126.jpg
 

 


비밀번호 인증

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

확인