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 2 votes
Article Rating

Anuncio:

Previous Librería ESP-Color
Next Conocemos la familia M5Stack, los populares dispositivos basados en el ES32
2 Comments
oldest
newest
Inline Feedbacks
View all comments
Antonio
10 days 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.