well, I can't put it as an attachment, so
I put you the code

#include <AccelStepper.h>     // https://www.pjrc.com/teensy/td_libs_AccelStepper.html

#define EnablePin 12
#define IN1 4 
#define IN2 5 
#define IN3 6 
#define IN4 7 
#define MotorInterfaceType 4

#include <EEPROM.h>

// EEPROM addresses
#define FOCUSER_POS_START 0
#define STEPPER_SPEED_ADD 3

AccelStepper stepper(MotorInterfaceType, IN1, IN2, IN3, IN4);

// Global vars
boolean moving = false;
boolean hold = false;
boolean reversed;
boolean positionSaved;               // Flag indicates if stepper position was saved as new focuser position
boolean firstPrint = false;
boolean homeFound = true;
String inputString;                  // Serial input command string (terminated with \n)
boolean findingHome = false;

// *************  this value must be changed for each specific setup ***************************************
long maxSteps = 505960;  // **** steps needed for 2 complete revolutions.  prevent cord wrap.
long minStep = 0;
//  Must also enter this value/720 = steps/degree for first time ASCOM driver setup, click "properties
// ******************************************************************************************************

int manualMoveStepSize = 50;  //higher number for faster manual moves
int findHomeStepSize = 100; //adjusts finding home speed

int buttonStateCW = HIGH;
int buttonStateCCW = HIGH;
boolean manualMoveCW = false;
boolean manualMoveCCW = false;

int HEState = 0;
long lastDebounceTime = 0;
long debounceDelay = 20;

void setup()
{
  // Initialize serial
  Serial.begin(57600);
  pinMode(EnablePin, OUTPUT);
  analogWrite(EnablePin, 0);

  // Initialize stepper motor
  stepper.setMaxSpeed(200);// 5000 works good,  use 500000 for confrom test1000 geared rotator10000 for geared stepper   200 for non-geared large stepper(500 max)  also may depend on what else is on loop()
  stepper.setAcceleration(1000);//1000 for geared rotator  10000 for geared stepper    1000 for non-geared large stepper
  //stepper.setCurrentPosition(readFocuserPos());
  stepper.setCurrentPosition(0);
  positionSaved = true;
  inputString = "";
  reverseDir(false);
}

void loop()
{
  if (findingHome == true) {
    findHome();
  }

  // Stepper loop
  if (stepper.distanceToGo() == 0) {
    if (hold == false) {
      analogWrite(EnablePin, HIGH);
    }
  } else {
    analogWrite(EnablePin, 200);
  }
  if (stepper.distanceToGo() == 0 && !positionSaved) {
    saveFocuserPos(stepper.currentPosition());
    positionSaved = true;
  }
  if (stepper.distanceToGo() != 0 && !firstPrint) {
    firstPrint = true;
  }

  if (stepper.distanceToGo() != 0) {
    moving = true;
  } else {
    moving = false;
  }
  stepper.run();
}

// Interrupt serial event
void reverseDir(boolean rev) {
  stepper.setPinsInverted(rev, false, false);  //for FSQ85(true, false, false) ---  for TSA 120should be (false, false, false)  (dir, step, enable)
  //not reversed is std setup for tsa-120
  reversed = rev;
}
void Hold(boolean conthold) {
  hold = conthold;
}

void serialEvent() {
  while (Serial.available() > 0) {
    char inChar = (char)Serial.read();
    if (inChar == ':' || inChar == '#') {
      if (inputString == "PV") inputString = "V"; // Version
      if (inputString == "GA") inputString = "B"; // bit 1 for switch 2
      if (inputString == "SH") inputString = "H"; // Starts the Find Home routine
      if (inputString == "GS") inputString = "Z"; // bit 2 for In limit switch
      if (inputString == "GT") inputString = "D"; // Sensor temperature in tenths of a degree, ex: 25°C = 250d
      if (inputString == "GV") inputString = "E"; // System voltage in tenths of a volt, ex 12.0V = 120d
      if (inputString == "PD") inputString = "D"; // Set the display brightness
      if (inputString == "PL") inputString = "D"; // Set the display sleep brightness
      if (inputString == "PF") inputString = "F"; // Gets the current focuser type. Ex: "2.5 NC#"
      if (inputString == "PS") inputString = "X"; // Gets the current focuser serial number
      if (inputString == "PU") inputString = "W"; // Gets a user defined field
      if (inputString == "PE") inputString = "C"; // Enables or disables the encoders
      if (inputString == "PR") inputString = "J"; // Issues a reset
      if (inputString == "Pt") inputString = "D"; // Adjusts the temperature offset
      if (inputString == "Pu") inputString = "Y"; // Sets the user text field
      serialCommand(inputString);
      inputString = "";
    }
    else {
      inputString += inChar;
    }
  }
}

