AccelStepper & Sensor Position ermitteln Anomalie

Hallo miteinander,

ich möchte mit der LIB AccelStepper.h eine Portal Fräse steuern.
Dazu möchte ich jetzt zuverlässig den Nullpunkt und den Arbeitsbereich ermitteln

Doch ich habe scheinbar ein paar fehlerloser mit drin, denn das Ergebnis ist nicht konstant.

Habe alle raus geschmissen im Code das nicht dazu gehört.
Meine Debugausgabe ist weiterhin mit im Code sichtbar.

Was mache ich im Code.

  1. zum Null Sensor Fahne
  2. Motor Stoppen und Rampe auslaufen lassen wenn Sensor 0 Auslöst
  3. Anfang des Sensors suchen, im Schneckentempo
  4. Aktuelle Position als 0 Setzen
    Debugger
  5. zum END-Sensor Fahne
  6. Motor Stoppen und Rampe auslaufen lassen wenn END-Sensor auslöst
  7. Anfang des Sensors suchen, im Schneckentempo
  8. Aktuelle Position als Arbeitsbereich Setzen
    Debugger 2

Das ganze wiederhole ich endlos um zu sehen ob Fehler auftreten.
Die Ausgabe auf dem Seriellen Monitor ist dann die hier: (das ist das aus dem Video)

Arduino bereit!
| 1 | 2 | 3 | 4 | Debugger | 5 | 6 | 7 | 8 | Debugger 2 | Arbeitsbereich: 398
| 1 | 2 | 3 | 4 | Debugger | 5 | 6 | 7 | 8 | Debugger 2 | Arbeitsbereich: 398
| 1 | 2 | 3 | 4 | Debugger | 5 | 6 | 7 | 8 | Debugger 2 | Arbeitsbereich: 398
| 1 | 2 | 3 | 4 | Debugger | 5 | 6 | 7 | 8 | Debugger 2 | Arbeitsbereich: 398
| 1 | 2 | 3 | 4 | Debugger | 5 | 6 | 7 | 8 | Debugger 2 | Arbeitsbereich: 398
| 1 | 2 | 3 | 4 | Debugger | 5 | 6 | 7 | 8 | Debugger 2 | Arbeitsbereich: 398
| 1 | 2 | 3 | 4 | Debugger | 5 | 6 | 7 | 8 | Debugger 2 | Arbeitsbereich: 398
| 1 | 2 | 3 | 4 | Debugger | 5 | 6 | 7 | 8 | Debugger 2 | Arbeitsbereich: -400
| 1 | 2 | 3 | 4 | Debugger | 5 | 6 | 7 | 8 | Debugger 2 | Arbeitsbereich: 398
| 1 | 2 | 3 | 4 | Debugger | 5 | 6 | 7 | 8 | Debugger 2 | Arbeitsbereich: 406
| 1 | 2 | 3 | 4 | Debugger | 5 | 6 | 7 | 8 | Debugger 2 | Arbeitsbereich: 398
| 1 | 2 | 3 | 4 | Debugger | 5 | 6 | 7 | 8 | Debugger 2 | Arbeitsbereich: 0
| 1 | 2 | 3 | 4 | Debugger | 5 | 6 | 7 | 8 | Debugger 2 | Arbeitsbereich: 398

Ein Video habe ich auch beriet gestellt: << Hier >>

Nach meiner Logik sollte der Arbeitsbereich immer gleich groß sein.
Das ist er jedoch nicht.
Was habe ich für einen Fehler eingebaut bzw. was für einen Zustand frage ich nicht ab?

So langsam glaube ich wirklich das ich das ganze teil sehr Tief in der erde vergraben sollte.

Gruß Mücke

//Arrays werden für das endprogramm definirt

  #include <AccelStepper.h>                         // Installiren der AccelStepper LIB 
  AccelStepper Achse_A(1, 4, 3);                    // Motor Installiren
  const byte   Sensoren[] = {44};                   // Sensor Pin`s
  const int    Speed[]    = {600};                  // Default (Schritte pro Sekunde)
  const int    Rampe[]    = {600};                  // Default (Schritte pro Sekunde)
  bool Nullpunkt_A = false;                         // Nullpunkt Status Achse A
  int Arbeitsbereich_A = 0;                         // Arbeitsbereich Achse A

