Как установить степпер и после этого заставить его двигаться на 45 градусов

Я пытаюсь позволить шаговому двигателю найти исходное положение (с помощью микропереключателя) после включения питания. После этого переместите его на 45 градусов (или эквивалентно шагам) и подождите 3 секунды. Ниже приведен код, который я нашел/адаптировал.

Настройка работает, но не гладко.

Часть Stepper1() вообще не работает (только рывковые движения).

Мне также хотелось бы, чтобы двигатель отключался во время ожидания, что, по моему мнению, должно быть достигнуто с помощью digitalWrite(M2en,HIGH);но когда я помещаю это в начало и конец (LOW, HIGH) Stepper1() никогда не работало. Любые идеи были бы великолепны.

#include "AccelStepper.h"

int M2dirpin = 4;  //Вывод направления Y двигателя
int M2steppin = 5; //Вывод шага двигателя Y
int M2en=12;  //Вывод включения двигателя Y
#define home_switch 9 // Контакт 9 подключен к Home Switch (MicroSwitch)

// Настройка AccelStepper
AccelStepper stepperX(1, 5, 4);   // (1,2,3) = (Выделенная плата, ШАГ, НАПРАВЛЕНИЕ)
// Переменные шагового хода
long initial_homing = -1; // Используется для домашнего шагового двигателя при запуске


void setup() {

  pinMode(home_switch, INPUT_PULLUP);
  pinMode(M2dirpin,OUTPUT);
  pinMode(M2steppin,OUTPUT);
  pinMode(M2en,OUTPUT);
  digitalWrite(M2en,LOW);
  Serial.begin(9600);  // Запускаем последовательный монитор со скоростью 9600 Бод
  stepperX.setMaxSpeed(50.0);      // Установка максимальной скорости шагового двигателя (медленнее, чтобы повысить точность)
  stepperX.setAcceleration(50.0);  // Установка ускорения шагового двигателя

  // Запускаем процедуру возврата шагового двигателя при запуске
  Serial.print("Stepper is Homing . . . . . . . . . . . ");

  while (digitalRead(home_switch)) {  // Заставляем шаговый двигатель двигаться против часовой стрелки, пока переключатель не будет активирован
    stepperX.moveTo(initial_homing);  // Устанавливаем позицию для перемещения
    initial_homing--;  // Уменьшаем на 1 для следующего хода, если необходимо
    stepperX.run();  // Начинаем перемещать степпер
    delay(20);
  }

  stepperX.setCurrentPosition(0);  // Устанавливаем текущую позицию как ноль
  stepperX.setMaxSpeed(50.0);      // Установка максимальной скорости шагового двигателя (медленнее, чтобы повысить точность)
  stepperX.setAcceleration(50.0);  // Установка ускорения шагового двигателя
  initial_homing = 1;

  while (!digitalRead(home_switch)) { // Заставляем шаговый двигатель двигаться по часовой стрелке, пока переключатель не будет деактивирован
    stepperX.moveTo(initial_homing);
    stepperX.run();
    initial_homing++;
    delay(20);
  }

  stepperX.setCurrentPosition(0);
  Serial.println("Homing Completed");
  Serial.println("");

 // Двигаемся на 10 шагов вперед от концевого выключателя (чтобы выйти из переключателя)
  while (stepperX.currentPosition() != 10) 
  {
    stepperX.setSpeed(10);
    stepperX.run();

}
}
void loop()
{
//степпер1();
}

void stepper1() 
{
  stepperX.move(22.5);
  stepperX.run();
  delay(3000);
}

, 👍0


1 ответ


Лучший ответ:

0

Вам нужно чаще вызывать run. Из документации:

Вы должны вызывать это как можно чаще, но по крайней мере один раз за минимальный интервал времени шага, желательно в основном цикле. Обратите внимание, что каждый вызов run() будет выполнять не более одного шага, и то только тогда, когда шаг должен быть выполнен, в зависимости от текущей скорости и времени, прошедшего с момента последнего шага.

Таким образом, один вызов run и последующая задержка заставят двигатель сделать только один шаг. Поэтому вам нужно переписать, например:

stepperX.run();
delay(3000);

в

unsigned long startMillis = millis();
while( millis()-startMillis<3000 )
{
  stepperX.run();
}

Во-вторых, move работает только с целыми числами, stepperX.move(22.5); фактически станет stepperX.move(22);< /п>

Наконец, почему вы используете совершенно другой метод, чем остальные, чтобы переместить мотор на 10 шагов? Я бы использовал moveTo(10), как и везде.

,