Два степпера один за другим

Я хочу запустить два шаговых двигателя один за другим Шаг 1 должен вращаться до 5 И шаговый 2 должен двигаться 1ротация Вот код

Шаговый 1-это nema 34 И шаг 2-это nema 24

#include <AccelStepper.h>

// Define a stepper and the pins it will use
AccelStepper stepper1 (1, 3, 2); // Defaults to 4 pins on 2, 3, 4, 5 mortor (A)
AccelStepper stepper2 (1, 5, 4); // Defaults to 4 pins on 2, 3, 4, 5 motor (B)

long Steps_For_Distance1 = 3; // 3cm
long Steps_For_Distance2 = 5; // 5cm
long currentPos = 0;
long targetPos = 200;
long targetPos_Reverse = -200;
long Motor_Speed1 = 50;
long Motor_Speed2 = 400;
long Motor_Speed3 = 800;
int Op_Sw = 0;
const int buttonPin = 2;     // the number of the pushbutton pin

const int ledPin =  13;      // the number of the LED pin

// variables will change:
int buttonState = 0;         // variable for reading the pushbutton status

void setup()
{
  // initialize the LED pin as an output:
  pinMode(ledPin, OUTPUT);

  // initialize the pushbutton pin as an input:
  pinMode(buttonPin, INPUT);
}

void checkStepper1_For_DT(AccelStepper &astepper)
{
  if (astepper.distanceToGo() == 0)
  {
    // Random change to speed, position and acceleration
    // Make sure we dont get 0 speed or accelerations
    astepper.setCurrentPosition(currentPos);
    astepper.moveTo(targetPos);
    astepper.setSpeed(Motor_Speed1);
    astepper.setAcceleration(100);
  }
}
void checkStepper2_For_360(AccelStepper &astepper)
{
  if (astepper.distanceToGo() == 0)
  {
    // Random change to speed, position and acceleration
    // Make sure we dont get 0 speed or accelerations

    astepper.moveTo(targetPos);
    astepper.setMaxSpeed(Motor_Speed2);
    astepper.setAcceleration(100);
  }
}
void PatternToBeLooped_For_Cycle1()
{
  int count = 0;

  for (count == 0; count <= 5; count ++)
  {
    checkStepper1_For_DT(stepper1);
    stepper1.runSpeedToPosition();
  }

  checkStepper2_For_360(stepper2);
  stepper2.runSpeedToPosition();
}
void loop() {
    PatternToBeLooped_For_Cycle1();
  }

Я запустил код Но это не сработало Оба двигателя работают одновременно

Пожалуйста, помогите мне
Где я допустил ошибку

Заранее спасибо


У меня была попытка с задержкой (1000); Но Тем не менее, они оба шаговых движутся одновременно и получают задержку в одно и то же время

, 👍2

Обсуждение

пожалуйста, покажите схему подключения, @jsotola

Может быть, они движутся не одновременно, а очень быстро друг за другом, так что вы не видите разницы? Попробуйте поместить задержку между двумя операторами stepper run в вашу циклическую функцию и посмотрите, что произойдет, @chrisl

-Вывод Dir для arduino gnd, @user8708050

-Dir pin , - импульсный pin к arduino gnd. И + dir к arduino 3 pin ,5pin. И +импульс к контакту 2,4, @user8708050


1 ответ


1

Я заглянул в источник библиотеки AccelStepper здесь, которая может быть вашей библиотекой или похожей на нее. Функция runSpeedToPosition() не блокируется до тех пор, пока не будет достигнута нужная позиция. Вместо этого внутри функции вы видите код, который выполняет шаг, когда достигается нужное время (в соответствии с millis ()), рассчитанное по скорости, иначе он вернет значение false. Предполагается, что вы должны очень часто вызывать эту функцию во время движения двигателя. Это позволяет вам управлять несколькими двигателями одновременно с разными скоростями.

Поскольку вы не хотите управлять обоими двигателями одновременно, вам придется делать петлю, пока первый двигатель не достигнет желаемого положения; затем проделайте то же самое со вторым двигателем. Попробуйте что-нибудь вроде этого:

void PatternToBeLooped_For_Cycle1()
{
  int count = 0;
  for (count == 0; count <= 5; count ++)
  {
    checkStepper1_For_DT(stepper1);
    while(stepper1.currentPosition() != stepper1.targetPosition()) stepper1.runSpeedToPosition();
  }

  checkStepper2_For_360(stepper2);
  while(stepper2.currentPosition() != stepper2.targetPosition()) stepper2.runSpeedToPosition();
}

Примечание: При этом изменении функция PatternToBeLooped_For_Cycle1() блокирует выполнение функции цикла до тех пор, пока двигатели не выполнят свое движение. Чтобы избежать этого, вы можете использовать оператор if, который выполняет код для stepper1 или stepper2 в зависимости от функции millis (). Это работает так же, как пример BlinkWithoutDelay в среде IDE Arduino.

,