Помогите с AccelStepper - не двигается!

Начнем с того, что я не программист, не особо разбираюсь в программировании и впервые программирую Arduino Uno. Я использую двигатель Nema 23 (23HS22-2804S) с микрошаговым драйвером (ST-M5045). В следующем коде есть описание того, что мне нужно, чтобы программа делала:

#include <AccelStepper.h>

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

AccelStepper stepper(AccelStepper::FULL4WIRE, 2, 6, 4, 8);

int Microstepping = 8; /* Фактор микрошага, установленный на плате управления ST-M5045.
Умножает количество шагов на оборот шагового двигателя.
См. руководство контроллера для настройки этого числа. */
int Steps = 200; /* Number of steps on your stepper motor.*/
int SPS;
int Amp;
int Freq;
// целое СК;
int n = 2;
int i;
int totalSteps = Microstepping * Steps;

/* Следует отметить, что множители Microstepping и Steps необязательны, и регулировка множителя microstepping
* на лету код не сломается. Однако имейте в виду, что изменение коэффициента микрошага более чем на один интервал
* за один раз может привести к тому, что двигатель не поспевает за внезапными изменениями, т.е. потеря крутящего момента или вибрация/заикание. */

void setup() {               // ЭТО ВЫПОЛНЯЕТСЯ ОДИН РАЗ //

  // чтение потенциометров; исходные данные от 0 до 1023 //
  SPS = analogRead(0)*0.733; // МАКС. об/мин ~28, максимальная скорость ~750 шагов в секунду (скорости выше 1000 шагов в секунду ненадежны,
                             // согласно документации AccelStepper)//
  Amp = analogRead(1)/20;     // МАКС. AMP ~51//
  Freq = analogRead(2)/170;   // МАКС. ЧАСТОТА ~6 Гц//
  
  stepper.setMaxSpeed(SPS);
  stepper.setAcceleration(SPS/1.5);

  int nextStop = totalSteps/Freq;
  
  stepper.moveTo(nextStop);
  stepper.run();
}

void loop() {
  int nextStop = totalSteps/Freq;

// доходит до этого места, цикл if не выполняется.
   if(stepper.distanceToGo()== 0){
     SPS = analogRead(0)*0.733;
     Amp = analogRead(1)/20;
     Freq = analogRead(2)/170;
     i = SPS - Amp;
     if(i <=0)
       i = 1;
     stepper.setSpeed(i);
     stepper.moveTo(nextStop*n);
     stepper.run();
    }
    n++;
}

Когда я использую Serial.println() для проверки того, где программа работает, а где нет, я вижу, что она завершает цикл настройки без каких-либо перемещений, а в немного отличающихся версиях одного и того же кода она ввела оператор if() и выполнил его (тоже без движения).

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

В идеале программа должна запускать демонстрацию на полной скорости и частоту раз в секунду, она будет замедляться ровно настолько, чтобы быть заметной как крутильная вибрация.

Я пробовал запускать программу со строками run() и без них, а также пробовал использовать runToNewPosition(), пытаясь заставить программу остановиться и правильно выполнить движение.

Я сделал цикл настройки как можно ближе к циклу настройки в bounce.pde, примере программы в документации AccelStepper, которая многократно перемещает шаговый двигатель между двумя точками, ускоряясь и замедляясь перед изменением направления. Причина, по которой я сделал это, заключается в том, что я знаю, что цикл настройки в bounce.pde работает, и поэтому я был бы более уверен, что мой цикл настройки не является основной проблемой.

Я ценю любую помощь, которую вы можете мне предложить! Спасибо за ваше время.

, 👍1

Обсуждение

Похоже, что этот драйвер использует интерфейс STEP/DIR. Вам понадобится DRIVER MotorInterfaceType, а не FULL4WIRE., @towe

towe, спасибо за ответ. Когда я начал писать этот пост, я начал понимать, что я действительно использую драйвер между Arduino и шаговым двигателем, который я ошибочно принял за особый тип двигателя только с двумя проводами, ссылаясь на документацию AccelStepper, в которой говорится "Требуется 2 штифта драйвера." Я попробую отредактировать свою программу, чтобы использовать тип интерфейса DRIVER., @czar1249


1 ответ


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

0

Пожалуйста, прочтите документацию по библиотеке AccelStepper.

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

источник

Вы вызываете run только один раз после установки новой позиции.

Переместите stepper.run(); из оператора if, конец функции loop.

      ...
      stepper.moveTo(nextStop*n);
    }
    stepper.run();
    n++;
}
,

Спасибо за ваш ответ. Я прочитал документацию несколько раз, и описание команды run() ничего для меня не значит, потому что я понятия не имею, каков интервал времени моего шага. Как я уже сказал, я ничего не знаю об этих вещах., @czar1249

run проверяет, нужно ли двигателю сделать (один) шаг **прямо сейчас**. Если нет, он просто ничего не делает. Вам не нужно знать, когда звонить. Он сам будет отслеживать, когда потребуется новый шаг. Поэтому вам нужно вызывать его как можно чаще. Я знаю, что это не так уж интуитивно понятно. Я все еще нахожу это немного странным, но я понимаю, почему они это сделали., @Gerben

Хорошо, спасибо. Я запустил программу с предложенной вами правкой, и она работает. Моя конечная цель еще не достигнута, но она уже в пути., @czar1249

@ czar1249 czar1249 Если это решило вашу проблему, примите ответ., @SoreDakeNoKoto