6 Ultraschallsensoren steuern

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Hallo Community,

    ich habe aktuell folgendes Projekt: Autonomes Fahren
    Ein Fahrzeug (M 1:16) soll selbstständig durch einen Parkour fahren und sich anhand der Fahrbahn mittels Pi-Kamera orientieren. Gleichezeitg sollen 6 Ultraschallsensoren (HC-SR04) zum Einsatz kommen, die Hindernisse u.ä. erkennen und so das Fahrzeug anhalten bzw. ausweichen lassen. Dabei sollen dann jeweils vorne und hinten zwei Sensoren und an den Seiten jeweils ein Sensor montiert werden. Um alles erstmal zu testen sind die Sensoren aktuell noch nicht am Fahrzeug befestigt.

    Ich bin totaler Pi-Neuling und auch in der Pythonprogrammierung habe ich kaum Erfahrung. Ich verwenden den Pi 2 Model B mit einer PowerBank (5V; 2,1A (max); 10400mAh). Im erstern Schritt habe ich nur einen Sensor angeschlossen, um alles kennenzulernen und um den Code auszuprobieren. Es hat auch alles wunderbar geklappt, es gab zwar zwischendurch ein paar totale Ausreißer, die aber alle einen Wert < 1cm hatten, sodass ich auf die Idee kam, diese einfach mit einer if-Anweisung auszufiltern.

    Mein eigentliches Problem liegt aber in der Programmierung mehrerer Sensoren. Ich habe jetzt erstmal zwei Sensoren angeschlossen und den Code aus dem erstem Versuch einfach erweitert. Der Trigger soll für alle Sensoren über einen Pin laufen, sodass alle gleichzeitig triggern. Danach sollen dann die einzelnen Echos ausgelesen werden.
    ( Da ich den Pi über Remotedestop steuere, funktioniert der Copy&Paste - Befehl nicht und weil ich mir nicht anders zu helfen wusste, habe ich eine Screenshot von Code und Ausgabe gemacht... ). Ich programmieren mit idle3, da ich das für mich am angenehmsten finde.

    Der zweite Sensor misst in diesem Fall den korrekten Wert und der erste misst (mehr oder weniger) gar nichts... Woran kann das liegen bzw. wie muss ich das genau programmieren, damit es auch bei sechs Sensoren funktioniert? Es hat ja alles beim Testen mit einem Sensor funktioniert, also kann es doch nur an dem Code liegen, da ich beide Sensoren gleich angeschlossen habe?! Ich hoffe mir kann jemand bei der Problemlösung helfen.

    achja... und so nach ca. 30 Messungen passiert nichts mehr, bzw. es kommt keine Ausgabe mehr, als ob die Sensoren einfach aufgehört haben zu messen. Was kann das für ein Problem sein?

    Andere Threads zu ähnlichen Themen habe ich mir auch durchgelesen, aber wirklich weitergekommen bin ich damit nicht :(

    Beste Grüße!

  • Moin,

    ich würde dir dazu raten auf C umzusteigen und versuchen die Struktur deines Programmes so weit wie möglich zu parallelisieren.
    Gibt verschiedene Möglichkeiten, hier findest du mal ein Programm was ich geschrieben und auch schon so verwendet habe:
    Ultraschallsensor: Falsche Distanzen

    Und für die Signalerfassung würde ich Interrupts empfehlen ;)

    Alternativ könntest du einen zusätzlichen Mikrocontroller verwenden (atmega), der die Ultraschallsensoren verwaltet und
    über i2c/uart/spi die Werte aller Sensoren zurückliefert.

    lg kobold254

  • Hallo Handtuchhalter,

    herzlich Willkommen in unserem Forum!

    Mir erschließt sich die Notwendigkeit nicht, diese Vielzahl an US-Sensoren einzusetzen. Eigentlich sollte es reichen, in die möglichen Fahrtrichtungen Abstandssensoren anzubringen. Außer ... äh ... Hast Du vor, das Fahrzeug mit irgendwas zu bewerfen? Und das Fahrzeug soll dies erkennen und blitzgeschwind ausweichen?

    Das Problem mit einem Trigger für 6 Sensoren wird wohl scheitern. Denn woher willst Du wissen, welcher Sensor als erster ein ECHO liefert? Wenn der erste ECHO-Befehl am längsten zur Rückmeldung benötigt, dann warten die anderen vergebens...Die Skalierung eines heruntergeladenen Sketches auf 6 Sensoren funktioniert so nicht.

    Das läuft - wenn überhaupt - nur im Pseudo-Interrupt-Betrieb und mit Definition von 6 Pseudo-Interrupts.

    Eleganter wäre es, wenn Du einen einzigen Ultraschallsensor auf einen Servo- oder Stepper-Motor setzt und diesen um 180 ° in die eine und 180 Grad in die andere Richting drehen lässt. Wenn der Motor 360 ° ermöglicht, dann ist's noch praktischer. Mehr kommt nicht in Frage (was machen die angeschlossenen Kabel? :s Eben...).

    Die Abstände beziehst Du dann auf die Motorausrichtung (Winkel) und erhältst auf diese Weise ein Umgebungsprofil (in Abhängigkeit der Fahrtrichtung).

    Dann wird es sinnvoll sein, bevorzugt in Fahrtrichtung zu "sehen", was dann den Winkelbereich reduziert und die Abfrage schneller macht.

    Wie sowas aussehen könnte, habe ich mal in einem früheren Bastel- und Programmierprojekt als Scrfeenshot angehängt.

    Der offensichtlichste Fehler an Deinem Code besteht darin, dass Du start1 und start2 nicht zeitgleich ermittelst, sondern start2 erst dann, wenn Sensor1 ein ECHO geliefert hat. Das heißt, die Zeitspanne seit dem Trigger-Signal liegt schon länger zurück.
    start1 und start2 beziehen sich aber auf den gleichen Start-Zeitpunkt - als nämlich auf den Trigger-Pin ein Pegelwechsel stattfand - nicht auf unterschiedliche wie in Deinem Code.

    Als nächsten Test würde ich das Zeugs auf Pseudo-Interrupt umstellen und in der Pseudo-Interrupt-Routine nur die Ende-Zeit des zugeordneten Sensors zurückmelden. Wenn beide Senoren "geliefert" haben, kannst Du wieder die Abstände berechnen.


    Beste Grüße

    Andreas

  • Willst Du genau messen (Welche Genauigkeit spezifiziert der US Hersteller eigentlich? Welche Genauigkeit benötigt die Anwendung?) und Dir keinen Ärger über das Betriebssystem einhandeln, dann liegst Du mit einem Mikrokontroller sicher auf der sichereren Seite. Zumindest funkt Dir da kein Betriebssystem dazwischen. Das schrieb kobold254 schon. Reicht eine Entfernungsschätzung, und eine moderate Abtastfrequenz (Weil Dein Auto sich vielleicht in einer sich nicht bewegenden Umgebung befindet - stimmt die Annahme?) der einzelnen Sensoren, dann mag es auch mit Raspi+Betriebssystem und einigen Ausreißerbehandlungen klappen. Ebenso kann ein sequentielles Auslesen der Entfernung hinreichend sein und es bedarf keiner Parallelisierung. Wie immer - es kommt auf die Grenzwerte der Problemstellung an.
    Automatisch zusammengefügt:


    Wie sowas aussehen könnte, habe ich mal in einem früheren Bastel- und Programmierprojekt als Scrfeenshot angehängt.


    Vorsicht, Andreas' Radar entgeht nix :lol:

  • erstmal vielen Dank für eure Tipps.
    Das ganze Projekt ist an den Audi Autonomous Driving Cup angelehnt, dort wird natürlich ein größerer Maßstab verwendet und auch sonst ist alles viel umfangreicher. Dort werden die Ultraschallsensoren auch über einen Mikrocontroller angesteuert. Ich wollte aus Platzgründen dies jedoch erstmal nur über den Pi lösen, da ich aber noch eine Arduino-Replika hier liegen habe, werde ich diese Variante aufjedenfall mal ausprobieren. Mit Arduino kenne ich mich auch ein bisschen besser aus. Das ist wohl auch der Grund, warum ich in Python programmieren, es ist einfach sehr ähnlich zu Arduino.

    Die Idee mit dem Sensor auf einem Servo hatte ich auch schon in einem anderen Thread gelesen, fand ich aber persönlich nicht so passend für mein Projekt und hat mich auch ein wenig an einen Flughafentower erinnnert :D

    Ich werde aufjedenfall die Idee mit den Interrupts weiter verfolgen, allerdings konnte ich bisher hier im Forum oder auch in Büchern nichts wirlich passendes finden. Wie verhält es sich mit dem Syntax, ähnlich wie bei Arduino?

    In der Zwischenzeit habe ich noch was anderes ausprobiert:
    Ich habe meinen vorherigen Code nur minimal verändert, dabei habe ich die trigger einzeln geschaltet und die Startzeiten beide gleichzeit starten lassen. Der Rest ist gleich geblieben... Es hat wunderbar funktioniert. Im nächsten Schritt habe ich das dann mit vier Sensoren getestet und den Code in gleicherweise einfach nur erweitert... hat natürlich wieder nicht funktioniert. Danach also wieder auf zwei Sensoren zurückgebaut und das Steckboard "aufgeräumt" und es hat danach wieder nicht funktioniert, obwohl ich am Code nichts verändert habe... das ist alles so deprimierend :(

Jetzt mitmachen!

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