Доброго времени суток)))
Проблема с шаговым двигателем. Проблема в том не могу остановить шаговик.
Шаговый мотор вращает вал и я не могу остановить его с помощью концевика.
Концевик установил как нулевая точка.
Помогите пожалуйста.
Шаговик крутит вал с помощью потенциометра.
Вот код:
#include <Stepper.h>
#include <EEPROM.h>
// Пины для шагового двигателя
#define DIR_PIN 7
#define PULL_PIN 8
// Параметры шагового двигателя
#define STEPS_PER_REVOLUTION 1800
#define SPEED 150
// Параметры для управления
#define DIFF 80
#define MULT 35
Stepper stepper(STEPS_PER_REVOLUTION, DIR_PIN, PULL_PIN);
// Переменные для хранения состояния
int address = 0;
int prev = 0;
int val = 0;
boolean initHeader = true;
const int endSwitchPin = 9;
void setup() {
while (address < EEPROM.length()) {
EEPROM.write(address, 0);
address++;
}
pinMode(endSwitchPin, INPUT_PULLUP);
stepper.setSpeed(SPEED);
Serial.begin(9600);
Serial.print(val);
Serial.print(endSwitchPin);
}
void loop() {
val = analogRead(A6);
if (val - prev >= DIFF) {
stepper.step((val - prev) * MULT);
prev = val;
}
if (prev - val >= DIFF) {
stepper.step((val - prev) * MULT);
prev = val;
}
int endSwitchState = digitalRead(endSwitchPin);
if (endSwitchState == LOW) {
// Конечный выключатель активирован, останавливаем двигатель
stepper.step(0);
Serial.println("Достигли ограничительного выключателя.");
// Проверяем положение потенциометра
val = analogRead(A6);
if (val > 512) {
// Если потенциометр вращен вправо, двигаемся назад
stepper.step(-10); // Измените количество шагов на необходимое значение
Serial.println("Двигаемся назад.");
}
} else {
initHeader = false;
}
Serial.println(endSwitchState);
}
'''
@Xayrullo
В вашем коде вы не останавливаете двигатель. Смотрите внимательнее в код - когда срабатывает концевик, вы всего лишь однократно посылате нулевое приращение на мотор и… только.
Дальше loop() исполняется снова и и вы опять начинаете крутить шаговик в зависимости от положения потенциометра.
Вам нужно завести глобальную переменную, означающую “КОНЦЕВИК СРАБОТАЛ” и если она установлена - больше мотор в эту сторону не крутить, независимо от положения потенциометра.
А теперь смотрите ответы Садман41. Если вы в начале программы заказали прокрутить шаговик на 1000 шагов, а через 200 шагов сработал концевик - мотор будет пытаться пройти оставшиеся шаги независимо от любых переменных в коде.
Решения вижу два:
Если в библиотеке есть функция остановки мотора, не доезжая последней заданной позиции - надо добавить ее в код срабатывания концевого выключателя.
Если такой функции нет или она почему-то не подходит - задавать движения мотора не сразу “от забора до обеда”, а маленькими порциями - то есть вместо 1000 шагов сначала перемещаемся на 10 и смотрим концевик. Если не сработал - идем еще на 10 и так далее…