From e865323a60f3d8e05827a10c3f7b692d9c952050 Mon Sep 17 00:00:00 2001 From: Dslak Date: Thu, 12 Aug 2021 08:30:57 +0200 Subject: [PATCH] hobermann fix --- Hobermann/Arduino/Arduino_new.ino | 90 +++++++++++++++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 Hobermann/Arduino/Arduino_new.ino 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); + } + } +}