Frästisch mit elektronischer Höhenverstellung mittels Schrittmotoren.
Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  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;
  15. }
  16. void RouterElevator::setZeroPosition() {
  17. Stepper.setCurrentPositionAsHomeAndStop();
  18. Stepper.setCurrentPositionInMillimeters(0);
  19. Stepper.setTargetPositionRelativeInMillimeters(0);
  20. targetDistance = 0.0;
  21. setMode(FAST);
  22. display.setDistanceValue(targetDistance);
  23. }
  24. void RouterElevator::moveRelativeInMillimeters(float distanceInMillimeters) {
  25. Stepper.setTargetPositionRelativeInMillimeters(distanceInMillimeters);
  26. }
  27. void RouterElevator::moveToLowerLimitSwitch(void) {
  28. Stepper.setTargetPositionInMillimeters(300 * DOWNWARD_DIR);
  29. }
  30. void RouterElevator::moveToUpperLimitSwitch(void) {
  31. Stepper.setTargetPositionInMillimeters(300 * UPWARD_DIR);
  32. }
  33. void RouterElevator::clearLimitSwitch(void) {
  34. Stepper.clearLimitSwitchActive();
  35. }
  36. void RouterElevator::tryReleaseLimitSwitch(void) {
  37. Stepper.moveRelativeInMillimeters(0.05 * previousDirection * -1); // move in opposite direction (away from switch)
  38. }
  39. bool RouterElevator::isLimitSwitchTriggerd() {
  40. return limitSwitchState == LOW;
  41. }
  42. bool RouterElevator::isTargetPositionReached() {
  43. return Stepper.getDistanceToTargetSigned() == 0;
  44. }
  45. void RouterElevator::moveToTarget(void) {
  46. Stepper.setTargetPositionInMillimeters(targetDistance);
  47. }
  48. void RouterElevator::moveToParkPosition(void) {
  49. float parkOffset = -5; //Router_Setup.getParkPostionOffset() * -1;
  50. Stepper.setTargetPositionInMillimeters(parkOffset);
  51. }
  52. bool RouterElevator::isWLSTriggerd() {
  53. if (WlsDetect.isConnected()) {
  54. if (Wls.isPlugged()) {
  55. Serial.println("The Tool is away from WLS");
  56. Stepper.clearLimitSwitchActive();
  57. return false;
  58. } else if (Wls.isUnplugged()) {
  59. Serial.println("The Tool touched the WLS");
  60. Stepper.setLimitSwitchActive(Stepper.LIMIT_SWITCH_COMBINED_BEGIN_AND_END);
  61. return true;
  62. }
  63. }
  64. return false;
  65. }
  66. void RouterElevator::limitSwitchHandler() {
  67. limitSwitchState = digitalRead(LimitSwitch);
  68. if (limitSwitchState == LOW) {
  69. // 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
  70. Stepper.setLimitSwitchActive(Stepper.LIMIT_SWITCH_COMBINED_BEGIN_AND_END);
  71. } else {
  72. // clear the limit switch flag to allow movement in both directions again
  73. clearLimitSwitch();
  74. }
  75. }
  76. void RouterElevator::checkDirection() {
  77. previousDirection = Stepper.getDirectionOfMotion();
  78. }
  79. ValueMode RouterElevator::getMode() const {
  80. return mode;
  81. }
  82. void RouterElevator::setMode(ValueMode mode) {
  83. this->mode = mode;
  84. display.setMode(this->mode);
  85. }
  86. void RouterElevator::toggleMode() {
  87. setMode((mode.getValueMode() == SLOW) ? ValueMode(FAST) : ValueMode(SLOW));
  88. }
  89. void RouterElevator::onRotaryControlerTurn(RotaryEncoder::Direction turn) {
  90. if (turn != RotaryEncoder::Direction::NOROTATION) {
  91. int sign = (turn == RotaryEncoder::Direction::CLOCKWISE) ? 1 : -1;
  92. float increment = mode.isSlow() ? Router_Setup.getEncoderSpeedSlow() : Router_Setup.getEncoderSpeedFast();
  93. targetDistance = max(0.0f, targetDistance + increment / 100 * sign);
  94. display.setDistanceValue(targetDistance);
  95. display.setDistanceUnit("mm");
  96. display.setRefreshScreen();
  97. }
  98. }