void setup() {
  Serial.begin(250000);                             // Serielle Schnittstelle Implementierung  
  Achse_A.setMaxSpeed(Speed[0]);                    // Geschwindigkeit setzen  
  Achse_A.setAcceleration(Rampe[0]);                // Rampe setzen 
  Serial.println(F("Arduino bereit!"));             // Ausgabe das Motor Startklar ist
}

void loop() {
   if (!Nullpunkt_A and Arbeitsbereich_A <= 0) {
    Nullpunkt();
   }
  // Debugger
    delay(1000);            // Pause 
    Nullpunkt_A = false;    // Nullpunkt Löschen 
    Arbeitsbereich_A = 0;   // Arbeitsbereich Löschen
  // Debugger
}


void Nullpunkt() {

// Nullpunkt Achse A 

// 1. zum Null Sensor Fahne
      Serial.print(F("| 1 "));
      Achse_A.move(-30000);                       //  Achsen ist etwas kleiner wie 30.000 Schritte 
// 2. Motor Stoppen und Rampe auslaufen lassen wenn Sensor 0 Auslöst 
      Serial.print(F("| 2 "));
      while (!digitalRead(Sensoren[0])){          // Solange Sensor nicht ausgelöst hat 
        Achse_A.run();                            // soll die Achse weiter laufen 
        }                                         // im vollem Speed 
      Achse_A.stop();                             // Sensor ausgelöst Stopen mit Rampe 
      while (Achse_A.distanceToGo() != 0) {       // Prüft auf Offene Schritte (Rampe)
        Achse_A.run();                            // 
      }                                           //
// 3. Anfang des Sensors suchen, im Schneckentempo
      Serial.print(F("| 3 "));
      Achse_A.setMaxSpeed(100);                   // Speey auf Schnekentempo drosseln
      Achse_A.setAcceleration(100);               // Rmpe an Schnekentempo anpassen 
      Achse_A.move(30000);                        // Schritte vorgeben
      while (!digitalRead(Sensoren[0])){          // Prüfen ob wie noch am Sensor sind
        Achse_A.run();                            // wenn nicht zum Ende es Sensors fahren
        }                                         //
      while (digitalRead(Sensoren[0])){           // Prüfen wann wir am anfang 
        Achse_A.run();                            // des Sensors uns befinden
        }                                         //
// 4. Aktuelle Position als 0 Setzen
      Serial.print(F("| 4 "));
      Achse_A.setCurrentPosition(0);              // Sofortiges Stopen und Aktuelle Position auf 0 setzen 
      Nullpunkt_A = true;                         // Nullpunkt Marker setzen
      Achse_A.setMaxSpeed(Speed[0]);              // Geschwindigkeit setzen  
      Achse_A.setAcceleration(Rampe[0]);          // Rampe setzen 
// Debugger 
      Serial.print(F("| Debugger "));
      delay(1000);                                // 1 Sekunde warten, damit man die Position erkennt
// 5. zum END-Sensor Fahne
      Serial.print(F("| 5 "));
      Achse_A.move(30000);                        //  Achsen ist etwas kleiner wie 30.000 Schritte     
// 6. Motor Stoppen und Rampe auslaufen lassen wenn END-Sensor auslöst 
      Serial.print(F("| 6 "));
      while (!digitalRead(Sensoren[0])){          // Solange Sensor nicht ausgelöst hat 
        Achse_A.run();                            // soll die Achse weiter laufen 
        }                                         // im vollem Speed 
      Achse_A.stop();                             // Sensor ausgelöst Stopen mit Rampe 
      while (Achse_A.distanceToGo() != 0) {       // Prüft auf Offene Schritte (Rampe)
        Achse_A.run();                            // 
      }                                           //                                              
// 7. Anfang des Sensors suchen, im Schneckentempo
      Serial.print(F("| 7 "));
      Achse_A.setMaxSpeed(100);                   // Speey auf Schnekentempo drosseln
      Achse_A.setAcceleration(100);               // Rmpe an Schnekentempo anpassen 
      Achse_A.move(-30000);                       // Schritte vorgeben
      while (digitalRead(Sensoren[0])){          // Prüfen ob wie noch am Sensor sind
        Achse_A.run();                            // wenn nicht zum Ende es Sensors fahren
        }                                         //
      while (!digitalRead(Sensoren[0])){           // Prüfen wann wir am anfang 
        Achse_A.run();                            // des Sensors uns befinden
        }                                         //
// 8. Aktuelle Position als Arbeitsbereich Setzen
      Serial.print(F("| 8 "));
      Achse_A.setCurrentPosition(Achse_A.currentPosition());  // Sofortiges Stopen und Aktuelle Position setzen 
      Arbeitsbereich_A = Achse_A.currentPosition();   // Arbeitsbereich Marker setzen
      Achse_A.setMaxSpeed(Speed[0]);              // Geschwindigkeit setzen  
      Achse_A.setAcceleration(Rampe[0]);          // Rampe setzen 
// Debugger 2
      Serial.print(F("| Debugger 2 "));
      delay(1000);                                // 1 Sekunde warten, damit man die Position erkennt
      Serial.print(F("| Arbeitsbereich: "));
      Serial.println(Arbeitsbereich_A); 
}

