Nö- es ist völlig normal, dass bei mehir als der maximalen Reichweite "0" ausgegeben wird- was auch sonst?
Da kommt kein Echo zurück....
Nö- es ist völlig normal, dass bei mehir als der maximalen Reichweite "0" ausgegeben wird- was auch sonst?
Da kommt kein Echo zurück....
Grüssle, Sly
..dem Inschenör ist nix zu schwör..
Hallo,
bei einem ähnlichen Ultraschallsensor SRF04 ist es so, dass der Puls einfach nur deutlich länger wird, wenn kein Echo in einer bestimmten Zeit zurückkommt.
Vgl. http://www.robot-electronics.co.uk/htm/srf04tech.htm
Der Echo-Ausgang ist m.E. genau dann auf high, während der Schall unterwegs ist und nicht erst nach der Messung. Da der Sensor nicht wissen kann, welche Entfernung der Schall zurücklegen wird, gibt er den Puls bis zu einem Timeout aus (oder wenn das Echo normal zurückkommt wird früher Low ausgegeben). Beim SRF04 sind das 36ms.
Grüße, Bernhard
"Im Leben geht es nicht darum, gute Karten zu haben, sondern auch mit einem schlechten Blatt gut zu spielen." R.L. Stevenson
Solange Daten ausgegeben werden, das Hindernis also innerhalb der Reichweite ist, liegt am Echo-Signal vor pulseIn LOW an. Wenn das Hindernis ausserhalb der Reichweite ist liegt am Echo-Signal vor pulseIn HIGH an. Danke Bernhard für den Tipp.
Blöd ist nur, dass dieser Pegel bleibt auch wenn man nun ein Hindernis wieder in Reichweite bringt. Für 200ms ist das vom Hersteller auch gewollt um klar zu detektieren dass kein Messwert vorliegt. Die nächste Messung beginnt lt. Datenblatt mit der fallenden Flanke am trigger. Das funktioniert aber nicht, auch wenn man der Routine die 200ms Zeit gibt.
Gelöst habe ich das Problem durch Herunterziehen des echo-Signals auf LOW nach pulseIn. Damit läuft es wie gewünscht.
Keine Ahnung ob das elegant ist. Es funktioniert halt
Vielen Dank Euch allen für die Ratschläge.
Hier der Sketch:
int trig=7;
int echo=9;
unsigned long dauer; //Zeit zwischen Sendezeit und Empfangszeit
void setup() {
Serial.begin(9600);
pinMode(trig, OUTPUT);
}
void loop() {
pinMode(echo, INPUT);
digitalWrite(trig, LOW);
delay(5);
digitalWrite(trig, HIGH);
delay(15);
digitalWrite(trig, LOW);
if (digitalRead(echo)==LOW) {Serial.print("L");}
dauer=pulseIn(echo,HIGH)/29/2;
if (digitalRead(echo)==HIGH) {Serial.print("H"); pinMode(echo, OUTPUT);digitalWrite(echo, LOW);}
Serial.println(dauer);
}
Lesezeichen