Accelstepper запустить степпер назад

Обновление:

Ниже я объяснил, как я понял ваши предложения. И он по-прежнему поворачивается только в одном направлении (вперед). Любопытно, что если я ввел M_DEST в функцию StepperOneForward(), то поворот вперед был очень долгим, но плавным. Код ниже заставил его вращаться, как обычно, очень нервно. Это часть ускорения, и если да, то как я могу это изменить? В идеале я мог бы приказать степперу перейти в положение X и вернуться в исходное положение, причем с постоянной скоростью.

 #include <AccelStepper.h>

const int stepPin = 5;
const int dirPin = 4;
const int enPin = 12;

unsigned int DEST = 800;
unsigned int M_DEST = -800;
unsigned int SPD = 1600;
unsigned int ACCEL = 800;

AccelStepper stepper1(1,stepPin,dirPin);

void setup() {

  pinMode(stepPin,OUTPUT);
  pinMode(dirPin,OUTPUT);
  pinMode(enPin,OUTPUT);

  stepper1.setEnablePin(enPin);
  stepper1.setPinsInverted(false, false, true);
  Serial.begin(9600);  // Начать сериал
}

void loop() {

stepperOneForward();
Serial.println("Stepper1 turned forward.");
delay(1000);
stepperOneBackward();
Serial.println("Stepper1 turned backward.");
}

void stepperOneForward() {

  stepper1.enableOutputs();
  stepper1.setMaxSpeed(SPD);
  stepper1.setAcceleration(ACCEL);
  stepper1.move(DEST);
  if (DEST > 0) {                          
    while ( stepper1.distanceToGo() > 0) { 
      stepper1.run();
      }
  //stepper1.disableOutputs();
  }
 }

 void stepperOneBackward() {

  stepper1.enableOutputs();
  stepper1.setMaxSpeed(SPD);
  stepper1.setAcceleration(ACCEL);
  stepper1.move(M_DEST);
  if (M_DEST < 0) {                          
    while ( stepper1.distanceToGo() > 0) { 
      stepper1.run();
      }
  //stepper1.disableOutputs();
  }
 }

У меня есть несколько шаговых двигателей, которые я хотел бы запустить вперед, пока они не коснутся микропереключателя, и назад в исходное положение. Но для упрощения я бы хотел управлять одним степпером, идущим вперед, а затем назад. Код ниже всегда просто поворачивается по часовой стрелке.

Я попытался установить dirPin на низкое значение, но это не сработало. Я попытался перевернуть setMaxSpeed (поставив перед ним минус). Я нашел класс enum AccelStepper::Direction в Accelstepper, в котором не объясняется, как установить DIRECTION_CCW или DIRECTION_CW.

Я хотел бы управлять этими шаговыми двигателями, чтобы они плавно двигались вперед, ждали, а затем назад. Это должно быть очень легко, но меня слишком долго расстраивает. На данный момент я бы использовал любую библиотеку, которая может это сделать и управлять более чем одним степпером.

Значения SPD и ACCEL настолько высоки, потому что я использую микрошаговый режим (6400 — полный цикл).

#include <AccelStepper.h>

const int stepPin = 5;
const int dirPin = 4;
const int enPin = 12;

unsigned int DEST = 6400;
unsigned int SPD = 1600;
unsigned int ACCEL = 800;

void setup() {

  pinMode(stepPin,OUTPUT);
  pinMode(dirPin,OUTPUT);
  pinMode(enPin,OUTPUT);
  Serial.begin(9600);  // Начать сериал
}

void loop() {

stepperOneForward();
Serial.println("Stepper1 turned forward.");
stepperOneBackward();
Serial.println("Stepper1 turned backward.");
}

void stepperOneForward() {

  AccelStepper stepper1(1,stepPin,dirPin);
  digitalWrite(enPin,LOW);
  stepper1.setMaxSpeed(SPD);
  stepper1.setAcceleration(ACCEL);
  stepper1.move(DEST);
  if (DEST > 0) {                          
    while ( stepper1.distanceToGo() > 0) { 
      stepper1.run();
      }
  digitalWrite(enPin,HIGH);
  }
 }

 void stepperOneBackward() {

  AccelStepper stepper1(1,stepPin,dirPin);
  digitalWrite(enPin,LOW);
  stepper1.setMaxSpeed(-SPD);
  stepper1.setAcceleration(ACCEL);
  stepper1.move(DEST);
  if (DEST < 0) {                          
    while ( stepper1.distanceToGo() > 0) { 
      stepper1.run();
      }
  digitalWrite(enPin,HIGH);
  }
 }

