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