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);
}
}
@digit, 👍1
Обсуждение1 ответ
Во-первых, вы создаете/уничтожаете объект 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
- Как заставить шаговый двигатель вращаться по часовой стрелке и против часовой стрелки
- Управление направлением шагового двигателя с помощью кнопок.
- Разгон шагового двигателя
- Использование кнопки для поворота шагового двигателя на 90 градусов.
- Изменение ШИМ на Arduino Mega, контакты 9 и 10 на 20–25 кГц
- Установить низкий уровень мощности или включить контакт драйвера шагового двигателя, чтобы шаговый двигатель не нагревался.
- Шаговый двигатель не работает с платой A4988
- Как запустить шаговый двигатель через последовательную связь
Я думаю, что это можно сделать с помощью
stepper1.move(-DEST)
. PS Я бы предложил создать объект Stepper1 только один раз, как глобальную переменную. А затем используйте этот глобальный шаговый процессор1 в двух функциях вместо того, чтобы заново создавать объект каждый раз, когда вы вызываете две функции., @Gerben