Und wo ist der Code, der dieses Ergebnis produziert?

Muecke:
Habe alle raus geschmissen im Code das nicht dazu gehört.
Meine Debugausgabe ist weiterhin mit im Code sichtbar.

Und wo ist der Code, der dieses Ergebnis produziert?

Oh man, vor lauter Video erstellen erc. habe ich den Code vergessen, habe den CODE im Beitrag #0 nachgetragen, sorry.

Danke für die Erinnerung.

Hi

Zumindest bei der -400 fährt der Stepper 'falsch herum' - denke, durch Vibrationen o.Ä. wurde der Beru de- und erneut aktiviert, was normal erst während der Schnecken-Runde passieren sollte.

MfG

an Vibration habe ich auch schon gedacht. Jedoch ist mir das in der Maschine auch schon passiert da hat er dann einfach mal einen Sensor ganz ignoriert und ist auf meinen Notaus Schalter gefahren ( hier wird der Motor Mechanisch vom Strom genommen).

Daher habe ich das wider auf den Tisch verlagert um zu testen.

ich bekomme auch zum teil die Länge -1 oder 0
ab und an bleibt er auch am Sensor hegen, und macht einen schritt vor uns zurück und das dann 4 bis 6 mal dann ist meine Achse nur 0 Schritte lang :slight_smile: und das 4 bis 6 mal hintereinander.

Ich habe den Eindruck das manchmal der Controller zu langsam ist oder zu schnell. und sich dann verhaspelt, kann das sein?

Wie würde ich so etwas auf die schliche kommen?
oder mache ich einen Denkfehler in meiner Abfolge? und vergesse etwas abzufragen?

ps. das ist das Aktuelle Protokoll das ich gerade mal erstellt habe, habe den Zeitstempel mit rein genommen dann sieht man wie schnell er alles abarbeitet ;-).

