Ayuda de AccelStepper: ¡simplemente no se mueve!

Oct 02 2020

Debo comenzar diciendo que no soy programador, no sé mucho sobre programación y estoy programando un Arduino Uno por primera vez. Estoy usando un motor Nema 23 (23HS22-2804S) con un controlador de micropasos (ST-M5045). Dentro del siguiente código está la descripción de lo que necesito que haga el programa:

#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++;
}

Cuando uso Serial.println () para verificar dónde está funcionando el programa y dónde no, veo que completa el ciclo de configuración sin moverse, y en versiones ligeramente diferentes del mismo código, ha ingresado el if ( ) y ejecutarlo (también sin moverse).

Una versión anterior del programa se ejecuta y ejecuta todas las declaraciones, pero solo se mueve un máximo de aproximadamente 20 pasos por segundo, sin las fluctuaciones en la velocidad que pido, y no responde en tiempo real a ninguna entrada del potenciómetro de velocidad que pone la velocidad por encima de 20.

Idealmente, el programa ejecutaría la demostración a toda velocidad y, con frecuencia por segundo, se ralentizaría lo suficiente para que se notara como una vibración torsional.

He intentado ejecutar el programa con y sin las líneas run (), y he intentado utilizar runToNewPosition () para intentar que el programa se detenga y ejecute correctamente el movimiento.

Hice el ciclo de configuración lo más cerca posible del ciclo de configuración en bounce.pde, el programa de ejemplo en la documentación de AccelStepper que mueve el motor paso a paso entre dos puntos repetidamente, acelerando y desacelerando antes de cambiar de dirección. La razón por la que hice esto es porque sé que el ciclo de configuración en bounce.pde funciona , por lo que me sentiría más seguro de que mi ciclo de configuración no es el problema raíz.

¡Se agradece cualquier ayuda que pueda ofrecerme! Gracias por tu tiempo.

Respuestas

Gerben Oct 02 2020 at 19:34

Lea la documentación de la biblioteca AccelStepper.

Sondear el motor y pisarlo si se debe dar un paso, implementando aceleraciones y desaceleraciones para alcanzar la posición objetivo. Debe llamar a esto con la mayor frecuencia posible , pero al menos una vez por intervalo de tiempo de paso mínimo, preferiblemente en su bucle principal. Tenga en cuenta que cada llamada a run () realizará como máximo un paso, y luego solo cuando un paso sea debido, según la velocidad actual y el tiempo transcurrido desde el último paso.

fuente

Solo llama rununa vez, después de establecer una nueva posición.

Mover stepper.run();fuera de la ifdeclaración, el final de la loopfunción.

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