Frästisch mit elektronischer Höhenverstellung mittels Schrittmotoren.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

RouterElevator.cpp 4.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. /*
  2. * RouterElevator.cpp
  3. *
  4. * Created on: 12.02.2022
  5. * Author: FSmilari
  6. */
  7. #include "RouterElevator.h"
  8. RouterElevator::RouterElevator(ESP_FlexyStepper &_Stepper, Display &_display, RouterSetup &_Router_Setup,
  9. WLS &_WlsDetect, WLS &_Wls, int _LimitSwitch, int _DOWNWARD_DIR)
  10. : Stepper(_Stepper), display(_display), Router_Setup(_Router_Setup), WlsDetect(_WlsDetect), Wls(_Wls), mode(FAST) {
  11. LimitSwitch = _LimitSwitch;
  12. DOWNWARD_DIR = _DOWNWARD_DIR;
  13. UPWARD_DIR = -DOWNWARD_DIR;
  14. targetDistance = 0.0;
  15. maxDiveDistance = 0.0;
  16. doDiveInitialization = true;
  17. }
  18. void RouterElevator::setZeroPosition() {
  19. Stepper.setCurrentPositionAsHomeAndStop();
  20. Stepper.setCurrentPositionInMillimeters(0);
  21. Stepper.setTargetPositionRelativeInMillimeters(0);
  22. targetDistance = 0.0;
  23. setMode(FAST);
  24. display.setDistanceValue(targetDistance);
  25. }
  26. void RouterElevator::moveRelativeInMillimeters(float distanceInMillimeters) {
  27. Stepper.setTargetPositionRelativeInMillimeters(distanceInMillimeters);
  28. }
  29. void RouterElevator::moveToLowerLimitSwitch(void) {
  30. Stepper.setTargetPositionInMillimeters(300 * DOWNWARD_DIR);
  31. }
  32. void RouterElevator::moveToUpperLimitSwitch(void) {
  33. Stepper.setTargetPositionInMillimeters(300 * UPWARD_DIR);
  34. }
  35. void RouterElevator::clearLimitSwitch(void) {
  36. Stepper.clearLimitSwitchActive();
  37. }
  38. void RouterElevator::tryReleaseLimitSwitch(void) {
  39. Stepper.moveRelativeInMillimeters(0.05 * previousDirection * -1); // move in opposite direction (away from switch)
  40. }
  41. bool RouterElevator::isLimitSwitchTriggerd() {
  42. return limitSwitchState == LOW;
  43. }
  44. bool RouterElevator::isTargetPositionReached() {
  45. return Stepper.getDistanceToTargetSigned() == 0;
  46. }
  47. void RouterElevator::moveToTarget(void) {
  48. Stepper.setTargetPositionInMillimeters(targetDistance);
  49. }
  50. void RouterElevator::moveToParkPosition(void) {
  51. float parkOffset = -5; //Router_Setup.getParkPostionOffset() * -1;
  52. Stepper.setTargetPositionInMillimeters(parkOffset);
  53. }
  54. bool RouterElevator::isWLSTriggerd() {
  55. if (WlsDetect.isConnected()) {
  56. if (Wls.isPlugged()) {
  57. Serial.println("The Tool is away from WLS");
  58. Stepper.clearLimitSwitchActive();
  59. return false;
  60. } else if (Wls.isUnplugged()) {
  61. Serial.println("The Tool touched the WLS");
  62. Stepper.setLimitSwitchActive(Stepper.LIMIT_SWITCH_COMBINED_BEGIN_AND_END);
  63. return true;
  64. }
  65. }
  66. return false;
  67. }
  68. void RouterElevator::limitSwitchHandler() {
  69. limitSwitchState = digitalRead(LimitSwitch);
  70. if (limitSwitchState == LOW) {
  71. // this will cause to stop any motion that is currently going on and block further movement in the same direction as long as the switch is active
  72. Stepper.setLimitSwitchActive(Stepper.LIMIT_SWITCH_COMBINED_BEGIN_AND_END);
  73. } else {
  74. // clear the limit switch flag to allow movement in both directions again
  75. clearLimitSwitch();
  76. }
  77. }
  78. void RouterElevator::checkDirection() {
  79. previousDirection = Stepper.getDirectionOfMotion();
  80. }
  81. ValueMode RouterElevator::getMode() const {
  82. return mode;
  83. }
  84. void RouterElevator::setMode(ValueMode mode) {
  85. this->mode = mode;
  86. display.setMode(this->mode);
  87. }
  88. void RouterElevator::toggleMode() {
  89. setMode((mode.getValueMode() == SLOW) ? ValueMode(FAST) : ValueMode(SLOW));
  90. }
  91. void RouterElevator::onRotaryControlerTurn(RotaryEncoder::Direction turn) {
  92. if (turn != RotaryEncoder::Direction::NOROTATION) {
  93. int sign = (turn == RotaryEncoder::Direction::CLOCKWISE) ? 1 : -1;
  94. float increment = mode.isSlow() ? Router_Setup.getEncoderSpeedSlow() : Router_Setup.getEncoderSpeedFast();
  95. targetDistance = max(0.0f, targetDistance + increment / 100 * sign);
  96. display.setDistanceValue(targetDistance);
  97. display.setDistanceUnit("mm");
  98. }
  99. }
  100. bool RouterElevator::isDoDiveInitialization() const {
  101. return doDiveInitialization;
  102. }
  103. void RouterElevator::setDoDiveInitialization(bool doDiveInitialization) {
  104. this->doDiveInitialization = doDiveInitialization;
  105. }
  106. float RouterElevator::getMaxDiveDistance() const {
  107. return maxDiveDistance;
  108. }
  109. void RouterElevator::setMaxDiveDistance() {
  110. if (isDoDiveInitialization()) {
  111. Serial.println("setMaxDiveDistance");
  112. maxDiveDistance = targetDistance;
  113. targetDistance = 0.0;
  114. display.setDistanceValue(maxDiveDistance);
  115. display.setDistanceUnit("mm");
  116. display.setRefreshScreen();
  117. setDoDiveInitialization(false);
  118. }
  119. }
  120. bool RouterElevator::incrementDiveDistance() {
  121. float increment = Router_Setup.getLevelHeightDiving();
  122. targetDistance = min(maxDiveDistance, targetDistance + increment);
  123. Serial.println("targetDistance: " + String(targetDistance, 2));
  124. return targetDistance == maxDiveDistance;
  125. }