20:02:50.875 -> | 1 | 2 | 3 | 4 | Debugger | 5 | 6 | 7 | 8 | Debugger 2 | Arbeitsbereich: 0
20:02:51.177 -> | 1 | 2 | 3 | 4 | Debugger | 5 | 6 | 7 | 8 | Debugger 2 | Arbeitsbereich: 0
20:02:51.413 -> | 1 | 2 | 3 | 4 | Debugger | 5 | 6 | 7 | 8 | Debugger 2 | Arbeitsbereich: 398
20:02:56.964 -> | 1 | 2 | 3 | 4 | Debugger | 5 | 6 | 7 | 8 | Debugger 2 | Arbeitsbereich: 398
20:03:02.549 -> | 1 | 2 | 3 | 4 | Debugger | 5 | 6 | 7 | 8 | Debugger 2 | Arbeitsbereich: 0
20:03:02.855 -> | 1 | 2 | 3 | 4 | Debugger | 5 | 6 | 7 | 8 | Debugger 2 | Arbeitsbereich: 0
20:03:03.124 -> | 1 | 2 | 3 | 4 | Debugger | 5 | 6 | 7 | 8 | Debugger 2 | Arbeitsbereich: 414
20:03:08.485 -> | 1 | 2 | 3 | 4 | Debugger | 5 | 6 | 7 | 8 | Debugger 2 | Arbeitsbereich: 398
20:03:14.079 -> | 1 | 2 | 3 | 4 | Debugger | 5 | 6 | 7 | 8 | Debugger 2 | Arbeitsbereich: 398
20:03:19.658 -> | 1 | 2 | 3 | 4 | Debugger | 5 | 6 | 7 | 8 | Debugger 2 | Arbeitsbereich: 406
20:03:25.180 -> | 1 | 2 | 3 | 4 | Debugger | 5 | 6 | 7 | 8 | Debugger 2 | Arbeitsbereich: 398
20:03:30.791 -> | 1 | 2 | 3 | 4 | Debugger | 5 | 6 | 7 | 8 | Debugger 2 | Arbeitsbereich: 414
20:03:36.191 -> | 1 | 2 | 3 | 4 | Debugger | 5 | 6 | 7 | 8 | Debugger 2 | Arbeitsbereich: 414
20:03:41.629 -> | 1 | 2 | 3 | 4 | Debugger | 5 | 6 | 7 | 8 | Debugger 2 | Arbeitsbereich: 0
20:03:41.933 -> | 1 | 2 | 3 | 4 | Debugger | 5 | 6 | 7 | 8 | Debugger 2 | Arbeitsbereich: 398
20:03:47.473 -> | 1 | 2 | 3 | 4 | Debugger | 5 | 6 | 7 | 8 | Debugger 2 | Arbeitsbereich: 0
20:03:47.775 -> | 1 | 2 | 3 | 4 | Debugger | 5 | 6 | 7 | 8 | Debugger 2 | Arbeitsbereich: 398
20:03:53.334 -> | 1 | 2 | 3 | 4 | Debugger | 5 | 6 | 7 | 8 | Debugger 2 | Arbeitsbereich: 0
20:03:53.635 -> | 1 | 2 | 3 | 4 | Debugger | 5 | 6 | 7 | 8 | Debugger 2 | Arbeitsbereich: 398
20:03:59.177 -> | 1 | 2 | 3 | 4 | Debugger | 5 | 6 | 7 | 8 | Debugger 2 | Arbeitsbereich: 398
20:04:04.771 -> | 1 | 2 | 3 | 4 | Debugger | 5 | 6 | 7 | 8 | Debugger 2 | Arbeitsbereich: 414
20:04:10.207 -> | 1 | 2 | 3 | 4 | Debugger | 5 | 6 | 7 | 8 | Debugger 2 | Arbeitsbereich: 414
20:04:15.623 -> | 1 | 2 | 3 | 4 | Debugger | 5 | 6 | 7 | 8 | Debugger 2 | Arbeitsbereich: 398
20:04:21.212 -> | 1 | 2 | 3 | 4 | Debugger | 5 | 6 | 7 | 8 | Debugger 2 | Arbeitsbereich: 406
20:04:26.735 -> | 1 | 2 | 3 | 4 | Debugger | 5 | 6 | 7 | 8 | Debugger 2 | Arbeitsbereich: 0
20:04:27.036 -> | 1 | 2 | 3 | 4 | Debugger | 5 | 6 | 7 | 8 | Debugger 2 | Arbeitsbereich: 0
20:04:27.311 -> | 1 | 2 | 3 | 4 | Debugger | 5 | 6 | 7 | 8 | Debugger 2 | Arbeitsbereich: 0
20:04:27.584 -> | 1 | 2 | 3 | 4 | Debugger | 5 | 6 | 7 | 8 | Debugger 2 | Arbeitsbereich: 414

gruß Mücke

Hallo,

irgendwie scheint mir die Benennung Verwirrung stiften zu wollen. Deine Werte 398, 0, 414, -400 stellen laut meiner Meinung keinen Arbeitsbereich dar. Die stellen laut meiner Meinung den neuen "Nullpunkt" dar der am Sensor gefunden wird. Ich vermute der Motor verliert Schritte. Testweise Rampe flacher machen und max. reduzieren.

Öm, nö das ist schon der Arbeitsbereich. in dem Fall ist der Start Sensor (0) der selbe wie der Endsensor (400 schritte entfernt 1 volle Umdrehung).

Folgendes wird abgearbeitet.

  1. zum Null Sensor Fahne
  2. Motor Stoppen und Rampe auslaufen lassen wenn Sensor 0 Auslöst
  3. Anfang des Sensors suchen, im Schneckentempo
  4. Aktuelle Position als 0 Setzen
    Debugger
  5. zum END-Sensor Fahne
  6. Motor Stoppen und Rampe auslaufen lassen wenn END-Sensor auslöst
  7. Anfang des Sensors suchen, im Schneckentempo
  8. Aktuelle Position als Arbeitsbereich Setzen
    Debugger 2

Ausgegeben wird jeweils die Nummer wo sich der Controller gerade befindet.

Schrittverlust sollte ignoriert werden, da wir ohne Positionsangabe arbeiten, es wird auf Sensoren reagiert.

Habe das ganze aufsplittetet

