Ultraschall Entfernungsmesser Fehler

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

    ich habe leider ein Problem, ich habe mir einen kleinen Roboter gebaut, auf dem 3 Ultraschall-Abstandssensoren befestigt sind (vorne, rechts und links Typ: HC-SR04). Das Auto fährt auch wirklich super, außer es bekommt kein Signal mehr zurück, was so alle 500-1000 Messungen passiert.
    D.h. er hängt im messen drin und bleibt einfach stehen und wartet, dass ein Signal zurückkommt.

    Das ist leider ziemlich nervig, da ich dann immer das Programm neustarten muss.

    Daher meine Frage, gibt es eine Möglichkeit, sozusagen dem Raspberry zu sagen, dass er spätestens nach x sec. wenn keine Messergebnisse da sind, neu messen soll?

    mein Skript sieht im Moment so aus:

    //Auszug :helpnew:

    [font="Menlo"]def messung():[/font]
    [font="Menlo"] global a[/font]
    [font="Menlo"] #1[/font]
    [font="Menlo"]        print("Messung 1 wird gestartet...")[/font]
    [font="Menlo"] GPIO.output(Trig1, 1)[/font]
    [font="Menlo"] time.sleep(0.00001)[/font]
    [font="Menlo"] GPIO.output(Trig1, 0)[/font]

    [font="Menlo"] while GPIO.input(Echo1) == 0:[/font]
    [font="Menlo"] pass[/font]
    [font="Menlo"] start1 = time.time()[/font]

    [font="Menlo"] while GPIO.input(Echo1) == 1:[/font]
    [font="Menlo"] pass[/font]
    [font="Menlo"] stop1 = time.time()[/font]

    [font="Menlo"] a = (stop1 - start1) * 17000[/font]

    [font="Menlo"] time.sleep(0.01)[/font]

    [font="Menlo"]Das mal als Beispiel für den ersten Messwert des vorderen USS.[/font]

    [font="Menlo"]Vielen Dank schonmal :)[/font]

  • Hallo
    ich hatte das gleiche Prob mit dem Robby meiner Nichte.

    Das Problem habe ich schlicht mit einem Zähler gelöst, der als timeout fungiert, und die warteschleife notfalls abbricht.

    Hier das Beispiel:
    Ist allerdings in C programmiert
    Diese Rountine gibt die gemessene Entfernung an den caller zurück, oder -1 wenn die steigende Flanke nicht kommt
    bzw 2- wenn die fallende Flanke nicht kommt


    villeicht als kleine Anstoss

    gruß root

    Einmal editiert, zuletzt von root (3. Februar 2014 um 19:23)

  • Sieht ja ganz nett aus, aber leider habe ich kaum Ahnung von C, gerade so ein wenig von python...

    Hast du evtl eine Idee, wie das in meinem Beispielprogramm zu lösen wäre?

    Danke schonmal für die schnelle Antwort ;)



  • Bin jetzt auch kein Python Experte, aber mit "break" kannst du die Schleife frühzeitig abbrechen.

    Es gibt KEINE dummen Fragen!

    Einmal editiert, zuletzt von paul70078 (3. Februar 2014 um 22:17)

  • Kleiner Tipp von mir:
    Sollte das nicht genau umgekehrt sein ?
    Nämlich so:

    Das Prob bei dem Sensor ist doch meist, dass überhaupt keine steigende Flanke kommt.
    Wenn die da ist, ist die Wahrscheinlichkeit, dass sie nicht wieder fällt ~ 0.


    Es sei denn, das Teil krepiert genau bei einer Messung, wenn die Flanke schon da ist :lol:
    Das wäre dann die Stecknadel im Amazonas gefunden:no_sad:

    Sry, hab von Python keine Ahnung, aber von der Logik her ....

    Gruß

    Einmal editiert, zuletzt von root (4. Februar 2014 um 18:22)

  • SO wie vorgeschlagen funktioniert es leider nicht...

    ich brauche ja eigentlich einen Zähler, der hochzählt und dann bei einer bestimmten Zahl (3sec kein Signal) die Messung neustartet.

    Ich brauche also einen Counter... Ich habe aber keine Ahnung, wie ich das ganze einbinden kann. ectl hat ja jemand bereits Erfahrung und kann mir sagen, wie der Srcipt-ausschnitt aussehen müsste...
    Ich bin echt am verzweifeln, da ich das ganze Projekt am Ende als BLL in der Schule einreiche :(

  • Habe eben was korrigiert.
    Die start1 - zeit muss logischerweise nochmal gestartet werden, wenn die positive flanke kommt

    dann ist stop1 - start1 die wirklich zeit.

    was die 100 bedeutet, müsste ich erst in python nachsehen.

    wenn ich das richtig sehe, bedeutet das, wenn nach 100 ns keine positive flanke kam, dann abbruch
    Laut datenblatt kann man das runterschrauben auf 38 ms

    Heute Abend hab ich mehr Zeit, dann guck ich mir das mal in Python an ... kann ja nicht so schwer sein

    Gruß

    Einmal editiert, zuletzt von root (4. Februar 2014 um 18:33)

  • Ich hab das Script mal alles so angepasst wie du es gesagt hast @root, das hat leider nicht funktioniert, das Auto fährt los, sobald irgendwas in die Nähe kommt, stopt das Programm jedoch.

    Kann es sein, dass es an der 100 liegt?
    wenn ich es auf 1 oder 3 oä stelle, steht er zwar machnmal ganz kurz, läuft dann aber problemlos weiter. Python geht ja nicht in ms oä, sondern in Sekunden, kann es evtl sein dass ich 0.39/1 sec einstellen muss, nicht 100??

    Und kann es evtl auch mittels try except Block gehen, in etwa so:

    .....
    GPIO.Output(Trig1, 0)
    start1 = time.time()
    try:
    while GPIO.input(Echo1) == 0:
    pass #nichts machen bis Echo1 auf 1 geht

    except time.time() >= 0.4: #also > als die maximale Messdauer
    messung() #neue Messung ausführen

    while GPIO.input(Echo1) == 1:
    pass
    stop1 = time.time()
    .....


    LG
    und vielen Dank schonmal ;)

    Einmal editiert, zuletzt von nilsconrad (4. Februar 2014 um 21:40)

  • Sodele ... phuuu
    Ich hab mir mal die Mühe gemacht, micht mit diesem komischen Python paar Std auseinanderzusetzen .
    Also ...mein's isses nicht.

    Beginn und Ende einer ControlStruct .... na ja ... ober ok, wer's mag

    Ich hab ein Beispiel für Dich mit diesem Sensor mal konstruiert.
    Ich habs getestet, und es funktioniert soweit.
    Aber wie immer... wenn keine steigende Flanke kommen soll, kommt sie.
    Das fehlen der fallenden Flanke kannst Du provozieren, indem Du einfach die Echo-Leitung abklemmst ;)
    Es funktioniert.
    Mit dem Zeitlesen weiss ich noch nicht ganz Bescheit.
    Da gibt es noch time.clock() ... mal sehen .. muss ich bischen suchen
    Ich suche noch in Python was im Timer microsec Bereich, hab aber noch nichts gefunden.
    Aber bis heute Abend hab ich's

    Das Beispiel nimmt einen Zeitzähler als Timeout, wenn eine Flanke nicht kommt.
    Denke, heute Abend hab ich ein Beispiel, wie man das gleiche mit nem simplen Zähler macht.
    Da Du wenn ich das richtig verstehe, noch Schüler bist, gibt es Dir evtl. bischen mehr Verständnis.

    Anderer kurzer Tipp zu diesem Sensor.
    Ich hab mit meiner Nichte nen Robby gebaut, der 5 von diesen Sensoren beinhaltet.
    Wenn man die "normal" verdrahtet, sind das 10 GPIO Ports.
    Dann wird's eng.
    Einfacher Trick
    Ich hab es so gemacht, dass das Triggersignal ALLE bekommen .
    Aber ich frage nur den Echo-Port ab, den ich will.
    Die anderen sind mir egal.
    Das einzige worauf man dabei achten muss, der Abfrageabstand muss mind. 60 ms betragen, da nach 60 ms jeder Sensor fertig ist, selbst wenn der langsamste nichts erfassen konnte.
    Das verhindert, dass bei der nächsten Sensorabfrage ausgerechnet der Sensor erwischt wird, der noch nicht mit dem Echo Signal fertig ist, und schon neu getriggert wird.
    D.h. bei 5 sensoren brauche ich keine 10 Port's, sondern 6
    Das nur so nebenbei

    So, hier der Code

    Gruß root
    Fast vergessen .
    Die Pins 28 und 29 wirst Du nicht finden, die sind am P5 Header.
    Nimm einfach nen anderen Port

    Einmal editiert, zuletzt von root (5. Februar 2014 um 05:05)

  • so nilsconrad

    Hier das versprochene Beispiel mit nem simplen counter.

    die variablen in der sub hab ich global definiert, so sind sie überall sichtbar, das muss aber nicht.
    du kannst werte auch übergeben und werte zuückbekommen.... wie erklär ich weiter unten.

    das prog läuft in einer endlosroutine und pollt den sensor alle 500ms.
    zu den 2 countern
    die endwerte einmal 100 und 3000 sind reine schätzwerte.
    die steigende flanke kommt kurz nach dem triggersignal... also kleiner zählwert
    die fallende flanke ist abhängig von der entfernung ... also größerer zählwert
    das kannste testen.
    stell z.b den ersten endwert auf 2.... du wirst nie ne steigende flanke bekommen, weil der break vorher kommt.
    du kannst dich also an die grenzen rantasten.
    oder klau ihm die versorgungspannung .... egal, das prog bleibt nie mehr hängen.
    enfach rumprobieren.

    so du hast 3 sensoren
    also 3 solche routinen....... ist falsch
    es reicht eine sub

    beispiel:
    in der main() variablen definieren
    poll = 11, echo = 12, dist = 0.0 z.b für sensor 1

    aufruf der funktion mit : polling(poll, echo, dist)
    in der pollroutine must du GPIO_TRIGGER durch poll ersetzen
    ..................................GPIO_ECHO durch echo erstzen
    den rest kannst du lassen

    vor dem ende der function muss eine neue Zeile mit: return dist eingefügt werden
    was bedeutet das ?
    die funktion triggert den pin 11 und wartet auf die flanken an pin 12
    wenn alles gut ging, bkommst du mit dist den wert von sensor 1 zurück

    mit dem 2 sensor genauso verfahren:
    poll = 14, ech0 = 14 dist = 0.0
    aufruf: polling(poll, echo, dist)
    der gibt dann den wert von sensor 2 zurück ..........usw

    dh. es gibt nur eine routine für x sensoren....... ist ja auch sinn der sache

    du kannst auf die flags mit übergeben und zurückbekommen

    ...aber du willst ja auch was lernen .... selbst probieren und überlegen :D

    gut, das wars erstmal... hoffe es hat dir bißchen was gebracht.
    ich kann jetzt bißchen python:)....... bis gestern mittag hatte ich keinen schimmer davon.

    aber mir ist C lieber :thumbs1:

    wenn weitere fragen sind .. kein problem .

    hier der code:

    Nachtrag:
    du wirst dich hoffentlich nicht wundern, dass selbstwenn keine flanken gefunden werden trotzdem ein dist wert angezeigt wird ????
    klingelt's ?:s
    ............
    :bravo2:... ist doch logisch .... das ist die zeit die vergangen ist, bis counter 1 zu seinem maxwert hochgezählt haben und das ganze
    mal 34000/2 ........
    sollte flanke kommen , aber nicht mehr fallen, dann wäre dist = 0
    also die berühmte "nxigefunden*(schallgeschwindigkeit/2)³" Konstante.... gaaaaaaaaanz wichtig:angel:

    Einmal editiert, zuletzt von root (8. Februar 2014 um 00:38)

Jetzt mitmachen!

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