Librería AsyncStepper v2.0


Actualizamos la librería AsyncStepper a una bien merecida versión 2.0. La principal novedad es incorporar aceleración lineal, aunque se ha reescrito por completo mejorando su uso y rendimiento.

Recordamos que la librería AsyncStepper permite mover un motor paso a paso de forma no bloqueante, es decir, permitiendo al procesador hacer acciones mientras mueve uno o varios motores a distintas velocidades.

Básicamente con AsyncStepper puedes hacer lo que quieras con un motor paso a paso, sin tener que preocuparte prácticamente de nada. Únicamente tienes que llamar frecuentemente a la función Update(), y AsyncStepper se encarga de hacer las cuentas necesarias.

AsyncStepper stepper1(stepper_steps, stepper_dir_pin, stepper_step_pin);

void setup()
{
	Serial.begin(115200);

	stepper1.SetSpeedRpm(30);
	stepper1.RotateAngle(360.0f * 2 + 270.0f, AsyncStepper::CW);
}

void loop()
{
	stepper1.Update();
}

Idealmente, deberías llamar a Update() antes del siguiente paso del motor. En caso de esperas muy largas, AsyncStepper intentará recuperar los pasos restantes, pero es un escenario a evitar.

Anuncio:

AsyncStepper está diseñado para emplearse con drivers como el A4988 o el DRV8825. Alternativamente, puede controlarse con otro tipo de driver (o sin driver) proporcionando las funciones de callBack actionCW() y actionCCW() que contengan, respectivamente, el código necesario para avanzar un paso en sentido horario y anti horario.

Adicionalmente se puede proporcionar una función OnFinish() que se ejecuta al finalizar un movimiento, y puede usarse para actualizar el estado en el programa o, por ejemplo, encadenar acciones.

stepper1.OnFinish = []()
{	
	stepper1.RotateAngle(360.0f * 2 + 270.0f, AsyncStepper::CCW);
};

Manual de uso

La clase AsyncStepper puede instanciarse como un objeto a través de uno de sus constructores,

AsyncStepper(uint16_t motorSteps, int pinDir, int pinStep)
AsyncStepper(uint16_t motorSteps, StepperCallback actionCW, StepperCallback actionCCW)

Uso de AsyncStepper

// Mover un cierto ángulo
void Rotate(float angleDelta, StepDirection direction);
void Rotate(float angleDelta, StepDirection direction, StepCallback callback);
  
// Mover hasta un cierto angulo
void RotateToAngle(float angle, StepDirection direction, StepCallback callback);
void RotateToAngle(float angle, StepDirection direction);
 
 // Mover en un cierto tiempo en segundos
 void RotateAngleInTime(float angle, float time, StepperDirection direction, StepperCallback onFinish = nullptr);
 void RotateToAngleInTime(float angle, float time, StepperDirection direction, StepperCallback onFinish = nullptr);
 
 // Mover de forma continua
void RotateContinuos(StepDirection direction);

// Cambiar velocidad y aceleración
void SetSpeed(long speed);
void SetSpeedRpm(float rpm);
void SetSpeedDegreesBySecond(float degreesBySecond);
void SetAcceleration(long acceleration);
void SetAcceleration(long acceleration, long deceleration);

// Detener el motor paso a paso
void Stop();
void Break();

// Actualiza la posicion del motor paso a paso
// Es necesario llamar a este metodo frecuentemente desde el bucle principal
bool Update();

//Obtener información
long GetRemainSteps();
unsigned long GetTimeTraveling();
float GetCurrentAngle();
long GetCurrentInterval();
long GetTravelCurrentStep();
long GetTravelSteps();
long GetAbsoluteStep();
long GetMaxSpeed();
long GetCurrentSpeed();
float GetCurrentSpeedRpm();
float GetCurrentSpeedDegreesBySecond();
float GetSpeedForMove(long steps, float time);
float GetTimeForMove(long steps);
float GetTimeForMove(long steps, unsigned long speed);

Instalación

  • Descargar la última versión desde GitHub
  • Descomprimir el archivo
  • Copiar en tu carpeta de librerías (normalmente Mis Documentos\Arduino\libraries)
  • Relanzar el IDE de Arduino

Si te ha gustado esta entrada y quieres leer más sobre Arduino puedes consultar la sección
tutoriales de Arduino
5 3 votes
Article Rating

Anuncio:

Previous Librería ESP-Color
Next Conocemos la familia M5Stack, los populares dispositivos basados en el ES32
4 Comments
oldest
newest
Inline Feedbacks
View all comments
Antonio
2 months ago

Creo que el ejemplo 03_OnFinish en xamples de github se ha quedado a medias, si lo tienes aplicado en el 00_Basic. Aqui tambien lo comentas.
Gracias por compartir la librería.

MIGUEL
1 month ago

Perdona Luis por la pregunta. En el ejemplo BASIC, ¿Dónde se especifican los pines dir y step donde se encuentra conectado el A4988?. En el sketch no lo veo, ni tampoco en el código de la librería. Pero veo que en otros de los ejemplos si se especifica. Cuando he intentado ejecutarlo, el driver que tenía conectado a los pines 8 y 9, se ha pegado un calentón de impresión, pero no ha movido nada el motor. ¿Se está teniendo en cuenta si está configurado con FULLSTEP o cualquier otra de las configuraciones con micropasos? Me gustaría probar una librería… Read more »