AdmiralStein
13.11.2018, 21:00

Mindstorms-Programmierung: Tipp zum Schleifenabbruch per Tastendruck?

Mit der grafischen Block-Programmierung tue ich mich echt etwas schwer... Ich schaffe in der grafischen EV3-Programmieroberfläche folgendes nicht: Es läuft ein Programm in Dauerschleife und am Ende der Schleife ist eingestellt, dass die beendet wird, sobald eine der fünf Tasten gedrückt wird.

Meine Erwartung ist nun: Sobald während des Schleifendurchlaufs irgendwann eine Taste gedrückt wird, bricht die Schleife am Ende des aktuellen Durchlaufs ab.

Was passiert ist folgendes: Ich kann Tasten drücken wie ich lustig bin, es passiert gar nichts. Die Schleife wird nur beendet, wenn am Ende eines Schleifendurchlaufs eine Taste gedrückt ist. Man muss quasi das Ende der Schleife abpassen und eine Taste gedrückt halten... das ist unschön. Es ist dabei egal, ob ich Zustand "1" ("Gedrückt") oder Zustand "2" ("Angestoßen") auswähle.

Ich könne es nun versuchen mit einem parallelen Programmzweig, der eine Dauerschleife enthält, in der die Tasten ständig abgefragt werden und falls eine gedrückt wird, eine Variable gesetzt wird, die am Ende der Hauptschleife als Abbruchkriterium abgefragt wird...

Gibt es eine einfachere Möglichkeit, meine Erwartung umzusetzen?

Grüße

Matthias



Tagl
13.11.2018, 21:15

Als Antwort auf den Beitrag von AdmiralStein

Re: Mindstorms-Programmierung: Tipp zum Schleifenabbruch per Tastendruck?

Hallo Mathias,
AdmiralStein hat geschrieben:

Ich könne es nun versuchen mit einem parallelen Programmzweig, der eine Dauerschleife enthält, in der die Tasten ständig abgefragt werden und falls eine gedrückt wird, eine Variable gesetzt wird, die am Ende der Hauptschleife als Abbruchkriterium abgefragt wird...

ich denke damit hast du die Lösung schon gefunden. Ich hätte das in jedem Fall so gelöst, obwohl ich eigentlich noch nie mit der graphischen Sprache gearbeitet habe.

Gruß
Marco


Steinregal Flickr

[image]


Lok24
14.11.2018, 07:35

Als Antwort auf den Beitrag von AdmiralStein

Editiert von
Lok24
14.11.2018, 07:44

Re: Mindstorms-Programmierung: Tipp zum Schleifenabbruch per Tastendruck?

Hallo Matthias,

das ist beim Programmuieren immer so?

Hier mal ein Beispiel

Do while Taste = false
wait 10sec
loop

Auch hier wirst Du die Taste am Ende der 10 sec gedrückt halten müssen, damit das wirkt.

Was Du scheinbar suchst ist ein Event.

Do while true
on Event exit loop
wait 10 sec
Loop



Leider habe ich jetzt gar keine Zeit das zu probieren.
Aber es geht ungefähr so:
Die Hauptschleife oben (= Dein Programm) heißt "Main"
Als paralleler Thread läuft unten eine Endlosschleife mit der Tastenabfrage und dem Schleifen-Interrupt für "Main"

[image]



So ähnlich, gerne heute abend mehr.

Grüße

Werner



Lok24
14.11.2018, 17:42

Als Antwort auf den Beitrag von AdmiralStein

Re: Mindstorms-Programmierung: Tipp zum Schleifenabbruch per Tastendruck?

Hallo,

AdmiralStein hat geschrieben:

Ich könne es nun versuchen mit einem parallelen Programmzweig, der eine Dauerschleife enthält, in der die Tasten ständig abgefragt werden und falls eine gedrückt wird, eine Variable gesetzt wird, die am Ende der Hauptschleife als Abbruchkriterium abgefragt wird...

Hängt davon ab was Du erreichen willst.
Wenn das Hauptprogramm immer ganz durchlaufen soll ja, wenn es immer sofort unterbrochen werden soll nein.



AdmiralStein
14.11.2018, 19:27

Als Antwort auf den Beitrag von Lok24

Re: Mindstorms-Programmierung: Tipp zum Schleifenabbruch per Tastendruck?

Danke, das funktioniert so für sofortigen Abbruch. Es musste hinter der Hauptschleife nur noch ein Schleifenabbruch für die Abbruchschleife ergänzt werden.

Grüße

Matthias



Lok24
14.11.2018, 19:37

Als Antwort auf den Beitrag von AdmiralStein

Re: Mindstorms-Programmierung: Tipp zum Schleifenabbruch per Tastendruck?

Hi,

AdmiralStein hat geschrieben:

Danke, das funktioniert so für sofortigen Abbruch. Es musste hinter der Hauptschleife nur noch ein Schleifenabbruch für die Abbruchschleife ergänzt werden.

Ah, elektronischer Selbtmord

Aber ja, wenn das Programm dann ganz fertig sein soll.
Wenn Du in Main Befehle wie Motor an / wait 3 / Motor aus hast
ist es gut, danach auch immer "Motor aus" zu schalten.

Sonst alles gut?



AdmiralStein
15.11.2018, 08:44

Als Antwort auf den Beitrag von Lok24

Re: Mindstorms-Programmierung: Tipp zum Schleifenabbruch per Tastendruck?

Lok24 hat geschrieben:

Was Du scheinbar suchst ist ein Event.


Gestern hatte ich keine Zeit, ausführlicher zu antworten. Aber jetzt:

