//
// Globale Konstanten definieren
//
constexpr byte DIR_PIN {4};
constexpr byte STEP_PIN {5};
constexpr byte ANALOG_PIN {A0};
constexpr unsigned int STEPS_PER_REVOLUTION {200};
constexpr unsigned int STEPPER_DELAY_US {2000}; // Microskunden!
constexpr byte HYSTERESE {1};
// Struktur für die Daten, die zur Steuerung des Steppers erforderlich sind deklarieren
struct Steps {
unsigned int analogValue;
unsigned int prevAnalogValue;
unsigned int position;
unsigned int count;
};
//
// Feststellen ob eine Bewegung im Uhrzeigersinn (CW) oder Gegenuhrzeigersinn (CCW)
// erforderlich ist. Das Ergebnis ist abhängig von dem gemessenen Potentiometerwert
//
void prepareSteps(byte pin, Steps& st) {
if (st.analogValue > st.prevAnalogValue) {
digitalWrite(pin, HIGH);
st.count = st.analogValue - st.position;
st.position += st.count;
} else {
digitalWrite(pin, LOW);
st.count = st.position - st.analogValue;
st.position -= st.count;
}
st.prevAnalogValue = st.analogValue;
}
//
// Den Schrittmotor um die errechnete Anzahl an Schritten CW oder CCW bewegen.
//
void driveStepper(byte pin, unsigned int stepCount) {
for (size_t x = 0; x < stepCount; ++x) {
digitalWrite(pin, HIGH);
delayMicroseconds(STEPPER_DELAY_US);
digitalWrite(pin, LOW);
delayMicroseconds(STEPPER_DELAY_US);
}
}
void setup() {
pinMode(STEP_PIN, OUTPUT);
pinMode(DIR_PIN, OUTPUT);
}
void loop() {
static Steps steps {0, 0, 0, 0}; // Strutur anlegen und Member mit 0 initialisieren.
// Potentiometerwert lesen und auf die maximale Schrittzahl für eine Umdrehung des
// Steppermotors umrechnen.
steps.analogValue = map(analogRead(ANALOG_PIN), 0, 1023, 0, STEPS_PER_REVOLUTION);
// Wenn sich der gelesenen Analogwert verändert hat den Stepper entsprechend bewegen.
if (steps.analogValue >= steps.prevAnalogValue + HYSTERESE ||
steps.analogValue <= steps.prevAnalogValue - HYSTERESE) {
prepareSteps(DIR_PIN, steps);
driveStepper(STEP_PIN, steps.count);
}
}
0
1023