Advertisement
Guest User

Camera Slider Code

a guest
Jul 2nd, 2022
877
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.29 KB | None | 0 0
  1. #include "BasicStepperDriver.h"
  2. #include "MultiDriver.h"
  3. #include "SyncDriver.h"
  4.  
  5. // This code accompanies the youtube video: https://youtu.be/NB-O0Zpb0e0
  6. // This code functions such that two potentiometers control position and rotation of two NEMA stepper motors,
  7. // with the 'in' and 'out' buttons setting the start and finish positions. A latching 'start' button activates the
  8. // slider motion, after moving each axis to the starting position, if not already there.
  9.  
  10. bool debug = true; // Enable or disable serial messages
  11. bool primed = false;
  12. bool reset = false;
  13.  
  14. // TMC2209 defaults to 8 microsteps in the CNC shield
  15. const int microSteps = 8;
  16. const int steps = 200; // 1.8 degree stepper (200 x 1.8 degrees = 360 degrees)
  17.  
  18. int pos_steps = 20;
  19. int rot_steps = 20;
  20.  
  21. int curr_pos = 0;
  22. int curr_rot = 0;
  23.  
  24. int in_pos = 0;
  25. int in_rot = 0;
  26. int out_pos = 0;
  27. int out_rot = 0;
  28.  
  29. int pot_pos_before = 200;
  30. int pot_rot_before = 200;
  31. int pot_pos_after;
  32. int pot_rot_after;
  33.  
  34. int initSpeedPos = 70;
  35. int initSpeedRot = 10;
  36. int moveSpeed = 25;
  37.  
  38. float interp_rot_steps = 0.0;
  39.  
  40. // DIO
  41. int in_but = 9; // In button - Limit X pin
  42. int out_but = 10; // Out button - Limit Y pin
  43. int start_but = 11; // Start button - Limit Z pin
  44. int batt_LED = 12; // Batt LED - Spindle Ena pin
  45.  
  46. // AIO
  47. int pos_pot = 14; // Pos Pot - Abort pin
  48. int rot_pot = 15; // Rot Pot - Hold pin
  49. int batt_mon = 16; // Batt Mon - Resume pin
  50. //int pos_pot = 17; // Pos Pot - Coolant En pin
  51. //int rot_pot = 18; // Rot Pot - SDA pin
  52. //int batt_mon = 19; // Batt Mon - SCL pin
  53.  
  54. BasicStepperDriver PosStepper(steps, 5, 2); // X driver; steps, dir, step
  55. BasicStepperDriver RotStepper(steps, 7, 4); // Z driver; steps, dir, step
  56.  
  57. void setup() {
  58.  
  59. pinMode(in_but, INPUT_PULLUP);
  60. pinMode(out_but, INPUT_PULLUP);
  61. pinMode(start_but, INPUT_PULLUP);
  62. pinMode(pos_pot, INPUT);
  63. pinMode(rot_pot, INPUT);
  64. pinMode(batt_mon, INPUT);
  65. pinMode(batt_LED, OUTPUT);
  66.  
  67. PosStepper.setEnableActiveState(LOW);
  68. RotStepper.setEnableActiveState(LOW);
  69.  
  70. //SyncDriver controller(PosStepper, RotStepper);
  71.  
  72. Serial.begin(115200);
  73. }
  74.  
  75. void loop() {
  76.  
  77. delay(100);
  78.  
  79. PosStepper.begin(initSpeedPos, microSteps);
  80. RotStepper.begin(initSpeedRot, microSteps);
  81.  
  82. // Battery voltage check (10V = 100, 12V = 120, etc)
  83. int batt_level = map(analogRead(batt_mon), 0, 1024, 0, 220);
  84. //Serial.println(batt_level); // 4K7+15K or 10K+33K divider - max voltage at pin of 5V equates to ~22V at battery
  85. if (batt_level <= 100) {
  86. digitalWrite(batt_LED, HIGH);
  87. Serial.println(batt_level); // 2K2+6K8 or 4K7+15K or 10K+33K divider - max voltage at pin of 5V equates to ~21V at battery
  88. //Serial.println("LOW BATTERY");
  89. } else {
  90. digitalWrite(batt_LED, LOW); // Set low unless the below is true
  91. }
  92.  
  93. // Read pos & rot
  94. pot_pos_after = map(analogRead(pos_pot), 0, 1024, 400, 0);
  95. pot_rot_after = map(analogRead(rot_pot), 0, 1024, 400, 0);
  96.  
  97. PosStepper.move(stepAmountFiltered(pot_pos_before, pot_pos_after, pos_steps*100));
  98. curr_pos += stepAmountFiltered(pot_pos_before, pot_pos_after, pos_steps)*100;
  99. /*if (pot_pos_after > pot_pos_before) {
  100. PosStepper.move(pos_steps);
  101. curr_pos += pos_steps;
  102. } else if (pot_pos_after < pot_pos_before) {
  103. PosStepper.move(-pos_steps);
  104. curr_pos -= pos_steps;
  105. }*/
  106.  
  107. // Move rot as pot is turned
  108. RotStepper.move(stepAmountFiltered(pot_rot_before, pot_rot_after, rot_steps*3));
  109. curr_rot += stepAmountFiltered(pot_rot_before, pot_rot_after, rot_steps)*3;
  110. // Move rot as pot is turned
  111. /*if (pot_rot_after > pot_rot_before) {
  112. RotStepper.move(rot_steps);
  113. curr_rot += rot_steps;
  114. } else if (pot_rot_after < pot_rot_before) {
  115. RotStepper.move(-rot_steps);
  116. curr_rot -= rot_steps;
  117. }*/
  118.  
  119. // Save in pos and rot
  120. if (digitalRead(in_but) == LOW) {
  121. delay(200);
  122. primed = false;
  123. reset = true;
  124. Serial.println("In button pushed");
  125.  
  126. in_pos = curr_pos;
  127. in_rot = curr_rot;
  128.  
  129. if (debug) {
  130. Serial.print("Start Pos: ");
  131. Serial.println(in_pos);
  132. Serial.print("Start Rot: ");
  133. Serial.println(in_rot);
  134. }
  135. }
  136.  
  137. // Save out pos and rot
  138. if (digitalRead(out_but) == LOW) {
  139. delay(200);
  140. primed = false;
  141. reset = true;
  142. Serial.println("Out button pushed");
  143.  
  144. out_pos = curr_pos;
  145. out_rot = curr_rot;
  146.  
  147. if (debug) {
  148. Serial.print("End Pos: ");
  149. Serial.println(out_pos);
  150. Serial.print("End Rot: ");
  151. Serial.println(out_rot);
  152. }
  153. }
  154.  
  155. if (debug) {
  156. Serial.print("Pos: ");
  157. Serial.println(curr_pos);
  158. Serial.print("Rot: ");
  159. Serial.println(curr_rot);
  160. //delay(500);
  161. }
  162.  
  163. // Move whilst start button held
  164. while (digitalRead(start_but) == LOW && reset == true) {
  165. //delay(500);
  166. //if (in_pos == out_pos || in_rot == out_rot && primed == false) { // Uncomment if you want an error if in and out pos AND rot are the same
  167. if (in_pos == out_pos && primed == false) { // Comment out if you don't want an error if in and out pos ONLY are the same
  168. //if (in_rot == out_rot && primed == false) { // Uncomment if you want an error if in and out rot ONLY are the same
  169. PosStepper.move(400);
  170. delay(500):
  171. PosStepper.move(-400);
  172. delay(500):
  173. PosStepper.move(400);
  174. delay(500):
  175. PosStepper.move(-400);
  176. Serial.println("In and out positions identical");
  177. break;
  178. }
  179.  
  180. if (curr_pos != in_pos && primed == false) {
  181. PosStepper.move(stepAmount(curr_pos, in_pos, pos_steps*20));
  182. curr_pos += stepAmount(curr_pos, in_pos, pos_steps)*20;
  183.  
  184. if (debug) {
  185. Serial.print("Moving to start position ");
  186. Serial.print(in_pos);
  187. Serial.print(" from ");
  188. Serial.println(curr_pos);
  189. }
  190. }
  191.  
  192. if (curr_rot != in_rot && primed == false) {
  193. RotStepper.move(stepAmount(curr_rot, in_rot, rot_steps*3));
  194. curr_rot += stepAmount(curr_rot, in_rot, rot_steps)*3;
  195.  
  196. if (debug) {
  197. Serial.print("Moving to start rotation ");
  198. Serial.print(in_rot);
  199. Serial.print(" from ");
  200. Serial.println(curr_rot);
  201. }
  202. }
  203.  
  204. if (curr_pos == in_pos && curr_rot == in_rot) {
  205. primed = true;
  206.  
  207. // Interpolate rotation distance to be proportionate to pos distance
  208. interp_rot_steps = in_rot - out_rot;
  209. interp_rot_steps = interp_rot_steps/(in_pos - out_pos);
  210. interp_rot_steps = interp_rot_steps*rot_steps;
  211.  
  212. // If the interpolated rotation motion is too small, set the steps to 1
  213. if (interp_rot_steps < 1 && interp_rot_steps > 0.1) {
  214. interp_rot_steps = 1;
  215. } else if (interp_rot_steps > -1 && interp_rot_steps < -0.1) {
  216. interp_rot_steps = -1;
  217. } else if (interp_rot_steps >= -0.1 && interp_rot_steps <= 0.1) {
  218. interp_rot_steps = 0;
  219. }
  220.  
  221. PosStepper.begin(moveSpeed, microSteps);
  222. RotStepper.begin(moveSpeed, microSteps);
  223. }
  224.  
  225. if (primed == true) {
  226. //controller.rotate(((in_pos - out_pos)/steps)*360), ((in_rot - out_rot)/steps)*360)));
  227.  
  228. PosStepper.move(stepAmount(in_pos, out_pos, pos_steps));
  229. curr_pos += stepAmount(in_pos, out_pos, pos_steps);
  230.  
  231. RotStepper.move(stepAmount(in_rot, out_rot, abs(interp_rot_steps)));
  232. curr_rot += stepAmount(in_rot, out_rot, abs(interp_rot_steps));
  233.  
  234. if (debug) {
  235. Serial.print("Moving pos ");
  236. Serial.print(curr_pos);
  237. Serial.print(" to ");
  238. Serial.println(out_pos);
  239. Serial.print("Moving rot ");
  240. Serial.print(curr_rot);
  241. Serial.print(" to ");
  242. Serial.println(out_rot);
  243. }
  244.  
  245. if (curr_pos == out_pos) {
  246. primed = false;
  247. reset = false;
  248. PosStepper.begin(initSpeedPos, microSteps);
  249. RotStepper.begin(initSpeedRot, microSteps);
  250. break;
  251. }
  252. }
  253. }
  254.  
  255. pot_pos_before = pot_pos_after;
  256. pot_rot_before = pot_rot_after;
  257. }
  258.  
  259. int stepAmount(int first, int second, int steps) {
  260. if (first > second) {
  261. return -steps;
  262. } else if (first < second) {
  263. return steps;
  264. } else {
  265. return 0;
  266. }
  267. }
  268.  
  269.  
  270. int stepAmountFiltered(int first, int second, int steps) {
  271. if (first > (second+5)) {
  272. return -steps;
  273. } else if (first < (second-5)) {
  274. return steps;
  275. } else {
  276. return 0;
  277. }
  278. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement