#define dirPin 2 #define stepPin 3 #define endPin 4 long maxRange = 35000; // motor maximum excursion range - 35000 int brakeRange = 400; // motor lowSpeed range int lowSpeed = 2000; // motor lower speed int highSpeed = 2800; // motor higher speed int inversionBreak = 10000; // motor pause time - 10000 long stepSpeed = 0; bool dir = true; long counter = 0; bool rodEnd = false; long brakeFactor = 0; void setup() { pinMode(stepPin, OUTPUT); pinMode(dirPin, OUTPUT); pinMode(endPin, INPUT); digitalWrite(dirPin, dir); while(!rodEnd) { counter++; if(counter <= brakeRange) { brakeFactor = (lowSpeed / brakeRange) * counter; stepSpeed = (highSpeed + brakeFactor > highSpeed + lowSpeed) ? highSpeed + lowSpeed : highSpeed + brakeFactor; } else { stepSpeed = highSpeed; } digitalWrite(stepPin, HIGH); delayMicroseconds(stepSpeed); digitalWrite(stepPin, LOW); delayMicroseconds(stepSpeed); if(digitalRead(endPin)) { rodEnd = true; counter = 0; } } } void loop() { if(!dir) { counter++; if(counter >= maxRange) { dir = !dir; digitalWrite(dirPin, dir); delay(inversionBreak); } else { if(counter >= maxRange - brakeRange) { brakeFactor = (lowSpeed / brakeRange) * (maxRange - counter); stepSpeed = (highSpeed + brakeFactor > highSpeed + lowSpeed) ? highSpeed + lowSpeed : highSpeed + brakeFactor; } else if(counter <= brakeRange) { brakeFactor = (lowSpeed / brakeRange) * counter; stepSpeed = (highSpeed + brakeFactor > highSpeed + lowSpeed) ? highSpeed + lowSpeed : highSpeed + brakeFactor; } else { stepSpeed = highSpeed; } digitalWrite(stepPin, HIGH); delayMicroseconds(stepSpeed); digitalWrite(stepPin, LOW); delayMicroseconds(stepSpeed); } } else { counter--; if(counter <= 0) { dir = !dir; digitalWrite(dirPin, dir); delay(inversionBreak); } else { if(counter >= maxRange - brakeRange) { brakeFactor = (lowSpeed / brakeRange) * (maxRange - counter); stepSpeed = (highSpeed + brakeFactor > highSpeed + lowSpeed) ? highSpeed + lowSpeed : highSpeed + brakeFactor; } else if(counter <= brakeRange) { brakeFactor = (lowSpeed / brakeRange) * counter; stepSpeed = (highSpeed + brakeFactor > highSpeed + lowSpeed) ? highSpeed + lowSpeed : highSpeed + brakeFactor; } else { stepSpeed = highSpeed; } digitalWrite(stepPin, HIGH); delayMicroseconds(stepSpeed); digitalWrite(stepPin, LOW); delayMicroseconds(stepSpeed); } } }