Neben den elektrotechnischen Fehlerquellen kann ich mir auch noch eine messtechnische vorstellen:
Es gibt 2 Messmethoden
Methode 1:
Die Dauer des Echopulses wird gemessen (Methode, die das Datenblatt vorschlägt).
Methode 2:
Zeit, die vergeht, bis der Sensor nach Triggerung einen Echo-Puls sendet, wird gemessen.
Ich sebst besitze keinen dieser Sensoren, also kann ich das nicht testen.
Ich hab mal einen Arduino-Testprogramm vorbereitet, das beide Methoden verwendet.
Das Ergebnis könnte aufschlussreich sein.
Code:
// Ultraschall-Test
// testet die Genauigkeit eines hc-sr04 Ultraschallsensors
// mit 2 Messmethoden:
// 1. measureAirTime
// Zeit, die vergeht, bis der Sensor nach Triggerung
// einen Echo-Puls sendet, wird gemessen.
// 2. measurePulseTime
// Die Dauer des Echo-Pulses wird gemessen.
//
// Datenblatt:
// https://docs.google.com/document/d/1Y-yZnNhMYy7rwhAgyL_pfa39RsB-x2qR4vP8saG73rE/edit?pli=1
//
// Sisor, 23.08.2014
#define PIN_TRIG 8 // Hier Anschluss-Pins definieren
#define PIN_ECHO 9
void trigger() {
digitalWrite(PIN_TRIG, HIGH);
delayMicroseconds(10); // 10 µs Triggerzeit (siehe Datenblatt)
digitalWrite(PIN_TRIG, LOW);
}
long measureAirTime() {
unsigned long now;
now = micros();
trigger();
while(digitalRead(PIN_ECHO) == LOW);
return micros() - now;
}
long measurePulseTime() {
// muss sofort nach measureAirTime()
// ausgeführt werden!!!
unsigned long now;
now = micros();
while(digitalRead(PIN_ECHO) == HIGH);
return micros() - now;
}
void printResult(unsigned long airMicros, unsigned long pulseMicros) {
Serial.print("measured air time : " );
Serial.print(airMicros );
Serial.println(" us");
Serial.print("measured pulse time: " );
Serial.print(pulseMicros );
Serial.println(" us");
Serial.println("---");
}
void setup() {
pinMode(PIN_TRIG, OUTPUT);
digitalWrite(PIN_TRIG, LOW);
pinMode(PIN_ECHO, INPUT);
Serial.begin(57600);
}
void loop() {
unsigned long airMicros, pulseMicros;
// Messung durchführen
airMicros = measureAirTime();
pulseMicros = measurePulseTime();
// Ausgabe über Serial-Monitor
printResult(airMicros, pulseMicros);
delay(100);
}
Lesezeichen