Frästisch mit elektronischer Höhenverstellung mittels Schrittmotoren.
Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  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. nullingDone = false;
  18. }
  19. void RouterElevator::setZeroPosition() {
  20. Stepper.setCurrentPositionAsHomeAndStop();
  21. Stepper.setCurrentPositionInMillimeters(0);
  22. Stepper.setTargetPositionRelativeInMillimeters(0);
  23. targetDistance = 0.0;
  24. nullingDone = true;
  25. setMode(FAST);
  26. display.setDistanceValue(targetDistance);
  27. }
  28. void RouterElevator::moveRelativeInMillimeters(float distanceInMillimeters) {
  29. Stepper.setTargetPositionRelativeInMillimeters(distanceInMillimeters);
  30. }
  31. void RouterElevator::moveToLowerLimitSwitch(void) {
  32. Stepper.setTargetPositionInMillimeters(300 * DOWNWARD_DIR);
  33. }
  34. void RouterElevator::moveToUpperLimitSwitch(void) {
  35. Stepper.setTargetPositionInMillimeters(300 * UPWARD_DIR);
  36. }
  37. void RouterElevator::clearLimitSwitch(void) {
  38. Stepper.clearLimitSwitchActive();
  39. }
  40. void RouterElevator::tryReleaseLimitSwitch(void) {
  41. Stepper.moveRelativeInMillimeters(0.05 * previousDirection * -1); // move in opposite direction (away from switch)
  42. }
  43. bool RouterElevator::isLimitSwitchTriggerd() {
  44. return limitSwitchState == LOW;
  45. }
  46. bool RouterElevator::isTargetPositionReached() {
  47. return Stepper.getDistanceToTargetSigned() == 0;
  48. }
  49. void RouterElevator::moveToTarget(void) {
  50. Stepper.setTargetPositionInMillimeters(targetDistance);
  51. }
  52. void RouterElevator::moveToParkPosition(void) {
  53. float parkOffset = -5; //Router_Setup.getParkPostionOffset() * -1;
  54. targetDistance = parkOffset;
  55. Stepper.setTargetPositionInMillimeters(targetDistance);
  56. display.setDistanceValue(targetDistance);
  57. }
  58. bool RouterElevator::isWLSTriggerd() {
  59. if (WlsDetect.isConnected()) {
  60. if (Wls.isPlugged()) {
  61. // Serial.println("The Tool is away from WLS");
  62. Stepper.clearLimitSwitchActive();
  63. return false;
  64. } else if (Wls.isUnplugged()) {
  65. // Serial.println("The Tool touched the WLS");
  66. Stepper.setLimitSwitchActive(Stepper.LIMIT_SWITCH_COMBINED_BEGIN_AND_END);
  67. return true;
  68. }
  69. }
  70. return false;
  71. }
  72. void RouterElevator::limitSwitchHandler() {
  73. limitSwitchState = digitalRead(LimitSwitch);
  74. if (limitSwitchState == LOW) {
  75. // 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
  76. Stepper.setLimitSwitchActive(Stepper.LIMIT_SWITCH_COMBINED_BEGIN_AND_END);
  77. } else {
  78. // clear the limit switch flag to allow movement in both directions again
  79. clearLimitSwitch();
  80. }
  81. }
  82. void RouterElevator::readLimitSwitch() {
  83. limitSwitchState = digitalRead(LimitSwitch);
  84. }
  85. void RouterElevator::checkDirection() {
  86. previousDirection = Stepper.getDirectionOfMotion();
  87. }
  88. ValueMode RouterElevator::getMode() const {
  89. return mode;
  90. }
  91. void RouterElevator::setMode(ValueMode mode) {
  92. this->mode = mode;
  93. display.setMode(this->mode);
  94. }
  95. void RouterElevator::toggleMode() {
  96. setMode((mode.getValueMode() == SLOW) ? ValueMode(FAST) : ValueMode(SLOW));
  97. }
  98. void RouterElevator::onRotaryControlerTurn(RotaryEncoder::Direction turn) {
  99. if (turn != RotaryEncoder::Direction::NOROTATION) {
  100. int sign = (turn == RotaryEncoder::Direction::CLOCKWISE) ? 1 : -1;
  101. float increment = mode.isSlow() ? Router_Setup.getEncoderSpeedSlow() : Router_Setup.getEncoderSpeedFast();
  102. if (nullingDone) {
  103. targetDistance = max(0.0f, targetDistance + increment / 100 * sign);
  104. } else {
  105. targetDistance = targetDistance + increment / 100 * sign;
  106. }
  107. display.setDistanceValue(targetDistance);
  108. display.setDistanceUnit("mm");
  109. }
  110. }
  111. bool RouterElevator::isDoDiveInitialization() const {
  112. return doDiveInitialization;
  113. }
  114. void RouterElevator::setDoDiveInitialization(bool doDiveInitialization) {
  115. this->doDiveInitialization = doDiveInitialization;
  116. }
  117. float RouterElevator::getMaxDiveDistance() const {
  118. return maxDiveDistance;
  119. }
  120. void RouterElevator::setMaxDiveDistance() {
  121. if (isDoDiveInitialization()) {
  122. maxDiveDistance = targetDistance;
  123. targetDistance = 0.0;
  124. display.setDistanceValue(targetDistance);
  125. display.setDistanceUnit("mm");
  126. display.setMaxDiveDistance(maxDiveDistance);
  127. display.setLevelHeightDiving(Router_Setup.getLevelHeightDiving());
  128. display.setRefreshScreen();
  129. setDoDiveInitialization(false);
  130. }
  131. }
  132. bool RouterElevator::incrementDiveDistance() {
  133. float increment = Router_Setup.getLevelHeightDiving();
  134. targetDistance = min(maxDiveDistance, targetDistance + increment);
  135. display.setMaxDiveDistance(maxDiveDistance);
  136. display.setDistanceValue(targetDistance);
  137. display.setLevelHeightDiving(Router_Setup.getLevelHeightDiving());
  138. return targetDistance == maxDiveDistance;
  139. }
  140. bool RouterElevator::maxDiveDistanceReached() {
  141. return targetDistance == maxDiveDistance;
  142. }
  143. void RouterElevator::resetNullingDone() {
  144. this->nullingDone = false;
  145. }