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.
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