Hallo allerseits, ich hatte mein Problem bereits schonmal im Arduino Forum gepostet, bin dort aber leider nicht weitergekommen. In der Zwischenzeit hat sich mein Problem aber konkretisiert und ich werde es mal auf den problematischen Teil herrunterbrechen. Ich bin dabei, die Höhenverstellung einer Tischfräse mit einem Schrittmotor über einen Arduino Uno zu steuern. Verschiedene funktionen habe ich bereits erfolgreich umgesetzt, nur eine Funktion bereitet mir noch Probleme: Auf einen einmaligen Tastendruck soll die Fräse ganz hochfahren, bis zum Endschalter. Leider schaffe ich es nicht, eine Schleife zu programmieren, die durch einen einmaligen Tastendruck gestartet wird und durch den Endschalter beendet wird. Der Motorsteuerungs-Code der in der Schleife durchlaufen soll sieht wie Folgt aus: [c] digitalWrite(dirPin,LOW); digitalWrite(stepPin,HIGH); delayMicroseconds(fast); digitalWrite(stepPin,LOW); delayMicroseconds(fast); [c/] Vielen Dank für eure Hilfe! David
:
Bearbeitet durch User
David J. schrieb: > Leider schaffe ich es nicht, eine Schleife zu programmieren, die durch > einen einmaligen Tastendruck gestartet wird und durch den Endschalter > beendet wird. Das EVA Prinzip kennst du? Nimm dir ein Flag, dass bei Erkennung von Taste oder Endschalter gesetzt bzw. gelöscht wird. Zusätzlich brauchst du noch eine Verriegelung, damit man aus dem Endanschlag rausfahren kann, aber nicht weiter in Richtung Anschlag. Nur wenn das Flag gesetzt ist, darf der Motor einen Schritt weiter machen.
David J. schrieb: > ich hatte mein Problem bereits schonmal im Arduino Forum gepostet, bin > dort aber leider nicht weitergekommen. Wenn du nach den ganzen Tipps und Hilfestellungen nicht weiter gekommen bist, liegt es wohl daran, dass du dich nicht genug in die Materie eingearbeitet hast. Grundlagen des Arduino und der Programmiersprache sind schon wichtig. Die benötigst du leider auch hier.
Ohne jetzt den Arduino oder den Rest des Programmes explizit zu kennen... ...ein bisschen Pseudo Code: wenn Taster gedrückt dann { solange nicht Endlage { kurbel' am Motor } } sonst { tu nix } ...ein Delay zur Zeitsteuerung ist übrigens auch nicht so gut...
Hallo, ich zeige euch mal, was ich momentan am laufen habe. Es ist einer von vielen Versuchen, aber funktioniert leider nicht. Evtl könnt ihr mir ja Tipps geben, wie ich den Code umschreiben kann.
1 | if (tasterfullup == HIGH){ // wenn der taster gedrückt wurde |
2 | while ( tasterendup == HIGH) // während der Endschalter nicht gedrückt ist (normaly closed) |
3 | {digitalWrite(dirPin,HIGH); |
4 | digitalWrite(stepPin,HIGH); |
5 | delayMicroseconds(slow); |
6 | digitalWrite(stepPin,LOW); |
7 | delayMicroseconds(slow);}} |
Wenn ich den Taster drücke, fährt der Motor in einer Endlosschleife und lässt sich nicht durch den Endschalter anhalten. Allein ein Reset kann ihn dann noch stoppen. Er hängt also in der while-Schleife fest und merkt nicht, dass der Endschalter (tasterendup) auf LOW wechselt. Einen Hardwarefehler kann ich ausschließen, da er bei den anderen Programmpunkten tadellos funktioniert. Das ist also auch der Ansatz wie ihn SuperPCFan vorgeschlagen hat. (ergänzt durch: else{}) >Das EVA Prinzip kennst du? >Nimm dir ein Flag, dass bei Erkennung von Taste oder Endschalter gesetzt >bzw. gelöscht wird. Zusätzlich brauchst du noch eine Verriegelung, damit >man aus dem Endanschlag rausfahren kann, aber nicht weiter in Richtung >Anschlag. Ja, das EVA Prinzip ist mir bewusst. Leider kann ich dir bei den Flags nicht folgen. Vermutlich meisnt du, ich solle StateChange's einbauen? damit habe ich es auch schon versucht, bin aber auch gescheitert.. Eine Verriegelung ist denke ich nicht nötig, da ich mit einem anderen Taster wieder vom Endschalter wegfahren kann. > ...ein Delay zur Zeitsteuerung ist übrigens auch nicht so gut... wieso ist das Delay nicht so gut? Was wäre die alternative, Microseconds? Über weitere Tipps würde ich mich sehr freuen! Grüße, David
:
Bearbeitet durch User
Lass mich raten: du weist der Variablen "tasterendup" außerhalb der while-Schleife ihren Wert zu?
Hmm... Im Prinzip weise ich ihr ja gar keinen Wert zu, sondern sie wechselt ihren Zustand ja durch das drücken des Endschalters? Mir geht ein Licht auf, muss ich die while-Schleife, nach dem "fahre einen Schritt" noch ein digital read? Ich werde es sofort mal ausprobieren!
Wenn die Variable "tasterendup" nicht durch einen Interrupt auserhalb der schleifenkörpers gefüllt, läuft die schleife ewig...Also mach mal dein Read dahin gruß j
Wie gesagt, ich kenne den Arduino nicht näher, aber ein Delay heißt im Normalfall, dass dein Prozessor nutzlos im Kreis läuft, solange die Zeit nicht abgelaufen ist. Im schlechtesten Fall wirkt es, als würde dein Programm "einfrieren". Eine Rechteckfunktion (nichts anderes ist dein setzen, warten, setzen, warten) wird besser durch einen Timerinterrupt umgesetzt. Dann kann der Prozessor während der Wartezeit noch andere sinnvolle Dinge tun.
SuperPCFan schrieb: > Dann kann der Prozessor während der Wartezeit noch andere sinnvolle > Dinge tun. Und wenn er da nichts zu tun hat ist das eine prima Gelegenheit ihn schlafen zu legen und erst dann wieder zu wecken wenn es auch etwas für ihn zu tun gibt ;)
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.