Frästisch mit elektronischer Höhenverstellung mittels Schrittmotoren.
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

Fraestisch_SFTools.ino 9.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347
  1. /*
  2. Steuerung f�r Fr�stisch_SFTools
  3. Diese Datei enth�lt den Code f�r die Implementierung der Steuerung eines Fr�stisches mit 2 Nema17 Schrittmotoren.
  4. Sie unterst�tzt:
  5. - Schnelles/langsames Verstellen der Fr�serh�he
  6. - Werkzeugwechsel
  7. - Automatisches Nullen mit WLS
  8. - Eintauchen mit vordefinierter Tiefe
  9. - F�r obige Funktionen notwendige Konfiguration
  10. Erstellt: 05.01.2021
  11. Autor: Flo Smilari
  12. */
  13. #include <Arduino.h>
  14. #include <esp32-hal.h>
  15. #include <esp32-hal-gpio.h>
  16. #include <ESP_FlexyStepper.h>
  17. #include <HardwareSerial.h>
  18. #include <pins_arduino.h>
  19. #include <Wire.h>
  20. #include <WString.h>
  21. #include "Display.h"
  22. #include "ExEzButton.h"
  23. #include "RotaryControler.h"
  24. #include "RouterElevator.h"
  25. #include "RouterSetup.h"
  26. #include "Status.h"
  27. #include "WLS.h"
  28. #define SDA 22
  29. #define SCX 23
  30. #define STEP 2
  31. #define DIR 4
  32. #define LIMIT_SWITCH 5
  33. static const byte led_gpio = 15;
  34. static const int WLS_Pin = 34;
  35. static const int WLS_DETECT_Pin = 35;
  36. static const int GreenBtn_Pin = 12;
  37. static const int RedBtn_Pin = 13;
  38. static const int BlueBtn_Pin = 14;
  39. static const int RotEnc_Switch_Pin = 25;
  40. static const int RotEnc_Clk_Pin = 32;
  41. static const int RotEnc_Dta_Pin = 33;
  42. static const int MOVE_DOWNWARD = -1; // motor rotation counter clock wise
  43. //static const int MOVE_UPWARD = 1; // motor rotation clock wise
  44. int intermediateState = 0;
  45. ExEzButton RedButton(RedBtn_Pin, false, 2000);
  46. ExEzButton GreenButton(GreenBtn_Pin, false, 2000);
  47. ExEzButton BlueButton(BlueBtn_Pin, false, 2000);
  48. WLS WlsDetect(WLS_DETECT_Pin, true);
  49. WLS Wls(WLS_Pin);
  50. RotaryControler RotaryControler(RotEnc_Dta_Pin, RotEnc_Clk_Pin, RotEnc_Switch_Pin);
  51. Display Display;
  52. ESP_FlexyStepper Stepper;
  53. RouterSetup Router_Setup(Display);
  54. RouterElevator Router_Elevator(Stepper, Display, Router_Setup, WlsDetect, Wls, LIMIT_SWITCH, MOVE_DOWNWARD);
  55. Status actualStatus;
  56. Status originStatus;
  57. String oldStatus = "";
  58. //********************* Rotary test **************
  59. long TimeOfLastDebounce = 0;
  60. long DelayofDebounce = 5;
  61. // Store previous Pins state
  62. int PreviousCLK;
  63. int PreviousDATA;
  64. int displaycounter = 0; // Store current counter value
  65. volatile boolean TurnDetected;
  66. void printStatus(String actualStatus) {
  67. if (!oldStatus.equals(actualStatus)) {
  68. Serial.println(actualStatus);
  69. oldStatus = actualStatus;
  70. }
  71. }
  72. //**********************************
  73. //*** Limit switch interrupt routine
  74. //**********************************
  75. void limitSwitchHandler() {
  76. Router_Elevator.limitSwitchHandler();
  77. }
  78. //*****************************************************************************************************
  79. //*** Initialization routine. Reads the eeprom first and sets the (potentially new) configured values.
  80. //*****************************************************************************************************
  81. void Initialize() {
  82. Router_Setup.readFromEEPROM();
  83. Router_Setup.printValues();
  84. Display.showInitialization();
  85. //attach an interrupt to the IO pin of the limit switch and specify the handler function
  86. attachInterrupt(digitalPinToInterrupt(LIMIT_SWITCH), limitSwitchHandler, CHANGE);
  87. Stepper.connectToPins(STEP, DIR);
  88. // set the speed and acceleration rates for the stepper motor
  89. Stepper.setSpeedInStepsPerSecond(Router_Setup.getSpeed() * Router_Setup.getStepsPerRev());
  90. Stepper.setStepsPerRevolution(Router_Setup.getStepsPerRev());
  91. Stepper.setStepsPerMillimeter(Router_Setup.getStepsPerRev() / Router_Setup.getPitch());
  92. Stepper.setAccelerationInStepsPerSecondPerSecond(Router_Setup.getAcceleration() * Router_Setup.getStepsPerRev());
  93. Stepper.setDecelerationInStepsPerSecondPerSecond(Router_Setup.getAcceleration() * Router_Setup.getStepsPerRev());
  94. if (!Stepper.isStartedAsService()) {
  95. Stepper.startAsService(0);
  96. }
  97. if (Router_Setup.isToolChangOnPowerOn()) {
  98. SetActualStatus(TOOL_CHANGE);
  99. } else {
  100. SetActualStatus(IDLE);
  101. }
  102. }
  103. //**********************
  104. //*** SETUP ************
  105. //**********************
  106. void setup() {
  107. SetActualStatus(INITIALIZATION);
  108. Wire.begin(SDA, SCX);
  109. Serial.begin(115200);
  110. Display.init();
  111. Display.display();
  112. pinMode(led_gpio, OUTPUT);
  113. pinMode(GreenBtn_Pin, INPUT);
  114. pinMode(RedBtn_Pin, INPUT);
  115. pinMode(BlueBtn_Pin, INPUT);
  116. pinMode(RotEnc_Switch_Pin, INPUT);
  117. // pinMode(RotEnc_Clk_Pin, INPUT_PULLUP);
  118. // pinMode(RotEnc_Dta_Pin, INPUT_PULLUP);
  119. pinMode(LIMIT_SWITCH, INPUT);
  120. RedButton.setDebounceTime(50); // set debounce time to 50 millis
  121. GreenButton.setDebounceTime(50);
  122. BlueButton.setDebounceTime(50);
  123. WlsDetect.setDebounceTime(50);
  124. Wls.setDebounceTime(50);
  125. RotaryControler.setDebounceTime(50);
  126. delay(1500);
  127. Display.setRefreshScreen();
  128. Display.showBrand();
  129. delay(1500);
  130. Display.setRefreshScreen();
  131. Initialize();
  132. }
  133. //**********************
  134. //*** MAIN LOOP ********
  135. //**********************
  136. void loop() {
  137. RedButton.loop(); // MUST call the loop() function first
  138. GreenButton.loop();
  139. BlueButton.loop();
  140. WlsDetect.loop();
  141. Wls.loop();
  142. RotaryControler.loop();
  143. Display.setWlsConnected(WlsDetect.isConnected());
  144. Display.showFrame(actualStatus);
  145. switch (actualStatus) {
  146. case INITIALIZATION:
  147. Initialize();
  148. break;
  149. case TOOL_CHANGE:
  150. printStatus("TOOL_CHANGE");
  151. originStatus = TOOL_CHANGE;
  152. if (intermediateState == 0) {
  153. Router_Elevator.moveToUpperLimitSwitch();
  154. SetActualStatus(MOVING_ELEVATOR);
  155. intermediateState = 1;
  156. } else if (intermediateState == 1) {
  157. Router_Elevator.setZeroPosition();
  158. Router_Elevator.resetNullingDone();
  159. if (RotaryControler.isSwitchLongPressed()) {
  160. SetActualStatus(CONFIGURATION);
  161. intermediateState = 0;
  162. } else if (BlueButton.isPressed()) {
  163. SetActualStatus(IDLE);
  164. intermediateState = 0;
  165. }
  166. }
  167. break;
  168. case CONFIGURATION:
  169. printStatus("CONFIGURATION");
  170. Router_Setup.initialize();
  171. Router_Setup.onRotaryControlerTurn(RotaryControler.getEncoderMove());
  172. if (RotaryControler.isSwitchPressed()) {
  173. Router_Setup.onRotaryControlerSwitch();
  174. } else if (RotaryControler.isSwitchLongPressed()) {
  175. Router_Setup.onRotaryControlerLongSwitch();
  176. SetActualStatus(INITIALIZATION);
  177. } else if (BlueButton.isPressed()) {
  178. Router_Setup.cancel();
  179. SetActualStatus(IDLE);
  180. }
  181. break;
  182. case NULLING:
  183. printStatus("NULLING");
  184. if (RedButton.isPressed()) {
  185. Router_Elevator.setZeroPosition();
  186. SetActualStatus(IDLE);
  187. }
  188. break;
  189. case NULLING_TLS:
  190. originStatus = NULLING_TLS;
  191. if (intermediateState == 0) {
  192. printStatus("NULLING_TLS,0");
  193. //Move elevator to lowest point (lower limit switch triggers)
  194. Router_Elevator.moveToLowerLimitSwitch();
  195. SetActualStatus(MOVING_ELEVATOR);
  196. intermediateState = 1;
  197. } else if (intermediateState == 1) {
  198. printStatus("NULLING_TLS,1");
  199. if (RedButton.isPressed()) {
  200. //Move elevator until it touch the TLS (WLS_PIN goes HIGH)
  201. Router_Elevator.moveToUpperLimitSwitch();
  202. SetActualStatus(MOVING_ELEVATOR);
  203. intermediateState = 2;
  204. }
  205. } else if (intermediateState == 2) {
  206. printStatus("NULLING_TLS,2");
  207. //Move elevator back about toolLenghtSensorHeight (will be the 0-Position)
  208. Router_Elevator.clearLimitSwitch();
  209. Router_Elevator.moveRelativeInMillimeters(Router_Setup.getToolLenghtSensorHeight() * MOVE_DOWNWARD);
  210. Serial.println(String(Router_Setup.getToolLenghtSensorHeight() * MOVE_DOWNWARD, 2));
  211. SetActualStatus(MOVING_ELEVATOR);
  212. intermediateState = 3;
  213. } else { // nullingTLS_intermediateState is 3
  214. printStatus("NULLING_TLS,3");
  215. //Set the 0-Position as actual position
  216. Router_Elevator.setZeroPosition();
  217. SetActualStatus(IDLE);
  218. intermediateState = 0;
  219. }
  220. break;
  221. case IDLE:
  222. printStatus("IDLE");
  223. originStatus = IDLE;
  224. if (RotaryControler.isSwitchPressed()) {
  225. Router_Elevator.toggleMode();
  226. }
  227. Router_Elevator.onRotaryControlerTurn(RotaryControler.getEncoderMove());
  228. if (RedButton.isLongPressed()) {
  229. if (WlsDetect.isConnected()) {
  230. SetActualStatus(NULLING_TLS);
  231. } else {
  232. SetActualStatus(NULLING);
  233. }
  234. } else if (BlueButton.isLongPressed()) {
  235. SetActualStatus(TOOL_CHANGE);
  236. } else if (GreenButton.isLongPressed()) {
  237. SetActualStatus(DIVING);
  238. } else if (GreenButton.isPressed()) {
  239. Router_Elevator.moveToTarget();
  240. SetActualStatus(MOVING_ELEVATOR);
  241. }
  242. break;
  243. case DIVING:
  244. printStatus("DIVING");
  245. originStatus = DIVING;
  246. Router_Elevator.setMaxDiveDistance();
  247. if (GreenButton.isPressed()) {
  248. Serial.println("GB && BB pressing");
  249. if (!Router_Elevator.maxDiveDistanceReached()) {
  250. Router_Elevator.incrementDiveDistance();
  251. Router_Elevator.moveToTarget();
  252. SetActualStatus(MOVING_ELEVATOR);
  253. } else {
  254. originStatus = IDLE;
  255. Router_Elevator.setDoDiveInitialization(true);
  256. Router_Elevator.moveToParkPosition();
  257. SetActualStatus(MOVING_ELEVATOR);
  258. }
  259. } else if (GreenButton.isLongPressed()) {
  260. originStatus = IDLE;
  261. Router_Elevator.setDoDiveInitialization(true);
  262. Router_Elevator.moveToParkPosition();
  263. SetActualStatus(MOVING_ELEVATOR);
  264. }
  265. break;
  266. case MOVING_ELEVATOR:
  267. printStatus("MOVING_ELEVATOR");
  268. if (Router_Elevator.isLimitSwitchTriggerd()) {
  269. delay(200);
  270. SetActualStatus(RELEASE_SWITCH);
  271. } else { // limitSwitchState is HIGH
  272. if (Router_Elevator.isTargetPositionReached()) {
  273. SetActualStatus(originStatus);
  274. delay(200);
  275. } else if (Router_Elevator.isWLSTriggerd()) {
  276. SetActualStatus(originStatus);
  277. delay(200);
  278. }
  279. Router_Elevator.clearLimitSwitch();
  280. Router_Elevator.checkDirection();
  281. }
  282. break;
  283. case RELEASE_SWITCH:
  284. printStatus("RELEASE_SWITCH");
  285. if (Router_Elevator.isLimitSwitchTriggerd()) {
  286. Router_Elevator.tryReleaseLimitSwitch();
  287. } else {
  288. SetActualStatus(originStatus);
  289. }
  290. break;
  291. default:
  292. break;
  293. }
  294. }
  295. void SetActualStatus(Status newStatus) {
  296. if (actualStatus != newStatus) {
  297. actualStatus = newStatus;
  298. Display.setRefreshScreen();
  299. }
  300. }