Go Down

Topic: Ultraschallmessung fehlerhafte Werte (Read 352 times) previous topic - next topic

Rilith

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

HotSystems

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.
Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

Rilith

#2
Apr 16, 2018, 03:02 pm Last Edit: Apr 16, 2018, 03:07 pm by Rilith
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
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);
 
}

SpaghettiCode

Hi,

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

Gruß André

Rilith

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.


HotSystems

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.
Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

combie

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

Das größte Problem, ist die Wahl der richtigen Gedanken.

uwefed

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 

Franz54

#8
Apr 16, 2018, 11:19 pm Last Edit: Apr 16, 2018, 11:20 pm by Franz54
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.

Rilith

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.

uwefed


Rilith

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.

ElEspanol

Ich glaube nicht, dass Ultraschall zur Lösung dieses Problems geeignet ist. Die Erfassungscharakteristik ist dafür zu ungenau

uwefed

Aus welchen Material ist die zu detektierende Kante?
Grüße Uwe

Rilith

Metall, Aluminium oder Stahl üblicherweise.

Go Up