티스토리 뷰

 

  • 모터 구분 : 소형(28BYJ-48 등), 중대형(NEMA-17 등)
  • IC 구분 : 단순(ULN2003 등), 다기능(DRV8825 등)

 

  • 소형 모터는 단순 기능의 ULN2003을 주로 이용하고
  • 중대형 모터는 다기능의 DRV8825를 주로 이용함.

 

  • 방향 및 단순속도 제어를 위해서는 Stepper.h를 사용하는 것이 편리하고
  • 가감속도 및 정밀 위치제어를 위해서는 AccelStepper.h를 사용하는 것이 효과적임.

[코드 실행 흐름 방식 비교]

블로킹(Blocking) 논블로킹(Non-blocking) 비고
어떤 작업이 완료될 때까지 프로그램 실행이 멈추는 방식 어떤 작업이 실행된 이후 다음 작업으로 계속 진행  
Stepper.h AccelStepper.h  

 

변칙적인 예로써,

ULN2003과 AccelStepper를 이용한 28BYJ-48 제어 코드를 소개함.

[AccelStepper.h를 이용한 ULN2003 제어]

#include <AccelStepper.h>

// ULN2003 제어 핀 (IN1 ~ IN4)
#define IN1  2
#define IN2  3
#define IN3  4
#define IN4  5

// AccelStepper 객체 생성 (4-wire 모드)
AccelStepper stepper(AccelStepper::FULL4WIRE, IN1, IN3, IN2, IN4);

void setup() {
  // 속도 및 가속도 설정
  stepper.setMaxSpeed(500);        // 최대 속도 (스텝/초)
  stepper.setAcceleration(200);    // 가속도 (스텝/초^2)
}

void loop() {
  // 1바퀴 이동 (28BYJ-48: 2048 스텝 ≈ 360도)
  stepper.moveTo(2048);
  while (stepper.distanceToGo() != 0) {
    stepper.run();  // 논블로킹 실행
  }

  delay(1000); // 1초 정지

  // 반대 방향으로 1바퀴 회전
  stepper.moveTo(0);
  while (stepper.distanceToGo() != 0) {
    stepper.run();
  }

  delay(1000); // 1초 정지
}

 

[회전 개시 초기 가속, 일정 기간 정속, 회전 종료 시 감속]

#include <AccelStepper.h>

// 핀 정의
#define STEP_PIN 2
#define DIR_PIN 3

// AccelStepper 객체 (DRV8825는 DRIVER 모드 사용)
AccelStepper stepper(AccelStepper::DRIVER, STEP_PIN, DIR_PIN);

// 1바퀴당 스텝 수 (마이크로스텝 비율에 따라 조정)
const int stepsPerRevolution = 3200;  // 1/16 마이크로스텝 기준
const int targetRevolutions = 100;
const long totalSteps = stepsPerRevolution * targetRevolutions;

void setup() {
  // 최대 속도, 가속도 설정
  stepper.setMaxSpeed(2000);     // 최대 회전 속도 (스텝/초)
  stepper.setAcceleration(800);  // 가속도 (스텝/초²)

  // 회전 방향 설정 (HIGH/LOW 바꾸면 반대 방향)
  stepper.setCurrentPosition(0);    // 현재 위치를 0으로 초기화
  stepper.moveTo(totalSteps);       // 목표 위치 설정
}

void loop() {
  if (stepper.distanceToGo() != 0) {
    stepper.run();  // 자동 가속/감속 포함 회전
  } else {
    // 도착 후 정지
    // 아무 작업 없음
  }
}

 

[지속 회전 예제 코드]

#include <AccelStepper.h>

#define STEP_PIN 2
#define DIR_PIN 3

AccelStepper stepper(AccelStepper::DRIVER, STEP_PIN, DIR_PIN);

void setup() {
  stepper.setMaxSpeed(800);  // 회전 속도 설정 (스텝/초)
  stepper.setSpeed(800);     // 방향 + 속도 설정 (음수면 반대방향)
}

void loop() {
  stepper.runSpeed();  // 설정된 속도로 계속 회전 (가속/감속 없음)
}

 

[최대 가속도 예시]

모터 종류 권장 가속도 범위 비고
28BYJ-48 (감속기 포함) 100 ~ 300  
NEMA 17 + DRV8825 200 ~ 1500  
NEMA 23 (고전류 타입) 1000 ~ 5000 충분한 전압/전류 필요
고속 CNC 모터 5000 이상 FastAccelStepper.h 권장

 

[28BYJ-48과 NEMA-17 비교]

항목 28BYJ-48 NEMA 17
동작 방식 유니폴라 (일부는 바이폴라) 바이폴라
기어 구조 감속 기어 내장 (약 64:1) 없음 (직결)
제어 드라이버 ULN2003 (간단한 릴레이형) A4988, DRV8825 등 정밀 제어 드라이버
토크 작음 (40~50g·cm) 큼 (2000g·cm 이상 가능)
속도 느림 빠름
정밀도 매우 높음 (감속기 덕분에 4096스텝/바퀴 이상) 낮음 (200~1600스텝/바퀴 일반)
소비 전류 매우 적음 (~240mA) 상대적으로 높음 (최대 1.5A~2A)
가격 매우 저렴 ($1~2) 비쌈 ($10~30 이상)
용도 간단한 자동화, 교육용, 시계 등 3D프린터, CNC, 로봇 팔 등 정밀 제어 분야
반응형