Problem beim programmieren von Roboterauto

  • Lass das. Theoretisch ist nicht. Entweder kannst du das laufen lassen, und uns mit konkreten Fehlern und Fragen beliefern. Oder es ist eine wertlose Trockenübung die den Helfern hier die Zeit stiehlt.


    Wenn du nicht an das Auto kannst, lern “normales” Python. Denn offensichtlich hapert es daran, und jeder Erkenntnisgewinn dort wird sich bezahlt machen.

  • Manul Das kommt darauf an wie die Hardware aufgebaut ist und/oder aus welchem Blickwinkel man die Bezeichnungsn „rechts“ und „links“ vergeben hat. 😜

    “If debugging is the process of removing software bugs, then programming must be the process of putting them in.” — Edsger Dijkstra

  • Ich danke euch vielmal.

    Diese dummen Fehler wären mir wahrscheinlich gar nicht erst aufgefallen und ich hätte wieder stundenlang gesucht.

    Das Grundgerüst ist bald fertig, ich sollte also morgen mit dem Programmieren beginnen können.



    Quote


    Kleine nicht programmiertechnische Anmerkung: Wenn der linke Motor vorwärts läuft und der rechte Motor steht, in welche Richtung dreht sich dann das Auto?

    Oh, übler Denkfehler. Oh Gott ich bin eine programmiertechnische sowie hardwaretechnische Katastrophe auf zwei Beinen.....


    (soll ich das in meine Beschreibung schreiben?^^)

    Quote


    Um `cleanup()` aufrufen zu können, müsste es ja `gpio` erst einmal geben.

    Müsste ich da diese Bibliothek importieren?

    Code
     import RPi.GPIO as GPIO


    Danke für die Tipps.


    Ich wünsche euch allen schöne Weihnachten und Gesundheit.


    Freundliche Grüsse


    Raspifriend

    Die Hand voller Asse, doch das Leben spielt Schach.



    Erfolg besteht aus drei Buchstaben: Tun

    Göthe

    Edited 2 times, last by Tundrameise ().

  • Doch, die waeren dir sofort aufgefallen. Denn es haette entsprechende Fehlermeldungen gegeben. So wie einem auch sofort auffaellt, dass man unter Wasser nicht atmen kann. Was beim Trockenschwimmen kein Problem war....


    Und du solltest gpiozero benutzen, so weit waren wir doch schon, oder? Mehrere Bibliotheken benutzten fuer den gleichen Zweck ist eine doofe Idee. Die kommen sich in die Quere. Wenn du etwas aufraeumen willst, lies dir die Dokumentation zu gpiozero durch, und schau, ob und was da bei deren Beispielen so passiert. Kleiner Spoiler: https://gpiozero.readthedocs.i…from_rpigpio.html#cleanup

  • Okay Sie haben mich überzeugt. Theoretisches Programmieren ist bullshit. Dann lese ich mir mal die Readthedocs durch und versuche mal und hoffe es funktioniert.


    Schönen Tag noch.


    Raspifriend

    Die Hand voller Asse, doch das Leben spielt Schach.



    Erfolg besteht aus drei Buchstaben: Tun

    Göthe

  • Hallo zusammen.


    Ich habe das Chassis fertig gestellt und das Programm getestet. Nun kann ich euch konkrete Fehler beschreiben.


    Das wäre mein Code, welchen ich verwendet habe:


    In eurem Beispiel Code habt ihr ja dort wo motor_stop() ist, finally: verwendet.

    Aber wenn ich das Ende des Codes so gemacht habe:

    Code
        else:
            motor_forward(0.5)
            print("Forward")
        finally:
            motor_stop()

    kommt diese Fehlermeldung als erstes:

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

    Hättet Ihr irgendwelche Alternativen für finally parat?

    Ausserdem, close() versteht er auch nicht. Er sagt es sei nicht definiert.



    Das Programm läuft Fehlerfrei.

    Der nervige Fehler, welcher mich fast schon seit dem Anfang des Projekts begleitet, kommt erst wenn ich das Programm beende. Dann dreht der eine der zwei Motoren weiter. Und zwar nicht mehr mit der halben Geschwindigkeit wie im Code sondern mit Vollgas, was ziemlich laut und nervig ist.


    Der Motor hört erst auf zu drehen wenn ich den Raspberry Pi herunterfahre oder neustarte. Manchmal beginnt der Motor auch für kurze Zeit direkt nach dem hochfahren des Raspberry Pi's zu drehen im Highspeed Modus.


    Ich vermute dass es irgendwie an den GPIO's liegt und sie nach dem Beenden des Programms nicht auf low schalten. Ausserdem wird beim Programmstart für 2 oder 3 Sekunden die Meldung in rot angezeigt dass der Echo Pin des Ultraschallsensors nicht auf High geht. Aber nach eben dieser Zeitspanne läuft das Programm ohne Fehler und mit dem Command motor_stop() sage ich dem Raspberry ja, dass er die gemeinten GPIO's auf Low schalten soll.


    Ich habe echt keine andere Idee mehr... Ich hoffe dass Ihr mir helfen könnt.


    Vielen Dank für eure Hilfe schon mal im Vorraus und ein schönes Silvester.


    Raspbifriend

    Die Hand voller Asse, doch das Leben spielt Schach.



    Erfolg besteht aus drei Buchstaben: Tun

    Göthe

  • Es gibt keine Alternative zu finally. Jedenfalls keine, die nicht noch komplizierter wäre. Du hast es einfach falsch eingebaut. Weil du aber nicht verrätst, wie der geänderte Code wirklich aussieht, kann man auch nichts dazu sagen.

  • Mein geänderter Code ist der den ich verwendet habe.

    Das wäre der originale Code

    Die Hand voller Asse, doch das Leben spielt Schach.



    Erfolg besteht aus drei Buchstaben: Tun

    Göthe

  • Du hast keinen vollständigen Code gepostet. Sondern einen Code, und ein Schnipsel, bei dem nicht klar ist, wie du den verbaut hast.


    Aber wenn du den einfach so hinten dran gepappt hast - klar geht das nicht. Ein finally ist Teil einer try Klausel.


    Wie die funktioniert ist in der offiziellen Dokumentation beschrieben. Das muss man nicht raten, das kann man lesen.

  • Das ist der Originale Code bevor ich das finally rausgeschmissen habe.



    oder müsste das finally hierhin?


    Die Hand voller Asse, doch das Leben spielt Schach.



    Erfolg besteht aus drei Buchstaben: Tun

    Göthe

    Edited once, last by Tundrameise: Lösungsvorschlag eingefügt. ().

  • ich kenne den Distanz-Sensor nicht, aber musst du 'echo' und 'trigger' nicht noch einen Wert vorgeben?

    Wieso benutzt du die Konstante 'VELOCITY' nicht? Wenn jeder Motor, egal in welcher Richtung immer mit der gleichen Geschwindigkeit laufen soll, dann nutze die Konstante. Wenn nicht, dann kannst du sie löschen.


    'finally' funktioniert bei dir nicht, weil du (vermutlich) deinen Code nicht ganz gründlich zusammen kopiert hast.


    Für den Fall, dass jeder Motor zu jedem Zeitpunkt mit der gleichen Geschwindigkeit drehen soll, würde ich es so machen:


    Habe das nicht getestet:

    'time' wird bei dir importiert und nicht genutzt. Was ist mit 'gpio cleanup'? Schau mal nochmal in die Dokumentation von gpiozero, ich meine so etwas wird nicht benötigt.


    Grüße

    Dennis


    Edit: Habe wohl etwas längers zum schreiben gebraucht und die neuen Posts erst jetzt gesehen. Achte doch mal genau auf die Namensräume beim kopieren. Sonst wird das nichts und nehme die Ratschläge von @__deets__ an und schau in die Dokumentation, sonst wird es ein ewiges raten und das macht dir bestimmt auch keinen Spass.

    ... ob's hinterm Horizont wirklich so weit runter geht oder ob die Welt vielleicht doch gar keine Scheibe ist?

    Edited once, last by Dennis89 ().

  • Im Chaos produzieren war ich schon immer gut.


    Das ist der Code welchen ich verwendet habe:


    Das wäre der Ultraschallabstandsensor:


    https://joy-it.net/de/products/SEN-US01


    und das der Motorcontroller:


    https://joy-it.net/de/products/SBC-Motodriver2

    Die Hand voller Asse, doch das Leben spielt Schach.



    Erfolg besteht aus drei Buchstaben: Tun

    Göthe

  • Im Chaos produzieren war ich schon immer gut.

    und noch so lernresistent! :wallbash::wallbash::wallbash:


    im Minutentakt Beiträge zu posten erhöht nicht gerade die Übersichtlichkeit, dazu gibt es EDIT!


    Entschuldigung. Nächstes Mal werde ich Edit verwenden. Haben Sie schon eine Idee was das Problem sein könnte?

    :conf:

    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)

  • Das ist mein neuster Stand mit allen Problemen und mein Code.

    Das finally funktioniert nicht egal wo ich es hinsetze, es kommt immer die gleiche Fehlermeldung.


    Quote

    Wieso benutzt du die Konstante 'VELOCITY' nicht? Wenn jeder Motor, egal in welcher Richtung immer mit der gleichen Geschwindigkeit laufen soll, dann nutze die Konstante. Wenn nicht, dann kannst du sie löschen.


    habe ich gerade verändert.

    Die Hand voller Asse, doch das Leben spielt Schach.



    Erfolg besteht aus drei Buchstaben: Tun

    Göthe

    Edited once, last by Tundrameise: Fehler im Code beim Kopieren behoben ().

  • Du. Musst. Verstehen. Wie. Es. Funktioniert.


    Du kannst so ein Projekt nicht durch raten machen. Du hast Wochen verballert hypothetischen Code zu schreiben statt mal ein Grundlagen Tutorial durchzuarbeiten. Darum kommst du nicht herum.

  • Wie das Programm funktioniert habe ich durch euch gelernt. Aber ich verstehe nicht warum die Fehler erst entstehen wenn ich das Programm beende. Normalerweise ist es doch umgekehrt oder nicht?


    Das Programm läuft ja Fehlerfrei.....

    Die Hand voller Asse, doch das Leben spielt Schach.



    Erfolg besteht aus drei Buchstaben: Tun

    Göthe

  • Mir geht es um die Anwendung des try/finally. Das hast du offensichtlich nicht verstanden.

  • Zwei Bemerkungen:


    1. try und finanally gehören in dem Sinne zusammen, dass nach dem Schlüsselwort 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 oder die durch try überachten Anweisungen fehlerfrei ausgeführt werden konnten. 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 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.


    Alles über die Pins des Raspberry verrät diese sehr schöne Seite: pinout

    Edited 2 times, last by Boris-Gaertner: 1. Tippfehler im 2. Absatz berichtigt. 2. Im ersten Absatz die Erklärung zu finally berichtigt. Die Finalisierungsanweisungen werden ja auch ausgeführt, wenn in den durch try überwachten Anweisungen keine Ausnahmebeding auftrat. 3. Einen weiteren Tippfehler im ersten Absatz berichtigt. ().