diff --git a/Hobermann/Arduino/Arduino_new.ino b/Hobermann/Arduino/Arduino_new.ino new file mode 100644 index 0000000..0433265 --- /dev/null +++ b/Hobermann/Arduino/Arduino_new.ino @@ -0,0 +1,90 @@ +#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); + } + } +}