Steps - Kontrolle und Dynamik per LS eruieren

Hallo!
@StefanL38
2 Dinge wollen eruiert werden, die korrekten Steps und die Dynamik.
Der Steppermotor dreht, der Lichtschranke erkennt die Position.
Die Aufgabe ist, das zu automatisieren.
Dazu brauche ich eure Hilfe!


das Rohprogramm ist vorbereitet:

// MACRO-START * MACRO-START * MACRO-START * MACRO-START * MACRO-START * MACRO-START *
// Take it for granted at the moment scroll down to void setup
// start of macros dbg and dbgi
#define dbg(myFixedText, variableName) \
  Serial.print( F(#myFixedText " "  #variableName"=") ); \
  Serial.println(variableName);
// usage: dbg("1:my fixed text",myVariable);
// myVariable can be any variable or expression that is defined in scope

#define dbgi(myFixedText, variableName,timeInterval) \
  do { \
    static unsigned long intervalStartTime; \
    if ( millis() - intervalStartTime >= timeInterval ){ \
      intervalStartTime = millis(); \
      Serial.print( F(#myFixedText " "  #variableName"=") ); \
      Serial.println(variableName); \
    } \
  } while (false);
// usage: dbgi("2:my fixed text",myVariable,1000);
// myVariable can be any variable or expression that is defined in scope
// third parameter is the time in milliseconds that must pass by until the next time a
// Serial.print is executed
// end of macros dbg and dbgi
// print only once when value has changed
#define dbgc(myFixedText, variableName) \
  do { \
    static long lastState; \
    if ( lastState != variableName ){ \
      Serial.print( F(#myFixedText " "  #variableName" changed from ") ); \
      Serial.print(lastState); \
      Serial.print( F(" to ") ); \
      Serial.println(variableName); \
      lastState = variableName; \
    } \
  } while (false);
// MACRO-END * MACRO-END * MACRO-END * MACRO-END * MACRO-END * MACRO-END * MACRO-END *
// library
#include <MobaTools.h>
// call
MoToStepper myStepper ( 4144, STEPDIR );

int zaehler = 0; // Anzahl der Lichtschrankimpulse
int x = 0;  // Anzahl der Umdrehungen

void setup() {
  pinMode (7, INPUT_PULLUP);
  myStepper.attach( 4, 3 );
  myStepper.setSpeed( 1000 );  
  myStepper.setRampLen( 10 );
  myStepper.setZero( 0 );
  myStepper.attachEnable( 2,100,LOW); 
  // Define Serial Output to display machine status ---
  Serial.begin (9600); // Datenrate 9600 bps
}

void loop() {
  dbgc(Lichtschranke:,zaehler);
  // Lichtschranke
    if (!digitalRead(7))
    { zaehler++;
      delay(100); // entprellen
    }
  // Schrittmotor    
  if (x<=10)
  {  if (myStepper.moving() == 0)
      { // delay(1000);
        myStepper.write( 360 * x );
        Serial.print("write Pos: "); Serial.println(360 * x);
        x++;
      }
  }
}

OK, soweit so gut.
Ein Problem habe ich, nach einem Download ist der Istwert oder Position des myStepper nicht 0. Obwohl im setup myStepper.setZero( 0 ); eingetragen ist, dh. beim Start up bewegt er sich wenn die erste Position "0" vorgegeben wird. Wie kann ich das lösen?

FĂŒr die Kontrolle der Steps, soll er 50x rotieren. Die Endposition bestimmt ob die Steps korrekt sind oder nicht. Start ist am Lichtschranke, er soll dann wieder am LS stehen bleiben, ist das so die Logik dahinter?

:slight_smile:

Zuerst eine sogenannte Referenzfahrt machen.
Das bedeutet wenn Lichtschranke geschaltet fahre erst einmal von der Lichtschranke herunter.
Dann drehe laaaangsam wieder in Richtung Lichtschranke bis Lichtschranke umschaltet.
Dieses laaaangsam fahren macht man gib einen EINZELNEN Schritt aus
dann SOFORT wieder Schaltzustand der Lichtschranke prĂŒfen.
Nur so bekommst du genau mit bei welcher Schrittanzahl die Lichtschranke schaltet

Dann Motor Stop und dann Nullpunkt setzen. Ich habe die Befehle nicht alle im Kopf vielleicht ist setZero fĂŒr Nullpunktsetzen nicht der richtige.
Doku lesen !

WofĂŒr soll das gut sein? Beides hĂ€ngt von der Mechanik ab, in der der Motor tatsĂ€chlich laufen soll.

Moin @4711,

kann mich @StefanL38 nur anschliessen: Auf jeden Fall die Doku zu den MobaTools lesen!

siehe hier https://github.com/MicroBahner/MobaTools/blob/master/MobaTools-243-de.pdf

Wenn der Aufbau dafĂŒr dienen soll, bei Schrittmotoren mit unbekanntem Schrittwinkel oder nachgeschaltetem Getriebe, herauszufinden, wie viele Schritte pro 360°-Umdrehung erforderlich sind, ist die Ansteuerung mit myStepper.write() nicht hilfreich. Diese Funktion ist erst sinnvoll, wenn man man zuvor bereits die Schritte/360° kennt und beim Einrichten des Steppers als ersten Parameter richtig eingegeben hat.

Um eine bestimmte Anzahl von Schritten zu gehen, benutzt man die Methoden

  • myStepper.doSteps(long stepcount) oder
  • myStepper.move(long stepcount)

Wenn man diese mit Schrittweite 1 in einer Schleife einsetzt, kann man mitzÀhlen lassen, wie viele Schritte nach dem letzten Lichtschrankendurchgang der nÀchste (oder ggf. der 10.) Durchgang erfolgt.

  • Schrittgesamtzahl/(Anzahl der Unterbrechungen) = Schritte/360°.

Wenn ich mich nicht tÀusche ...

Gruß
ec2021

1 Like

Du kannst ja mal diesen Sketch testen:

// library
#include <MobaTools.h>
// call
MoToStepper myStepper ( 4144, STEPDIR );

int zaehler = 0; // Anzahl der Lichtschrankimpulse
int StepCount = 0;

void setup() {
  pinMode (7, INPUT_PULLUP);
  myStepper.attach( 4, 3 );
  myStepper.setSpeed( 1000 );  
  myStepper.setRampLen( 10 );
  myStepper.setZero( 0 );
  myStepper.attachEnable( 2,100,LOW); 
  // Define Serial Output to display machine status ---
  Serial.begin (9600); // Datenrate 9600 bps
}

boolean SchrankeWiederFrei(){
   static unsigned long lastFree = 0;
   static boolean WarZu = false;
   boolean SchrankeOffen = digitalRead(7);
   if (WarZu && SchrankeOffen) {
     WarZu = false;
     return true;
     } else {
       WarZu = !SchrankeOffen; 
       return false;
    } 
}

void loop() {
    if (SchrankeWiederFrei()) {
          if (zaehler == 0) StepCount = 0;
          int SchritteProUmdrehung = (zaehler > 0) ? StepCount/zaehler : 0 ;
          Serial.print("Durchgang = "+String(zaehler));
          Serial.print("\tSchritte = "+String(StepCount));
          Serial.print("\tSchritt/Umdrehung = ");
          Serial.println(SchritteProUmdrehung);
          zaehler++;
    };
  // Schrittmotor    
   if (zaehler < 10) {
     StepCount++;
     myStepper.doSteps(1);
     while (myStepper.moving());
   }  
}
  • Die Lichtschranke "nullt", wenn sie nach einem Unterbruch wieder frei wird; da sollte hoffentlich keine Entprellung mehr erforderlich sein ...
  • Die Schrittweite ist 1 Step; danach wird mit "while(myStepper.moving());" gewartet, bis der Motor die Position erreicht hat. Erst danach geht's weiter.
  • Je Umdrehung werden die DurchgĂ€nge, Gesamtzahl der Steps und der Durchschnittswert (Steps/DurchgĂ€nge) seriell ausgegeben.
  • Hört nach 10 Umdrehungen auf zu "steppen" ...

Bei Wokwi mit Taster anstelle der Lichtschranke getestet; muss aber nicht unbedingt gleich in Deinem Aufbau funktionieren ... Dann gerne als Anhalt verwenden ... :wink:

Gruß
ec2021

1 Like

hab dein Programm 1:1 probiert, Schrittmotor lÀuft mit 1 Step (sehr langsam) eine Runde und am LS passiert das:

Durchgang = 0	Schritte = 0	Schritt/Umdrehung = 0

er fÀhrt weiter....

fasse ich mit dem Finger noch mal rein in den LS kommt das:

Durchgang = 1	Schritte = 1135	Schritt/Umdrehung = 1135
Durchgang = 2	Schritte = 1195	Schritt/Umdrehung = 597
Durchgang = 3	Schritte = 1212	Schritt/Umdrehung = 404
Durchgang = 4	Schritte = 1227	Schritt/Umdrehung = 306
Durchgang = 5	Schritte = 1244	Schritt/Umdrehung = 248
Durchgang = 6	Schritte = 1257	Schritt/Umdrehung = 209
Durchgang = 7	Schritte = 1269	Schritt/Umdrehung = 181

dh es fkt., ich lasse ihn jetzt mal die 10 U farhen :slight_smile:

ich sehe, dass wenn die Fahne den LS verlÀsst, die Anzeige LED etwas flackert

  1. Durchlauf, zeigt ein gutes Ergebnis:
Durchgang = 0	Schritte = 0	Schritt/Umdrehung = 0
Durchgang = 1	Schritte = 4144	Schritt/Umdrehung = 4144

es ist nicht konstat, schÀtze der LS gehört entprellt

Durchgang = 0	Schritte = 0	Schritt/Umdrehung = 0
Durchgang = 1	Schritte = 4142	Schritt/Umdrehung = 4142
Durchgang = 2	Schritte = 8287	Schritt/Umdrehung = 4143
Durchgang = 3	Schritte = 12435	Schritt/Umdrehung = 4145
Durchgang = 4	Schritte = 16578	Schritt/Umdrehung = 4144

FĂŒr was steht denn die AbkĂŒrzung LS ?

Lichtschranke?
Hat das LS-dingsbums einen Schmitt-Trigger mit Hysterese oder nicht?

vgs

LS=Lichtschranke
keine Ahnung was du damit meinst.
https://de.aliexpress.com/item/32806655358.html?gatewayAdapt=glo2deu
https://ja.aliexpress.com/i/1005001270670445.html
ist ein E3S-DS15N

Die Abweichungen können sich auch aus folgenden GrĂŒnden ergeben:

a) Die Erkennung des Übergangs von Unterbrochen zu Offen ist nicht auf "den Step" genau.
b) Rundungsfehler beim Teilen der Summe durch die Anzahl der Umdrehungen.

Wenn der von Dir dargestellte Aufbau auf einen oder zwei Schritte genau arbeitet, halte ich das fĂŒr schon sehr ordentlich. Außerdem dienen die 10 Drehungen dazu, einzelne (kleiner Fehler!) auszumitteln. GrĂ¶ĂŸere Abweichungen (z.B. Unterbruch mittels Finger) werden nicht erkannt und verfĂ€lschen die sehr einfach gehaltene Auswertung. Will man das vermeiden, könnte man das Verfahren jetzt so anpassen, dass z.B. alle UnterbrĂŒche mit weniger als 4130 und mehr als 4160 Schritten zwischen zwei Lichtschrankenmessungen nicht akzeptiert werden. Am einfachsten ist das so zu machen, dass man die Messwerte pro Umlauf in einem Array speichert und nach definiertem Abschluss der Messreihe auswertet.

Hast Du die Messung im abgedunkelten Zimmer durchgefĂŒhrt oder zumindest den Bereich der Lichtschranke vor Fremdlicht abgeschirmt? Unter UmstĂ€nden könnte auch Streulicht oder der generelle Kontrast Einfluss auf die Wiederholgenauigkeit der Messung haben.

Gruß
ec2021

Es gibt noch eine mögliche Fehlerquelle,

Je nachdem wie du den Openkollektorausgang an den IO-pin angeschlossen hast
könnte das auch zu Abweichungen fĂŒhren.

Poste mal einen Schaltplan wie du die Lichtschranke angeschlossen hast.

vgs

Andererseits, worĂŒber sprechen wir hier ...

4142 / 360° = 11,506 Schritte pro Grad
4145 / 360° = 11,514 Schritte pro Grad

Wir sind also pro Step schon im 10tel-Grad-Bereich. Das erscheint mir als Wiederholgenauigkeit bei dem Aufbau aus Post #1 schon nicht ĂŒbel ...

Wenn die Drehrichtung in der Anwendung wechselt, wĂ€re auch noch zu prĂŒfen, wie sich das Spiel beim Wechsel von Links- auf Rechtslauf und zurĂŒck auf eine absolute Positionierung auswirkt.

Gruß
ec2021

der LS ist an Pin 7 angehÀngt, 5V Versorgung vom Board
der LS hat eine Betriebsspannung von 6-36V, er fkt. mM aber einwandfrei.
Umbau ist möglich, allerdings muss die Signalspannung verm. dann wieder umgeformt werden.
wie gesagt sehe ich das LED flackern, wenn die Fahne den LS verlÀsst, das Programm erkennt die erst neg. Fahne und nichts weiter, wenn ich das richtig interpretiere.

wer misst, misst Mist, denke auch, dass es nur mit gr. Aufwand genauer wird, stellt sich die Frage, ob das notwendig ist, die Tendenz zeigt, dass die 4144 bei 4 Microsteps schon korrket sind.

Nach Deinem Link sollte das NPN NO sein, also zieht der Ausgangstransistor nur nach GND. Hast Du den internen PullUp aktiviert? Bei NPN NO stört auch eine höhere Betriebsspannung nicht.

Gruß Tommy

der Link ist zu einem blauen, NPN GS15N, ich habe einen gelben DS15N
dazu finde ich nichts, ich weiß somit nicht ob er gleich ist

  pinMode (7, INPUT_PULLUP);

Woher sollen wir das dann wissen?

Gruß Tommy

sag ich ja nicht

Was heisst "flackern" ??
in 0,5 Sekunden 10mal an/aus?
ein einziges mal kurz an dann wieder aus?
in 0,5 sekunden 3-5 mal an/aus?

Das ist nichts weiter als Spekulation und spÀtestens wenn du zwei Spekulationen aufeinander baust kannst du wochenlang den Fehler suchen und nicht finden weil die Annahmen falsch sind.

Wenn du kein Oszilloskop hast könntest du als Ersatz eine Interrupt-routine programmieren
und in der Interrupt-Routine einfach nur einen ZÀhler hochzÀhlen lassen.
Triggern auf CHANGE (heißt bei Änderung von LOW nach HIGH wird getriggert und bei Änderung von HIGH auf LOW wird getriggert.

Bei einer Umdrehung = einer Lichtschrankenunterbrechung darf der ZÀhler dann nur um 2 erhöht sein. Wenn es öfter ist dann schwankt der Spannungspegel mehrfach das wÀre dann das was man nicht gebrauchen kann.

vgs

Kannst Du mal die Werte von einem kompletten 10er-Durchgang posten? Gibt es da grĂ¶ĂŸere Abweichungen bei den einzelnen Runden oder liegen diese im Einzelschrittbereich? Kommen im MIttel (bei mehreren 10-er-Runden) regelmĂ€ĂŸig die 4144 Steps heraus?

Der Sketch arbeitet flankengesteuert (Umdrehung startet und endet dort, wo digitalRead(7) nachdem es zuvor (fĂŒr mindestens einen oder aber mehrere aufeinanderfolgende Steps) LOW war wieder auf HIGH wechselt). Diese PrĂŒfung findet jeweils nach einem Step statt. Ob der Übergang beim Eintritt oder beim Austritt aus der Lichtschranke passiert, hĂ€ngt von der "Logik" der Schranke ab.

Vielleicht habe ich es nicht richtig verstanden, aber mir ist noch nicht ganz klar, wo bei der anscheinend vorhandenen Wiederholgenauigkeit von wenigen 10tel-Grad das Problem liegt.

Gruß
ec2021