//==============================================================
// MotorBank SBD-14U 아두이노 RS485(Modbus RTU) 예제 V1.0
// 기능: 정역 연속회전 / 절대좌표 이동 / 운전속도 설정 / 정지(잠김·자유) / 상태 읽기
// 보드: Arduino Uno + RS485 컨버터 모듈(MAX485 등)
// 근거: SBD-14U_protocol 문서 (CRC 예제 15건 전수 검증 일치) — 문서 확정 기능만 구현
//
// [통신 설정] 9600bps, No Parity, 1 Stop (출하 기본) / 출하 기본주소 0x01
// [결선] 모듈 RO->D10, DI->D11, DE+RE->D3, A->드라이버 A, B->B, GND 공통
// (핀 번호는 예제 편의상 지정 - 다른 디지털 핀도 사용 가능)
//
// [시리얼 모니터 사용법] (9600bps, "새 줄" 설정)
// f : 정회전 연속(0x002A<-0x0010, 리미트 비활성) r : 역회전 연속(0x0000)
// g51200 : 원점 기준 +방향 절대좌표 51200스텝으로 이동(0x002B)
// G51200 : -방향 절대좌표로 이동
// v51200 : 운전속도 51200 step/s 설정(0x0028, 전원 차단 시 저장 안 됨)
// s : 정지+축 잠김(0x002D<-0x0000) S : 정지+축 자유(0x0001)
// t : 상태 읽기(0x002E - 정지/과열/실전류/리미트 파싱)
//
// [문서 기재 주의사항 - 그대로 반영]
// - 정지 지령 후 2초 뒤에 다음 지령을 보내야 함(코드에서 안내 출력)
// - 좌표모드는 절대위치라 같은 목표값 재전송 시 모터가 돌지 않는 것이 정상
// - 속도 환산은 1.8도 스텝각 기준(다른 스텝각은 비례 계산)
//
// [상충 플래그 - 실기 확인 대상]
// 프로토콜 문서: 0x0010=정회전(비트표 bit4=1 정방향과 일치 - 본 코드 채택)
// PC툴 문서 요약: 정회전=0x0000 으로 반대 표기 - 실기에서 방향이 반대로 돌면
// f/r의 값(0x0010/0x0000)을 서로 바꾸면 됩니다.
//==============================================================
#include <SoftwareSerial.h>
const int RS485_RX = 10, RS485_TX = 11, RS485_EN = 3;
const byte ADDR = 0x01; // 출하 기본주소
SoftwareSerial rs485(RS485_RX, RS485_TX);
uint16_t crc16(const byte *d, byte n) { // 표준 Modbus CRC16
uint16_t c = 0xFFFF;
for (byte j = 0; j < n; j++) {
c ^= d[j];
for (byte i = 8; i; i--) c = (c & 1) ? (c >> 1) ^ 0xA001 : c >> 1;
}
return c;
}
void txrx(byte *f, byte n) { // 송신 + 응답 HEX 로그
uint16_t c = crc16(f, n);
f[n++] = c & 0xFF; f[n++] = c >> 8; // CRC Low 먼저(문서 예제 검증 순서)
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); }
byte buf[24]; byte m = 0;
unsigned long t0 = millis();
while (millis() - t0 < 300 && m < 24) if (rs485.available()) buf[m++] = rs485.read();
Serial.print(F(" | RX(")); Serial.print(m); Serial.print(F("B):"));
for (byte i = 0; i < m; i++) { Serial.print(' '); if (buf[i]<16) Serial.print('0'); Serial.print(buf[i], HEX); }
Serial.println();
// 상태 읽기 응답 파싱: [ADDR][03][02][H][L][CRC](에코 뒤에 붙을 수 있어 뒤에서 탐색)
for (int i = m - 5; i >= 0; i--) {
if (buf[i] == ADDR && buf[i+1] == 0x03 && buf[i+2] == 0x02) {
uint16_t s = ((uint16_t)buf[i+3] << 8) | buf[i+4];
Serial.print(F(" 상태: ")); Serial.print(s & 0x8000 ? F("정지") : F("운전중"));
if (s & 0x4000) Serial.print(F(" / 과열경고(120C)"));
if (s & 0x2000) Serial.print(F(" / 과열정지(136C)"));
Serial.print(F(" / 전류코드 ")); Serial.print((s >> 4) & 0x1F);
Serial.print(F(" / 우측SW ")); Serial.print((s >> 1) & 1);
Serial.print(F(" / 좌측SW ")); Serial.println(s & 1);
break;
}
}
}
void write06(uint16_t reg, uint16_t val) {
byte f[8] = { ADDR, 0x06, (byte)(reg>>8), (byte)reg, (byte)(val>>8), (byte)val };
txrx(f, 6);
}
void write10_32(uint16_t reg, uint32_t val) { // 32bit: 레지스터 2개, 4바이트
byte f[13] = { ADDR, 0x10, (byte)(reg>>8), (byte)reg, 0x00, 0x02, 0x04,
(byte)(val>>24), (byte)(val>>16), (byte)(val>>8), (byte)val };
txrx(f, 11);
}
void read03(uint16_t reg) {
byte f[8] = { ADDR, 0x03, (byte)(reg>>8), (byte)reg, 0x00, 0x01 };
txrx(f, 6);
}
void setup() {
Serial.begin(9600);
rs485.begin(9600);
pinMode(RS485_EN, OUTPUT); digitalWrite(RS485_EN, LOW);
Serial.println(F("SBD-14U ready. f r g51200 G51200 v51200 s S t"));
}
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': write06(0x002A, 0x0010); Serial.println(F("정회전(리미트 비활성)")); break;
case 'r': write06(0x002A, 0x0000); Serial.println(F("역회전(리미트 비활성)")); break;
case 'g': write10_32(0x002B, (uint32_t)constrain(v, 0, 0xFFFFFF));
Serial.println(F("+좌표 이동(같은 값 재전송 시 무회전이 정상)")); break;
case 'G': write10_32(0x002B, 0x80000000UL | (uint32_t)constrain(v, 0, 0xFFFFFF));
Serial.println(F("-좌표 이동")); break;
case 'v': write10_32(0x0028, (uint32_t)constrain(v, 1, 200000));
Serial.println(F("운전속도 설정(전원 차단 시 미저장)")); break;
case 's': write06(0x002D, 0x0000); Serial.println(F("정지+잠김. 다음 지령은 2초 후!")); break;
case 'S': write06(0x002D, 0x0001); Serial.println(F("정지+축 자유. 다음 지령은 2초 후!")); break;
case 't': read03(0x002E); break;
default: Serial.println(F("? f r g51200 G51200 v51200 s S t"));
}
}

