Arduino Forum

International => Deutsch => Topic started by: Rilith on Apr 16, 2018, 02:29 pm

Title: Ultraschallmessung fehlerhafte Werte
Post by: Rilith on Apr 16, 2018, 02:29 pm
Moin alle zusammen,

ich hab mit einem Nano und einem Ultraschallsensor (HC-SR04) eine kleine Distanzmessung aufgebaut. In Kombination mit einem DHT11 berechne ich die Entfernung über 100 Werte und gebe mir dann die Zahl als cm aus. Nun ist mir aufgefallen, dass der erste Wert stimmt, jedoch die nächsten 15 Werte viel zu klein sind bevor wieder realistische Werte ausgegeben werden. Der Nano läuft über USB und der Ultraschallsensor hat eine eigene 5V Spannungsversorgung. GND ist verbunden.

Code: [Select]
  float summe=0;
  int i=0, h=0, tempera=0;
  tempera=DHT.temperature;
 while(i<=99){
     
    digitalWrite(trigPin, LOW);
    delayMicroseconds(5);
    digitalWrite(trigPin, HIGH);
    delayMicroseconds(10);
    digitalWrite(trigPin, LOW);
 
    duration = pulseIn(echoPin, HIGH);
    speed = 331.5 + (0.6 * 20);
    distance = (duration / 2) * (speed / 10000);

    summe=summe+distance;
    h=distance*100;
    Serial.println(h);
    delayMicroseconds(40); 

    i++;
  }


Ich weiß leider nicht wonach ich suchen muss bzw. was den Fehler auslöst und warum er gerade bei Messung 2 bis 16 auftritt.

Mit freundlichen Grüßen
Title: Re: Ultraschallmessung fehlerhafte Werte
Post by: HotSystems on Apr 16, 2018, 02:35 pm
Da dein Sketch nicht vollständig ist, wird eine Aussage schwer sein.

Ich vermute, du misst zu schnell hinter einander.
Da muss eine kleine Pause (ca. 0,5 sek.) zwischen den einzelnen Messungen sein.
Title: Re: Ultraschallmessung fehlerhafte Werte
Post by: Rilith on Apr 16, 2018, 03:02 pm
Hallo HotSystems,

erstmal vielen Dank für deine Antwort.
Laut Datenblatt benötigt der Sensor einen Delay von 50us zwischen den Starts der Messung. Daher hatte ich ein delay zum Ende der Schleife eingefügt. Ich hab die Pause nun erhöht auf 0,5 Sekunden. Es funktioniert nun ist aber nun sehr langsam.  :smiley-confuse: Ich verstehe aber nicht wieso die Schleife am Anfang zu schnell läuft und danach wieder normal ? Das Datenblatt ist hier verlinkt:
www.mpja.com (http://www.mpja.com/download/hc-sr04_ultrasonic_module_user_guidejohn.pdf)
Da steht halt in der Grafik 50us was ich mit 50µs gedeutet habe.

Hier ist nochmal der gesamte Code mit TFT Display:

Code: [Select]
#include <dht.h>
#include <TFT.h>  // Arduino LCD library
#include <SPI.h>

// pin definition for the Uno
#define cs   10
#define dc   9
#define rst  8
#define DHT11_PIN 7
#define trigPin 3
#define echoPin 5
// create an instance of the library
TFT TFTscreen = TFT(cs, dc, rst);
dht DHT;
// char array to print to the screen
char sensorPrintout[6];
float tempalt, humialt, rangealt;
unsigned long time;

void setup() {
  Serial.begin(9600);
 
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);


 
  // Put this line at the beginning of every sketch that uses the GLCD:
  TFTscreen.begin();

  // clear the screen with a black background
  TFTscreen.background(0, 0, 0);

  // write the static text to the screen
  // set the font color to white
  TFTscreen.stroke(255, 255, 255);
 
  TFTscreen.line(0,  9, 160,  9);
  TFTscreen.line(0, 34, 160, 34);
  TFTscreen.line(0, 46, 160, 46);
  TFTscreen.line(0, 71, 160, 71);
  TFTscreen.line(0, 82, 160, 82);
 
  // set the font size
  TFTscreen.setTextSize(1);
  // write the text to the top left corner of the screen
  TFTscreen.text("Temperatur in Celsius", 0, 0);
  TFTscreen.text("Luftfeuchtigkeit in %", 0, 37);
  TFTscreen.text("Entfernung in cm", 0, 73);
  // ste the font size very large for the loop
  TFTscreen.setTextSize(3);

}

