Advertisement
AdamBB

Slider Code

Jun 17th, 2019
142
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Arduino 21.23 KB | None | 0 0
  1. #include <Wire.h>
  2. #include <LiquidCrystal_I2C.h>
  3.  
  4.  
  5. LiquidCrystal_I2C lcd(0x27, 20, 4);
  6.  
  7. const int dirPinS = 2;
  8. const int dirPinP = 3;
  9. const int dirPinT = 4;
  10.  
  11. const int stepPinS = 5;
  12. const int stepPinP = 6;
  13. const int stepPinT = 7;
  14.  
  15. const int encoderPinA = A3;
  16. const int encoderPinB = A2;
  17. int encoderPinALast = LOW;
  18. int encoderPinACurrent = LOW;
  19. int encoderPinBCurrent = LOW;
  20.  
  21. unsigned long nextMoveSlide = micros();
  22. unsigned long nextMovePan = micros();
  23. unsigned long nextMoveTilt = micros();
  24.  
  25. unsigned long nextStatRefresh = millis();
  26.  
  27. long globalSlide = 0;
  28. long globalPan = 0;
  29. long globalTilt = 0;
  30. int globalTime = 30;
  31. long pointAS, pointAP, pointAT, pointBS, pointBP, pointBT;
  32. int moveMode = 0;  // 0 = none, 1 = slide, 2 = pan+tilt
  33. int statsMode = 0; // 0 = none, 1 = show current pos, 2 = show point A pos, 3 = show point B pos, 4 = set time
  34. bool statsDisplayed = false;
  35.  
  36. bool regenerateLcdRequired = true;
  37. int regenerateLcdMode = 0;
  38. // 0 = whole screen
  39. // 1 = menu items
  40. // 2 = menu arrow
  41. int currentScreen = 0;
  42. // 0 = home
  43. // 10 = stats index
  44. // 11 = show stats - current pos
  45. // 12 = show stats - A point pos
  46. // 13 = show stats - B point pos
  47. // 20 = set point index
  48. // 21 = set point A
  49. // 22 = set point B
  50. // 30 = go to point index
  51. // 31 = going to point a
  52. // 32 = goint to point b
  53. int currentOptionSelected = 0;
  54. // LCD's line selected in menu
  55.  
  56. int menuLinking[5][5];
  57. // array to map all menu linkings in format [screen][option], for example
  58. // menuLinking[0][3] = 30 means screen 0 (home screen), option 3 (Go to point) links to screen 30 (go to point index)
  59.  
  60. void setZeroPositions() {
  61.   globalSlide = 0;
  62.   globalPan = 0;
  63.   globalTilt = 0;
  64. }
  65.  
  66. void setPointA() {
  67.   pointAS = globalSlide;
  68.   pointAP = globalPan;
  69.   pointAT = globalTilt;
  70.   Serial.println(
  71.     "Set point A - S:" +
  72.     String(pointAS) + " P:" +
  73.     String(pointAP) + " T;" +
  74.     String(pointAT)
  75.   );
  76. }
  77.  
  78. void setPointB() {
  79.   pointBS = globalSlide;
  80.   pointBP = globalPan;
  81.   pointBT = globalTilt;
  82.   Serial.println(
  83.     "Set point B - S:" +
  84.     String(pointBS) + " P:" +
  85.     String(pointBP) + " T;" +
  86.     String(pointBT)
  87.   );
  88. }
  89.  
  90. void showStats() {
  91.    Serial.println("----------");
  92.    Serial.println(
  93.     "Point A - S:" +
  94.     String(pointAS) + " P:" +
  95.     String(pointAP) + " T;" +
  96.     String(pointAT)
  97.   );
  98.   Serial.println(
  99.     "Point B - S:" +
  100.     String(pointBS) + " P:" +
  101.     String(pointBP) + " T;" +
  102.     String(pointBT)
  103.   );
  104.    Serial.println("----------");
  105.    delay(5000);
  106. }
  107.  
  108.  
  109.  
  110. void goToPoint(bool point) {
  111.   long microstepsSlide, microstepsPan, microstepsTilt;
  112.   long afterMoveGlobalSlide, afterMoveGlobalPan, afterMoveGlobalTilt;
  113.   if (point == 0) {
  114.     microstepsSlide = globalSlide - pointAS;
  115.     microstepsPan = globalPan - pointAP;
  116.     microstepsTilt = globalTilt - pointAT;
  117.     afterMoveGlobalSlide = pointAS;
  118.     afterMoveGlobalPan = pointAP;
  119.     afterMoveGlobalTilt = pointAT;
  120.     if(pointAS < globalSlide) {
  121.       digitalWrite(dirPinS, LOW);
  122.     } else {
  123.       digitalWrite(dirPinS, HIGH);
  124.     }
  125.     if(pointAP < globalPan) {
  126.       digitalWrite(dirPinP, LOW);
  127.     } else {
  128.       digitalWrite(dirPinP, HIGH);
  129.     }
  130.     if(pointAT < globalTilt) {
  131.       digitalWrite(dirPinT, LOW);
  132.     } else {
  133.       digitalWrite(dirPinT, HIGH);
  134.     }
  135.      
  136.   } else if (point == 1) {
  137.     microstepsSlide = globalSlide - pointBS;
  138.     microstepsPan = globalPan - pointBP;
  139.     microstepsTilt = globalTilt - pointBT;
  140.     afterMoveGlobalSlide = pointBS;
  141.     afterMoveGlobalPan = pointBP;
  142.     afterMoveGlobalTilt = pointBT;
  143.     if(pointBS < globalSlide) {
  144.       digitalWrite(dirPinS, LOW);
  145.     } else {
  146.       digitalWrite(dirPinS, HIGH);
  147.     }
  148.     if(pointBP < globalPan) {
  149.       digitalWrite(dirPinP, LOW);
  150.     } else {
  151.       digitalWrite(dirPinP, HIGH);
  152.     }
  153.     if(pointBT < globalTilt) {
  154.       digitalWrite(dirPinT, LOW);
  155.     } else {
  156.       digitalWrite(dirPinT, HIGH);
  157.     }
  158.   }
  159.  
  160.   long totalTime = globalTime * 1000000;
  161.   unsigned long nextMoveSlide, nextMovePan, nextMoveTilt;
  162.   bool nextMoveSlideType, nextMovePanType, nextMoveTiltType;
  163.  
  164.   microstepsSlide = abs(microstepsSlide);
  165.   microstepsPan = abs(microstepsPan);
  166.   microstepsTilt = abs(microstepsTilt);
  167.  
  168.   long timeGapSlide = totalTime / microstepsSlide;
  169.   long timeGapPan = totalTime / microstepsPan;
  170.   long timeGapTilt = totalTime / microstepsTilt;
  171.  
  172.   Serial.println("Steps to do SLIDE: " + String(microstepsSlide));
  173.   Serial.println("Steps to do PAN: " + String(microstepsPan));
  174.   Serial.println("Steps to do TILT: " + String(microstepsTilt));
  175.   Serial.println("Miliseconds for movement: " + String(totalTime));
  176.  
  177.   Serial.println("2s to start moving.....");
  178.   delay(2000);
  179.  
  180.   nextMoveSlide = micros();
  181.   nextMovePan = micros();
  182.   nextMoveTilt = micros();
  183.  
  184.   while (
  185.     microstepsSlide > 0 ||
  186.     microstepsPan > 0 ||
  187.     microstepsTilt > 0
  188.   ) {
  189.     bool doSlideMove = 0;
  190.     bool doPanMove = 0;
  191.     bool doTiltMove = 0;
  192.     if (microstepsSlide > 0) {
  193.       if (nextMoveSlide < micros()) {
  194.         doSlideMove = 1;
  195.         microstepsSlide = microstepsSlide - 1;
  196.         nextMoveSlide = nextMoveSlide + timeGapSlide;
  197.       }
  198.     }
  199.  
  200.     if (microstepsPan > 0) {
  201.       if (nextMovePan < micros()) {
  202.         doPanMove = 1;
  203.         microstepsPan = microstepsPan - 1;
  204.         nextMovePan = nextMovePan + timeGapPan;
  205.       }
  206.     }
  207.     if (microstepsTilt > 0) {
  208.       if (nextMoveTilt < micros()) {
  209.         doTiltMove = 1;
  210.         microstepsTilt = microstepsTilt - 1;
  211.         nextMoveTilt = nextMoveTilt + timeGapTilt;
  212.       }
  213.     }
  214.  
  215.     if(doSlideMove) { digitalWrite(stepPinS, HIGH); }
  216.     if(doPanMove) { digitalWrite(stepPinP, HIGH); }
  217.     if(doTiltMove) { digitalWrite(stepPinT, HIGH); }
  218.     delayMicroseconds(20);
  219.     if(doSlideMove) { digitalWrite(stepPinS, LOW); }
  220.     if(doPanMove) { digitalWrite(stepPinP, LOW); }
  221.     if(doTiltMove) { digitalWrite(stepPinT, LOW); }
  222.     delayMicroseconds(20);
  223.   }
  224.  
  225.   globalSlide = afterMoveGlobalSlide;
  226.   globalPan = afterMoveGlobalPan;
  227.   globalTilt = afterMoveGlobalTilt;
  228.   Serial.println("MOVE FINISHED!");
  229. }
  230.  
  231.  
  232. void setup() {
  233.   pinMode(stepPinS,OUTPUT);
  234.   pinMode(stepPinP,OUTPUT);
  235.   pinMode(stepPinT,OUTPUT);
  236.   pinMode(dirPinS,OUTPUT);
  237.   pinMode(dirPinP,OUTPUT);
  238.   pinMode(dirPinT,OUTPUT);
  239.  
  240.   pinMode(A1, INPUT);
  241.   pinMode(A2, INPUT);
  242.   pinMode(A3, INPUT);
  243.   pinMode(A6, INPUT);
  244.   pinMode(A7, INPUT);
  245.  
  246.   Serial.begin(9600);
  247.  
  248.   // ------ currently not in use, but this is desired solution
  249.   // home screen links:
  250.   menuLinking[0][0] = 10;
  251.   menuLinking[0][1] = 20;
  252.   menuLinking[0][2] = 30;
  253.   // stats index screen
  254.   menuLinking[10][0] = 11;
  255.   menuLinking[10][1] = 12;
  256.   menuLinking[10][2] = 13;
  257.   menuLinking[10][3] = 0;
  258.   // set point index screen
  259.   menuLinking[20][0] = 21;
  260.   menuLinking[20][1] = 22;
  261.   menuLinking[20][3] = 0;
  262.   // go to point index screen
  263.   menuLinking[30][0] = 31;
  264.   menuLinking[30][1] = 32;
  265.   menuLinking[30][3] = 0;
  266.   // ----------------------------------
  267.  
  268.   lcd.begin();
  269.   lcd.setCursor(0,0);
  270.   lcd.print("--------------------");
  271.   lcd.setCursor(0,1);
  272.   lcd.print("|    PRO SLIDER    |");
  273.   lcd.setCursor(0,2);
  274.   lcd.print("| 3 axis movement  |");
  275.   lcd.setCursor(0,3);
  276.   lcd.print("--------------------");
  277.   delay(1500);
  278.   lcd.clear();
  279.  
  280.   setZeroPositions();
  281. }
  282.  
  283. int getJoyValue(long value, bool direction) {
  284.   // if direction == 0, analyse lower half of values (eg. left, bottom),
  285.   // if direction == 1, analyse higher half of values (eg right, top)
  286.   if(value >= 520 && direction == 1) {
  287.     return map(value, 520, 1024, 0, 100);
  288.   } else if(value <= 500 && direction == 0) {
  289.     return map(value, 500, 0, 0, 100);
  290.   } else {
  291.     return 0;
  292.   }
  293. }
  294.  
  295. void loop() {
  296.   long joyY = analogRead(6);
  297.   long joyX = analogRead(7);
  298.  
  299.   // bool values - flags if button, encoder of joystick was used
  300.   bool button = analogRead(1) < 50;
  301.   bool encLeft = false;
  302.   bool encRight = false;
  303.   bool joyLeft = joyX < 450;
  304.   bool joyRight = joyX > 570;
  305.   bool joyUp = joyY > 570;
  306.   bool joyDown = joyY < 450;
  307.  
  308.   // int values for joystick input - from 0 to 100 for each direction
  309.   long joyLeftValue = getJoyValue(joyX, 1);
  310.   long joyRightValue = getJoyValue(joyX, 0);
  311.   long joyUpValue = getJoyValue(joyY, 0);
  312.   long joyDownValue = getJoyValue(joyY, 1);
  313.  
  314.   // handling of encoder rotations
  315.   encoderPinACurrent = digitalRead(encoderPinA);
  316.   encoderPinBCurrent = digitalRead(encoderPinB);
  317.   if (encoderPinALast != encoderPinACurrent && encoderPinACurrent == LOW) {
  318.     if (encoderPinBCurrent != encoderPinACurrent) {
  319.       encRight = true;
  320.     } else {
  321.       encLeft = true;
  322.     }
  323.   }
  324.   encoderPinALast = encoderPinACurrent;
  325.  
  326.   // if LCD refreshing was requested, proceed
  327.   if(regenerateLcdRequired) {
  328.     regenerateLcd();
  329.   }
  330.  
  331.   // if button or encoder was used, handle click or menu option change
  332.   if(button || encLeft || encRight) {
  333.     // exclude few screens from encoder move (arrow up/down) handler
  334.     bool disableEncoder;
  335.     if(
  336.       currentScreen == 11 ||  // show current pos. screen
  337.       currentScreen == 12 ||  // show point A pos. screen
  338.       currentScreen == 13 ||  // show point B pos. screen
  339.       currentScreen == 40 ||  // set time screen
  340.       currentScreen == 210 || // set slide of A screen
  341.       currentScreen == 211 || // set pan/tilt of A screen
  342.       currentScreen == 220 || // set slide of B screen
  343.       currentScreen == 221    // set pan/tilt of B screen
  344.     ) {
  345.       disableEncoder = true;
  346.     } else {
  347.       disableEncoder = false;
  348.     }
  349.     if(button) {
  350.       handleEnterClick();
  351.       delay(400); // anti double-click
  352.    } else if(encLeft && !disableEncoder) {
  353.      if(currentOptionSelected > 0) {
  354.        currentOptionSelected--;
  355.        regenerateLcdRequired = true;
  356.        regenerateLcdMode = 2;
  357.      }
  358.    } else if(encRight && !disableEncoder) {
  359.      if(currentOptionSelected < 3) {
  360.        currentOptionSelected++;
  361.        regenerateLcdRequired = true;
  362.        regenerateLcdMode = 2;
  363.      }
  364.    } else if(statsMode = 4) {
  365.      //handle encoder move for setting movement time
  366.      if(encLeft && globalTime > 15) {
  367.        globalTime--;
  368.      } else if(encRight && globalTime < 600) {
  369.        globalTime++;
  370.      }
  371.      statsDisplayed = false; // set to let stats screen render again with new time
  372.    }
  373.   }
  374.  
  375.   // if manual move flag is set and joystick is in sure, proceed with movement
  376.   if(moveMode > 0) {
  377.     if (
  378.       (moveMode == 1 && (joyLeftValue > 0 || joyRightValue > 0)) ||
  379.       (moveMode == 2 && (joyLeftValue > 0 || joyRightValue > 0 || joyUpValue > 0 || joyDownValue > 0))
  380.     ) {
  381.       handleManualMove(joyLeftValue, joyRightValue, joyUpValue, joyDownValue);
  382.     } else if(nextStatRefresh < millis()) {
  383.       lcd.setCursor(0,1);
  384.       lcd.print("Slide " + String(globalSlide) + "     ");
  385.       lcd.setCursor(0,2);
  386.       lcd.print("Pan   " + String(globalPan) + "     ");
  387.       lcd.setCursor(0,3);
  388.       lcd.print("Tilt  " + String(globalTilt) + "     ");
  389.       nextStatRefresh = millis() + 300;
  390.     }
  391.   }
  392.  
  393.   if(statsMode > 0 && !statsDisplayed) {
  394.     lcd.clear();
  395.     if(statsMode == 1) {
  396.       lcd.setCursor(0,0);
  397.       lcd.print("Current position");
  398.       lcd.setCursor(0,1);
  399.       lcd.print("Slide " + String(globalSlide));
  400.       lcd.setCursor(0,2);
  401.       lcd.print("Pan   " + String(globalPan));
  402.       lcd.setCursor(0,3);
  403.       lcd.print("Tilt  " + String(globalTilt));
  404.     } else if(statsMode == 2) {
  405.       lcd.setCursor(0,0);
  406.       lcd.print("Point A position");
  407.       lcd.setCursor(0,1);
  408.       lcd.print("Slide " + String(pointAS));
  409.       lcd.setCursor(0,2);
  410.       lcd.print("Pan   " + String(pointAP));
  411.       lcd.setCursor(0,3);
  412.       lcd.print("Tilt  " + String(pointAT));
  413.     } else if(statsMode == 3) {
  414.       lcd.setCursor(0,0);
  415.       lcd.print("Point B position");
  416.       lcd.setCursor(0,1);
  417.       lcd.print("Slide " + String(pointBS));
  418.       lcd.setCursor(0,2);
  419.       lcd.print("Pan   " + String(pointBP));
  420.       lcd.setCursor(0,3);
  421.       lcd.print("Tilt  " + String(pointBT));
  422.     } else if(statsMode == 4) {
  423.       lcd.setCursor(0,0);
  424.       lcd.print("Set movement time");
  425.       lcd.setCursor(0,1);
  426.       lcd.print(String(globalTime) + " s.");
  427.     }
  428.     statsDisplayed = true; // set true so it won't be rendered again in next loop iterations
  429.   }
  430.  
  431. }
  432.  
  433. void regenerateLcd() {
  434.   if(regenerateLcdMode == 0) {
  435.     currentOptionSelected = 0;
  436.     lcd.clear();
  437.     regenerateLcdMenuItems();
  438.     regenerateLcdMenuArrow();
  439.   } else if(regenerateLcdMode == 1) {
  440.     regenerateLcdMenuItems();
  441.   } else if(regenerateLcdMode == 2) {
  442.     regenerateLcdMenuArrow();
  443.   }
  444.   regenerateLcdRequired = false;
  445. }
  446.  
  447. void regenerateLcdMenuItems() {
  448.   if(currentScreen == 0) {
  449.     char menuOptions[4][18] = {
  450.       "Show current data",
  451.       "Set target points",
  452.       "Go to point",
  453.       "Set Time"
  454.     };
  455.     drawMenuOptions(menuOptions);
  456.   } else if(currentScreen == 10) {
  457.     char menuOptions[4][18] = {
  458.       "Show current pos.",
  459.       "Show point A pos.",
  460.       "Show point B pos.",
  461.       "Return"
  462.     };
  463.     drawMenuOptions(menuOptions);
  464.   } else if(currentScreen == 20) {
  465.     char menuOptions[4][18] = {
  466.       "Set point A",
  467.       "Set point B",
  468.       "",
  469.       "Return"
  470.     };
  471.     drawMenuOptions(menuOptions);
  472.   } else if(currentScreen == 21) {
  473.     char menuOptions[4][18] = {
  474.       "Set SLIDE of A",
  475.       "Set PAN/TILT of A",
  476.       "",
  477.       "Save"
  478.     };
  479.     drawMenuOptions(menuOptions);
  480.   } else if(currentScreen == 210) {
  481.     lcd.clear();
  482.     lcd.setCursor(1,0);
  483.     lcd.print("Set SLIDE of A");
  484.   } else if(currentScreen == 211) {
  485.     lcd.clear();
  486.     lcd.setCursor(1,0);
  487.     lcd.print("Set PAN/TILT of A");
  488.   } else if(currentScreen == 22) {
  489.     char menuOptions[4][18] = {
  490.       "Set SLIDE of B",
  491.       "Set PAN/TILT of B",
  492.       "",
  493.       "Save"
  494.     };
  495.     drawMenuOptions(menuOptions);
  496.   } else if(currentScreen == 220) {
  497.     lcd.clear();
  498.     lcd.setCursor(1,0);
  499.     lcd.print("Set SLIDE of B");
  500.   } else if(currentScreen == 221) {
  501.     lcd.clear();
  502.     lcd.setCursor(1,0);
  503.     lcd.print("Set PAN/TILT of B");
  504.   } else if(currentScreen == 30) {
  505.     char menuOptions[4][18] = {
  506.       "Go to point A",
  507.       "Go to point B",
  508.       "",
  509.       "Return"
  510.     };
  511.     drawMenuOptions(menuOptions);
  512.   } else if(
  513.     currentScreen == 11 ||
  514.     currentScreen == 12 ||
  515.     currentScreen == 13 ||
  516.     currentScreen == 14 ||
  517.     currentScreen == 40
  518.   ) {
  519.     // no handling here, but empty handler needed to not redrawing menu options (instruction below)
  520.   } else {
  521.     char menuOptions[4][18] = { "", "", "", ""};
  522.     drawMenuOptions(menuOptions);
  523.   }
  524. }
  525.  
  526. void regenerateLcdMenuArrow() {
  527.   for(int i=0; i<=3; i++) {
  528.     lcd.setCursor(0, i);
  529.     if(i == currentOptionSelected) {
  530.       lcd.print(">");
  531.     } else {
  532.       lcd.print(" ");
  533.     }
  534.   }
  535. }
  536.  
  537. void drawMenuOptions(char lines[4][18]) {
  538.   for (int i=0; i<=3; i++) {
  539.     lcd.setCursor(2,i);
  540.     for (int j=0; j<sizeof(lines[i]); j++) {
  541.       // TODO find better way to inserting spaces if array item is not defined
  542.       // if(lines[i][j] == NULL) {
  543.       //   lines[i][j] = " ";
  544.       // }
  545.     }
  546.     lcd.print(String(lines[i]));
  547.   }
  548. }
  549.  
  550. void handleEnterClick(){
  551.   regenerateLcdMode = 0; // just in case if regenerate LCD will be requested
  552.   if(currentScreen == 0) {
  553.     // home screen links:
  554.     if(currentOptionSelected == 0) {
  555.       currentScreen = 10;
  556.       regenerateLcdRequired = true;
  557.     } else if(currentOptionSelected == 1) {
  558.       currentScreen = 20;
  559.       regenerateLcdRequired = true;
  560.     } else if(currentOptionSelected == 2) {
  561.       currentScreen = 30;
  562.       regenerateLcdRequired = true;
  563.     } else if(currentOptionSelected == 3) {
  564.       currentScreen = 40;
  565.       statsMode = 4;
  566.       statsDisplayed = false;
  567.     }
  568.   } else if(currentScreen == 10) {
  569.     // stats index screen
  570.     if(currentOptionSelected == 0) {
  571.       currentScreen = 11;
  572.       statsMode = 1;
  573.       statsDisplayed = false;
  574.     } else if(currentOptionSelected == 1) {
  575.       currentScreen = 12;
  576.       statsMode = 2;
  577.       statsDisplayed = false;
  578.     } else if(currentOptionSelected == 2) {
  579.       currentScreen = 13;
  580.       statsMode = 3;
  581.       statsDisplayed = false;
  582.     } else if(currentOptionSelected == 3) {
  583.       currentScreen = 0;
  584.       regenerateLcdRequired = true;
  585.     }
  586.   } else if(currentScreen == 11) {
  587.     currentScreen = 10;
  588.     statsMode = 0;
  589.     regenerateLcdRequired = true;
  590.   } else if(currentScreen == 12) {
  591.     currentScreen = 10;
  592.     statsMode = 0;
  593.     regenerateLcdRequired = true;
  594.   } else if(currentScreen == 13) {
  595.     currentScreen = 10;
  596.     statsMode = 0;
  597.     regenerateLcdRequired = true;
  598.   } else if(currentScreen == 20) {
  599.     // set point index screen
  600.     if(currentOptionSelected == 0) {
  601.       currentScreen = 21;
  602.       regenerateLcdRequired = true;
  603.     } else if(currentOptionSelected == 1) {
  604.       currentScreen = 22;
  605.       regenerateLcdRequired = true;
  606.     } else if(currentOptionSelected == 3) {
  607.       currentScreen = 0;
  608.       regenerateLcdRequired = true;
  609.     }
  610.   } else if(currentScreen == 21) {
  611.     // set point A screen
  612.     if(currentOptionSelected == 0) {
  613.       currentScreen = 210;
  614.       moveMode = 1;
  615.       regenerateLcdRequired = true;
  616.     } else if(currentOptionSelected == 1) {
  617.       currentScreen = 211;
  618.       moveMode = 2;
  619.       regenerateLcdRequired = true;
  620.     } else if(currentOptionSelected == 3) {
  621.       currentScreen = 20;
  622.       setPointA();
  623.       regenerateLcdRequired = true;
  624.     }
  625.   } else if(currentScreen == 210) {
  626.     moveMode = 0;
  627.     currentScreen = 21;
  628.     regenerateLcdRequired = true;
  629.   } else if(currentScreen == 211) {
  630.     moveMode = 0;
  631.     currentScreen = 21;
  632.     regenerateLcdRequired = true;
  633.   } else if(currentScreen == 22) {
  634.     // set point B screen
  635.     if(currentOptionSelected == 0) {
  636.       currentScreen = 220;
  637.       moveMode = 1;
  638.       regenerateLcdRequired = true;
  639.     } else if(currentOptionSelected == 1) {
  640.       currentScreen = 221;
  641.       moveMode = 2;
  642.       regenerateLcdRequired = true;
  643.     } else if(currentOptionSelected == 3) {
  644.       setPointB();
  645.       currentScreen = 20;
  646.       regenerateLcdRequired = true;
  647.     }
  648.   } else if(currentScreen == 220) {
  649.     moveMode = 0;
  650.     currentScreen = 22;
  651.     regenerateLcdRequired = true;
  652.   } else if(currentScreen == 221) {
  653.     moveMode = 0;
  654.     currentScreen = 22;
  655.     regenerateLcdRequired = true;
  656.   } else if(currentScreen == 30) {
  657.     // go to point index screen
  658.     if(currentOptionSelected == 0) {
  659.       goToPoint(0);
  660.     } else if(currentOptionSelected == 1) {
  661.       goToPoint(1);
  662.     } else if(currentOptionSelected == 3) {
  663.       currentScreen = 0;
  664.       regenerateLcdRequired = true;
  665.     }
  666.   } else if(currentScreen == 40) {
  667.     currentScreen = 0;
  668.     regenerateLcdRequired = true;
  669.   }
  670. }
  671.  
  672. void handleManualMove(int joyLeftValue, int joyRightValue, int joyUpValue, int joyDownValue) {
  673.   bool doSlideMove = false;
  674.   bool doPanMove = false;
  675.   bool doTiltMove = false;
  676.   long timeGapSlide = 0;
  677.   long timeGapPan = 0;
  678.   long timeGapTilt = 0;
  679.   bool dirS, dirP, dirT;
  680.   bool slideMoveSet = false;
  681.   bool panMoveSet = false;
  682.   bool tiltMoveSet = false;
  683.  
  684.   if(moveMode == 1 && (joyLeftValue || joyRightValue) ) {
  685.     if(joyLeftValue > 0) {
  686.       digitalWrite(dirPinS, HIGH);
  687.       dirS = 1;
  688.       slideMoveSet = true;
  689.       timeGapSlide = map(joyLeftValue, 0, 100, 2000, 40);
  690.     } else {
  691.       digitalWrite(dirPinS, LOW);
  692.       dirS = 0;
  693.       slideMoveSet = true;
  694.       timeGapSlide = map(joyRightValue, 0, 100, 2000, 40);
  695.     }
  696.     if (slideMoveSet && nextMoveSlide < micros()) {
  697.       doSlideMove = 1;
  698.       nextMoveSlide = micros() + timeGapSlide;
  699.     }
  700.   } else if(moveMode == 2) {
  701.     if(joyLeftValue > 0) {
  702.       digitalWrite(dirPinP, HIGH);
  703.       dirP = 1;
  704.       panMoveSet = true;
  705.       timeGapPan = map(joyLeftValue, 0, 100, 5000, 1500);
  706.     } else if(joyRightValue > 0) {
  707.       digitalWrite(dirPinP, LOW);
  708.       dirP = 0;
  709.       panMoveSet = true;
  710.       timeGapPan = map(joyRightValue, 0, 100, 5000, 1500);
  711.     }
  712.     if(joyUpValue > 0) {
  713.       digitalWrite(dirPinT, HIGH);
  714.       dirT = 1;
  715.       tiltMoveSet = true;
  716.       timeGapTilt = map(joyUpValue, 0, 100, 5000, 1500);
  717.     } else if(joyDownValue > 0) {
  718.       digitalWrite(dirPinT, LOW);
  719.       dirT = 0;
  720.       tiltMoveSet = true;
  721.       timeGapTilt = map(joyDownValue, 0, 100, 5000, 1500);
  722.     }
  723.     timeGapPan = timeGapPan * 2;
  724.     timeGapTilt = timeGapTilt * 2;
  725.     if (panMoveSet && nextMovePan < micros()) {
  726.       doPanMove = 1;
  727.       nextMovePan = micros() + timeGapPan;
  728.     }
  729.     if (tiltMoveSet && nextMoveTilt < micros()) {
  730.       doTiltMove = 1;
  731.       nextMoveTilt = micros() + timeGapTilt;
  732.     }
  733.   }
  734.  
  735.   if(doSlideMove) { digitalWrite(stepPinS, HIGH); }
  736.   if(doPanMove) { digitalWrite(stepPinP, HIGH); }
  737.   if(doTiltMove) { digitalWrite(stepPinT, HIGH); }
  738.   delayMicroseconds(10);
  739.   if(doSlideMove) {
  740.     digitalWrite(stepPinS, LOW);
  741.     if(dirS) {
  742.       globalSlide++;
  743.     } else {
  744.       globalSlide--;
  745.     }
  746.   }
  747.   if(doPanMove) {
  748.     digitalWrite(stepPinP, LOW);
  749.     if(dirP) {
  750.       globalPan++;
  751.     } else {
  752.       globalPan--;
  753.     }
  754.   }
  755.   if(doTiltMove) {
  756.     digitalWrite(stepPinT, LOW);
  757.     if(dirT) {
  758.       globalTilt++;
  759.     } else {
  760.       globalTilt--;
  761.     }
  762.   }
  763.   delayMicroseconds(10);
  764. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement