Problem beim programmieren von Roboterauto

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Aha um das geht es.

    Egal wie ich es drehe und wende, beim finally kommt immer diese Fehlermeldung:

    Code
    Traceback (most recent call last):
    File "/home/pi/Desktop/teilziel 1.py", line 43
    finally:
    ^
    SyntaxError: invalid syntax

    Bedeutet das das er das finally nicht versteht oder das was nachher kommt?????????????????'

    Die Hand voller Asse, doch das Leben spielt Schach.


    Erfolg besteht aus drei Buchstaben: Tun

    Goethe

  • Zwei Bemerkungen:


    1. try und finanally gehören in dem Sinne zusammen, dass nach dem Schlüllelwort finally: die Aktionen festgelegt werden, die unter allen Umständen als Schlussaktivität ausgeführt werden müssen, falls eine der durch try überwachten Anweisungen fehlschlägt. finally ist ohne try gar nicht verwendbar. Da try und finally zusammengehören, müssen beide Schlüsselwörter die gleiche Einrückung haben. Das t von try muss in der gleichen Spalten stehen wie das f von finally.


    2. Leider schreibst du nicht, welcher der beiden Motoren weiterdreht, nachdem du das Progrmam beendet hast. Könnte es sein, dass es der Motor ist, der im Programm MOTOR_LEFT heißt? Der ist nämlich an die Pins 21 und 20 angeschlossen und diese beiden Pins haben die Sonderfunktion PCM (Pulse Code Modulation). Falls es dieser Motor ist, der weiterdreht, würde ich vorschlagen, ihn versuchsweise über zwei andere Pins anzusteuern, z.B. über die Pins GPIO5 und GPIO6, falls diese noch frei sind.

    Jetzt habe ich den Fehler kapiert.

    Ja und es ist Motor_left.

    Dann setze ich diese zwei mal auf GPIO 5 und 6.

    Vielen Vielen Dank Boris.

    Ich habe mich immer auf diese Abbildung welche ich aus dem Raspberry Pi CMD kopiert habe verlassen.

  • 2. Leider schreibst du nicht, welcher der beiden Motoren weiterdreht, nachdem du das Programm beendet hast. Könnte es sein, dass es der Motor ist, der im Programm MOTOR_LEFT heißt? Der ist nämlich an die Pins 21 und 20 angeschlossen und diese beiden Pins haben die Sonderfunktion PCM (Pulse Code Modulation). Falls es dieser Motor ist, der weiterdreht, würde ich vorschlagen, ihn versuchsweise über zwei andere Pins anzusteuern, z.B. über die Pins GPIO5 und GPIO6, falls diese noch frei sind.

    Jetzt macht es der andere:@:@:@:@

    Die Hand voller Asse, doch das Leben spielt Schach.


    Erfolg besteht aus drei Buchstaben: Tun

    Goethe

  • Ich dachte bis jetzt immer das es auch ohne finally geht

    Am 22. Dezember hat dir __blackjack__ einen Code geschrieben mit 'try' und 'finally', du hattest die funktionierende Kombination und hättest es nur ordentlich kopieren müssen.

    Vor 46 Minuten hatte @__deets__ dir schon geschrieben, das 'try' und 'finally' nur zusammen funktionieren. Kurze Zeit später hast du von mir auch noch einen Code bekommen, mit 'try' und 'finally'. Und jetzt erst nach dem Boris-Gaertner es nochmal geschrieben hat, hast du es verstanden?

    Lese was man dir schreibt und verinnerliche es. Arbeite dich in die Antworten ein. Und erst dann wenn du nur Bahnhof verstehst, dann frag weiter nach.

    Achja und bevor ich es vergesse, lese dir die Antworten der User durch, die dir helfen wollen. Es macht keinen Sinn alles zu überfliegen und irgendwas zusammen kopieren. Es macht Sinn die Texte die man dir schreibt zu lesen und versuchen sie zu verstehen. Und zum Schluss, habe ich schon erwähnt dass du jede Antwort die du hier bekommst ordentlich durchlesen solltest?

    Weiterhin dann noch viel Erfolg

    🎧 With the music execution and the talk of revolution, it bleeds in me and it goes 🎧

  • Was ich nicht verstehe. Die Anschlussnamen die auf der Website sind die sie Boris-Gaertner geschickt haben, sind ganz anders als die BCM aufstellung welche ich aus dem Raspberry rauskopiert habe....

    Habt ihr eine Erklärung dafür?!

    Jetzt kapier ich gar nicht mehr wo welcher GPIO ist.

    und vorallem. Welche Auflistung soll ich nun benutzen.

  • lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)

  • Der Code ist ja nicht mehr das Problem. Jetzt ist das Problem nur die Motoren die einfach weiterdrehen nach dem beenden des Programms. Das Programm läuft ohne PROBLEME!

    Die Hand voller Asse, doch das Leben spielt Schach.


    Erfolg besteht aus drei Buchstaben: Tun

    Goethe

  • Unglücklicherweise gibt es für verschiedene Programme unterschiedlichen Pin-Nummerierungen. wiringPi (Spalte "wPi" im Screenshot) verwendet andere Nummern als BCM (Spalte "BCM" im Screenshot). gpiozero verwendet die Nummerierung nach dem Schema BCM; diese Tatsache ist hier angegeben. Verwende also bitte die Nummern in den Spalten ganz links und ganz rechts (beide Spalten mit der Überschrift "BCM"). Das Hilfsprogramm pinout zeigt, wenn der Button "wiringPi" (rechts oben auf blauem Hintergrund) angeklickt ist, in großer Schrift die BCM-Nummern und eingeklammert in kleinerer Schrift die wiringPi-Nummern.

  • Okey. Danke. Also kann ich meinen Screenshot ohne bedenken verwenden?

    und welche Pins soll ich nehmen für den anderen Motor? weil jetzt spinnt der REchts.

    Ich blicke nicht mehr durch. Jetzt machen beide Motoren wieder was sie wollen....;(;(;(;(

    Die Hand voller Asse, doch das Leben spielt Schach.


    Erfolg besteht aus drei Buchstaben: Tun

    Goethe

    Einmal editiert, zuletzt von Tundrameise (31. Dezember 2020 um 13:55)

  • Im Beitrag #77 zeigst Du im als aktuell bezeichneten Code diese Anweisung:

    Python
    while True:
        if ultrasonic.distance <0.3:
                motor_stop()
                print("stopp engines")
        else:
            motor_forward(0.5)
            print("Forward")
        motor_stop()

    Hier steht der Aufruf motor_stop() im Rumpf der Wiederholungsanweisung. (Als Rumpf einer Wiederholungsanweisung bezeichnet man die Anweisungen die bei jedem Durchlauf der Wiederholungsanweisung ausgeführt werden. In Python sind diese Anweisungen gegenüber dem einleitenden while nach rechts eingerückt.)

    Wenn der Aufruf motor_stop() einmalig nach dem Ende der Wiederholungsanweisung ausgeführt werden soll, darf er relativ zum Schlüsselwort while nicht eingerückt sein. Vielmehr muss das m von motor_stop() in der gleichen Spalte stehen wie das w von while:

    Überprüfe also bitte, ob du das inzwischen berichtigt hast und berichtige es erforderlichenfalls. Die Einrückungsregeln von Python sind wirklich richtig und ja, sie sind eine Fehlerquelle.

    Was Du sonst noch tun kannst:

    Wenn man nicht mehr weiter weiß und keinen Debugger zur Verfügung hat, erweitert man sein Programm um Print-Anweisungen, die einem ein Ablaufprotokoll liefern, wenn das Programm ausgeführt wird. Wenn Du beispielsweise die folgende Funktion dienes Programms

    Python
    def motor_stop():
        MOTOR_LEFT.stop()
        MOTOR_RIGHT.stop()

    so ergänzt:

    Python
    def motor_stop():
        print("MOTOR_LEFT soll gestoppt werden")
        MOTOR_LEFT.stop()
        print("MOTOR_LEFT wurde gestoppt")
        print("MOTOR_RIGHT soll gestoppt werden")
        MOTOR_RIGHT.stop()
        print("MOTOR_RIGHT wurde gestoppt")

    bekommst Du ein Protokoll, aus dem du genau siehst, wie die Anweisungen deines Programm eine nach der anderen ausgeführt werden. Ablaufprotokolle können schnell sehr lang werden, aber Du kannst aus einem Ablaufprotokoll herauslesen, ob tatsächlich alle Anweisungen einer Funktion ausgeführt wurden oder ob die Funktion nach dem Auftreten eines nicht behandelten Fehlers vorzeitig abgebrochen wurde. Das ist oft hilfreich und es könnte dir vielleicht auch helfen.

  • Jetzt ist mir etwas aufgefallen und ich habe es auch getestet.

    Wenn die Motoren BEVOR ich das Programm beende schon vom Programm aus still stehen, drehen sie auch danach nicht weiter. Wenn Sie aber BEVOR ich das Programm beende vom Programm aus drehen, drehen sie auch danach weiter. Könnt ihr daraus etwas ziehen?

    Ich möchte mich entschuldigen dass ich ein solches Chaos veranstaltet habe mit meinen Code's und Kommentären. ich bin einfach völlig durch den Wind, weil die VA ja zeitlich begrenzt ist.

    Die Hand voller Asse, doch das Leben spielt Schach.


    Erfolg besteht aus drei Buchstaben: Tun

    Goethe

  • Wenn der Aufruf motor_stop() einmalig nach dem Ende der Wiederholungsanweisung ausgeführt werden soll, darf er relativ zum Schlüsselwort while nicht eingerückt sein. Vielmehr muss das m von motor_stop() in der gleichen Spalte stehen wie das w von while:

    Dann kommt diese Fehlermeldung.

    Code
    Traceback (most recent call last):
      File "/home/pi/Desktop/teilziel 1.py", line 46
        motor_stop()
                     ^
    SyntaxError: unexpected EOF while parsing

    Die Hand voller Asse, doch das Leben spielt Schach.


    Erfolg besteht aus drei Buchstaben: Tun

    Goethe

  • Zitat

    Wenn die Motoren BEVOR ich das Programm beende schon vom Programm aus still stehen, drehen sie auch danach nicht weiter. Wenn Sie aber BEVOR ich das Programm beende vom Programm aus drehen, drehen sie auch danach weiter. Könnt ihr daraus etwas ziehen?

    Wenn das deine Beobachtung ist, könnest Du versuchen, in der Funktion motor_stop zunächst für beide Motoren die Geschindigkeit 0 einzustellen, bevor du die Motoren mit Aufrufen von stop() ausschaltest.

  • Ich habe das mal so gemacht. Aber es funktioniert nicht. Stimmt meine Programmierung nicht oder wo liegt der Fehler?

    und ausserdem drehen wieder beide Motoren nachher.

    Zitat

    Wenn man nicht mehr weiter weiß und keinen Debugger zur Verfügung hat, erweitert man sein Programm um Print-Anweisungen, die einem ein Ablaufprotokoll liefern, wenn das Programm ausgeführt wird. Wenn Du beispielsweise die folgende Funktion dienes Programms

    habe ich gemacht. Aber beim finally zeigt es mir die Print befehle, die ich bei Stop und anhalten generiert habe, nicht an.

    Das wäre der code mit den Print befehlen:

    Die Hand voller Asse, doch das Leben spielt Schach.


    Erfolg besteht aus drei Buchstaben: Tun

    Goethe

    3 Mal editiert, zuletzt von Tundrameise (31. Dezember 2020 um 14:32)

  • Wie wird den diese "ewige" Schleife verlassen? Ich vermute mal, mit einer TastenKombination, aber mit welcher?

    Steuerung und Q gleichzeitig gedrückt liefert, wenn ich nicht irre, ein kill-Signal, da ist dann sofort Schluss.

    Steuerung und C gleichzeitig gedrückt liefert einen KeyboardInterrupt, da kommt die Finalisierung mit finally dann zum Zug.

    • Offizieller Beitrag

    Für mich sieht das aus wie Defective by Design. Warum importierst Du Motor statt Robot? :conf:

    Robot ist doch wie geschaffen dafür. Siehe hier: https://gpiozero.readthedocs.io/en/stable/recipes.html#robot Soweit ich das bei der bisherigen Aufgabenstellung richtg sehe, bräuchte man im zweiten Beispiel nur die GPIO-Nummern anpassen und und in den beiden Zeilen darunter backward und stop austauschen.

    //Nachtrag: Das API noch: https://gpiozero.readthedocs.io/en/stable/api_…#gpiozero.Robot

  • Für mich sieht das aus wie Defective by Design. Warum importierst Du Motor statt Robot? :conf:


    Robot ist doch wie geschaffen dafür. Siehe hier: https://gpiozero.readthedocs.io/en/stable/recipes.html#robot Soweit ich das bei der bisherigen Aufgabenstellung richtg sehe, bräuchte man im zweiten Beispiel nur die GPIO-Nummern anpassen und und in den beiden Zeilen darunter backward und stop austauschen.

    Weil ich nicht wusste wie man bei Robot rechts und links definierte und ihr das Programm aus welchem ich meines schrieb, mit Motor machtet.

    und ja beim Robot hätte ich wahrscheinlich auch nur lesen müssen. Aber es läuft jetzt und ich möchte nicht dass sich das ändert.... Verstehen sie?

    Die Hand voller Asse, doch das Leben spielt Schach.


    Erfolg besteht aus drei Buchstaben: Tun

    Goethe

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!