Forum: Mikrocontroller und Digitale Elektronik NewPing.h vs. andere Methoden für Ultraschallmessung


von Lukas (Gast)


Lesenswert?

Hallo,

ich benutze den HC-SR04 (im Prinzip würde hier jeder mögliche US-sensor 
gehen) als Ultraschallsensor und würde gerne eine auf ca. 0,3 cm genaue 
Ausgabe erreichen (die laut Datenblatt auch erreichbar ist).

Ich habe 2 verschiedene Ansätze, die Distanz auszurechnen:

a) über die NewPing Bibliothek, die ohne pulseIn(), delay(), etc. 
auskommt
b) über einen einfachen Code:
1
float getEntfernung(){ 
2
   
3
  //float entfernung = 0.0;
4
  int dauer = 0;
5
    
6
  digitalWrite(trigger, LOW); 
7
  delayMicroseconds(3);
8
  noInterrupts();
9
  digitalWrite(trigger, HIGH);                    //Trigger Impuls 10 us
10
  delayMicroseconds(10);
11
  digitalWrite(trigger, LOW); 
12
  dauer = pulseIn(echo, HIGH);                    // Echo-Zeit messen
13
  interrupts();
14
 
15
  entfernung = (dauer/2) / 29.1;                  //Entfernung in Zentimeter (für Milimeter / 2.91 rechnen)
16
  if (entfernung >= 500 || entfernung <= 0) {
17
   Serial.println("Kein Messwert, da außerhalb des Messbaren Bereiches (0 - 500cm)");
18
  }
19
  else {
20
   return(entfernung);
21
  } 
22
}

Jetzt habe ich beide Varianten benutzt und folgende Testergebnisse 
erhalten (beide natürlich bei exakt gleichem Aufbau und Abstand zur 
Wand)

1. Test:
a) 7,77 cm
b) 7,59 cm

2. Test:
a) 9,66 cm
b) 9,45 cm

3. Test:
a) 107,26 cm
b) 104,6 cm

Leider fällt auf, dass sich die Werte zwischen 0,2 cm (was absolut okay 
ist) und bei 1 Meter bereits 2-3 cm unterscheiden.
Wäre der Unterschied bei allen Entfernungen gleich, wäre es ja kein 
Problem, aber da eine Methode von beiden (oder im Zweifel beide) 
offensichtlich nicht linear gleichmäßig ein passendes Ergebnis bestimmen 
wird eine Messung in gerade 1-3 Metern unzuverlässig.

Habt ihr Erfahrungen darin bzw. könnt ihr evtl. einschätzen, welche 
Methode vorraussichtlich zuverlässiger ist?

Vielen Dank, Lukas

von Leierkastenonkel (Gast)


Lesenswert?

naja, da 3cm bei schallgeschwindigkeit von 300m/s Faktor 10000 
darstellt, würd ich mal nachschauen auf wieviel mikrosekunden genau der 
Timer auflösen kann und welche Auswürgungen  "delayMicroseconds(10);" 
mit sich bringt.

von K. S. (the_yrr)


Lesenswert?

Das muss so, weil du keinen Quellcode lesen kannst oder willst. Einer 
von euch beiden (du oder die Lib, oder doch beide?) hat falsche Werte:
Aus der NewPing Lib:
#define US_ROUNDTRIP_CM 57      // Microseconds (uS) it takes sound to 
travel round-trip 1cm (2cm total), uses integer to save compiled code 
space.

2cm/57µs = 350m/s

du hast da was anderes:
Lukas schrieb:
> entfernung = (dauer/2) / 29.1;
ergibt eher 343m/s

letzte Messung als Beispiel:
107.26/350*343 = 105.11, passt schon besser

die Funktion dazu:
// Conversion from uS to distance (round result to nearest cm or inch).
#define NewPingConvert(echoTime, conversionFactor) (max((echoTime + 
conversionFactor / 2) / conversionFactor, (echoTime ? 1 : 0)))

Wie man sieht geben die aus irgendeinem Grund noch 0.5cm auf die 
gemessene Zeit drauf, oder der fehlte halt warum auch immer in der 
echoTime. Die Lib weiter lesen darfst du selber:
https://github.com/livetronic/Arduino-NewPing

(conversionFactor / 2) / conversionFactor kürzt sich weg zu 1/2

nochmal letzte Messung als Beispiel:
(107.26 - 0.5)/350*343 = 104.62, passt perfekt.

und nächstes mal erst den Code suchen, dann den lesen, und wenns dann 
noch nicht klappt mit dem Verstehen den Code verlinken (damit andere den 
nicht suchen müssen).




ps:
Leierkastenonkel schrieb:
> würd ich mal nachschauen auf wieviel mikrosekunden genau der
> Timer auflösen kann und welche Auswürgungen  "delayMicroseconds(10);"
war ne nette Idee, aber für die Zeitmessung ist einzig PulseIn() 
zuständig, und das hat laut Code 16 Zyklen pro Schleifendurchlauf (bei 
16MHz also 1-2µs Ungenauigkeit, das macht ca. 1 bis 4 mm)

: Bearbeitet durch User
von Alexxx (Gast)


Lesenswert?

Was ihr noch nicht bedacht habt:
Es vergeht zusätzlich Zeit von der ersten eintreffenden US Welle, bis 
der Sensor genügend Amplitude bringt, so dass ein digitaler Schwellwert 
überschritten wird (Einschwingen).
Dies wird jedoch von der Schallamplitude abhängen => Entfernung / 
Reflexionsverhalten!

von K. S. (the_yrr)


Lesenswert?

Alexxx schrieb:
> Es vergeht zusätzlich Zeit von der ersten eintreffenden US Welle, bis
> der Sensor genügend Amplitude bringt, so dass ein digitaler Schwellwert
> überschritten wird (Einschwingen).

Nicht wirklich. Der Sensor selber ist ein Modul und liefert ein TTL 
Signal (laut Datenblatt) dessen Dauer der Laufzeit entspricht. Angeblich 
schafft der bis zu 3mm Auflösung, und da auch 8 Impulse gesendet werden 
wird das wohl irgendwie Kompensiert oder ist zu gering um Einfluss zu 
haben. Bei einem reinen US-Sender (und nicht einem Modul mit Auswertung) 
wäre dies aber durchaus eine wahrscheinliche Fehlerquelle.

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.