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!
// 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?
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 !
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°.
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 ...
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.
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.
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.
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.
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.