Концевик для шагового двигателя

Доброго времени суток)))
Проблема с шаговым двигателем. Проблема в том не могу остановить шаговик.
Шаговый мотор вращает вал и я не могу остановить его с помощью концевика.
Концевик установил как нулевая точка.
Помогите пожалуйста.
Шаговик крутит вал с помощью потенциометра.

Вот код:

#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);
}
'''

Концевик же должен выдавать два состояния - “разомкнуто” и “сомкнуто”.
Где это у вас в коде?

А где схема?

Уверен, что это так работает?

step() - Moves the motor steps_to_move steps.

Ему все равно, какой там limitswitch и где. Пока не докрутит - не остановится.

1 лайк

@Xayrullo
В вашем коде вы не останавливаете двигатель. Смотрите внимательнее в код - когда срабатывает концевик, вы всего лишь однократно посылате нулевое приращение на мотор и… только.
Дальше loop() исполняется снова и и вы опять начинаете крутить шаговик в зависимости от положения потенциометра.

Вам нужно завести глобальную переменную, означающую “КОНЦЕВИК СРАБОТАЛ” и если она установлена - больше мотор в эту сторону не крутить, независимо от положения потенциометра.

3 лайка

Увидел. Строки 52-54. Как-то сразу проглядел… ((
По решению задачи @b707 все расписал.

Эта библиотека не крутит постоянно. Только на N шагов в функции step(N).

ну вы чё, не слышите sadman41
хорошо, вот вам картинка

Всё изобретено давным давно:

Слышим, слышим.
Это не меняет моих выводов о неработоспособности кода ТС

Это обновлённый код, добавил переменные. Но все равно шаговик вращается даже, когда активен концевик.
Концевик выдает сигналы 0 и 1.

#include <Stepper.h>
#include <EEPROM.h>

// Пины для подключения концевика и мотора
#define ENDSTOP_PIN 13
#define STEPS 1920
#define DIFF 80
#define SPEED 100
#define MULT 35

Stepper stepper(STEPS, 7, 8);

int address = 0;
int prev = 0;
boolean initHeader = false;
boolean endstopTriggered = false; // Глобальная переменная для отслеживания состояния концевика

void setup() {
  pinMode(ENDSTOP_PIN, INPUT_PULLUP); // Настройка пина концевика
  while (address < EEPROM.length()) {
    EEPROM.update(address, 0);
    address++;
  }
  stepper.setSpeed(SPEED);
  Serial.begin(9600);
  int buttonState = digitalRead(9);
  if (buttonState == 0) {
    initHeader = true;
  }
}

void loop() {
  // Проверка состояния концевика
  if (digitalRead(ENDSTOP_PIN) == LOW) {
    endstopTriggered = true;
  }

  int val = analogRead(6);

  if (val - prev >= DIFF && !endstopTriggered) {
    stepper.step((val - prev) * MULT);
    prev = val;
  }

  if (prev - val >= DIFF && !endstopTriggered) {
    stepper.step((val - prev) * MULT);
    prev = val;
  }

  int buttonState = digitalRead(9);

  if (buttonState == 0 && initHeader) {
    stepper.step(-10);
  } else {
    initHeader = false;
  }

  Serial.println(buttonState);
}

А теперь смотрите ответы Садман41. Если вы в начале программы заказали прокрутить шаговик на 1000 шагов, а через 200 шагов сработал концевик - мотор будет пытаться пройти оставшиеся шаги независимо от любых переменных в коде.

Решения вижу два:

  1. Если в библиотеке есть функция остановки мотора, не доезжая последней заданной позиции - надо добавить ее в код срабатывания концевого выключателя.
  2. Если такой функции нет или она почему-то не подходит - задавать движения мотора не сразу “от забора до обеда”, а маленькими порциями - то есть вместо 1000 шагов сначала перемещаемся на 10 и смотрим концевик. Если не сработал - идем еще на 10 и так далее…