74 lines
1.7 KiB
C++
74 lines
1.7 KiB
C++
|
// MultiStepper.cpp
|
||
|
//
|
||
|
// Copyright (C) 2015 Mike McCauley
|
||
|
// $Id: MultiStepper.cpp,v 1.2 2015/10/04 05:16:38 mikem Exp $
|
||
|
|
||
|
#include "MultiStepper.h"
|
||
|
#include "AccelStepper.h"
|
||
|
|
||
|
MultiStepper::MultiStepper()
|
||
|
: _num_steppers(0)
|
||
|
{
|
||
|
}
|
||
|
|
||
|
boolean MultiStepper::addStepper(AccelStepper& stepper)
|
||
|
{
|
||
|
if (_num_steppers >= MULTISTEPPER_MAX_STEPPERS)
|
||
|
return false; // No room for more
|
||
|
_steppers[_num_steppers++] = &stepper;
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
void MultiStepper::moveTo(long absolute[])
|
||
|
{
|
||
|
// First find the stepper that will take the longest time to move
|
||
|
float longestTime = 0.0;
|
||
|
|
||
|
uint8_t i;
|
||
|
for (i = 0; i < _num_steppers; i++)
|
||
|
{
|
||
|
long thisDistance = absolute[i] - _steppers[i]->currentPosition();
|
||
|
float thisTime = abs(thisDistance) / _steppers[i]->maxSpeed();
|
||
|
|
||
|
if (thisTime > longestTime)
|
||
|
longestTime = thisTime;
|
||
|
}
|
||
|
|
||
|
if (longestTime > 0.0)
|
||
|
{
|
||
|
// Now work out a new max speed for each stepper so they will all
|
||
|
// arrived at the same time of longestTime
|
||
|
for (i = 0; i < _num_steppers; i++)
|
||
|
{
|
||
|
long thisDistance = absolute[i] - _steppers[i]->currentPosition();
|
||
|
float thisSpeed = thisDistance / longestTime;
|
||
|
_steppers[i]->moveTo(absolute[i]); // New target position (resets speed)
|
||
|
_steppers[i]->setSpeed(thisSpeed); // New speed
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Returns true if any motor is still running to the target position.
|
||
|
boolean MultiStepper::run()
|
||
|
{
|
||
|
uint8_t i;
|
||
|
boolean ret = false;
|
||
|
for (i = 0; i < _num_steppers; i++)
|
||
|
{
|
||
|
if ( _steppers[i]->distanceToGo() != 0)
|
||
|
{
|
||
|
_steppers[i]->runSpeed();
|
||
|
ret = true;
|
||
|
}
|
||
|
}
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
// Blocks until all steppers reach their target position and are stopped
|
||
|
void MultiStepper::runSpeedToPosition()
|
||
|
{
|
||
|
while (run())
|
||
|
;
|
||
|
}
|
||
|
|