void loop() {


  String sensorVal;
  float duration, distance;
  float speed;
  float summe=0;
  int i=0, h=0, tempera=0;
  tempera=DHT.temperature;
 while(i<=99){
     
    digitalWrite(trigPin, LOW);
    delayMicroseconds(5);
    digitalWrite(trigPin, HIGH);
    delayMicroseconds(10);
    digitalWrite(trigPin, LOW);
 
    duration = pulseIn(echoPin, HIGH);
    //speed = 331.4 + (0.606 * tempera);
    speed = 331.5 + (0.6 * 20);
    distance = (duration / 2) * (speed / 10000);
    summe=summe+distance;
    h=distance*100;
    Serial.println(h);
    delay(500); 

    i++;
  }

  distance = summe/100;

  delay(250);
  int chk = DHT.read11(DHT11_PIN);
 
  if(tempalt != DHT.temperature)
  {
    tempalt=DHT.temperature;
    // Read the value of the sensor on A0
    sensorVal = String(DHT.temperature);
    // convert the reading to a char array
    sensorVal.toCharArray(sensorPrintout, 3);
    // set the font color
    TFTscreen.stroke(0,0,0);
    TFTscreen.fill(0,0,0);
    TFTscreen.rect(0,11,160,21);
    TFTscreen.stroke(255, 255, 255);
    // print the sensor value
    TFTscreen.text(sensorPrintout, 0, 11);
  }
    if(humialt != DHT.humidity)
  {
    humialt=DHT.humidity;
    // Read the value of the sensor on A0
    sensorVal = String(DHT.humidity);
    // convert the reading to a char array
    sensorVal.toCharArray(sensorPrintout, 3);
    // set the font color
    TFTscreen.stroke(0,0,0);
    TFTscreen.fill(0,0,0);
    TFTscreen.rect(0,48,160,21);
    TFTscreen.stroke(255, 255, 255);
    // print the sensor value
    TFTscreen.text(sensorPrintout, 0, 48);
  }
  //Serial.println(rangealt-distance);
  //Serial.println(distance);
 
    // Read the value of the sensor on A0
    sensorVal = String(distance);
    // convert the reading to a char array
    sensorVal.toCharArray(sensorPrintout, 6);
    // set the font color
    TFTscreen.stroke(0,0,0);
    TFTscreen.fill(0,0,0);
    TFTscreen.rect(0,84,160,21);   
    TFTscreen.stroke(255, 255, 255);
    // print the sensor value
    TFTscreen.text(sensorPrintout, 0, 84);
 
}
Title: Re: Ultraschallmessung fehlerhafte Werte
Post by: SpaghettiCode on Apr 16, 2018, 03:18 pm
Hi,

rechne Dir doch mal aus, wie lange das Signal läuft, bei 340m/s ;)

Gruß André
Title: Re: Ultraschallmessung fehlerhafte Werte
Post by: Rilith on Apr 16, 2018, 04:04 pm
Hallo SpaghettiCode,

mhh bei 2cm Abstand müssten das mit hin und Rückweg ca. 117,6 µs sein. Was ja heißt, dass der Befehl:
Code: [Select]
duration = pulseIn(echoPin, HIGH);
die Zeit von 50 µs von dem Datenblatt bereits überbrückt oder? Damit ist der Delay am Ende ja überflüssig. Habe den Sensor nun auch schon ausgetauscht => gleiches Ergebnis. Jedoch hab ich auf der Suche nach anderen Datenblätter Unterschiede bzw. Abweichungen gefunden. Zum Beispiel besagt ein Datenblatt das maximal 50 Messungen pro Sekunde ausgeführt werden können. Das würde bedeuten, dass alle 20 Millisekunden eine Messung gemacht werden kann.

Title: Re: Ultraschallmessung fehlerhafte Werte
Post by: HotSystems on Apr 16, 2018, 04:32 pm
Hallo SpaghettiCode,

mhh bei 2cm Abstand müssten das mit hin und Rückweg ca. 117,6 µs sein. Was ja heißt, dass der Befehl:
Code: [Select]
duration = pulseIn(echoPin, HIGH);
die Zeit von 50 µs von dem Datenblatt bereits überbrückt oder? Damit ist der Delay am Ende ja überflüssig. Habe den Sensor nun auch schon ausgetauscht => gleiches Ergebnis. Jedoch hab ich auf der Suche nach anderen Datenblätter Unterschiede bzw. Abweichungen gefunden. Zum Beispiel besagt ein Datenblatt das maximal 50 Messungen pro Sekunde ausgeführt werden können. Das würde bedeuten, dass alle 20 Millisekunden eine Messung gemacht werden kann.


