Ajuda do AccelStepper - ele simplesmente não se move!

Oct 02 2020

Devo começar dizendo que não sou um programador, não sei muito sobre programação e estou programando um Arduino Uno pela primeira vez. Estou usando um motor Nema 23 (23HS22-2804S) com um driver microstep (ST-M5045). No código a seguir está a descrição do que preciso que o programa faça:

#include <AccelStepper.h>

/* Using a stepper motor,
 rotate a vibrational model using gears interconnected by springs
 in such a way as to induce torsional vibration, which should be visible by comparing
 movement of juxtaposed rotating gears with markers painted on. */

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

int Microstepping = 8; /* Microstepping factor, as set on the ST-M5045 control board. 
                          Multiplies the number of steps per revolution on the stepper motor.
                          Reference controller manual for adjustments to this number. */
int Steps = 200; /* Number of steps on your stepper motor.*/
int SPS;
int Amp;
int Freq;
// int SC;
int n = 2;
int i;
int totalSteps = Microstepping * Steps;

/* It should be noted that the Microstepping and Steps factors are not necessary, and adjusting the microstepping factor
 *  on the fly will not break the code. However, be aware that changing the microstepping factor by more than one interval
 *  at a time can cause the motor to not keep up with the sudden changes, i.e. losing torque or vibrating/stuttering. */

void setup() {               // THIS RUNS ONCE //

  // read potentiometers; raw inputs from 0 to 1023 //
  SPS = analogRead(0)*0.733; // MAX RPM ~28, max speed ~750 steps per sec (speeds above 1000 steps per second are unreliable,
                             // according to AccelStepper documentation)// 
  Amp = analogRead(1)/20;     // MAX AMP ~51//
  Freq = analogRead(2)/170;   // MAX FREQ ~6 Hz//
  
  stepper.setMaxSpeed(SPS);
  stepper.setAcceleration(SPS/1.5);

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

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

// reaches here, doesn't execute if loop. 
   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++;
}

Quando eu uso Serial.println () para verificar onde o programa está funcionando e onde não está, vejo que ele completa o loop de configuração sem nunca se mover, e em versões ligeiramente diferentes do mesmo código, ele inseriu o if ( ) declaração e executou-a (também sem mover.)

Uma versão anterior do programa executa e executa todas as instruções, mas apenas se move no máximo cerca de 20 passos por segundo, sem as flutuações de velocidade que eu chamo, e não responde em tempo real a qualquer entrada do potenciômetro de velocidade que coloca a velocidade acima de 20.

Idealmente, o programa executaria o demo em velocidade total e, freq vezes por segundo, desaceleraria apenas o suficiente para ser percebido como uma vibração de torção.

Tentei executar o programa com e sem as linhas run () e tentei usar runToNewPosition () na tentativa de fazer o programa parar e executar o movimento corretamente.

Eu fiz o loop de configuração o mais próximo possível do loop de configuração em bounce.pde, o programa de exemplo na documentação do AccelStepper que move o motor de passo entre dois pontos repetidamente, acelerando e desacelerando antes de mudar de direção. A razão de eu ter feito isso é porque sei que o loop de configuração em bounce.pde funciona e, portanto, me sentiria mais confiante de que meu loop de configuração não é o problema raiz.

Qualquer ajuda que você possa me oferecer é apreciada! Obrigado pelo seu tempo.

Respostas

Gerben Oct 02 2020 at 19:34

Leia a documentação da biblioteca AccelStepper.

Sondar o motor e acioná-lo se uma etapa for necessária, implementando acelerações e desacelerações para atingir a posição desejada. Você deve chamar isso com a maior freqüência possível , mas pelo menos uma vez por intervalo de tempo mínimo da etapa, de preferência em seu loop principal. Observe que cada chamada para executar () fará no máximo uma etapa, e somente quando uma etapa for devida, com base na velocidade atual e no tempo desde a última etapa.

fonte

Você só está pagando runuma vez, depois de definir uma nova posição.

Saia stepper.run();da ifinstrução, o fim da loopfunção.

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