- 상품 스티커제거 또는 전압인가, 샤프트 물림으로 상품 가치 훼손 시에는 상품수령후 7일 이내라도 교환 및 반품이 불가능합니다.
- 저단가 상품, 일부 특가 상품은 고객 변심에 의한 교환, 반품은 고객께서 초기,왕복배송비를 부담하셔야 합니다(제품의 하자,배송오류는 제외)
- 일부 상품은 원자재값 상승, 부품가격 변동 등 제조사 사정으로 가격이 변동될 수 있습니다.
※ 저희 취급품들은 모두 산업용 부품으로 자동화 라인에서 로봇에 의해 생산되며, 생산과 동시에 품질체크를 합니다. 생산 완료 후에는 QC룸, 에이징 테스트, 모든 테스트에서
통과한 제품이고, 쇼핑몰 판매 특성 상 제품 출하 전 다시 한번 전수 검사를 합니다.
제품은 CJ대한통운에 위탁하며, 제품 배송 중 발생한 파손은 처리가 가능하오나 그외 사용 중 파손, 전원을 바꿔 인가해 드라이버 훼손으로 인한 불량, 제품 테스트 중 발생한 불량은
저희가 책임지지 않습니다. 또한 반품,교환 불가합니다.
- 특조 제품, 조립제품 등은 인수 후에는 교환/반품기간내라도 교환 및 반품이 불가능 합니다.
- 교환/환불 불가라고 표시된 제품은 인수 후에는 교환/반품기간내라도 교환 및 반품이 불가능 합니다.
- 단순변심에 의한 반품,교환으로 다시 저희에게 보내주실 경우, 받으신 상태 그대로 포장하여 보내주시기 바랍니다. 포장상태 불량으로 운송 중 제품이 훼손된 경우
교환 및 반품이 불가능 합니다.
- 일부 특가 상품의 경우, 인수 후에는 제품 하자나 오배송의 경우를 제외한 고객님의 단순변심에 의한 교환, 반품이 불가능할 수 있사오니, 각 상품의 상품상세정보를 꼭 참조하십시오.
- 상품 청약철회 가능기간은 상품 수령일로 부터 7일 이내 입니다.
※ 본제품은 산업용 부품으로 기업체에서는 이 분야 전문가가 수십개의 샘플들을 구입하여 오랜 기간 수십가지 항목의 성능과 적합성을
테스트한 후에 결정하고, 만족하면, 수백, 수천또는 수만개씩 구입하는 전문지식이 필요한 제품입니다.
전문적 지식이 필요한 전자, 전기, 기계 부품의 특성상 제품이 불량이거나, 주문한 제품과 다른 제품인 경우를 제외하고, 제품의 하자가 없을 경우,
이미 사용한 제품을 고객의 단순 변심으로 교환, 반품, A/S 불가합니다.
또한, 산업용 부품은 공산품처럼 인지 상품이 아니라서, 전문적 지식이 없는 개인 사용자나 초보자는 구입 먼저하고
원하는 성능과 기대에 부합하지 않으면, 무조건 반품이나 교환을 요구하여 이로인한 손실로 택배비, 결제수수료, 포장비등의 비용을
구제 받을 길이 없어, 잘 모르시는 분들에게는 쇼핑몰로 판매를 안하고, 전문가나 기업체들과 같이 반품이나 교환,환불을
요구하지 안는다면 구입하셔도 됩니다.
- 책임 제한 고지
일반적으로 제조사/판매사는 2차 피해(기구 손상 등)에 대한 법적 책임을 지지 않음을 설명합니다.
“당사의 제품을 사양 범위를 벗어나 사용함으로 인해 발생한 간접적 손해(기기 손상, 시스템 장애 등)에 대해서는 보상 책임이 없음을 구매 약관 및 계약서에 명시하고 있습니다.”
- 소비자분쟁해결 기준(공정거래위원회 고시)에 따라 피해를 보상받을 수 있습니다.
- A/S는 판매자에게 문의하시기 바랍니다.
※ 본제품은 산업용 부품으로 기업체에서는 이 분야 전문가가 수십개의 샘플들을 구입하여 오랜 기간 수십가지 항목의 성능과 적합성을
테스트한 후에 결정하고, 만족하면, 수백, 수천또는 수만개씩 구입하는 전문지식이 필요한 제품입니다.
전문적 지식이 필요한 전자, 전기, 기계 부품의 특성상 제품이 불량이거나, 주문한 제품과 다른 제품인 경우를 제외하고, 제품의 하자가 없을 경우,
이미 사용한 제품을 고객의 단순 변심으로 교환, 반품, A/S 불가합니다.
또한, 산업용 부품은 공산품처럼 인지 상품이 아니라서, 전문적 지식이 없는 개인 사용자나 초보자는 구입 먼저하고
원하는 성능과 기대에 부합하지 않으면, 무조건 반품이나 교환을 요구하여 이로인한 손실로 택배비, 결제수수료, 포장비등의 비용을
구제 받을 길이 없어, 잘 모르시는 분들에게는 쇼핑몰로 판매를 안하고, 전문가나 기업체들과 같이 반품이나 교환,환불을
요구하지 안는다면 구입하셔도 됩니다.
※ 전압, 토크,속도,전류,파워,샤프트 도면은 원하시는 스펙에 맞게 바뀔 수 있습니다. 대량구매시 전화문의 바랍니다.
상품이 장바구니에 담겼습니다.
바로 확인하시겠습니까?
상품이 찜 리스트에 담겼습니다.
바로 확인하시겠습니까?