Ablauf von Nullpunkt()

  1. Zum Null-Sensor Fahne
  2. Motor Stoppen bei NULL-Sensor
  3. Rampe abarbeiten
  4. Schnekentempo
  5. Zum Null-Sensor Fahne
  6. Null-Sensor Anfang finden
  7. Nullpunkt setzen
  8. Standardwerte wider herstellen
    Debugger 1
  9. Zum END-Sensor Fahne
  10. Motor Stoppen bei END-Sensor
  11. Rampe abarbeiten
  12. Schnekentempo
  13. Zum END-Sensor Fahne
  14. Null-Sensor Anfang finden
  15. Nullpunkt setzen
  16. Standardwerte wider herstellen
    Debugger 2
void Nullpunkt() {
/* 1. Zum Null-Sensor Fahne */                        Serial.print(F("| 1 "));
      Achse_A.move(-30000);                           //  Achsen ist etwas kleiner wie 30.000 Schritte 
/* 2. Motor Stoppen bei NULL-Sensor */                Serial.print(F("| 2 "));
      while (!digitalRead(Sensoren[0])){              // Solange Sensor nicht ausgelöst hat 
        Achse_A.run();                                // soll die Achse weiter laufen 
        }                                             // im vollem Speed 
      Achse_A.stop();                                 // Sensor ausgelöst Stopen mit Rampe
/* 3. Rampe abarbeiten */                             Serial.print(F("| 3 "));
      while (Achse_A.distanceToGo() != 0) {           // Prüft auf offene schritte
        Achse_A.run();                                // schritt muss gemacht werden
      }
/* 4. Schnekentempo */                                Serial.print(F("| 4 "));
      Achse_A.setMaxSpeed(100);                       // Speed drosseln
      Achse_A.setAcceleration(100);                   // Rmpe drosseln 
/* 5. Zum Null-Sensor Fahne */                        Serial.print(F("| 5 "));
      Achse_A.move(30000);                            // Schritte vorgeben
/* 6. Null-Sensor Anfang finden */                    Serial.print(F("| 6 "));
      while (!digitalRead(Sensoren[0])){              // Prüfen ob wier noch am Sensor sind
        Achse_A.run();                                // wenn nicht zum Ende es Sensors fahren
        }
      while (digitalRead(Sensoren[0])){               // Prüfen ob wir wir am anfang 
        Achse_A.run();                                // des Sensors uns befinden
        }
/* 7. Nullpunkt setzen */                             Serial.print(F("| 7 "));
      Achse_A.setCurrentPosition(0);                  // Sofortiges Stopen und Aktuelle Position auf 0 setzen 
      Nullpunkt_A = true;                             // Nullpunkt Marker setzen
/* 8. Standardwerte wider herstellen */               Serial.print(F("| 8 "));
      Achse_A.setMaxSpeed(Speed[0]);                  // Geschwindigkeit setzen  
      Achse_A.setAcceleration(Rampe[0]);              // Rampe setzen 
/* Debugger */                                        Serial.print(F("| D-1 "));

//  Ab jetzt wird der Arbeitsbereich ermittelt 

/* 9. Zum END-Sensor Fahne */                         Serial.print(F("| 9 "));
      Achse_A.move(30000);                            //  Achsen ist etwas kleiner wie 30.000 Schritte     
/* 10. Motor Stoppen bei END-Sensor */                Serial.print(F("| 10 "));
      while (!digitalRead(Sensoren[0])){              // Solange Sensor nicht ausgelöst hat 
        Achse_A.run();                                // soll die Achse weiter laufen 
        }                                             // im vollem Speed 
      Achse_A.stop();                                 // Sensor ausgelöst Stopen mit Rampe 
/* 11. Rampe abarbeiten */                            Serial.print(F("| 11 "));
      while (Achse_A.distanceToGo() != 0) {           // Prüft auf offene schritte
        Achse_A.run();                                // schritt muss gemacht werden
      }
/* 12. Schnekentempo */                               Serial.print(F("| 12 "));
      Achse_A.setMaxSpeed(100);                       // Speed drosseln
      Achse_A.setAcceleration(100);                   // Rmpe drosseln
/* 13. Zum END-Sensor Fahne */                        Serial.print(F("| 13 "));      
      Achse_A.move(-30000);                           // Schritte vorgeben
/* 14. Null-Sensor Anfang finden */                   Serial.print(F("| 14 "));
      while (digitalRead(Sensoren[0])){               // Prüfen ob wier noch am Sensor sind
        Achse_A.run();                                // wenn nicht zum Ende es Sensors fahren
        }
      while (!digitalRead(Sensoren[0])){              // Prüfen ob wir wir am anfang
        Achse_A.run();                                // des Sensors uns befinden
        }
/* 15. Nullpunkt setzen */                            Serial.print(F("| 15 "));
      Arbeitsbereich_A = Achse_A.currentPosition();   // Aktuelle Position ist Arbeitsbereich
/* 16. Standardwerte wider herstellen */              Serial.print(F("| 16 "));
      Achse_A.setMaxSpeed(Speed[0]);                  // Geschwindigkeit setzen
      Achse_A.setAcceleration(Rampe[0]);              // Rampe setzen 
/* Debugger 2 */                                      Serial.print(F("| D-2 "));
      Serial.print(F("| Arbeitsbereich: "));
      Serial.println(Arbeitsbereich_A);
}