, 👍1

Обсуждение

Я думаю, что это можно сделать с помощью stepper1.move(-DEST). PS Я бы предложил создать объект Stepper1 только один раз, как глобальную переменную. А затем используйте этот глобальный шаговый процессор1 в двух функциях вместо того, чтобы заново создавать объект каждый раз, когда вы вызываете две функции., @Gerben


1 ответ


3

Во-первых, вы создаете/уничтожаете объект AccelStepper Stepper1() при каждом вызове. Это неправильно, поскольку библиотека больше не может отслеживать положение и состояние шагового двигателя.

Объект Stepper должен быть создан в глобальной области видимости (то есть вне setup() или loop()).

Во-вторых, вы можете вызвать stepper1.setEnablePin(enPin) и stepper1.setPinsInverted(false, false, true) после создания объекта, чтобы получить элемент управления библиотеки AccelStepper. вывод разрешения и установить вывод разрешения на работу с активным низким уровнем. Затем драйвер включается или отключается с помощью вызовов stepper1.enableOutputs() и stepper1.disableOutputs(). На практике вы не будете отключать драйвер, кроме как в целях экономии энергии, поскольку шаговый двигатель больше не может удерживать свое положение, когда выходы не включены. Он потеряет свои позиции.

В-третьих, не устанавливайте скорость на отрицательное значение. Направление шагового двигателя определяется библиотекой на основе текущего положения и желаемого конечного положения. Когда библиотека создается, позиция равна нулю. Установить новую позицию можно несколькими способами:

  • stepper1.move(): установите целевую позицию относительно текущей позиции. Это означает, что для перехода назад вы передаете этой функции отрицательное значение. Он добавит это (отрицательное) число к внутренней целевой позиции, а затем run() будет работать, чтобы получить его туда.

  • stepper1.moveTo(): установите новую абсолютную позицию. Если вы изначально установили позицию 100 и переместились туда, а затем установили ее на 50, степпер будет двигаться в обратном направлении, чтобы достичь позиции 50. Если вы начнете с позиции 0 и двинетесь до 50, он будет двигаться вперед. Если вы начнете с 0 и установите значение -50, процесс будет идти в обратном направлении, и так далее.

,

Большое спасибо за ваш ответ выше моего обновления., @digit

@digit Возможно, вы захотите узнать, что означают значения ускорения и скорости. В документах (https://www.airspayce.com/mikem/arduino/AccelStepper/classAccelStepper.html#ae79c49ad69d5ccc9da0ee691fa4ca235) говорится, что скорости более 1000 ненадежны . Попробуйте снизить значения скорости и ускорения примерно до 200. 1600 шагов в секунду — это слишком быстро, чтобы физический ротор мог реагировать на изменения обмотки., @jose can u c

Ну, это потому, что я использую микрошаг, и если я установлю скорость на 200, но степпер должен пробежать 800 шагов, он станет очень медленным. Я прочитал эту часть Accelstepper. Но все это все равно не решает проблему, которая никогда не возвращалась вспять. Только вперед., @digit

Если с помощью шагового привода он движется вперед, а не назад, дважды проверьте проводку... Когда AccelStepper использует драйвер, он только поднимает или опускает направляющий штифт, а драйвер управляет последовательностью катушек., @jose can u c

Если я использую другой драйвер и код (но ту же проводку), это работает как шарм, так что это не может быть проводка (или я что-то здесь упускаю). Я хотел бы иметь только один пример кода, который поворачивает шаговый двигатель назад с помощью Accelstepper и в идеале в специально выделенном пространстве, которое включает двигатель только при необходимости (и, таким образом, сохраняет шаговый двигатель холодным для непрерывной работы. Все еще не смог найти решение для этого после 5 дней :), @digit

Вы говорите другой драйвер и код, проводка та же. А как насчет того же кода, но другого драйвера или другого драйвера, но того же кода? Чтобы исключить драйвер или проводку как виновника, необходимо менять только что-то одно за раз., @jose can u c

Если проводка будет неправильной, сможет ли он вращаться вперед?, @digit

Возможно. Это 4-проводной биполярный шаговый двигатель? Измерьте сопротивление между набором из 6 комбинаций (A+B, A+C, A+D, B+C, B+D, C+D) проводов. Две катушки будут парой с примерно одинаковым сопротивлением. Если он работает нестабильно, поменяйте полярность одной из катушек., @jose can u c