Forum: Mikrocontroller und Digitale Elektronik Arduino Motorsteuerung : Start durch Taster, Stopp durch Endschalter


von David J. (kettid)


Angehängte Dateien:

Lesenswert?

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
von Tom E. (Gast)


Lesenswert?

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.

von Brain 2.0 (Gast)


Lesenswert?

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.

von SuperPCFan (Gast)


Lesenswert?

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...

von David J. (kettid)


Lesenswert?

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
von Timo E. (cumbaya)


Lesenswert?

Lass mich raten: du weist der Variablen "tasterendup" außerhalb der 
while-Schleife ihren Wert zu?

von David J. (kettid)


Lesenswert?

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!

von jibi (Gast)


Lesenswert?

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

von SuperPCFan (Gast)


Lesenswert?

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.

von M. K. (sylaina)


Lesenswert?

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
Noch kein Account? Hier anmelden.