commit 018d00d010fd5873c5f7be4f6a92a2f4639d3c93 Author: Jannis Date: Mon Sep 21 00:42:07 2026 +0200 Init diff --git a/main.ino b/main.ino new file mode 100644 index 0000000..302f136 --- /dev/null +++ b/main.ino @@ -0,0 +1,99 @@ +#include +#include + +FastAccelStepperEngine engine = FastAccelStepperEngine(); +FastAccelStepper *stepper = NULL; + +// WICHTIG beim XIAO ESP32-C6: +// Wenn du die Beschriftung auf der Platine nutzt, schreibe D-Pins (z. B. D9), +// nicht die nackte Zahl, da GPIO-Nummern abweichen! +#define dirPinStepper D5 // Bei dir zuvor: 5 +#define enablePinStepper D6 // Bei dir zuvor: 6 +#define stepPinStepper D9 // Bei dir zuvor: 9 + +#define speedUp D8 // Bei dir zuvor: 8 +#define speedDown D7 // Bei dir zuvor: 7 + +const int32_t ACCEL_RATE = 2000; +const uint32_t MAX_SPEED_HZ = 106000; + +int32_t lastControl = 0; +uint32_t lastPlotTime = 0; + +void setup() { + Serial.begin(115200); + delay(1000); // Zeit für USB-CDC-Verbindung geben + + Serial.println("--- MOTOR DIAGNOSE START ---"); + + engine.init(); + stepper = engine.stepperConnectToPin(stepPinStepper); + + if (stepper) { + Serial.println("[OK] FastAccelStepper erfolgreich an Pin initialisiert."); + stepper->setDirectionPin(dirPinStepper); + + // Hinweis: Manche Optokoppler-Treiber benötigen HIGH-Aktivität zum Aktivieren. + // Falls der Motor blockiert bleibt, versuche: stepper->setEnablePin(enablePinStepper, false); + stepper->setEnablePin(enablePinStepper, true); + stepper->setAutoEnable(true); + stepper->setSpeedInHz(MAX_SPEED_HZ); + } else { + Serial.println("[FEHLER] FastAccelStepper konnte NICHT initialisiert werden (stepper == NULL)!"); + Serial.println("Prüfe, ob der gewählte Step-Pin von der Library auf dem ESP32-C6 unterstützt wird."); + } + + pinMode(speedUp, INPUT_PULLUP); + pinMode(speedDown, INPUT_PULLUP); +} + +void loop() { + if (!stepper) { + Serial.println("[HALT] Kein Stepper-Objekt aktiv."); + delay(1000); + return; + } + + // Bei INPUT_PULLUP: gedrückt = LOW (true) + bool btnUpPressed = (digitalRead(speedUp) == LOW); + bool btnDownPressed = (digitalRead(speedDown) == LOW); + + int32_t control = 0; + + if (btnUpPressed && btnDownPressed) { + stepper->stopMove(); + control = 0; + } + else if (btnUpPressed) { + control = ACCEL_RATE; + } + else if (btnDownPressed) { + control = -ACCEL_RATE; + } + else { + control = 0; + } + + if (control != lastControl) { + stepper->moveByAcceleration(control, true); + lastControl = control; + } + + // Plotter-Ausgabe alle 50 ms (überflutet den Bus nicht) + if (millis() - lastPlotTime >= 50) { + lastPlotTime = millis(); + + int32_t currentSpeed = stepper->getCurrentSpeedInUs() == 0 ? 0 : (1000000 / stepper->getCurrentSpeedInUs()); + + // Format kompatibel für den Arduino Serial Plotter + Serial.print("Current_Speed_Hz:"); + Serial.print((60*currentSpeed)/3200); + Serial.print(" Accel_Control:"); + Serial.print(control); + Serial.print(" Btn_Up:"); + Serial.print(btnUpPressed ? 5000 : 0); + Serial.print(" Btn_Down:"); + Serial.print(btnDownPressed ? -5000 : 0); + Serial.println(); + } +} \ No newline at end of file