wiktortokumpel

Untitled

Nov 14th, 2023
182
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.86 KB | None | 0 0
  1. #include <AccelStepper.h>
  2. #include <MultiStepper.h>
  3.  
  4. // Definicje pinów dla fotorezystorów
  5. #define PIN_FR_1 A0
  6. #define PIN_FR_2 A1
  7. #define PIN_FR_3 A2
  8. #define PIN_FR_4 A3
  9.  
  10. // Definicje pinów dla silników krokowych
  11. #define PIN_STEP_HORIZONTAL 2
  12. #define PIN_DIR_HORIZONTAL 3
  13. #define PIN_STEP_VERTICAL 4
  14. #define PIN_DIR_VERTICAL 5
  15.  
  16. // Definicje pinów dla czujników krańcowych
  17. #define PIN_LIMIT_HORIZONTAL 6
  18. #define PIN_LIMIT_VERTICAL 7
  19.  
  20. // Obiekty dla silników krokowych
  21. AccelStepper stepperHorizontal(AccelStepper::DRIVER, PIN_STEP_HORIZONTAL, PIN_DIR_HORIZONTAL);
  22. AccelStepper stepperVertical(AccelStepper::DRIVER, PIN_STEP_VERTICAL, PIN_DIR_VERTICAL);
  23. MultiStepper multiStepper;
  24.  
  25. // Stałe do kalibracji
  26. int calibrationDelay = 1000; // ms
  27. int calibrationThreshold = 100; // Wartość graniczna dla kalibracji
  28.  
  29. void setup() {
  30. Serial.begin(9600);
  31.  
  32. // Ustawienia dla silnika poziomego
  33. stepperHorizontal.setMaxSpeed(1000);
  34. stepperHorizontal.setAcceleration(500);
  35.  
  36. // Ustawienia dla silnika pionowego
  37. stepperVertical.setMaxSpeed(1000);
  38. stepperVertical.setAcceleration(500);
  39.  
  40. // Ustawienia dla czujnika krańcowego poziomego
  41. pinMode(PIN_LIMIT_HORIZONTAL, INPUT_PULLUP);
  42.  
  43. // Ustawienia dla czujnika krańcowego pionowego
  44. pinMode(PIN_LIMIT_VERTICAL, INPUT_PULLUP);
  45.  
  46. // Kalibracja
  47. calibrate();
  48. }
  49.  
  50. void loop() {
  51. // Odczyt wartości z fotorezystorów
  52. int sensorValue1 = analogRead(PIN_FR_1);
  53. int sensorValue2 = analogRead(PIN_FR_2);
  54. int sensorValue3 = analogRead(PIN_FR_3);
  55. int sensorValue4 = analogRead(PIN_FR_4);
  56.  
  57. // Przesunięcie wartości o wartość kalibracyjną
  58. sensorValue1 -= calibrationThreshold;
  59. sensorValue2 -= calibrationThreshold;
  60. sensorValue3 -= calibrationThreshold;
  61. sensorValue4 -= calibrationThreshold;
  62.  
  63. // Korekcja wartości ujemnych (jeśli występują)
  64. sensorValue1 = max(0, sensorValue1);
  65. sensorValue2 = max(0, sensorValue2);
  66. sensorValue3 = max(0, sensorValue3);
  67. sensorValue4 = max(0, sensorValue4);
  68.  
  69. // Wyświetlanie odczytów w konsoli
  70. Serial.print("FR1: ");
  71. Serial.print(sensorValue1);
  72. Serial.print("\tFR2: ");
  73. Serial.print(sensorValue2);
  74. Serial.print("\tFR3: ");
  75. Serial.print(sensorValue3);
  76. Serial.print("\tFR4: ");
  77. Serial.println(sensorValue4);
  78.  
  79. // Sterowanie silnikami na podstawie odczytów z fotorezystorów
  80. controlMotors(sensorValue1, sensorValue2, sensorValue3, sensorValue4);
  81.  
  82. // Sprawdzenie czy silniki osiągnęły krańce
  83. checkLimits();
  84. }
  85.  
  86. void calibrate() {
  87. Serial.println("Rozpocznij kalibrację...");
  88.  
  89. delay(calibrationDelay);
  90.  
  91. int sensorValue1 = analogRead(PIN_FR_1);
  92. int sensorValue2 = analogRead(PIN_FR_2);
  93. int sensorValue3 = analogRead(PIN_FR_3);
  94. int sensorValue4 = analogRead(PIN_FR_4);
  95.  
  96. calibrationThreshold = max(sensorValue1, max(sensorValue2, max(sensorValue3, sensorValue4)));
  97.  
  98. Serial.println("Kalibracja zakończona.");
  99. }
  100.  
  101. void controlMotors(int fr1, int fr2, int fr3, int fr4) {
  102. // Wylicz różnicę pomiędzy odczytami z przeciwległych fotorezystorów
  103. int horizontalDiff = fr1 - fr3;
  104. int verticalDiff = fr2 - fr4;
  105.  
  106. // Wylicz korektę dla silnika poziomego
  107. int horizontalCorrection = map(horizontalDiff, -calibrationThreshold, calibrationThreshold, -100, 100);
  108.  
  109. // Wylicz korektę dla silnika pionowego
  110. int verticalCorrection = map(verticalDiff, -calibrationThreshold, calibrationThreshold, -100, 100);
  111.  
  112. // Zastosuj korekty
  113. multiStepper.moveTo(horizontalCorrection, verticalCorrection);
  114. multiStepper.runSpeedToPosition();
  115. }
  116.  
  117. void checkLimits() {
  118. // Sprawdzenie czy silnik poziomy osiągnął krańce
  119. if (digitalRead(PIN_LIMIT_HORIZONTAL) == LOW) {
  120. stepperHorizontal.setCurrentPosition(0);
  121. }
  122.  
  123. // Sprawdzenie czy silnik pionowy osiągnął krańce
  124. if (digitalRead(PIN_LIMIT_VERTICAL) == LOW) {
  125. stepperVertical.setCurrentPosition(0);
  126. }
  127. }
  128.  
Advertisement
Add Comment
Please, Sign In to add comment