Fehlmessungen mit HC-SR04

  • Hallo zusammen,

    nach vielem suchen und versuchen, was aber leider alles nichts gebracht hat, muß ich nun mal eine Frage ins Forum stellen.

    Ich versuche eine Abstandsmessung zu bauen, die ich später in einen Tank einbauen will.
    Dazu habe ich mir den Sensor und die Widerstände besorgt, die Software aus dem Internet, alles zurammengebaut und angeschlossen an dem PI.
    Messen tut er.....
    aber leider immer das gleiche :(
    Erst dachte ich mein HC-SR04 wäre kaputt, weil er immer den selben Wert misst (120cm +-1 cm)
    Leider hat ein neuer Sensor, und eine neu aufgebaute Schaltung, nichts gebracht :(
    Die Software hatte ich schon nach verschiedenen Mustern geändert, immer das gleiche :(

    Meine Frage ist nun, fällt jemandem etwas ein... hatte schon einmal jemand ein ähnliches Problem?

    Ich denke mal es ist nur eine banale Sache die ich übersehe....
    Danke

    Gruß Jan


  • Bitte Schaltplan sowie den Code zeigen.

    Eine Forums Suche nach " zisterne " könnte dir aber auch helfen.

    Sorry, hatte ich vergessen:


    Die Zeilen mit den Nummern habe ich nur eingefügt um schneller was zu finden bei Fehlermeldungen....

    Angeschlossen habe ich alles so wie hier --> zu sehen


    Danke noch mal...

    Nach der "Zisterne" werde ich gleich mal schauen

    Gruß Jan

  • Hallo Jan,

    Dein Code kann so nicht funktionieren. Du setzt innerhalb der Schleife, ob das Echo-Signal ankommt, immer wieder die Start-Zeit neu.
    Folgende Zeile kannst Du entfernen:

    Code
    # store start time
     while GPIO.input(GPIOEcho) == 0:
       StartTime = time.time()

    Klappt's?


    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

    Einmal editiert, zuletzt von Andreas (15. Mai 2016 um 18:24)

  • Ich glaube, das ist schon richtig so: Die Zeitmessung soll erst starten, wenn der GPIO auf 1 geht, daher wird in der Schleife, die darauf wartet, die Startzeit immer wieder neu gesetzt. Genauso wie die Endzeit in der darauffolgenden, die darauf wartet, daß der Pin zurück auf 0 geht.

  • Hallo Jan,

    also mein Code auf dem Arduino sieht vom Algorithmus her anders aus:

    Du setzst der TriggerPin auf HIGH, wartest, 10 µs und setzt ihn dann auf LOW. Dadurch wird der Sensor veranlasst einen US-Impuls aufzusetzen.


    Und sobald auf dem EchoPin ein Pegelwechsel LOW => HIGH stattfindet, wird die Messung begonnen. Und nach einem Pegelwechsel von HIGH => LOW ist die Messung auch schon wieder beendet und die Entfernung kann berechnet werden.

    Link auf Datenblatt


    Und ganz sicher wird Start- und End-Zeit nicht in einer Schleife dauernd neu bestimmt, sondern erst nach dem ein Pegelwechsel stattfand.

    Probier mal so:

    Code
    # store start time
    while GPIO.input(GPIOEcho) == 0:
    StartTime = time.time()                   <== Keine Einrückung!
    
    
    # store stop time
    while GPIO.input(GPIOEcho) == 1:
    StopTime = time.time()                   <== Keine Einrückung!

    Dadurch werden die Zeiten nicht in einer Schelife gesetzt, sondern nachdem ein Pegelwechsel stattgefunden hat.

    Bei Pegelwechsel von 0 auf 1 wird die Zeitmessung gestartet - bei Pegelwechsel von 1 auf 0 wird die Zeitmessung gestoppt.

    Zumindest solltest Du jetzt unterschiedliche Zeiten erhalten, wenn denn die Entfernungen variieren.

    Bist Du Dir sicher, dass Du auch die Pins entsprechned der Software angeschlossen hast? Vergleich mal hiermit...


    Und noch ein Tip: Über einen Pseudo-Interrupt wäre das alles eleganter!


    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

    2 Mal editiert, zuletzt von Andreas (15. Oktober 2017 um 15:15)

  • Hallo Jan,
    der Code und die Schaltung in dem von Dir angeführten Link benutzt GPIO17 und 18,
    in Deinem Code werden 23 und 24 benutzt.
    Wenn Du den HC so angeschlossen hast wie in der Schaltung im Link dann kann es nicht funktionieren.

  • Andreas: Das ist so schon richtig, das Script aus Beitrag#3 wird wie gedacht funktionieren. Erst wenn er das wie Du vor schlägst ändern würde funktioniert es nicht mehr.
    Würde man die Einrückungen entfernen würde a) Python eine Fehlermeldung werfen und b) das Script nicht mehr so funktionieren wie es sollte

    "while GPIO.input(GPIOEcho) == 0:" ... solange GPIOEcho kein HIGH liefert wird die StartTime gesetzt.
    Sobald ein Flankenwechsel stattfindet wird die while beendet und solange StopTime gesetzt wie der andere Pegel anliegt.
    Das Ergebnis ist dann eine genaue StartTime ab dem Zeitpunkt von wo ein Ping gesendet und eine StopTime von wo der Ping empfangen wurde.

    Da er das mit Python umsetzt bringt es nicht so viel andere Programmiersprachen aufzuzeigen.

    Aber vielleicht ein Hinweis auf die von dir gewählten GPIO's: GPIO#23 ist Pin#16 und GPIO#24 ist Pin#18 ... Hast du es auch genau dort angeschlossen? Pin#23 wäre nämlich GPIO#11 und Pin#24 wäre GPIO#8, also etwas völlig anderes. GPIO.BCM bezieht sich auf die GPIO#

    Wichtig ist dass das Module mit 5V arbeitet, ein GPIO aber nur 3V3 verträgt. Deshalb ist es enorm wichtig das die Widerstände und alles passt, sonst beschädigst du den SoC des Pi's. Die GPIO's gehen ungebuffert direkt zur SoC.


    Alternativ kannst du es auch mal damit folgendem Python Module probieren: https://github.com/alaudet/hcsr04sensor
    Diese Python2 Scripts aus meinem Archive funktionieren aber auch:
    http://codepad.org/COkKG7p4
    http://codepad.org/zaqRZgI7
    http://codepad.org/Vyskdn6S

  • Hallo Meigrafd,


    Andreas: Das ist so schon richtig, das Script aus Beitrag#3 wird wie gedacht funktionieren. Erst wenn er das wie Du vor schlägst ändern würde funktioniert es nicht mehr.


    Probiert?

    Lt. zitiertem Datenblatt beginnt die Zeitmessung mit Pegelwechsel LOW nach HIGH und wird beendet bei Pegelwechsel von HIGH nach LOW. Warum dann nicht auch solches programmieren?


    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

  • Hallo,

    leider nein.
    Ich bekomme nur Fehlermeldungen :(

    pi@raspi-allert:~/bin $ sudo ./ultsonic.py
    Traceback (most recent call last):
    File "./ultsonic.py", line 75, in <module>
    main()
    File "./ultsonic.py", line 53, in main
    Distance = MeasureDistance()
    File "./ultsonic.py", line 44, in MeasureDistance
    TimeElapsed = StopTime - StartTime
    UnboundLocalError: local variable 'StopTime' referenced before assignment


    mehr sagt er mir nicht.
    Durch das Auskommentieren der von dir genannten Zeilen fehlt ihm was.
    Oder stimmt da was mit den Einrückungen nicht mehr?
    Ne, kann nicht sein, denn in der main() fehlen ihm ja nun Werte.
    :(

    Gruß Jan

  • Andreas: Gegenfrage: Hast Du es denn schon mit besagtem Python Script ausprobiert?

    Ich empfehle dir (Andreas) mal nach "HC-SR04 python" zu googlen und dich dann zu fragen wieso so viele verschiedene Quellen ein doch sehr ähnliches Script wie aus Beitrag#3 anwenden.. Nicht zuletzt auch das Module welches ich oben verlinkt habe. Folglich muss da schon irgendwas dran sein oder nicht?


    Grummel: Das wird so auch nicht funktionieren. Ignoriere bitte das was Andreas bis dato zu dem Python Script schrieb.

  • Hallo Jan,


    Beitrag #6 zur Kenntnis genommen?

    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

  • Hallo, da hat sich was überschnitten.......
    Moment mal, ich muss da erst mal lesen was ihr geschrieben habt...
    Sorry, war ne weile nicht am PC und hatte die "Antwort" schon angefangen zu schreiben.
    Automatisch zusammengefügt:
    Hallo,

    so, habe alles noch mal gelesen.
    angeschlossen sind sie an 23 und 24, die Seite die ich da als Schaltung gepostet habe kann da abweichen (sorry).
    5V kommen von der 2 und Masse ist auf der 6.
    In der Schaltung habe ich 330 und 470 OHM eingelötet. So wie in der Schaltung angegeben.
    Mit C kann ich leider nicht viel anfangen (habe Ende der 80er mal BASIC gelernt und hänge da noch immer in verschiedenen Dialekten fest ;) ).
    Ein wenig lesen ist OK, aber wirklich verstehen... na ich bin ein alter Mann ;)

    # store start time
    while GPIO.input(GPIOEcho) == 0:
    StartTime = time.time() <== Keine Einrückung!

    # store stop time
    while GPIO.input(GPIOEcho) == 1:
    StopTime = time.time() <== Keine Einrückung!

    Der Teil funktioniert bei mir NUR mit den Einrückungen....

    ich komme irgendwie nicht weiter... :(
    Aber danke für eure Mühen

    Gruß Jan

    Einmal editiert, zuletzt von Grummel (15. Mai 2016 um 20:05)

  • Hallo Jan,
    ich hatte Zeit - ich habe also Deinen Code kopiert und einen HC-SR04 an GPIO 23 + 24 angeschlossen.
    Es funktioniert bei mir tadellos.

    Einzig die Widerstände sind bei mir anders, 1K und 2K statt 330 und 470.

    Einmal editiert, zuletzt von ait (15. Mai 2016 um 20:45)

  • Hallo Grummel,

    es gibt mehreren Dutzend Beispielen dafür - etwas Ausdauer (andere Tut´s ausprobieren) BITTE!
    Dein Fehler ist:
    Initialisieren der Zeit in der selber Referenz. -> Kurz:
    Die Zeidiferenzen werden verglichen, aber die Initialisierung erfolgte in Deinem Code NUR für StartTime Variable
    Die Stop wurde sich in anderem Zeitpunkt geholt!
    also bitte:


    [code=php]...
    #--------------31--------------------
    # store initial start time
    StartTime = time.time()
    StopZeit = time.time() # < ------- hier beide Time-Flags initialisieren
    # store start time
    while GPIO.input(GPIOEcho) == 0:
    ...[/php]

    hmmm:

    Gruß
    Georg

  • *seufz* Auch das ist leider nicht ganz korrekt. StopZeit muss man nicht vorher definieren.

    Es gibt mehrere Möglichkeiten ein UltraSchall Sensor zu betreiben. Die von gtkdb.de beschriebene Möglichkeit nutzt einen Spannungsteiler, die von ait verwendete aber nicht deshalb sind die Widerstände auch anders.


    angeschlossen sind sie an 23 und 24, die Seite die ich da als Schaltung gepostet habe kann da abweichen (sorry).
    5V kommen von der 2 und Masse ist auf der 6.

    Noch mal:

    Pin-Nummer ist etwas anderes als GPIO-Nummer.

    Du erwähnst ohne Unterscheidung den Pin#2 (5V) mit GPIO#23 & GPIO#24

    Stell also sicher das du auch WIRKLICH GPIO.BCM verwendest:
    GPIO#23 -> Pin#16
    GPIO#24 -> Pin#18

  • Hmmm,
    ich vermute die Entwickler wollten uns Helfen und eine Art ?Kompensation in "die Sache" eingebaut haben.
    Habe gerade den Script von Jan ausprobiert.
    Wenn die "default´s" angehalten werden ->also:
    - Messbereich stimmt
    - ...
    - keine Störungsquellen vorhanden
    - ...
    funktioniert das Script 1A.
    Wird das Sensor bewegt , schnell bewegt, ... kein Fixierpunkt gefunden .... so bekommt man keine bis Falsche Anzeigen.

    ...

    Gruß
    Georg

  • Hallo Meigrafd,


    Andreas: Gegenfrage: Hast Du es denn schon mit besagtem Python Script ausprobiert?

    Ich empfehle dir (Andreas) mal nach "HC-SR04 python" zu googlen und dich dann zu fragen wieso so viele verschiedene Quellen ein doch sehr ähnliches Script wie aus Beitrag#3 anwenden.. Nicht zuletzt auch das Module welches ich oben verlinkt habe. Folglich muss da schon irgendwas dran sein oder nicht?


    Grummel: Das wird so auch nicht funktionieren. Ignoriere bitte das was Andreas bis dato zu dem Python Script schrieb.

    toller Tip, Meigrafd. ;)

    Im Anhang ein Screenshot von einem von mir erstellten Programm. Ein HC-SR04 ist auf einem Servo montiert, der sich innerhalb von 1 bis 2 s um 180 ° dreht und pro Grad eine Entfernungsmessung durchführt. Die Entfernung wird über UART an den Raspberry geschickt, der dann diese im Anhang enthaltene Graphik anfertigt. Die Skalierung der Achsen (von wenigen cm bis einigen Metern) kann in Echtzeit über Tastatur vorgenommen werden.
    Aus dem Screenshot kann man unmittelbar entnehmen, dass der von mir gewählte Algorithmus offensichtlich recht reproduzierbare Werte liefert, da unbewegeliche Gegenstände mit recht geringer Streuung angezeigt werden. Und Objekte, die deutlich weiter entfernt stehen, werden ebenso deutlich und mit geringer Streuung angezeigt.
    Hm, und wenn der Servo wieder zurückfährt, misst er wieder; das Programm zeichnet wieder. Und alle einzelnen Messwerte schwanken über Stunden nur unmerklich. Latscht jemand durch den Raum, dann fällt dies entsprechend auf. Usw. usf.

    Ich bin dann hier raus - hoffe aber, das Ihr solch banale Dinge gelöst bekommt.

    Beste Grüße

    Andreas

    Bilder

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

    Einmal editiert, zuletzt von Andreas (15. Mai 2016 um 22:07)

Jetzt mitmachen!

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