Python Programm beenden

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Artjom
User
Beiträge: 8
Registriert: Mittwoch 22. November 2023, 08:08

Hi, an alle ich habe das Problem das mein Programm sich eigentlich mit dem drücken der unteren Taste abschalten soll dies aber nicht tut habe auch schon verschiedene Codes ausprobiert aber hilft nichts. Code steht unten falls ihr Ideen habt.

Code: Alles auswählen

from pybricks.hubs import EV3Brick
from pybricks.ev3devices import Motor, TouchSensor, ColorSensor, InfraredSensor, UltrasonicSensor
from pybricks.parameters import Port, Stop, Direction, Button, Color
from pybricks.tools import wait, StopWatch, DataLog
from pybricks.robotics import DriveBase
from pybricks.media.ev3dev import SoundFile, ImageFile
import sys

# This program requires LEGO EV3 Micropython v2.0 or higher.
# Click "Open User Guide" on the EV3 extension tab for more information.

# Create your objects here.
ev3 = EV3Brick()
timer = StopWatch()
leg_motor = Motor(Port.A, Direction.COUNTERCLOCKWISE)
trunk_motor = Motor(Port.B, Direction.COUNTERCLOCKWISE)
neck_motor = Motor(Port.D)

while True:
    while Button.CENTER in ev3.buttons.pressed():
        leg_motor.run_target(1000, 3680)
        neck_motor.run_target(500, 580)
        trunk_motor.run_target(-809, 1200)
        ev3.speaker.play_file(SoundFile.ELEPHANT_CALL)
        trunk_motor.run_target(500, 0)
        neck_motor.run_target(500, -0)
        wait(5000)
        leg_motor.run_target(1009, -0)

    while Button.CENTER not in ev3.buttons.pressed():
        leg_motor.run_target(1009, 0)
        trunk_motor.run_target(500, 0)
        neck_motor.run_target(500, 0)
        timer.reset()

    if Button.DOWN in ev3.buttons.pressed():
        sys.exit()
Zuletzt geändert von Artjom am Mittwoch 22. November 2023, 08:24, insgesamt 1-mal geändert.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Bitte Code Tags benutzen, damit die in Python relevanten Einrückungen erhalten bleiben.

Zu deinem Problem: was soll denn “exit” auf einem embedded Programm wie hier bedeuten? Ich kenne die Platform nicht genau, aber bei anderen micropython Implementierungen würde der einfach neu starten, und wieder das Programm ausführen.
Artjom
User
Beiträge: 8
Registriert: Mittwoch 22. November 2023, 08:08

__deets__ hat geschrieben: Mittwoch 22. November 2023, 08:20 Bitte Code Tags benutzen, damit die in Python relevanten Einrückungen erhalten bleiben.

Zu deinem Problem: was soll denn “exit” auf einem embedded Programm wie hier bedeuten? Ich kenne die Platform nicht genau, aber bei anderen micropython Implementierungen würde der einfach neu starten, und wieder das Programm ausführen.
Also habe es jetzt nochmal anders hochgeladen und ich muss einen elephanten von Lego mindstorms programmieren bei visual Studio code er muss Nach betatigen der mittleren Taste soll der Elefant 4 Schritte vorwartsgehen, dann den Nacken und
den Russel nach oben bewegen und einen Sound machen. Danach soll er den Nacken und Rossel
wieder nach unten bewegen, 5 Sekunden warten und 4 Schritte rückwartsgehen. Wenn die mittlere
Taste wieder gedrückt wird, startet das Programm von neuem. Wenn die untere Taste gedruckt
wird, wird das Programm beendet
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das beantwortet nicht die Frage: was heißt denn beendet? Wenn du ein Programm auf deinem Rechner beendest, geht das Fenster zu. Wenn es eines hatte.

Bei einem embedded System wie dem hier, ist das aber nicht so klar. Denn die haben meist nur ein Programm, und das läuft, wenn man das System in Betrieb nimmt, und zwar endlos. Was also soll zu sehen sein, wenn man den Knopf nach unten drückt?
Artjom
User
Beiträge: 8
Registriert: Mittwoch 22. November 2023, 08:08

