티스토리 뷰

 

본 게시물은 비교적 중형 스텝 모터인 NEMA17을 제어하기 위한 방법을 게시한다.

 

[준비물]

  • 아두이노
  • 아두이노 IDE
  • 스텝 모터(NEMA 17 등)
  • 스텝 모터 드라이버(DRV8825 등), 중대전력(류)
  • 모터 전원(12~24V, 2A 이상)
  • 케이블 등

 

[부품간 연결]

아두이노 DRV8825 비고
9 STEP  
8 DIR  
GND ENABLE Enable
GND M0, M1, M2 마이크로 스텝 설정
5V(HIGH) RESET 또는 OPEN
5V(HIGH) SLEEP 또는 OPEN
  VMOT 전원(12~24V)
GND GND  

 

[Driver IC]

DRV8825


DRV28825
A4988


A4989

 

 

[DRV8825 모듈 예시]

 

[스텝 모터 예시 : 24H256-05S]

[예제 코드 : GPIO 제어]

#define PINNO_STEP 9 // Pulse control
#define PINNO_DIR 8 // Direction control

void setup() {
  Serial.begin(115200);
  pinMode(PINNO_STEP, OUTPUT);
  pinMode(PINNO_DIR, OUTPUT);
}

void loop() {
  digitalWrite(PINNO_DIR, HIGH); // HIGH:Clock-wise, LOW:Counterclock-wise
  for(int i=0; i<200; i++){
    digitalWrite(PINNO_STEP, HIGH);
    delayMicroseconds(500); // Control pulse ==> speed
    digitalWrite(PINNO_STEP, HIGH);
    delayMicroseconds(500); // Control pulse ==> speed
  }
  delay(1000);

  digitalWrite(PINNO_DIR, LOW); // HIGH:Clock-wise, LOW:Counterclock-wise
  for(int i=0; i<200; i++){
    digitalWrite(PINNO_STEP, HIGH);
    delayMicroseconds(500); // Control pulse ==> speed
    digitalWrite(PINNO_STEP, HIGH);
    delayMicroseconds(500); // Control pulse ==> speed
  }
  delay(1000);
}

 

[예제 코드 : AccelStepper.h 활용]

* 마이크로 스텝 제어

* 드라이버 모드는 참고 사항(1, 2, 3, 4)

#include <AccelStepper.h>

// DRV8825 설정 (1 = 드라이버 모드)
AccelStepper stepper(1, 9, 8);  // STEP: 9번, DIR: 8번

// 마이크로 스텝 설정 핀
#define M0 4
#define M1 5
#define M2 6

#define STEPS_PER_REV 200  // 1바퀴당 기본 스텝 수 (1.8° = 200 스텝)
#define MICROSTEP 16       // 사용하려는 마이크로 스텝 분할 수

void setMicrostepping(int microstep) {
  switch (microstep) {
    case 1:   digitalWrite(M0, LOW); digitalWrite(M1, LOW); digitalWrite(M2, LOW); break; // Full Step
    case 2:   digitalWrite(M0, HIGH); digitalWrite(M1, LOW); digitalWrite(M2, LOW); break; // 1/2 Step
    case 4:   digitalWrite(M0, LOW); digitalWrite(M1, HIGH); digitalWrite(M2, LOW); break; // 1/4 Step
    case 8:   digitalWrite(M0, HIGH); digitalWrite(M1, HIGH); digitalWrite(M2, LOW); break; // 1/8 Step
    case 16:  digitalWrite(M0, LOW); digitalWrite(M1, LOW); digitalWrite(M2, HIGH); break; // 1/16 Step
    case 32:  digitalWrite(M0, HIGH); digitalWrite(M1, LOW); digitalWrite(M2, HIGH); break; // 1/32 Step
    default:  digitalWrite(M0, LOW); digitalWrite(M1, LOW); digitalWrite(M2, LOW); break; // 기본값: Full Step
  }
}

void setRPM(float rpm) {
  float stepsPerSecond = (rpm * STEPS_PER_REV * MICROSTEP) / 60.0; // RPM을 스텝/초로 변환
  stepper.setMaxSpeed(stepsPerSecond);
  stepper.setAcceleration(stepsPerSecond / 2); // 적절한 가속도 설정
}

void setup() {
  pinMode(M0, OUTPUT);
  pinMode(M1, OUTPUT);
  pinMode(M2, OUTPUT);

  setMicrostepping(MICROSTEP); // 마이크로 스텝 설정 (1/16)

  setRPM(60); // 60 RPM으로 설정
}

void loop() {
  stepper.move(200 * MICROSTEP);  // 1바퀴 회전 (200 기본 스텝 * 마이크로 스텝)
  stepper.runToPosition();

  delay(1000);

  stepper.move(-200 * MICROSTEP);
  stepper.runToPosition();

  delay(1000);
}

반응형