Ultraschallmessung fehlerhafte Werte

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. :confused: 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:

#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);
  
}

Hi,

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

Gruß André

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:

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.

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:

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.

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

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

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

 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.

Guten Morgen,
schon einmal vielen Dank für die vielen Antworten.

HotSystems:
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.

combie:
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 :confused:

uwefed:
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.

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

Werde ich gleich mal ausprobieren.

Was ist eine Fugendetektion?

uwefed:
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.

Fuge.PNG

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

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

Metall, Aluminium oder Stahl üblicherweise.

Wie genau muß die Kante detektiert werden? Spielt sich alles in einer sauberen Umgebung ab oder ist es staubig und dreckig?

Grüße Uwe

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ß

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?

Rilith:
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ß

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

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ß