void serialCommand(String command) {
  String param = command.substring(4);
  String comando = command.substring(0, 3); //:2SN 12345678#
  if (comando == "2GP") command = "G"; // Current position count, 8 digits, signed, 0 padding
  if (comando == "1GP") command = "K"; // DUMMY Current position
  if (comando == "3GP") command = "K"; // DUMMY Current position
  if (comando == "2GM") command = "Q"; // IS MOVING
  if (comando == "2GN") command = "A"; // New (or Target) position count, 8 digits, signed, 0 padding
  if (comando == "2GR") command = "A"; // Motor step delay in 100 microsecond intervals
  if (comando == "2SQ") command = "S"; // Stops motor
  if (comando == "2SM") command = "A"; // Starts motor to move to the “NEW” focus position
  if (comando == "2SP") command = "P"; // Set the current position, 32 bit value, signed
  if (comando == "2SN") command = "M"; // Move to the New position count, 32 bit value, signed
  if (comando == "1SR") command = "A"; // Set the motor step rate in 100 microsecond intervals.
  if (comando == "2SR") command = "A"; // Set the motor step rate in 100 microsecond intervals.
  if (comando == "3SR") command = "A"; // Set the motor step rate in 100 microsecond intervals.

  //Serial.println(command);

  switch (command.charAt(0)) {
    case 'Q':
      if (moving == true) {
        Serial.println("01#");
      } else {
        Serial.println("00#");
      }
    case 'Y':
      Serial.println("RC 8#");
      break;
    case 'K':
      Serial.println("30000#");
      break;
    case 'A':
      Serial.println("#");
      break;
    case 'B':
      Serial.println("00#");
      break;
    case 'Z':
      Serial.println("00#");
      break;
    case 'D':
      Serial.println("105#");
      break;
    case 'E':
      Serial.println("123#");
      break;
    case 'F':
      Serial.println("3.5 NC#");
      break;
    case 'X':
      Serial.println("20200516#");
      break;
    case 'W':
      Serial.println("StarPI Rotator#");
      break;
    case 'G':
      printCurrentPosition();
      break;
    case 'P':
      saveCurrentPos(stringToLong(param));
      break;
    case 'H':    // find home
      if (param = 2) findHome();
      break;
    case 'M':
      moveStepper(stringToLong(param), false);
      break;
    case 'S':
      halt();
      break;
    case 'R':
      int value;
      value = (stringToNumber(param));
      if (value == 0) {
        reverseDir(false);
      } else {
        reverseDir(true);
      }
      break;
    case 'C':// continuos hold
      int value2;
      value2 = (stringToNumber(param));
      if (value2 == 0) {
        Hold(false);
      } else {
        Hold(true);
      }
      Serial.println("#");
      break;
    case 'V':
      Serial.println("1.3#");
      break;
    case 'J': // Reset Arduino myFocuserPro2 controller
      software_Reboot();
      break;
  }
}

void printCurrentPosition() {
  Serial.print("00");
  if (stepper.currentPosition() < 100000) Serial.print("0");
  if (stepper.currentPosition() < 10000) Serial.print("0");
  if (stepper.currentPosition() < 1000) Serial.print("0");
  if (stepper.currentPosition() < 100) Serial.print("0");
  if (stepper.currentPosition() < 10) Serial.print("0");
  Serial.print(stepper.currentPosition());
  Serial.println("#");
}

void moveStepper(long newPos, boolean manualMove) {
  Serial.println("#");
  if (findingHome == true) {
    stepper.moveTo(newPos);
  return;
  }

  if (newPos != stepper.currentPosition()) {
    if (newPos < minStep || newPos > maxSteps) {
      return;
    } else {
      stepper.moveTo(newPos);
      positionSaved = false;
      firstPrint = false;
    }
  }
}

void halt() {
  Serial.println("#");
  stepper.stop();
}

void saveCurrentPos(long newPos) {
  Serial.println("#");
  if (newPos < minStep) newPos = minStep;
  stepper.setCurrentPosition(newPos);
  moveStepper(newPos, false);
  saveFocuserPos(newPos);
  positionSaved = true;
}

void findHome() {
  Serial.println("#");
  long newPos = maxSteps / 4;
  homeFound = true;
  findingHome = false;
  saveCurrentPos(newPos);
}
// reboot the Arduino
void software_Reboot() {
  // jump to the start of the program
  asm volatile ( "jmp 0");
}

void saveFocuserPos(long newPos) {
  writeLong(getSaveFocuserPosAddress() + 1, newPos);
}

long readFocuserPos() {
  return readLong(getReadFocuserPosAddress() + 1);
}

void writeWord(word address, word value) {
  EEPROM.update(address, lowByte(value));
  EEPROM.update(address + 1, highByte(value));
}

word readWord(word address) {
  return word(EEPROM.read(address + 1), EEPROM.read(address));
}

long readLong(word address) {
  word lowWord = readWord(address);
  word highWord = readWord(address + 2);
  return lowWord + highWord * 65536;
}

void writeLong(word address, long value) {
  word lowWord = value % 65536;
  word highWord = value / 65536;
  writeWord(address, lowWord);
  writeWord(address + 2, highWord);
}

int stringToNumber(String thisString) {
  int i, value = 0, length;
  length = thisString.length();
  for (i = 0; i < length; i++) {
    value = (10 * value) + thisString.charAt(i) - (int) '0';
  }
  return value;
}

long stringToLong(String thisString) {
  boolean neg = false;
  if (thisString.indexOf("-") == 0) {
    thisString = thisString.substring(1);
    neg = true;
  }
  //Serial.println(thisString);
  long value = 0;
  int i, length;
  length = thisString.length();
  for (i = 0; i < length; i++) {
    value = (10 * value) + thisString.charAt(i) - (int) '0';
  }
  if (neg == true) {
    value = maxSteps - value;
  }
  return value;
}

// Simple EEPROM wear leveling
int getSaveFocuserPosAddress() {
  for (byte x = 0; x < 20; x++) {
    int address = FOCUSER_POS_START + 5 * x;
    if (EEPROM.read(address) == 0) {
      EEPROM.update(address, 0xFF);
      return address;
    }
  }
  // Array is full, erase it and start from 0 - takes about 100ms
  for (byte x = 0; x < 20; x++) {
    EEPROM.update(FOCUSER_POS_START + 5 * x, 0);
    EEPROM.update(FOCUSER_POS_START, 0xFF);
    return FOCUSER_POS_START;
  }
}

int getReadFocuserPosAddress() {
  for (byte x = 0; x < 20; x++) {
    int address = FOCUSER_POS_START + 5 * x;
    if (EEPROM.read(address) == 0) {
      return FOCUSER_POS_START + 5 * (x - 1);
    }
  }
}


Read More...