Projekt: Autonomer Roboter

  • Vergleich mal deine measure Funktion mit meiner... Tipp: bei dir fehlen 2 Zeilen. Der Trigger muss nur kurz High gesetzt werden, also ein "Echo" gesendet werden, das macht deine Funktion nicht.

  • Habe es jetzt so, aber kommt immer noch aufs gleiche raus

  • Ich sprach von nur 2 Zeilen. Wenn du das jetzt so änderst mit der while dann blockiert die while in distance() die andere while in main() (oder wo auch immer die andere ist)...


    Wird das Script gestartet existiert nur ein Thread. Die Datei wird von oben nach unten verarbeitet. Ein Befehl blockiert das Script derweil er beschäftigt ist. Eine Schleife wiederholt sich solange wie dessen Bedingung zutrifft.

    Das wiederum bedeutet, das eine while solange den Rest des Scripts blockiert, wie sie wiederholt wird... Deshalb hab ich ja irgendwo am Anfang des Threads erwähnt dass man die Distanzmessung auslagern müsste, abkoppeln vom Script, einen zusätzlichen Thread starten - damit unabhängig von Steuerbefehlen weiterhin Messungen vorgenommen werden können und das Gefährt nicht verunglückt.


    Also noch mal: Du brauchtest nur 2 Zeilen ändern/einfügen: Das High setzen des TRIGGER-GPIO's, extrem kurzes warten um die Zeitspanne des Triggers zu beeinflussen und direkt danach wieder Low setzen. Dadurch wird ein Ultraschall-Signal (echo) ausgesendet, was dann von einem Objekt reflektiert wird und durch den ECHO-GPIO wieder empfangen wird. (natürlich eigentlich durch den Sensor....)

  • Komme heute nicht mehr dahinter. Habe mir gerade nochmal Gedanken gemacht wie es ablaufen muss aber ka bringt heute nix mehr. Blicke die einfachsten Dinge gerade nicht.


    LG

    Bastelstube

  • Also noch mal: Du brauchtest nur 2 Zeilen ändern/einfügen: Das High setzen des TRIGGER-GPIO's, extrem kurzes warten um die Zeitspanne des Triggers zu beeinflussen und direkt danach wieder Low setzen. Dadurch wird ein Ultraschall-Signal (echo) ausgesendet, was dann von einem Objekt reflektiert wird und durch den ECHO-GPIO wieder empfangen wird. (natürlich eigentlich durch den Sensor....)


    Mit gpio.output(38, True)time.sleep(0.00001)gpio.output(38, False) setze ich ja den Trigger GPIO für eine kurze Zeit auf High und anschließend wieder auf Low.


    Ich würde es jetzt so machen, dass ich den Echo GPIO tausche. Das heißt, dass die erste while = True ist und die zweite while = False.


    LG

    Bastelstube

  • Ne das wird nichts. Solange man nicht versteht wie das funktioniert oder wieso das so und nicht anders gemacht wird, bringt das daran herumspielen nicht so viel..


    Wie gesagt:

    TRIGGER-GPIO wird kurz auf High gestellt, damit sendet der HC-SR04 ein Ultraschall-Signal aus. Dann wird gewartet bis der HC-SR04 etwas empfängt und wenn dem so ist wird der ECHO-Pin vom HC-SR04 so lange auf High gesetzt wie das Signal zwischen Senden und Empfangen gebraucht hat...


    Solange der ECHO-GPIO auf LOW ist wird die StartZeit gespeichert bzw gesetzt. Dann wechselt der Zustand auf HIGH, dann wird solange der ECHO-GPIO auf HIGH ist die EndZeit gespeichert.

    Anschließend die Zeit-Differenz und dann anhand Schallgeschwindigkeit usw die tatsächliche Distanz errechnet.


    Es macht also kein Sinn die while's zu ändern.



    Hast du schon mein Script-Vorschlag mit mp usw ausprobiert?

  • Dann macht der Quellcode aber doch genau das:conf:


    Ich setze den Trigger (38) auf HIGH und kurz darauf wieder auf LOW. Anschließend setze ich in der while den Echo Pin (40) auf LOW und speichere die Zeit in start_time. Das selbe mache ich nun wenn der Pin auf HIGH gesetzt wird. Hier speichere ich das ganze aber dann in stop_time. Am ende berechne ich den unterschied mit time_elapsed = stop_time - start_timeund berechne dies daraufhin anhand der Schallgeschwindigkeit.


    LG

    Bastelstube

  • Naja, du änderst immer wieder irgendwas am Script, zeigst aber nur einzelne Teile - Zeile 2 zum Beispiel stammt aus meinem Scriptvorschlag, wieso du das in Deine Funktion übernommen hast versteh ich nicht macht nämlich auch kein Sinn. Dh ich weiß nicht 100% warum es bei dir aktuell nicht wie erwartet funktioniert - ich kann nur mit den Informationen arbeiten die mir vorliegen. In Beitrag#3 war die Funktion zB noch fehlerhaft da wurde GPIO-38 nie auf High gesetzt.


    Wenn du also mit Deinem Code weiter arbeiten willst dann bitte das vollständige und aktuelle Script posten.

    Ansonsten:

    Hast du schon mein Script-Vorschlag mit mp usw ausprobiert?

  • Naja, du änderst immer wieder irgendwas am Script, zeigst aber nur einzelne Teile - Zeile 2 zum Beispiel stammt aus meinem Scriptvorschlag, wieso du das in Deine Funktion übernommen hast versteh ich nicht macht nämlich auch kein Sinn. Dh ich weiß nicht 100% warum es bei dir aktuell nicht wie erwartet funktioniert - ich kann nur mit den Informationen arbeiten die mir vorliegen. In Beitrag#3 war die Funktion zB noch fehlerhaft da wurde GPIO-38 nie auf High gesetzt.


    Wenn du also mit Deinem Code weiter arbeiten willst dann bitte das vollständige und aktuelle Script posten.

    Ansonsten:

    Hast du schon mein Script-Vorschlag mit mp usw ausprobiert?


    Hier mein aktueller Code:


    Wenn ich deinen Code ausführe, bekomme ich folgende Meldung:



    LG

    Bastelstube

  • Versuchs mal damit:


  • Dann bekomme ich folgende Ausgabe:



    Beide Reifen drehen sich, wenn ich die Hand von Anfang an davor halte, misst er den Abstand und macht den turn_left() für eine kurze Zeit und fährt dann wieder geradeaus. Bei erneutem vorhalten passiert nichts, ausser der Ausgabe der Distanz.


    LG

    Bastelstube

  • Ja kann ich machen. Kann dir schonmal einen Aufbau schicken. Schaltplan muss ich dann dieser Tage anfertigen.


    Edit: Bei den Motoren sind die Kabel so wie bei dem oberen Motor. Oberer Motor = Unterer Motor.


    LG

    Bastelstube

    Files

    • Aufbau.zip

      (247.15 kB, downloaded 87 times, last: )
  • Bei deinem Aufbau verwendest du einen Levelshifter für den HC-SR04 ... Hast du den schon mal gegen einen 0815 Spannungsteiler ala Widerstände ausgetauscht?

    Wichtig ist das in jedem Fall, da der Sensor bei einem HIGH-Pegel 5V ausgibt, die GPIO's vom Pi aber maximal 3V3 vertragen - 5V würden den Pi also beschädigen da die GPIOs ungebuffert direkt zur SoC gehen.


    Desweiteren ist es wichtig den auf IN geschaltet GPIO auf Masse zu ziehen, sodass keine undefinierten Zustände auftreten (Pull-Down) - diesen Nebeneffekt erhälst du über eine Lösung mit'm Spannungsteiler. Benötigt wird dafür 1x 330 und 1x 470 Ω Widerstand. Wie das verschaltet wird Siehe Anhang.


    Bist du dir bei den Motoren sicher das die GPIO's wirklich nur ein mal gesetzt werden müssen damit sich der Motor permanent in eine Richtung dreht?

    Hier wäre auch gut wenn du am Anfang des Scripts Konstanten für die GPIO's definierst, wie zum Beispiel:

    MOTOR_LEFT_A

    MOTOR_LEFT_B

    MOTOR_RIGHT_A

    MOTOR_RIGHT_B


    Versorgt das Batteriepack sowohl Motoren als auch Raspberry?

    Wenn ja dann solltest du hier nochmal dein Konzept überdenken, da ein Pi3B im Vergleich zu einem PiZeroW ziemlich viel Strom frisst und die Motoren ebenfalls viel Strom verballern können (Stall). Optimal wäre eine getrennte Versorgung von Computer und Peripherie (Motoren etc). Kriegt eine der Komponenten nämlich zu wenig Strom/Spannung arbeiten die nicht mehr zuverlässig.

  • Bei deinem Aufbau verwendest du einen Levelshifter für den HC-SR04 ... Hast du den schon mal gegen einen 0815 Spannungsteiler ala Widerstände ausgetauscht?

    Wichtig ist das in jedem Fall, da der Sensor bei einem HIGH-Pegel 5V ausgibt, die GPIO's vom Pi aber maximal 3V3 vertragen - 5V würden den Pi also beschädigen da die GPIOs ungebuffert direkt zur SoC gehen.

    Habe bisher immer nur der Levelshifter verwendet, da ich mir gedacht habe, er war bei dem Paket dabei und wird auch so vorgeschlagen im Beispiel Code für den HC-SR04. Das hat auch immer funktioniert. Habe das ganze mal getestet indem ich nur den Sensor anspreche. Dies hat einwandfrei funktioniert, dadurch denke ich das der Levelshifter die SPannung richtig herunter bzw. herauf regelt.


    Ja bin ich mir schon, da ich ja einmal den impuls gebe und diesen dann nicht mehr ändere. Es sei denn er wird durch eine Funktion geändert. Die Konstanten setzen ist ein guter Hinweis.


    Versorgt das Batteriepack sowohl Motoren als auch Raspberry?

    Wenn ja dann solltest du hier nochmal dein Konzept überdenken, da ein Pi3B im Vergleich zu einem PiZeroW ziemlich viel Strom frisst und die Motoren ebenfalls viel Strom verballern können (Stall). Optimal wäre eine getrennte Versorgung von Computer und Peripherie (Motoren etc). Kriegt eine der Komponenten nämlich zu wenig Strom/Spannung arbeiten die nicht mehr zuverlässig.


    Das Batteriepack versorgt lediglich die Motoren. Der Raspberry wird über die Steckdose betrieben. Habe da extra zewi getrennte Stromflüsse drin, um den Pi nicht zu überlasten etc.



    Hast Du denn eine Idee bzgl. des Codes, wie man das nun umsetzen kann? Hast Du noch eine Lösung für deinen Code, den ich ausprobieren sollte?


    Können auch gerne per PN schreiben wenn du magst.


    LG

    Bastelstube

  • Können auch gerne per PN schreiben wenn du magst.

    Ich gebe kein Support via PN, und finde sowas in einem Forum auch eher mieß - zumal wir jetzt schon so weit gekommen sind aber dann die Öffentlichkeit ausschließen? Wenn dann irgendwann mal jemand was ähnliches bauen will muss man das wieder alles durchkauen? Ne, dafür ist son Forum ja da!

    Hast Du denn eine Idee bzgl. des Codes, wie man das nun umsetzen kann?

    Nein, Du?


    Da ich nicht vor deiner Hardware sitze und nicht verstehe wieso dein Gefährt nur ein mal kurz nach links lenkt obwohl der Code was anderes sagt, kann ich nicht nachvollziehen. Wie gesagt: Die Funktion wird ausgeführt, die GPIOs umgestellt und dann soll das Gefährt nach links drehen... Wieso es das nicht tut liegt nicht an der Software - es sei denn du hast auf dem Pi noch andere Script laufen die ggf dazwischen funken oder was weiß ich.... Es ist sehr mühsam aus der Ferne das nun zu analysieren, du machst den Eindruck als sitzt du nur schulterzuckend da und wartest darauf das dir von hier jemand hilft...

    Also meine letzte Idee war dass etwas mit der Hardware nicht passt - da, wie gesagt, die Software das tut was sie sollte.

  • Hier nun das Video. Könnt Ihr euch ja mal anschauen ich überlege auch mal weiter woran es liegen könnte.


    Habe den Code von #70 verwendet.


    Hier noch die Ausgabe zum Video.



    LG

    Bastelstube