首頁 > 碎碎唸, 計算機 > arduino CNC shield 步進馬達

arduino CNC shield 步進馬達

2018年3月30日 發表評論 閱讀評論

要做一個東西,要用到兩個步進馬達,要彼此配合速度、方向、位置,先是人家建議了用CNC Shield,可以搭a4988來控制馬達,也省去拉線的困擾。接著要同時操作兩個步進馬達,目前的方法是使用 AccelStepper.h 這個lib。這篇是用來做個記錄。

原本採用最簡單的驅動,每發一個訊號,就delay一下,但後來發現這樣子做,delay很難控制兩個以上馬達。之後,又不知道那跟筋想到用Timer控制呼叫函數,寫了寫,也是很複雜,最後看到AccelStepper,就拿來用了。

底下code,搞我最久的竟在處理按鍵彈跳的問題!所以,有一大段的code都是在弄彈跳。而這個lib,最主要重點是在一開始的設定,他可以設定不同馬達的驅動方式。每一個loop,更改速度後,跑一下run()更改狀態,就會依我們要的速率了。

對了,方向是用 +/- 來控制。速度值是 RPM值。

ok,記錄一下,


#include <AccelStepper.h>

#define EN        8 // state LOW works
#define X_DIR     5
#define Y_DIR     6
#define X_STP     2
#define Y_STP     3

#define SEL_SWITCH  9 // Limit X-axis
#define INC_B  10 // Limit Y-axis
#define DEC_B  11 // Limit Z-axis

AccelStepper Xaxis(1, X_STP, X_DIR); // pin 3 = step, pin 6 = direction
AccelStepper Yaxis(1, Y_STP, Y_DIR); // pin 4 = step, pin 7 = direction

long debounceDelay = 50;    // the debounce time; increase if the output flickers

long lastDebounceTime = 0;  // the last time the output pin was toggled
int lastButtonState = LOW;
int buttonState;

long incBLT =0;   // the last time; inc button
int incBLS = LOW;  // inc last state
int incBS;         //inc button

long decBLT =0;   // the last time; dec button
int decBLS = LOW;  // dec button last state
int decBS;         // dec button state

 int Y_SPEED = 100;


void setup() {
  Serial.begin(115200); 
  pinMode(X_DIR, OUTPUT); //the initail pin mode of stepping motor
  pinMode(X_STP, OUTPUT);
  pinMode(Y_DIR, OUTPUT);
  pinMode(Y_STP, OUTPUT);
  
  pinMode(EN, OUTPUT);
  digitalWrite(EN, LOW);


 pinMode(SEL_SWITCH , INPUT);
  digitalWrite(SEL_SWITCH, HIGH);

  pinMode(INC_B , INPUT);
  digitalWrite(INC_B, HIGH);
  pinMode(DEC_B , INPUT);
  digitalWrite(DEC_B, HIGH);


  
  Xaxis.setMaxSpeed(6400);
  Yaxis.setMaxSpeed(6400);
  Xaxis.setSpeed(45);
  Yaxis.setSpeed(Y_SPEED);
 
}

void loop() {  


    int SS = digitalRead(SEL_SWITCH); //read SEL button
    int incBR = digitalRead(INC_B); //read inc button
    int decBR = digitalRead(DEC_B); //read dec button

    if(incBR != incBLS) { incBLT = millis(); }
    if((millis()-incBLT) > debounceDelay) {
      if(incBR !=incBS) {
        incBS = incBR; 
        if(incBS == LOW) { 

            Y_SPEED += 100;
            Yaxis.setSpeed(Y_SPEED);
             Serial.print("INC:");
             Serial.println(Y_SPEED);       
        }
        
      }
    }

  incBLS = incBR;

    if(decBR != decBLS) { decBLT = millis(); }
    if((millis()-decBLT) > debounceDelay) {
      if(decBR !=decBS) {
        decBS = decBR; 
        if(decBS == LOW) { 

            Y_SPEED -=100;
            Yaxis.setSpeed(Y_SPEED);
            Serial.print("DEC:");
            Serial.println(Y_SPEED);       
        }

      }
    }
 decBLS = decBR;

    if(SS != lastButtonState) {
      lastDebounceTime = millis();
    }

    if((millis() - lastDebounceTime) > debounceDelay) {
      if(SS !=buttonState) {
        buttonState =SS;
        if(buttonState == LOW) {
          Y_SPEED = -Y_SPEED;
          Yaxis.setSpeed(Y_SPEED);
          Serial.print("CH_DIR:");
          Serial.println(Y_SPEED);  
        }
          
          
      }
    }
  
   Xaxis.runSpeed();
   Yaxis.runSpeed();
   //Zaxis.runSpeed();

 lastButtonState = SS;
  
}

  1. 目前尚無任何的評論。
  1. 目前尚無任何 trackbacks 和 pingbacks。