__deets__ hat geschrieben: Mittwoch 22. November 2023, 08:43 Das beantwortet nicht die Frage: was heißt denn beendet? Wenn du ein Programm auf deinem Rechner beendest, geht das Fenster zu. Wenn es eines hatte.

Bei einem embedded System wie dem hier, ist das aber nicht so klar. Denn die haben meist nur ein Programm, und das läuft, wenn man das System in Betrieb nimmt, und zwar endlos. Was also soll zu sehen sein, wenn man den Knopf nach unten drückt?
Ich meine damit das wenn ich den code ausführe befindet er sich in einer schleife ich muss aber die schleife abrechen
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Bitte nicht meinen gesamten Text zitieren, der steht ja schon davor.

Meinst du statt beenden, dass die Sequenz, und der sich der Roboter befinden, abgebrochen werden soll?
Artjom
User
Beiträge: 8
Registriert: Mittwoch 22. November 2023, 08:08

Ja genau
Sirius3
User
Beiträge: 17759
Registriert: Sonntag 21. Oktober 2012, 17:20

Schleifen verläßt man per `break`.

Die inneren while-Schleifen sind etwas komisch. Ich würde hier ein if erwarten, weil ja eine lange Sequenz innerhalb des Blocks abgelaufen wird, und dann wird die zweite while-Schleife ein else, was deutlich klarer wäre.
Das im zweiten Block sieht aber aus, als ob das nur ein "alles auf Anfang" wäre. Das würde ich am Ende der Sequenz erwarten (wo das ja auch schon steht). Der Block ist also überflüssig.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Dann muss dein Programm anders strukturiert sein. Leider ist die Umgebung, die du da hast, ziemlich primitiv, und kennt keine Nebenläufigkeit. Habe ich zumindest nicht gefunden in der Doku. Du musst das Programm daher so umbauen, dass du die einzelnen Aktionen irgendwie benennst, und durch ein große if-Kaskade zb abfeuerst. Also ein kleines Beispiel:

Code: Alles auswählen

zustand = “warten”
while True:
    if button_up():
        zustand = “anfang”
    if button_down()”:
        zustand = “warten”
    if zustand == “anfang”:
        links_vor()
        zustand = “zweiter_schritt”
    elif zustand == “zweiter_schritt”:
        rechts_vor()
        zustand = “dritter_schritt”
    elif …
Das ist ziemlich anstrengend, aber ich sehe zumindest erstmal keinen anderen Weg.

Durch diese Aufteilung in lauter Teilschritte kann die Abfrage des Buttons jederzeit (außer bei Wartezeiten) berücksichtigt werden.
Artjom
User
Beiträge: 8
Registriert: Mittwoch 22. November 2023, 08:08

oh man das wird anstrengend aber ich danke dir
Artjom
User
Beiträge: 8
Registriert: Mittwoch 22. November 2023, 08:08

Hi sirius3, ich verstehe noch nicht ganz genau was du meinst
Artjom
User
Beiträge: 8
Registriert: Mittwoch 22. November 2023, 08:08

ich habe das Problem gelöst ich habe die 2 unteren while schleifen durch if ersetzt und unten beim if Button.DOWN ein Break eingesetzt ich danke euch für eure Hilfe
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Also damit erreichst du aber keinen Abbruch der laufenden Sequenz. Der Button-Down kann also auch komplett entfallen, der macht ja nix wirklich. Ausser, dass danach gar nix mehr geht. Wenn das sinnvoll ist, ok.
Artjom
User
Beiträge: 8
Registriert: Mittwoch 22. November 2023, 08:08

doch er bricht die schleife ab habe es getestet
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Natuerlich tut er das. Aber wozu ist das gut? Dann geht ja gar nix mehr. Wohingegen das abbrechen deiner Sequenz selbst nicht geht, und das hast du gesagt, soll der Button machen.
Antworten