Control Library for Pololu A4988 Motor Driver
Basic functions
// create an instance of motor driver with only 3 pins
A4988 stepper(pinEnable, pinDirection, pinStep);
// enable stepper driver
stepper.enable();
// disable stepper driver
stepper.disable();
// set rotation direction using enum values Back or Forth
stepper.setDirection(Forth);
// get current directoin
uint8_t currentDirection = stepper.getDirection();
// add a task to be performed, speed is a float in range 0.001 .. 1.0
stepper.addTask(amountOfSteps, direction, speed);
// toggle step pin; it takes two toggles to perform one step
stepper.halfStep();
Extra functions
// create an instance of motor driver with all available pins
A4988 stepper(pinEnable, pinDirection, pinStep, pinSleep, pinReset, pinModeSel3, pinModeSel2, pinModeSel1);
// disable motor driver FETs, stepper will not move until next call to wake()
stepper.sleep();
// enable motor driver FETs
stepper.wake();
// reset motor driver internal logic and counters
stepper.reset();
// set step size, use one of enumerations: Full, Half, Quarter, Eighth or Sixteenth of a step
stepper.setStepSize(Quarter);
// add a task to be performed
stepper.addTask(amountOfSteps, stepSize, direction, speed);
Motors can be grouped into a sichronization pool. Each motor in the pool must receive a task before they start execution.
Once all motors have received a task execution starts immediately.
Even if one of the synchronized motors has to do 0 steps, it still has to receive a dummy task in order to unlock others.
A4988 stepper1(pinEnable, pinDirection, pinStep);
A4988 stepper2(pinEnable, pinDirection, pinStep);
A4988 stepper3(pinEnable, pinDirection, pinStep);
A4988 stepper4(pinEnable, pinDirection, pinStep);
void setup() {
stepper1.enable();
stepper2.enable();
stepper3.enable();
stepper4.enable();
stepper1.synchronize();
stepper2.synchronize();
stepper3.synchronize();
}
void loop() {
stepper1.addTask(5, direction, speed);
stepper2.addTask(10, direction, speed);
stepper3.addTask(0, direction, speed); // add a dummy task for a synchronized motor
stepper1.halfStep();
stepper2.halfStep();
stepper3.halfStep();
stepper4.addTask(500, direction, speed); // non-synchronized motor does not depend on other ones and doesn't block them
stepper4.halfStep();
}
The motor stepping is implemented without the use of delay(), which allows for some more sophisticated logic to be added to the sketch.
However, the library relies on polling rather than on timer interrupts, which means exact step timing is not guaranteed.
