• 고속 리니어스테이지 스테핑모터 일체형 LSM7-NK237625-1610  브레이크장착가능

고속 리니어스테이지 스테핑모터 일체형 LSM7-NK237625-1610 브레이크장착가능

속도 mm/s : 150
리드 mm : 10
스크류 직경 mm: 16
정격추력 N: 518

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

아두이노 제어 예제 — 포토센서 리미트·원점복귀 포함 (복사해서 바로 사용)

본 스테이지의 포토센서는 드라이버가 아니라 아두이노에 연결합니다 — MSD-224에는 리미트 입력 기능이 없으므로, 아두이노가 센서를 감시하다가 감지 즉시 펄스를 멈추는 소프트웨어 리미트 방식입니다. 이 구조 덕분에 원점복귀(호밍)까지 가능합니다: 센서 방향으로 저속 이동 → 감지 → 그 자리를 0점으로 설정 → 이후 스텝 단위 위치 이동. 이동거리 환산: mm = 스텝 수 × 리드 ÷ 회전당 스텝 수.
센서 추가·교체: 포토센서 SN04-A(NPN/PNP 선택) → · 근접센서 SN04-N(험한 환경용) → — 선택 기준·배선 상세는 SN04-A 페이지의 센서 가이드 참조
결선: D9→PUL+ / D6→DIR+ / GND→PUL−·DIR−(모터 전원은 SMPS 별도), 포토센서(3선식)는 갈색→센서 전원(DC24V 별도), 파란색→GND(아두이노와 공통), 검정 신호선→왼쪽(원점) D7·오른쪽 D8. 업로드 후 시리얼 모니터(9600bps, "새 줄")에서 h(호밍) → m2000·M2000(스텝 이동, 리미트 감시) / f·r(연속 이동, 센서·s로 정지) / t(센서 상태·현재 위치)로 조작합니다. NPN 옵션(기본)은 그대로, PNP 옵션 구매 시 SENSOR_ACTIVE_LOW를 0으로, 이동 방향이 반대면 DIR_CW_LEVEL을 바꿔 업로드하세요 — 결선 수정 없이 코드 두 줄로 맞출 수 있습니다.
//==============================================================
// MotorBank 리니어 스테이지(포토센서 리미트 포함) + MSD-224 아두이노 예제 V1.0
// 구조: MSD-224는 리미트 입력이 없으므로, 포토센서를 "아두이노"가 읽고
//       감지 즉시 펄스를 멈추는 소프트웨어 리미트 방식입니다.
// 기능: 원점복귀(호밍) / 위치 이동(리미트 감시) / 연속 이동(리미트 감시) / 센서 상태 확인
// 보드: Arduino Uno
//
// [드라이버 결선] 아두이노 -> MSD-224 (제어신호 3.3~24V)
//   D9 -> PUL+ / D6 -> DIR+ / GND -> PUL-, DIR-  (ENA 미사용 시 미연결)
//   모터 전원(SMPS)은 드라이버에 별도 공급
//
// [포토센서 결선 - SN04-A/SN04-N 기준(3선식)]
//   갈색 = 센서 전원(+, DC24V 별도 공급) / 파란색 = 전원(-, 아두이노 GND와 공통)
//   검정색(신호): 왼쪽(원점) 센서 -> D7 / 오른쪽 센서 -> D8 (내부 풀업 사용)
//   NPN 옵션: 감지 시 신호가 LOW (아두이노 표준 - 기본값)
//   PNP 옵션 구매 시에는 아래 값을 0으로 변경
#define SENSOR_ACTIVE_LOW 1   // 1: NPN(감지=LOW) / 0: PNP(감지=HIGH)
//
// [방향 기준] 본 예제는 CW(DIR HIGH)=오른쪽 이동, CCW=왼쪽(원점 방향)으로 가정.
//   실제 이동 방향이 반대면 DIR_CW_LEVEL을 LOW로 변경.
#define DIR_CW_LEVEL HIGH
//
// [이동량 환산] 이동거리(mm) = 스텝 수 x 리드(mm) / 회전당 스텝 수(분주 설정)
//
// [시리얼 모니터 사용법] (9600bps, "새 줄" 설정)
//   h      : 호밍 - 왼쪽 센서 감지까지 저속 이동 후 그 자리를 원점(0)으로
//   m2000  : 오른쪽으로 2000스텝 이동(오른쪽 센서 감지 시 즉시 정지)
//   M2000  : 왼쪽으로 2000스텝 이동(왼쪽 센서 감지 시 즉시 정지)
//   f / r  : 오른쪽/왼쪽 연속 이동(센서 감지 또는 s 입력 시 정지)
//   s      : 정지
//   t      : 좌우 센서 현재 상태 표시
//==============================================================
const int PUL_PIN = 9, DIR_PIN = 6;
const int SENS_L = 7, SENS_R = 8;      // 왼쪽(원점)/오른쪽 포토센서
const unsigned int HALF_US_RUN  = 240; // 일반 이동 약 2kHz
const unsigned int HALF_US_HOME = 600; // 호밍 저속 약 0.8kHz