Das ist das Ergebnis, wie zu erwarten keine Besserung :frowning:

Arduino bereit!
21:05:11.367 -> | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | D-1 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | D-2 | Arbeitsbereich: 398
21:05:18.873 -> | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | D-1 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | D-2 | Arbeitsbereich: -8
21:05:19.678 -> | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | D-1 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | D-2 | Arbeitsbereich: -371
21:05:24.211 -> | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | D-1 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | D-2 | Arbeitsbereich: 398
21:05:30.169 -> | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | D-1 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | D-2 | Arbeitsbereich: 398
21:05:36.160 -> | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | D-1 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | D-2 | Arbeitsbereich: 406
21:05:42.088 -> | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | D-1 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | D-2 | Arbeitsbereich: 0
21:05:42.794 -> | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | D-1 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | D-2 | Arbeitsbereich: 0
21:05:43.096 -> | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | D-1 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | D-2 | Arbeitsbereich: 406
21:05:48.647 -> | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | D-1 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | D-2 | Arbeitsbereich: 398
21:05:54.634 -> | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | D-1 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | D-2 | Arbeitsbereich: 398
21:06:00.616 -> | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | D-1 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | D-2 | Arbeitsbereich: 0
21:06:01.319 -> | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | D-1 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | D-2 | Arbeitsbereich: 398
21:06:06.947 -> | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | D-1 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | D-2 | Arbeitsbereich: 398
21:06:12.916 -> | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | D-1 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | D-2 | Arbeitsbereich: 398
21:06:18.898 -> | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | D-1 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | D-2 | Arbeitsbereich: 398
21:06:24.900 -> | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | D-1 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | D-2 | Arbeitsbereich: 0
21:06:25.436 -> | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | D-1 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | D-2 | Arbeitsbereich: 398
21:06:31.287 -> | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | D-1 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | D-2 | Arbeitsbereich: -8
21:06:32.059 -> | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | D-1 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | D-2 | Arbeitsbereich: -371
21:06:36.577 -> | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | D-1 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | D-2 | Arbeitsbereich: 398
21:06:42.581 -> | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | D-1 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | D-2 | Arbeitsbereich: 398
21:06:48.546 -> | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | D-1 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | D-2 | Arbeitsbereich: 414
21:06:54.391 -> | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | D-1 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | D-2 | Arbeitsbereich: -393
21:06:59.216 -> | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | D-1 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | D-2 | Arbeitsbereich: -1
21:07:00.021 -> | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | D-1 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | D-2 | Arbeitsbereich: 0
21:07:00.323 -> | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | D-1 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | D-2 | Arbeitsbereich: 398
21:07:05.948 -> | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | D-1 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | D-2 | Arbeitsbereich: 398
21:07:11.930 -> | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | D-1 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | D-2 | Arbeitsbereich: 0

ich habe gedacht das es vielleicht am Sensor liegen kann das der durch die Vibration auslöst ohne das was vorliegt, ist ja billig wahre :slight_smile:
Dem ist leider nicht so :frowning:

jetzt habe ich das ganze mal ohne Rampen programmiert, sprich das teil bleibt brachial von jetzt auf nachher stehen, ja das ist nicht gut :frowning:

Es ist nur noch einen kleine Rampe mit drin am ende, die habe ich so gut es geht Element da ich einen Beschleunigung von 5.000 schritten mache, somit ist nahezu keine Rampe mehr vorhanden.