So ist das mit "Theorie und Praxis".
Meine bisherigen Erfahrungen haben gezeigt, dass eine Messung nicht zu schnell aufeinander folgen darf, sonst stören die Reflexionen das Messergebnis.

Evtl. musst du dich langsam an den Wert rantasten, den du für brauchbar siehst.
Mag sein, dass die 0,5 sek. zu hoch angesetzt sind, aber dabei habe ich die besten Erfahrungen gesammelt.
Für meine bisherigen Projekte war das jedenfalls ausreichend.
Title: Re: Ultraschallmessung fehlerhafte Werte
Post by: combie on Apr 16, 2018, 04:41 pm
Quote
Laut Datenblatt benötigt der Sensor einen Delay von 50us zwischen den Starts der Messung.
Ich sehe da: >50us

Also mehr als 50µs!
evtl. deutlich mehr

Denn:
Ich sehe da auch noch: Propagation Delay Dependent on Distance

Title: Re: Ultraschallmessung fehlerhafte Werte
Post by: uwefed on Apr 16, 2018, 11:08 pm
Die mögliche Signalfolge ist eine Sache, der erzeugte Schall eine andere.
Wenn der Ultraschallsensor eine Ultraschallfolge losschickt, dann wird diese vom ersten Objekt im Schallkegel reflektiert und braucht eine Gewisse Zeit um bei gegebener Geschwindigkeit die Strecke zu durchlaufen. Dann ist aber der Ultraschallimpuls noch nicht weg.
Er kann:
1) Durch ein zweites Objekt das weiter weg im Schallkegel ist reflektiert werden und ein zweites Echo erzeugen.
2) Ein zweites Echo erzeugen weil ein Teil des ersten Echos vom Modul zurückgeworfen wird un am Objekt ein 2. Echo produziert. (Doppelte Spiegelung)

Beide Effekte machen daß erst nach geraumer Zeit eine weitere Messung möglich ist wenn es im Raum im Bezug auf Ultraschall "wieder still" ist. Das ist meist nach 1 Sekunde der Fall.

Deshalb kannst Du nicht schnell in Folge mit einem Ultraschallsensor eine Distanz messen. Du kannst Infrarotabstandssensoren bzw TOF-Sensoren verwenden.
Erzähl mal genau was Du machen möchtest, vieleicht können wir gemeinsam den besten Sensor finden.

Grüße Uwe 
Title: Re: Ultraschallmessung fehlerhafte Werte
Post by: Franz54 on Apr 16, 2018, 11:19 pm
Ich führe das Programm alle 200ms aus. Da sind die Ergebnisse gut.