long position = 0;                     // 원점 기준 현재 위치(스텝, 오른쪽 +)
bool homed = false;

bool sensL() { return digitalRead(SENS_L) == (SENSOR_ACTIVE_LOW ? LOW : HIGH); }
bool sensR() { return digitalRead(SENS_R) == (SENSOR_ACTIVE_LOW ? LOW : HIGH); }

void setDir(bool right) { digitalWrite(DIR_PIN, right ? DIR_CW_LEVEL : !DIR_CW_LEVEL); delayMicroseconds(10); }

// 리미트 감시하며 스텝 이동. 이동한 스텝 수 반환(센서·s 입력 시 조기 종료)
long moveSteps(bool right, long steps, unsigned int halfUs) {
  setDir(right);
  long done = 0;
  for (; done < steps; done++) {
    if (right ? sensR() : sensL()) { Serial.println(F("! 리미트 감지 - 정지")); break; }
    if (Serial.available() && Serial.peek() == 's') break;
    digitalWrite(PUL_PIN, HIGH); delayMicroseconds(halfUs);
    digitalWrite(PUL_PIN, LOW);  delayMicroseconds(halfUs);
  }
  position += right ? done : -done;
  return done;
}

void home() {
  Serial.println(F("호밍: 왼쪽 센서 방향 저속 이동..."));
  if (!sensL()) moveSteps(false, 2000000L, HALF_US_HOME);   // 감지까지 이동
  if (sensL()) {
    position = 0; homed = true;
    Serial.println(F("원점 설정 완료 (position = 0)"));
  } else Serial.println(F("호밍 실패 - 센서 결선·SENSOR_ACTIVE_LOW 확인"));
}

void setup() {
  pinMode(DIR_PIN, OUTPUT); pinMode(PUL_PIN, OUTPUT);
  pinMode(SENS_L, INPUT_PULLUP); pinMode(SENS_R, INPUT_PULLUP);
  Serial.begin(9600);
  Serial.println(F("LSM+MSD-224 ready. h m2000 M2000 f r 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 = constrain(cmd.substring(1).toInt(), 1, 2000000L);
  switch (c) {
    case 'h': home(); break;
    case 'm': { long d = moveSteps(true,  v, HALF_US_RUN);
                Serial.print(F("+")); Serial.print(d); Serial.print(F(" steps, pos=")); Serial.println(position); } break;
    case 'M': { long d = moveSteps(false, v, HALF_US_RUN);
                Serial.print(F("-")); Serial.print(d); Serial.print(F(" steps, pos=")); Serial.println(position); } break;
    case 'f': Serial.println(F("연속 우측 이동(센서/s로 정지)")); moveSteps(true,  2000000L, HALF_US_RUN);
              Serial.print(F("pos=")); Serial.println(position); break;
    case 'r': Serial.println(F("연속 좌측 이동(센서/s로 정지)")); moveSteps(false, 2000000L, HALF_US_RUN);
              Serial.print(F("pos=")); Serial.println(position); break;
    case 's': Serial.println(F("STOP")); break;
    case 't': Serial.print(F("왼쪽 센서: ")); Serial.print(sensL() ? F("감지") : F("-"));
              Serial.print(F(" / 오른쪽 센서: ")); Serial.print(sensR() ? F("감지") : F("-"));
              Serial.print(F(" / pos=")); Serial.print(position);
              Serial.println(homed ? F(" (호밍됨)") : F(" (호밍 전)")); break;
    default:  Serial.println(F("? h m2000 M2000 f r s t"));
  }
}
작성: MotorBank 기술팀 · 아두이노 우노 기준 · 최종 업데이트: 2026-08-14

3fdcb4badfc27694577cfd86a4c22f9b_162642.jpg

비밀번호 인증

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

확인