Der Code hat sich demnach etwas verändert.

  #include <AccelStepper.h>                         // Installiren der AccelStepper LIB 
  AccelStepper Achse_A(1, 4, 3);                    // Motor Installiren
  const byte   Sensoren[] = {44};                   // Sensor Pin`s
  const int    Speed[]    = {600};                  // Default (Schritte pro Sekunde)
  const int    Rampe[]    = {5000};                 // Default (Schritte pro Sekunde)
  bool Nullpunkt_A = false;                         // Nullpunkt Status Achse A
  int Arbeitsbereich_A = 0;                         // Arbeitsbereich Achse A
  int Diff; 
  
void setup() {
  Serial.begin(250000);                             // Serielle Schnittstelle Implementierung  
  Achse_A.setMaxSpeed(Speed[0]);                    // Geschwindigkeit setzen  
  Achse_A.setAcceleration(Rampe[0]);                // Rampe setzen 
  Serial.println(F("Arduino bereit!"));             // Ausgabe das Motor Startklar ist
  Serial.print(F("Speed: ")); 
  Serial.print(Speed[0]); 
  Serial.print(F(" Rampe: ")); 
  Serial.println(Rampe[0]); 
}

void loop() {
   if (!Nullpunkt_A or Arbeitsbereich_A <= 0) {
    Nullpunkt();
   }
  // Debugger
    Nullpunkt_A = false;    // Nullpunkt Löschen 
  //  Arbeitsbereich_A = 0;   // Arbeitsbereich Löschen
  // Debugger
}


void Nullpunkt() {
/* 1. Zum Null-Sensor Fahne */                          Serial.print(F("| 1 "));
    Achse_A.move(-30000);                               // Auftrag zur Position zu Fahren
    while(digitalRead(Sensoren[0]) == 0)                // Prüft ob Null-Sensor ausgelöst hat
      { Achse_A.run(); }                                // Richtung Null-Sensor fahren 
/* 2. Nullpunkt setzen */                               Serial.print(F("| 2 "));
    Achse_A.setCurrentPosition(-10);                    // Aktuelle Position auf -10 stellen
    Nullpunkt_A = true;                                 // Nullpunkt Marker setzen
/* 3. Position Null anfahren */                         Serial.print(F("| 3 "));   
    Achse_A.moveTo(0);                                  // Auftrag zur Position zu Fahren
    while(Achse_A.currentPosition() != 0)               // Positions überprüfung
      {Achse_A.run(); }                                 // Weiter zur position fahren
/* 4. Zum Ende-Sensor Fahne */                          Serial.print(F("| 4 "));
    Achse_A.move(30000);                                // Auftrag zur Position zu Fahren
    while(digitalRead(Sensoren[0]) == 0)                // Prüft ob Ende-Sensor ausgelöst hat
      {Achse_A.run(); }                                 // Richtung Ende-Sensor fahren 
/* 5. Arbeoitsbereich setzen */                         Serial.print(F("| 5 "));
    Diff = Achse_A.currentPosition() - Arbeitsbereich_A;  // Debugg information 
    Arbeitsbereich_A = Achse_A.currentPosition();       // Aktuelle position ist Arbeitsbereich
/* 6. Position Null anfahren */                         Serial.print(F("| 6 "));   
    Achse_A.moveTo(0);                                  // Auftrag zur Position zu Fahren
    while(Achse_A.currentPosition() != 0)               // Positions überprüfung
      {Achse_A.run(); }                                 // Weiter zur position fahren
/* 7. Arbeitsbereich ausgeben */                      Serial.print(F("| 7 "));
  Serial.print(F("| Arbeitsbereich: "));
  Serial.print(Arbeitsbereich_A); 
  Serial.print(F(" | Diff.: "));
  Serial.println(Diff); 
}

Das erstaunliche ist jetzt das ich bei 1 bis 5 durchlaufen eine Abweichung erhalte und dann der Arbeitsbereich immer exakt gleich groß ist.

Hat jemand eine Idee warum zu beginn noch eine Abweichung vorhanden ist?

Das ist das Ergebnis aus dem Code.

