請豆包幫忙寫的,調整幾次之后,可以正常運行,用的是Arduino板子,豆包寫梯形圖的能力還不強,寫這種編程語言厲害些。
// 定義步進電機控制引腳
const int stepPin = 2;
const int dirPin = 3;
// 定義啟動按鍵引腳
const int startButtonPin = 4;
// 定義 12 個開關引腳
const int switchPins[12] = {5, 6, 7, 8, 9, 10, 11, 12, 13, A0, A1, A2};
// 定義原點感應點位引腳
const int originPin = A3;
// 定義料件感應點位引腳
const int materialSensorPin = A4;
// 定義振動盤點位引腳
const int vibrationDiskPin = A5;
// 定義步進電機參數
const int stepsPerRevolution = 1000;  // 步進電機每轉脈沖數
// 定義速度參數(毫秒)
const unsigned long normalSpeedDelay = 1;  // 正常速度延遲
const unsigned long fastSpeedDelay = 0.2;  // 快速速度延遲
const unsigned long returnSpeedDelay = 0.5; // 返回原點速度延遲
// 定義停留時間(毫秒)
const unsigned long pauseTime = 500;
// 定義變量
bool startButtonState = false;
bool lastStartButtonState = false;
bool isRunning = false;
bool isReturning = false;
int currentSegment = 0;
int remainingSteps = stepsPerRevolution;
unsigned long lastStepTime = 0;
unsigned long lastPauseTime = 0;
bool isPausing = false;
void setup() {
  // 初始化步進電機控制引腳為輸出模式
  pinMode(stepPin, OUTPUT);
  pinMode(dirPin, OUTPUT);
  // 初始化啟動按鍵引腳為輸入模式,并啟用上拉電阻
  pinMode(startButtonPin, INPUT_PULLUP);
  // 初始化 12 個開關引腳為輸入模式,并啟用上拉電阻
  for (int i = 0; i < 12; i++) {
    pinMode(switchPins, INPUT_PULLUP);
  }
  // 初始化原點感應點位引腳為輸入模式,并啟用上拉電阻
  pinMode(originPin, INPUT_PULLUP);
  // 初始化料件感應點位引腳為輸入模式,并啟用上拉電阻
  pinMode(materialSensorPin, INPUT_PULLUP);
  // 初始化振動盤點位引腳為輸出模式
  pinMode(vibrationDiskPin, OUTPUT);
  // 設置初始方向
  digitalWrite(dirPin, HIGH);
}
void loop() {
  // 讀取啟動按鍵狀態
  startButtonState = digitalRead(startButtonPin);
  // 檢測啟動按鍵按下事件
  if (startButtonState == LOW && lastStartButtonState == HIGH) {
    isRunning = true;
    currentSegment = 0;
    remainingSteps = stepsPerRevolution;
    isReturning = false;
  }
  // 保存上一次啟動按鍵狀態
  lastStartButtonState = startButtonState;
  // 控制振動盤
  bool materialDetected = digitalRead(materialSensorPin) == LOW;
  digitalWrite(vibrationDiskPin, !materialDetected);
  // 如果電機正在運行
  if (isRunning) {
    if (isReturning) {
      unsigned long currentTime = millis();
      if (currentTime - lastStepTime >= returnSpeedDelay) {
        digitalWrite(dirPin, LOW); // 設置返回方向
        digitalWrite(stepPin, HIGH);
        delayMicroseconds(10);  // 確保脈沖寬度
        digitalWrite(stepPin, LOW);
        lastStepTime = currentTime;
        if (digitalRead(originPin) == LOW) {
          isRunning = false;
          isReturning = false;
          digitalWrite(dirPin, HIGH); // 恢復正向
        }
      }
    } else {
      if (isPausing) {
        if (millis() - lastPauseTime >= pauseTime) {
          isPausing = false;
        }
      } else {
        unsigned long currentTime = millis();
        bool switchState = digitalRead(switchPins[currentSegment]);
        unsigned long speedDelay = switchState ? normalSpeedDelay : fastSpeedDelay;
        if (currentTime - lastStepTime >= speedDelay) {
          if (remainingSteps > 0) {
            digitalWrite(stepPin, HIGH);
            delayMicroseconds(10);  // 確保脈沖寬度
            digitalWrite(stepPin, LOW);
            remainingSteps--;
            lastStepTime = currentTime;
          }
          if (remainingSteps * 12 <= (11 - currentSegment) * stepsPerRevolution) {
            if (switchState) {
              isPausing = true;
              lastPauseTime = currentTime;
            }
            currentSegment++;
          }
          if (currentSegment >= 12) {
            isReturning = true;
          }
        }
      }
    }
  }
  // 短暫延遲以減少 CPU 負載
  delay(1);
}