Ja, ein Tastendruck verstehe ich intuitiv als Event, das im Fall des Tastendrucks zwischengespeichert wird, falls das abgefragt wird. Denn: Da man als Schleifenabbruchkriterium "Taste angestoßen" (-> Vergangenheitsform!), d. h. "gedrückt und wieder losgelassen", auswählen kann, ging ich davon aus, dass Tastendrücke zwischengespeichert werden, falls "Taste angestoßen" abgefragt wird. Sonst macht dieses Kriterium ja überhaupt keinen Sinn. Wer drückt schon exakt im Moment der Abfrage eine Taste und lässt diese ebenfalls in exakt diesem Moment wieder los? Wenn ich eh die Taste in diesem Moment gedrückt halten muss, würde ja auch alleine das Kriterium "Gedrückt" ausreichen. Muss man nicht verstehen.

Grüße

Matthias



AdmiralStein
15.11.2018, 08:49

Als Antwort auf den Beitrag von Lok24

Re: Mindstorms-Programmierung: Tipp zum Schleifenabbruch per Tastendruck?

Lok24 hat geschrieben:

Hi,

AdmiralStein hat geschrieben:
Danke, das funktioniert so für sofortigen Abbruch. Es musste hinter der Hauptschleife nur noch ein Schleifenabbruch für die Abbruchschleife ergänzt werden.

Ah, elektronischer Selbtmord

Aber ja, wenn das Programm dann ganz fertig sein soll.
Wenn Du in Main Befehle wie Motor an / wait 3 / Motor aus hast
ist es gut, danach auch immer "Motor aus" zu schalten.

Sonst alles gut?


Alles ok, etwas wenig Schlaf...

Die Abbruchschleife muss abgebrochen werden, auch wenn das Programm nach der abgebrochenen Hauptschleife noch weiterläuft. Sonst kann es nie beendet werden, weil die Abbruchschleife ewig weiterläuft, aber quasi nichts mehr macht.

Wir sehen uns.

Grüße

Matthias



Lok24
15.11.2018, 18:53

Als Antwort auf den Beitrag von AdmiralStein

Editiert von
Lok24
15.11.2018, 19:36

Re: Mindstorms-Programmierung: Tipp zum Schleifenabbruch per Tastendruck?

Hallo Matthias,

AdmiralStein hat geschrieben:

Ja, ein Tastendruck verstehe ich intuitiv als Event, das im Fall des Tastendrucks zwischengespeichert wird, falls das abgefragt wird. Denn: Da man als Schleifenabbruchkriterium "Taste angestoßen" (-> Vergangenheitsform!), d. h. "gedrückt und wieder losgelassen", auswählen kann, ging ich davon aus, dass Tastendrücke zwischengespeichert werden, falls "Taste angestoßen" abgefragt wird.


Hm. Hmmmmm.
Such mal im Internet nach diesem Buch:
Laurens Valk, LEGO®-EV3-Roboter, dpunkt.verlag, ISBN 978-3-86490-151-5
Da findets Du auch eine Lesepobe, interessant sind die Seiten 68 und 69

Grüße

Werner



Lok24
17.11.2018, 14:22

Als Antwort auf den Beitrag von AdmiralStein

Editiert von
Lok24
17.11.2018, 14:29

Re: Mindstorms-Programmierung: Tipp zum Schleifenabbruch per Tastendruck?

Hallo Matthias,

schön, dass wir Deine Achterbahn mal in Betrieb sehen konnten.


Ich habe jetzt nochmal nachgelsen: offenbar ist es so, dass Du nur am Schleifenende auf "angestoßen" setzen musst.
Der EV3 überwacht den Taster dauernd, merkt sich das und beendet die Schleife dann am Ende.
(das entspricht Deinen Variablen, die der intern für Dich führt)

Aber als "Nothalt" ist das eher ungeeignet, denn wenn Du z.B. dem Motor sagst "30 Umdrehungen" und dann geht was schief kommt der Block nie ans Schleifenende.

Ich nutze für Nothalt immer die "Zurück"-Taste am Brick, die stoppt alles sofort.

Hier noch was Grundsätzliches: Wenn beim Programm-Start der Aufzug immer untensteht, kannst Du auch x Umdrehungen auf und x Umdrehungen ab programmieren, ganz ohne Clutch. Aber wehe der steht irgendwo, dann explodiert dein Moc.

Daher baue ich entweder
- Clutch und fahre x+1 Umdrehungen in die Startposition, ab dann -x / + x oder sogar -x / + (x+1)
- oder ein Farbsensor mit Kennungen an der Kette für unten und oben

Beides ist zuverlässig und fehlertolerant

Warum nicht über die Zeit? Weil ich nicht sicher bin, ob die Motoren je nach Batteriestand immer gleich schnell drehen....


Grüße

Werner



Lok24
18.11.2018, 17:07

Als Antwort auf den Beitrag von AdmiralStein

+1Re: Mindstorms-Programmierung: Testaufbau

Hallo Matthias,

Hab's jetzt mal probiert: es geht!
So sieht das Programm aus:

[image]



Und das tut es:
- der Motor macht nacheinander immer eine ganze Umdrehung, unendlich
- drückt man währenddessen den Taster und lässt ihn los, wird die Umdrehung zu Ende geführt, dann die Schleife verlassen, Programmende
- drückt man währenddessen den Taster und hält ihn fest startet der Motor immer wieder eine neue Umdrehung, bis dann der Taster losgelassen wird, es wird die Umdrehung zu Ende geführt, dann die Schleife verlassen, Programmende

Eigentlich ganz gut.

Grüße

Werner



JuL gefällt das