Code: [Select]
digitalWrite(triggerPin2, LOW);
  delayMicroseconds(2);
  digitalWrite(triggerPin2, HIGH);
  delayMicroseconds(10);
  digitalWrite(triggerPin2, LOW);
  messung2 = pulseIn(echoPin2, HIGH, timeout); // Echozeit auslesen.

  // Wenn "messung" größer Timeout dann Messung ist "0"
  // Timout ist 18000 also 306 cm
  // Ist messung "0" dann ungültig, LCD-Ausgabe überspringen
  if (messung2 > 0) {
    ergebnis2 = (messung2 / 2) / 29; // Millisec in cm umrechnen.
Title: Re: Ultraschallmessung fehlerhafte Werte
Post by: Rilith on Apr 17, 2018, 08:49 am
Guten Morgen,
schon einmal vielen Dank für die vielen Antworten.


So ist das mit "Theorie und Praxis".
Meine bisherigen Erfahrungen haben gezeigt, dass eine Messung nicht zu schnell aufeinander folgen darf, sonst stören die Reflexionen das Messergebnis.
Hatte ich mir auch überlegt jedoch verstehe ich nicht wieso es nur am Anfang zu schnell aufeinander ist und immer die gleiche Anzahl an Werte. Werde mich nun so wie du es vorschlägst an den niedriegsten Wert rantasten.



Ich sehe da: >50us

Also mehr als 50µs!
evtl. deutlich mehr

Denn:
Ich sehe da auch noch: Propagation Delay Dependent on Distance


Das hab ich tatsächlich übersehen :smiley-confuse:

 
Erzähl mal genau was Du machen möchtest, vieleicht können wir gemeinsam den besten Sensor finden.

Grüße Uwe 
Ich möchte eine Fugendetektion bauen. Ich denke, das der Ultraschall-Sensor dafür nicht geeignet ist, dennoch wollte ich erstmal schauen wie so einen Abstandsmessung allgemein abläuft. Denke ich bräuchte ein Sensor mit kleinerem Kegel.



Ich führe das Programm alle 200ms aus. Da sind die Ergebnisse gut.

Werde ich gleich mal ausprobieren.
Title: Re: Ultraschallmessung fehlerhafte Werte
Post by: uwefed on Apr 17, 2018, 09:13 am
Was ist eine Fugendetektion?
Title: Re: Ultraschallmessung fehlerhafte Werte
Post by: Rilith on Apr 17, 2018, 09:36 am
Was ist eine Fugendetektion?
Oder Kantendetektion? Ich versuch mal ein Bild anzuhängen das ich fix gezeichnet hab. Der Gedanke geht dahin, das ein Schweißroboter so der Fuge folgen kann. Der Sensor erkennt wenn die Fuge nach rechts oder links wandert.
Title: Re: Ultraschallmessung fehlerhafte Werte
Post by: ElEspanol on Apr 17, 2018, 10:13 am
Ich glaube nicht, dass Ultraschall zur Lösung dieses Problems geeignet ist. Die Erfassungscharakteristik ist dafür zu ungenau
Title: Re: Ultraschallmessung fehlerhafte Werte
Post by: uwefed on Apr 17, 2018, 11:32 am
Aus welchen Material ist die zu detektierende Kante?
Grüße Uwe
Title: Re: Ultraschallmessung fehlerhafte Werte
Post by: Rilith on Apr 17, 2018, 11:45 am
Metall, Aluminium oder Stahl üblicherweise.
Title: Re: Ultraschallmessung fehlerhafte Werte
Post by: uwefed on Apr 17, 2018, 12:25 pm
Wie genau muß die Kante detektiert werden? Spielt sich alles in einer sauberen Umgebung ab oder ist es staubig und dreckig?

Grüße Uwe
Title: Re: Ultraschallmessung fehlerhafte Werte
Post by: Rilith on Apr 17, 2018, 12:41 pm
Umgebung ist sauber, jedoch sehr hell durch das Schweißen, eventuell kommt mal ein Spritzer durch die Messbahn geflogen. Kante sollte schon mit 1mm Auflösung detektiert werden. Genauer desto besser.

Gruß
Title: Re: Ultraschallmessung fehlerhafte Werte
Post by: combie on Apr 17, 2018, 01:48 pm
Ich möchte mal sagen:
1. Zu feine Strukturen für Ultraschall
2. Zuviel Ultraschall im Schweißgeräusch
3. Zuviel Licht(und Dreck), für optische Systeme
4. Zu viel EM Dreck für irgendwelche Verstärkerschaltungen, nahe dran

Mechanische Führung?
Vorher abfahren?
Title: Re: Ultraschallmessung fehlerhafte Werte
Post by: Rilith on Apr 17, 2018, 02:42 pm
Ich denke, das der Ultraschall-Sensor dafür nicht geeignet ist, dennoch wollte ich erstmal schauen wie so einen Abstandsmessung allgemein abläuft.
Hi combie,
aktuell bin ich tatsächlich an der Planung einer mechanischen Führung. Vorherabfahren ist zwar möglich doch kompensiert nicht den Materialverzug durch die Wärmeeinbringung.

Gruß
Title: Re: Ultraschallmessung fehlerhafte Werte
Post by: postmaster-ino on Apr 17, 2018, 07:53 pm
Hi

Sind die Kanten angefast?
Dann könnte man ggf. eine Art Linienfolger konstruieren - zur Elektrode optisch abgeschirmt.
Da käme dann wohl noch hinzu, daß Du den gerade detektierten Punkt erst in 3...5cm schweißt - gerade bei der 90° 'Kurve' müsste man sich wohl was überlegen, daß Das auch nach der 'Kurve' unterbrechungsfrei weiter geht.

Hatte bisher nur an Rundschweiß-Maschinen zu tun, meist Endschalter tauschen.

MfG
Title: Re: Ultraschallmessung fehlerhafte Werte
Post by: Rilith on Apr 18, 2018, 08:24 am
Hi postmaster-ino,

Nein die Kanten sind nicht angefast. Es handelt sich im Grunde nur um T-Stoße. Kurven gibt es zwar aber nicht mit 90°. Aktuell halte ich eine mechanische Führung für Sinnvoll. Wobei eine berührungslose natürlich zu bevorzugen wäre.

Gruß