Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <Wire.h>
- #include <LiquidCrystal_I2C.h>
- LiquidCrystal_I2C lcd(0x27, 20, 4);
- const int dirPinS = 2;
- const int dirPinP = 3;
- const int dirPinT = 4;
- const int stepPinS = 5;
- const int stepPinP = 6;
- const int stepPinT = 7;
- const int encoderPinA = A3;
- const int encoderPinB = A2;
- int encoderPinALast = LOW;
- int encoderPinACurrent = LOW;
- int encoderPinBCurrent = LOW;
- unsigned long nextMoveSlide = micros();
- unsigned long nextMovePan = micros();
- unsigned long nextMoveTilt = micros();
- unsigned long nextStatRefresh = millis();
- long globalSlide = 0;
- long globalPan = 0;
- long globalTilt = 0;
- int globalTime = 30;
- long pointAS, pointAP, pointAT, pointBS, pointBP, pointBT;
- int moveMode = 0; // 0 = none, 1 = slide, 2 = pan+tilt
- int statsMode = 0; // 0 = none, 1 = show current pos, 2 = show point A pos, 3 = show point B pos, 4 = set time
- bool statsDisplayed = false;
- bool regenerateLcdRequired = true;
- int regenerateLcdMode = 0;
- // 0 = whole screen
- // 1 = menu items
- // 2 = menu arrow
- int currentScreen = 0;
- // 0 = home
- // 10 = stats index
- // 11 = show stats - current pos
- // 12 = show stats - A point pos
- // 13 = show stats - B point pos
- // 20 = set point index
- // 21 = set point A
- // 22 = set point B
- // 30 = go to point index
- // 31 = going to point a
- // 32 = goint to point b
- int currentOptionSelected = 0;
- // LCD's line selected in menu
- int menuLinking[5][5];
- // array to map all menu linkings in format [screen][option], for example
- // menuLinking[0][3] = 30 means screen 0 (home screen), option 3 (Go to point) links to screen 30 (go to point index)
- void setZeroPositions() {
- globalSlide = 0;
- globalPan = 0;
- globalTilt = 0;
- }
- void setPointA() {
- pointAS = globalSlide;
- pointAP = globalPan;
- pointAT = globalTilt;
- Serial.println(
- "Set point A - S:" +
- String(pointAS) + " P:" +
- String(pointAP) + " T;" +
- String(pointAT)
- );
- }
- void setPointB() {
- pointBS = globalSlide;
- pointBP = globalPan;
- pointBT = globalTilt;
- Serial.println(
- "Set point B - S:" +
- String(pointBS) + " P:" +
- String(pointBP) + " T;" +
- String(pointBT)
- );
- }
- void showStats() {
- Serial.println("----------");
- Serial.println(
- "Point A - S:" +
- String(pointAS) + " P:" +
- String(pointAP) + " T;" +
- String(pointAT)
- );
- Serial.println(
- "Point B - S:" +
- String(pointBS) + " P:" +
- String(pointBP) + " T;" +
- String(pointBT)
- );
- Serial.println("----------");
- delay(5000);
- }
- void goToPoint(bool point) {
- long microstepsSlide, microstepsPan, microstepsTilt;
- long afterMoveGlobalSlide, afterMoveGlobalPan, afterMoveGlobalTilt;
- if (point == 0) {
- microstepsSlide = globalSlide - pointAS;
- microstepsPan = globalPan - pointAP;
- microstepsTilt = globalTilt - pointAT;
- afterMoveGlobalSlide = pointAS;
- afterMoveGlobalPan = pointAP;
- afterMoveGlobalTilt = pointAT;
- if(pointAS < globalSlide) {
- digitalWrite(dirPinS, LOW);
- } else {
- digitalWrite(dirPinS, HIGH);
- }
- if(pointAP < globalPan) {
- digitalWrite(dirPinP, LOW);
- } else {
- digitalWrite(dirPinP, HIGH);
- }
- if(pointAT < globalTilt) {
- digitalWrite(dirPinT, LOW);
- } else {
- digitalWrite(dirPinT, HIGH);
- }
- } else if (point == 1) {
- microstepsSlide = globalSlide - pointBS;
- microstepsPan = globalPan - pointBP;
- microstepsTilt = globalTilt - pointBT;
- afterMoveGlobalSlide = pointBS;
- afterMoveGlobalPan = pointBP;
- afterMoveGlobalTilt = pointBT;
- if(pointBS < globalSlide) {
- digitalWrite(dirPinS, LOW);
- } else {
- digitalWrite(dirPinS, HIGH);
- }
- if(pointBP < globalPan) {
- digitalWrite(dirPinP, LOW);
- } else {
- digitalWrite(dirPinP, HIGH);
- }
- if(pointBT < globalTilt) {
- digitalWrite(dirPinT, LOW);
- } else {
- digitalWrite(dirPinT, HIGH);
- }
- }
- long totalTime = globalTime * 1000000;
- unsigned long nextMoveSlide, nextMovePan, nextMoveTilt;
- bool nextMoveSlideType, nextMovePanType, nextMoveTiltType;
- microstepsSlide = abs(microstepsSlide);
- microstepsPan = abs(microstepsPan);
- microstepsTilt = abs(microstepsTilt);
- long timeGapSlide = totalTime / microstepsSlide;
- long timeGapPan = totalTime / microstepsPan;
- long timeGapTilt = totalTime / microstepsTilt;
- Serial.println("Steps to do SLIDE: " + String(microstepsSlide));
- Serial.println("Steps to do PAN: " + String(microstepsPan));
- Serial.println("Steps to do TILT: " + String(microstepsTilt));
- Serial.println("Miliseconds for movement: " + String(totalTime));
- Serial.println("2s to start moving.....");
- delay(2000);
- nextMoveSlide = micros();
- nextMovePan = micros();
- nextMoveTilt = micros();
- while (
- microstepsSlide > 0 ||
- microstepsPan > 0 ||
- microstepsTilt > 0
- ) {
- bool doSlideMove = 0;
- bool doPanMove = 0;
- bool doTiltMove = 0;
- if (microstepsSlide > 0) {
- if (nextMoveSlide < micros()) {
- doSlideMove = 1;
- microstepsSlide = microstepsSlide - 1;
- nextMoveSlide = nextMoveSlide + timeGapSlide;
- }
- }
- if (microstepsPan > 0) {
- if (nextMovePan < micros()) {
- doPanMove = 1;
- microstepsPan = microstepsPan - 1;
- nextMovePan = nextMovePan + timeGapPan;
- }
- }
- if (microstepsTilt > 0) {
- if (nextMoveTilt < micros()) {
- doTiltMove = 1;
- microstepsTilt = microstepsTilt - 1;
- nextMoveTilt = nextMoveTilt + timeGapTilt;
- }
- }
- if(doSlideMove) { digitalWrite(stepPinS, HIGH); }
- if(doPanMove) { digitalWrite(stepPinP, HIGH); }
- if(doTiltMove) { digitalWrite(stepPinT, HIGH); }
- delayMicroseconds(20);
- if(doSlideMove) { digitalWrite(stepPinS, LOW); }
- if(doPanMove) { digitalWrite(stepPinP, LOW); }
- if(doTiltMove) { digitalWrite(stepPinT, LOW); }
- delayMicroseconds(20);
- }
- globalSlide = afterMoveGlobalSlide;
- globalPan = afterMoveGlobalPan;
- globalTilt = afterMoveGlobalTilt;
- Serial.println("MOVE FINISHED!");
- }
- void setup() {
- pinMode(stepPinS,OUTPUT);
- pinMode(stepPinP,OUTPUT);
- pinMode(stepPinT,OUTPUT);
- pinMode(dirPinS,OUTPUT);
- pinMode(dirPinP,OUTPUT);
- pinMode(dirPinT,OUTPUT);
- pinMode(A1, INPUT);
- pinMode(A2, INPUT);
- pinMode(A3, INPUT);
- pinMode(A6, INPUT);
- pinMode(A7, INPUT);
- Serial.begin(9600);
- // ------ currently not in use, but this is desired solution
- // home screen links:
- menuLinking[0][0] = 10;
- menuLinking[0][1] = 20;
- menuLinking[0][2] = 30;
- // stats index screen
- menuLinking[10][0] = 11;
- menuLinking[10][1] = 12;
- menuLinking[10][2] = 13;
- menuLinking[10][3] = 0;
- // set point index screen
- menuLinking[20][0] = 21;
- menuLinking[20][1] = 22;
- menuLinking[20][3] = 0;
- // go to point index screen
- menuLinking[30][0] = 31;
- menuLinking[30][1] = 32;
- menuLinking[30][3] = 0;
- // ----------------------------------
- lcd.begin();
- lcd.setCursor(0,0);
- lcd.print("--------------------");
- lcd.setCursor(0,1);
- lcd.print("| PRO SLIDER |");
- lcd.setCursor(0,2);
- lcd.print("| 3 axis movement |");
- lcd.setCursor(0,3);
- lcd.print("--------------------");
- delay(1500);
- lcd.clear();
- setZeroPositions();
- }
- int getJoyValue(long value, bool direction) {
- // if direction == 0, analyse lower half of values (eg. left, bottom),
- // if direction == 1, analyse higher half of values (eg right, top)
- if(value >= 520 && direction == 1) {
- return map(value, 520, 1024, 0, 100);
- } else if(value <= 500 && direction == 0) {
- return map(value, 500, 0, 0, 100);
- } else {
- return 0;
- }
- }
- void loop() {
- long joyY = analogRead(6);
- long joyX = analogRead(7);
- // bool values - flags if button, encoder of joystick was used
- bool button = analogRead(1) < 50;
- bool encLeft = false;
- bool encRight = false;
- bool joyLeft = joyX < 450;
- bool joyRight = joyX > 570;
- bool joyUp = joyY > 570;
- bool joyDown = joyY < 450;
- // int values for joystick input - from 0 to 100 for each direction
- long joyLeftValue = getJoyValue(joyX, 1);
- long joyRightValue = getJoyValue(joyX, 0);
- long joyUpValue = getJoyValue(joyY, 0);
- long joyDownValue = getJoyValue(joyY, 1);
- // handling of encoder rotations
- encoderPinACurrent = digitalRead(encoderPinA);
- encoderPinBCurrent = digitalRead(encoderPinB);
- if (encoderPinALast != encoderPinACurrent && encoderPinACurrent == LOW) {
- if (encoderPinBCurrent != encoderPinACurrent) {
- encRight = true;
- } else {
- encLeft = true;
- }
- }
- encoderPinALast = encoderPinACurrent;
- // if LCD refreshing was requested, proceed
- if(regenerateLcdRequired) {
- regenerateLcd();
- }
- // if button or encoder was used, handle click or menu option change
- if(button || encLeft || encRight) {
- // exclude few screens from encoder move (arrow up/down) handler
- bool disableEncoder;
- if(
- currentScreen == 11 || // show current pos. screen
- currentScreen == 12 || // show point A pos. screen
- currentScreen == 13 || // show point B pos. screen
- currentScreen == 40 || // set time screen
- currentScreen == 210 || // set slide of A screen
- currentScreen == 211 || // set pan/tilt of A screen
- currentScreen == 220 || // set slide of B screen
- currentScreen == 221 // set pan/tilt of B screen
- ) {
- disableEncoder = true;
- } else {
- disableEncoder = false;
- }
- if(button) {
- handleEnterClick();
- delay(400); // anti double-click
- } else if(encLeft && !disableEncoder) {
- if(currentOptionSelected > 0) {
- currentOptionSelected--;
- regenerateLcdRequired = true;
- regenerateLcdMode = 2;
- }
- } else if(encRight && !disableEncoder) {
- if(currentOptionSelected < 3) {
- currentOptionSelected++;
- regenerateLcdRequired = true;
- regenerateLcdMode = 2;
- }
- } else if(statsMode = 4) {
- //handle encoder move for setting movement time
- if(encLeft && globalTime > 15) {
- globalTime--;
- } else if(encRight && globalTime < 600) {
- globalTime++;
- }
- statsDisplayed = false; // set to let stats screen render again with new time
- }
- }
- // if manual move flag is set and joystick is in sure, proceed with movement
- if(moveMode > 0) {
- if (
- (moveMode == 1 && (joyLeftValue > 0 || joyRightValue > 0)) ||
- (moveMode == 2 && (joyLeftValue > 0 || joyRightValue > 0 || joyUpValue > 0 || joyDownValue > 0))
- ) {
- handleManualMove(joyLeftValue, joyRightValue, joyUpValue, joyDownValue);
- } else if(nextStatRefresh < millis()) {
- lcd.setCursor(0,1);
- lcd.print("Slide " + String(globalSlide) + " ");
- lcd.setCursor(0,2);
- lcd.print("Pan " + String(globalPan) + " ");
- lcd.setCursor(0,3);
- lcd.print("Tilt " + String(globalTilt) + " ");
- nextStatRefresh = millis() + 300;
- }
- }
- if(statsMode > 0 && !statsDisplayed) {
- lcd.clear();
- if(statsMode == 1) {
- lcd.setCursor(0,0);
- lcd.print("Current position");
- lcd.setCursor(0,1);
- lcd.print("Slide " + String(globalSlide));
- lcd.setCursor(0,2);
- lcd.print("Pan " + String(globalPan));
- lcd.setCursor(0,3);
- lcd.print("Tilt " + String(globalTilt));
- } else if(statsMode == 2) {
- lcd.setCursor(0,0);
- lcd.print("Point A position");
- lcd.setCursor(0,1);
- lcd.print("Slide " + String(pointAS));
- lcd.setCursor(0,2);
- lcd.print("Pan " + String(pointAP));
- lcd.setCursor(0,3);
- lcd.print("Tilt " + String(pointAT));
- } else if(statsMode == 3) {
- lcd.setCursor(0,0);
- lcd.print("Point B position");
- lcd.setCursor(0,1);
- lcd.print("Slide " + String(pointBS));
- lcd.setCursor(0,2);
- lcd.print("Pan " + String(pointBP));
- lcd.setCursor(0,3);
- lcd.print("Tilt " + String(pointBT));
- } else if(statsMode == 4) {
- lcd.setCursor(0,0);
- lcd.print("Set movement time");
- lcd.setCursor(0,1);
- lcd.print(String(globalTime) + " s.");
- }
- statsDisplayed = true; // set true so it won't be rendered again in next loop iterations
- }
- }
- void regenerateLcd() {
- if(regenerateLcdMode == 0) {
- currentOptionSelected = 0;
- lcd.clear();
- regenerateLcdMenuItems();
- regenerateLcdMenuArrow();
- } else if(regenerateLcdMode == 1) {
- regenerateLcdMenuItems();
- } else if(regenerateLcdMode == 2) {
- regenerateLcdMenuArrow();
- }
- regenerateLcdRequired = false;
- }
- void regenerateLcdMenuItems() {
- if(currentScreen == 0) {
- char menuOptions[4][18] = {
- "Show current data",
- "Set target points",
- "Go to point",
- "Set Time"
- };
- drawMenuOptions(menuOptions);
- } else if(currentScreen == 10) {
- char menuOptions[4][18] = {
- "Show current pos.",
- "Show point A pos.",
- "Show point B pos.",
- "Return"
- };
- drawMenuOptions(menuOptions);
- } else if(currentScreen == 20) {
- char menuOptions[4][18] = {
- "Set point A",
- "Set point B",
- "",
- "Return"
- };
- drawMenuOptions(menuOptions);
- } else if(currentScreen == 21) {
- char menuOptions[4][18] = {
- "Set SLIDE of A",
- "Set PAN/TILT of A",
- "",
- "Save"
- };
- drawMenuOptions(menuOptions);
- } else if(currentScreen == 210) {
- lcd.clear();
- lcd.setCursor(1,0);
- lcd.print("Set SLIDE of A");
- } else if(currentScreen == 211) {
- lcd.clear();
- lcd.setCursor(1,0);
- lcd.print("Set PAN/TILT of A");
- } else if(currentScreen == 22) {
- char menuOptions[4][18] = {
- "Set SLIDE of B",
- "Set PAN/TILT of B",
- "",
- "Save"
- };
- drawMenuOptions(menuOptions);
- } else if(currentScreen == 220) {
- lcd.clear();
- lcd.setCursor(1,0);
- lcd.print("Set SLIDE of B");
- } else if(currentScreen == 221) {
- lcd.clear();
- lcd.setCursor(1,0);
- lcd.print("Set PAN/TILT of B");
- } else if(currentScreen == 30) {
- char menuOptions[4][18] = {
- "Go to point A",
- "Go to point B",
- "",
- "Return"
- };
- drawMenuOptions(menuOptions);
- } else if(
- currentScreen == 11 ||
- currentScreen == 12 ||
- currentScreen == 13 ||
- currentScreen == 14 ||
- currentScreen == 40
- ) {
- // no handling here, but empty handler needed to not redrawing menu options (instruction below)
- } else {
- char menuOptions[4][18] = { "", "", "", ""};
- drawMenuOptions(menuOptions);
- }
- }
- void regenerateLcdMenuArrow() {
- for(int i=0; i<=3; i++) {
- lcd.setCursor(0, i);
- if(i == currentOptionSelected) {
- lcd.print(">");
- } else {
- lcd.print(" ");
- }
- }
- }
- void drawMenuOptions(char lines[4][18]) {
- for (int i=0; i<=3; i++) {
- lcd.setCursor(2,i);
- for (int j=0; j<sizeof(lines[i]); j++) {
- // TODO find better way to inserting spaces if array item is not defined
- // if(lines[i][j] == NULL) {
- // lines[i][j] = " ";
- // }
- }
- lcd.print(String(lines[i]));
- }
- }
- void handleEnterClick(){
- regenerateLcdMode = 0; // just in case if regenerate LCD will be requested
- if(currentScreen == 0) {
- // home screen links:
- if(currentOptionSelected == 0) {
- currentScreen = 10;
- regenerateLcdRequired = true;
- } else if(currentOptionSelected == 1) {
- currentScreen = 20;
- regenerateLcdRequired = true;
- } else if(currentOptionSelected == 2) {
- currentScreen = 30;
- regenerateLcdRequired = true;
- } else if(currentOptionSelected == 3) {
- currentScreen = 40;
- statsMode = 4;
- statsDisplayed = false;
- }
- } else if(currentScreen == 10) {
- // stats index screen
- if(currentOptionSelected == 0) {
- currentScreen = 11;
- statsMode = 1;
- statsDisplayed = false;
- } else if(currentOptionSelected == 1) {
- currentScreen = 12;
- statsMode = 2;
- statsDisplayed = false;
- } else if(currentOptionSelected == 2) {
- currentScreen = 13;
- statsMode = 3;
- statsDisplayed = false;
- } else if(currentOptionSelected == 3) {
- currentScreen = 0;
- regenerateLcdRequired = true;
- }
- } else if(currentScreen == 11) {
- currentScreen = 10;
- statsMode = 0;
- regenerateLcdRequired = true;
- } else if(currentScreen == 12) {
- currentScreen = 10;
- statsMode = 0;
- regenerateLcdRequired = true;
- } else if(currentScreen == 13) {
- currentScreen = 10;
- statsMode = 0;
- regenerateLcdRequired = true;
- } else if(currentScreen == 20) {
- // set point index screen
- if(currentOptionSelected == 0) {
- currentScreen = 21;
- regenerateLcdRequired = true;
- } else if(currentOptionSelected == 1) {
- currentScreen = 22;
- regenerateLcdRequired = true;
- } else if(currentOptionSelected == 3) {
- currentScreen = 0;
- regenerateLcdRequired = true;
- }
- } else if(currentScreen == 21) {
- // set point A screen
- if(currentOptionSelected == 0) {
- currentScreen = 210;
- moveMode = 1;
- regenerateLcdRequired = true;
- } else if(currentOptionSelected == 1) {
- currentScreen = 211;
- moveMode = 2;
- regenerateLcdRequired = true;
- } else if(currentOptionSelected == 3) {
- currentScreen = 20;
- setPointA();
- regenerateLcdRequired = true;
- }
- } else if(currentScreen == 210) {
- moveMode = 0;
- currentScreen = 21;
- regenerateLcdRequired = true;
- } else if(currentScreen == 211) {
- moveMode = 0;
- currentScreen = 21;
- regenerateLcdRequired = true;
- } else if(currentScreen == 22) {
- // set point B screen
- if(currentOptionSelected == 0) {
- currentScreen = 220;
- moveMode = 1;
- regenerateLcdRequired = true;
- } else if(currentOptionSelected == 1) {
- currentScreen = 221;
- moveMode = 2;
- regenerateLcdRequired = true;
- } else if(currentOptionSelected == 3) {
- setPointB();
- currentScreen = 20;
- regenerateLcdRequired = true;
- }
- } else if(currentScreen == 220) {
- moveMode = 0;
- currentScreen = 22;
- regenerateLcdRequired = true;
- } else if(currentScreen == 221) {
- moveMode = 0;
- currentScreen = 22;
- regenerateLcdRequired = true;
- } else if(currentScreen == 30) {
- // go to point index screen
- if(currentOptionSelected == 0) {
- goToPoint(0);
- } else if(currentOptionSelected == 1) {
- goToPoint(1);
- } else if(currentOptionSelected == 3) {
- currentScreen = 0;
- regenerateLcdRequired = true;
- }
- } else if(currentScreen == 40) {
- currentScreen = 0;
- regenerateLcdRequired = true;
- }
- }
- void handleManualMove(int joyLeftValue, int joyRightValue, int joyUpValue, int joyDownValue) {
- bool doSlideMove = false;
- bool doPanMove = false;
- bool doTiltMove = false;
- long timeGapSlide = 0;
- long timeGapPan = 0;
- long timeGapTilt = 0;
- bool dirS, dirP, dirT;
- bool slideMoveSet = false;
- bool panMoveSet = false;
- bool tiltMoveSet = false;
- if(moveMode == 1 && (joyLeftValue || joyRightValue) ) {
- if(joyLeftValue > 0) {
- digitalWrite(dirPinS, HIGH);
- dirS = 1;
- slideMoveSet = true;
- timeGapSlide = map(joyLeftValue, 0, 100, 2000, 40);
- } else {
- digitalWrite(dirPinS, LOW);
- dirS = 0;
- slideMoveSet = true;
- timeGapSlide = map(joyRightValue, 0, 100, 2000, 40);
- }
- if (slideMoveSet && nextMoveSlide < micros()) {
- doSlideMove = 1;
- nextMoveSlide = micros() + timeGapSlide;
- }
- } else if(moveMode == 2) {
- if(joyLeftValue > 0) {
- digitalWrite(dirPinP, HIGH);
- dirP = 1;
- panMoveSet = true;
- timeGapPan = map(joyLeftValue, 0, 100, 5000, 1500);
- } else if(joyRightValue > 0) {
- digitalWrite(dirPinP, LOW);
- dirP = 0;
- panMoveSet = true;
- timeGapPan = map(joyRightValue, 0, 100, 5000, 1500);
- }
- if(joyUpValue > 0) {
- digitalWrite(dirPinT, HIGH);
- dirT = 1;
- tiltMoveSet = true;
- timeGapTilt = map(joyUpValue, 0, 100, 5000, 1500);
- } else if(joyDownValue > 0) {
- digitalWrite(dirPinT, LOW);
- dirT = 0;
- tiltMoveSet = true;
- timeGapTilt = map(joyDownValue, 0, 100, 5000, 1500);
- }
- timeGapPan = timeGapPan * 2;
- timeGapTilt = timeGapTilt * 2;
- if (panMoveSet && nextMovePan < micros()) {
- doPanMove = 1;
- nextMovePan = micros() + timeGapPan;
- }
- if (tiltMoveSet && nextMoveTilt < micros()) {
- doTiltMove = 1;
- nextMoveTilt = micros() + timeGapTilt;
- }
- }
- if(doSlideMove) { digitalWrite(stepPinS, HIGH); }
- if(doPanMove) { digitalWrite(stepPinP, HIGH); }
- if(doTiltMove) { digitalWrite(stepPinT, HIGH); }
- delayMicroseconds(10);
- if(doSlideMove) {
- digitalWrite(stepPinS, LOW);
- if(dirS) {
- globalSlide++;
- } else {
- globalSlide--;
- }
- }
- if(doPanMove) {
- digitalWrite(stepPinP, LOW);
- if(dirP) {
- globalPan++;
- } else {
- globalPan--;
- }
- }
- if(doTiltMove) {
- digitalWrite(stepPinT, LOW);
- if(dirT) {
- globalTilt++;
- } else {
- globalTilt--;
- }
- }
- delayMicroseconds(10);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement