MultiStepper.cpp 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. // MultiStepper.cpp
  2. //
  3. // Copyright (C) 2015 Mike McCauley
  4. // $Id: MultiStepper.cpp,v 1.2 2015/10/04 05:16:38 mikem Exp $
  5. #include "MultiStepper.h"
  6. #include "AccelStepper.h"
  7. MultiStepper::MultiStepper()
  8. : _num_steppers(0)
  9. {
  10. }
  11. boolean MultiStepper::addStepper(AccelStepper& stepper)
  12. {
  13. if (_num_steppers >= MULTISTEPPER_MAX_STEPPERS)
  14. return false; // No room for more
  15. _steppers[_num_steppers++] = &stepper;
  16. return true;
  17. }
  18. void MultiStepper::moveTo(long absolute[])
  19. {
  20. // First find the stepper that will take the longest time to move
  21. float longestTime = 0.0;
  22. uint8_t i;
  23. for (i = 0; i < _num_steppers; i++)
  24. {
  25. long thisDistance = absolute[i] - _steppers[i]->currentPosition();
  26. float thisTime = abs(thisDistance) / _steppers[i]->maxSpeed();
  27. if (thisTime > longestTime)
  28. longestTime = thisTime;
  29. }
  30. if (longestTime > 0.0)
  31. {
  32. // Now work out a new max speed for each stepper so they will all
  33. // arrived at the same time of longestTime
  34. for (i = 0; i < _num_steppers; i++)
  35. {
  36. long thisDistance = absolute[i] - _steppers[i]->currentPosition();
  37. float thisSpeed = thisDistance / longestTime;
  38. _steppers[i]->moveTo(absolute[i]); // New target position (resets speed)
  39. _steppers[i]->setSpeed(thisSpeed); // New speed
  40. }
  41. }
  42. }
  43. // Returns true if any motor is still running to the target position.
  44. boolean MultiStepper::run()
  45. {
  46. uint8_t i;
  47. boolean ret = false;
  48. for (i = 0; i < _num_steppers; i++)
  49. {
  50. if ( _steppers[i]->distanceToGo() != 0)
  51. {
  52. _steppers[i]->runSpeed();
  53. ret = true;
  54. }
  55. }
  56. return ret;
  57. }
  58. // Blocks until all steppers reach their target position and are stopped
  59. void MultiStepper::runSpeedToPosition()
  60. {
  61. while (run())
  62. ;
  63. }