Arduino bereit!
Speed: 600 Rampe: 5000
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | Arbeitsbereich: 0 | Diff.: 0
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | Arbeitsbereich: 389 | Diff.: 389
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | Arbeitsbereich: 397 | Diff.: 8
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | Arbeitsbereich: 395 | Diff.: -2
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | Arbeitsbereich: 395 | Diff.: 0
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | Arbeitsbereich: 395 | Diff.: 0
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | Arbeitsbereich: 395 | Diff.: 0
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | Arbeitsbereich: 395 | Diff.: 0
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | Arbeitsbereich: 395 | Diff.: 0
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | Arbeitsbereich: 395 | Diff.: 0
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | Arbeitsbereich: 395 | Diff.: 0
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | Arbeitsbereich: 395 | Diff.: 0
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | Arbeitsbereich: 395 | Diff.: 0
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | Arbeitsbereich: 395 | Diff.: 0
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | Arbeitsbereich: 395 | Diff.: 0
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | Arbeitsbereich: 395 | Diff.: 0
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | Arbeitsbereich: 395 | Diff.: 0
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | Arbeitsbereich: 395 | Diff.: 0
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | Arbeitsbereich: 395 | Diff.: 0
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | Arbeitsbereich: 395 | Diff.: 0
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | Arbeitsbereich: 395 | Diff.: 0
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | Arbeitsbereich: 395 | Diff.: 0
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | Arbeitsbereich: 395 | Diff.: 0
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | Arbeitsbereich: 395 | Diff.: 0
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | Arbeitsbereich: 395 | Diff.: 0
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | Arbeitsbereich: 395 | Diff.: 0
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | Arbeitsbereich: 395 | Diff.: 0
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | Arbeitsbereich: 395 | Diff.: 0
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | Arbeitsbereich: 395 | Diff.: 0
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | Arbeitsbereich: 395 | Diff.: 0
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | Arbeitsbereich: 395 | Diff.: 0
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | Arbeitsbereich: 395 | Diff.: 0
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | Arbeitsbereich: 395 | Diff.: 0
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | Arbeitsbereich: 395 | Diff.: 0
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | Arbeitsbereich: 395 | Diff.: 0
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | Arbeitsbereich: 395 | Diff.: 0
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | Arbeitsbereich: 395 | Diff.: 0
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | Arbeitsbereich: 395 | Diff.: 0
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | Arbeitsbereich: 395 | Diff.: 0
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | Arbeitsbereich: 395 | Diff.: 0
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | Arbeitsbereich: 395 | Diff.: 0
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | Arbeitsbereich: 395 | Diff.: 0
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | Arbeitsbereich: 395 | Diff.: 0
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | Arbeitsbereich: 395 | Diff.: 0
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | Arbeitsbereich: 395 | Diff.: 0
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | Arbeitsbereich: 395 | Diff.: 0
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | Arbeitsbereich: 395 | Diff.: 0
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | Arbeitsbereich: 395 | Diff.: 0

Gruß Mücke

Hallo Mücke,
ohne dein letztes Problem exakt angeschaut zu haben.
Ein grundsätzliches Problem bei deinem Code scheint mir zu sein, dass Du nicht kontrollierst, ob der Stepper nach dem Anhalten noch innerhalb des Sensorbereiches steht, oder schon darüber hinausgelaufen ist. Beim Zurückdrehen, um die Kante genau zu bestimmen ist das aber wichtig, da Du jeweils anders weitermachen musst.

Hallo,

Habe mir auch nochmal Gedanken gemacht. Der Einwand von Microbahner ist sehr gut. Das könnte/wird das falsch drehen im Video erklären.

Ansonsten behaupte ich immer noch das die Werte welche du Arbeitsbereich nennst eine Position ist, denn du ermittelst die mit
currentPosition(). Desweiteren suchst du den Sensor mit Speed und Rampe 100. Das wird noch zu hoch sein und die schwankenden Debugwerte ist die Toleranz der Schalthysterese vom Sensor. Das der Wert Steps/360° entspricht ist Zufall.

Bsp. wie man es machen könnte.
Wenn du im Uhrzeigersinn am Sensor vorbeisaust dann gibt es 2 Flanken. Mit der 2. Flanke weißt du, du bist am Sensor vorbei und musst wieder zurück. Das wäre deine 3. Flanke die man Nullpunkt nennen könnte.

Fährt man im Uhrzeigersinn vorbei, registrierst eine Flanke aber die 2. kommt innerhalb eines festgelegten Weges nicht, dann weiß man man ist außerhalb des Sensors und muss rückwärts suchen oder man ein anderes Problem.

Kommt man Gegenuhrzeigersinn am Sensor vorbei hat man wieder eine erste Flanke und dann muss die 2. Flanke kommen. Dann weiß man man hat genau den Sensorbereich soeben erfasst und wieder verlassen. Jetzt muss man im Uhrzeigersinn fahren, 1. Flanke, 2. Flanke, vorbei, zurück, 3. Flanke wie oben, Nullpunkt erfasst.