HC-SR04 Ping-Sensor schneidet bei ~3 Metern ab

Ich habe einige HC-SR04-Ultraschallsensoren, die ich vor nicht allzu langer Zeit bei eBay gekauft habe. Ich habe einen an einen Arduino angeschlossen und eine schnelle Skizze geschrieben, um sie zu testen, und festgestellt, dass keiner von ihnen konsistent funktioniert.

Es scheint, dass sie alle aufhören zu arbeiten, wenn die Entfernung zu groß wird. Ich kann den Arduino einschalten und ich höre das Klicken des Sensors, während er auf die Decke gerichtet ist ~ 1,5 Meter entfernt. Wenn ich es jedoch in Richtung des anderen Endes des Raums drehe, ~3 Meter entfernt, stoppt das Klicken und die Methode pulsein() läuft ab und die Entfernungen werden mit 0 cm angezeigt. Das Zurückrichten des Sensors auf die Decke löst das Problem nicht, die Stromversorgung muss aus- und wieder eingeschaltet werden. Ich habe tatsächlich herausgefunden, dass das Bewegen des Sensors ihn manchmal auch wieder zum Laufen bringen kann, ohne die Stromversorgung aus- und wieder einzuschalten. Ich habe nach Leuten gesucht, die Probleme mit dem Sensor haben, aber niemand scheint das Problem zu haben, das ich habe.

EDIT: Ich habe noch etwas experimentiert und denke jetzt, dass es kein internes Timeout geben darf, wenn ein 'Klick' gesendet und nicht empfangen wird. Der Sensor funktioniert, wenn er auf feste Oberflächen in einer Entfernung von bis zu 3 Metern gerichtet wird. Es funktioniert in zwei Fällen nicht mehr: auf eine Tür gerichtet oder auf eine weiche Oberfläche gerichtet. Die Dokumentation zum Sensor besagt, dass er eine Reichweite von 4 Metern hat und auf weichen (schallabsorbierenden) Oberflächen nicht gut funktioniert. Meine Vermutung ist, dass in diesen beiden Fällen überhaupt kein Echo zu hören ist. Der Sensor steckt dann fest und wartet auf ein Echo. Wenn Sie es schnippen, wird das Echo erzeugt, auf das es gewartet hat, und es wird fortgesetzt, bis ein weiteres Echo verpasst wird.

Auf der Platine befinden sich drei ICs: ein Verstärker, ein max3232-Level-Shifter und ein nicht identifizierbarer. Ich vermute, dass der dritte eine Art Mikrocontroller ist, also kann ich versuchen, ihn neu zu programmieren oder zu ersetzen. Jeder Beitrag dazu wäre willkommen, obwohl es so aussieht, als hätte ich meine eigene Frage so weit wie möglich beantwortet.

Hier ist der Code, den ich verwende. Ich habe alle Verbindungen dreifach überprüft und die Tatsache, dass es kurz funktioniert, deutet darauf hin, dass sie tatsächlich korrekt sind.


const int trig = 3;
const int echo = 4;

float elapsed, distance;

void setup() {

  pinMode(trig, OUTPUT);
  pinMode(echo, INPUT);

  Serial.begin(9600);

}

void loop() {

  digitalWrite(trig, HIGH);
  delayMicroseconds(20);
  digitalWrite(trig, LOW);

  elapsed = pulseIn(echo, HIGH, 1000000);
 // timeout in microseconds

  distance = elapsed / 58;

  Serial.println((String)(distance) + " cm");

  delay(500);

}
Sie können das pulseIn(pin, value, timeout)Formular verwenden, um eine maximale Zeit zum Hören auf ein Echo anzugeben, damit Ihre Skizze nicht in einer Situation außerhalb des Bereichs hängt.
Ich verwende ein Timeout in meiner Arduino-Skizze, und es läuft ab. Ich vermute, dass sich auf der Sensorplatine selbst ein Mikrocontroller befindet, der keine Zeitüberschreitung aufweist, sodass er hängen bleibt (keine Klicks sendet), bis ich die Platine schnippe, wodurch ein künstliches Echo erzeugt wird.
Der von Ihnen gepostete Code verwendet die Nicht-Timeout-Version von pulseIn () Wenn Sie dies nicht verwenden, sollten Sie Ihre Frage aktualisieren.
Das Standard-Timeout beträgt eine Sekunde. Ich werde es aber zur Verdeutlichung hinzufügen.
Der Vorschlag von @ Samee87 war in Ordnung. Nicht sicher, warum gelöscht.
Was ist Ihre EE-Frage?

Antworten (2)

Es funktioniert wahrscheinlich "gut genug".

Derzeit sollte Ihr Code NICHT hängen bleiben, sondern alle 1,5 Sekunden eine Schleife durchlaufen - 1 Sekunde für das Arduino-vermittelte Impulszeitlimit und 500 ms aufgrund der Verzögerung (500). Nichts, was das SR04-Modul tut, sollte in der Lage sein, zu verhindern, dass Ihr Code alle ~= 1,5 Sekunden eine Schleife durchläuft. Wenn Sie zB die integrierte LED während der Verzögerungszeit (500) einschalten, sollten Sie sehen können, dass die Schleife auftritt.

Die Chancen stehen gut, dass Ihr System die Rückkehr auf weiche Ziele bei größeren Entfernungen nicht "hört", wie im Handbuch angegeben, bei 1 s abläuft, um 500 ms verzögert und dann wiederholt.

Die Verzögerung von 500 ms wird nicht benötigt (hilft aber, wenn eine Heartbeat-LED verwendet wird), da das 1-Sekunden-Pulsin-Timeout unabhängig vom SR04 ist, der lange vor dem "Aufgeben" ist.

WENN das obige richtig ist, dann wäre eine Art Beweis, den Sensor zu schnippen, GERADE WIE / NACHDEM die hinzugefügte Herzschlag-LED erlischt. Dies sollte jedes Mal funktionieren, wenn Sie schnell genug sind. Wohingegen ein Schnipsen, zB wenn die Heartbeat-LED angeht, nicht helfen würde.

Und/oder das Zeigen auf ein nahes Objekt für mindestens 1,54+ Sekunden sollte den Betrieb wiederherstellen.


Bonus:

Ich würde nicht glauben, dass es das Verhalten erklären würde, ABER der Triggerimpuls soll 10 uS betragen - nicht 20 uS plus. Der Prozessor fügt dieser Verzögerung eine endliche Zeit hinzu - aber "mit etwas Glück" werden die Verzögerungen von niedrig zu hoch und von hoch zu niedrig der DigitalWrites aufgehoben. ABER ich würde eine Verzögerung von 10 uS versuchen und, falls verfügbar, auch den Puls auf einem Oszilloskop betrachten. |

Ich habe genau das gleiche Problem. Hat jemand eine funktionierende Lösung gefunden? Meine einzige Lösung besteht darin, den Sensor mit einem digitalen Ausgang zu versorgen (der Arbeitsstrom beträgt 15 mA, also ist es in Ordnung) und ihn zurückzusetzen, wenn pulseIn mir 0 zurückgibt. Aber es sollte eine dauerhafte Lösung geben, um dies zu beheben ... Danke, Fardenco

EDIT: Ich habe eine Lösung gefunden: Sie müssen nur den Echo-Pin in den OUTPUT-Modus versetzen und ihm einen LOW-Impuls senden, ihn wieder in den INPUT-Modus versetzen und los geht's !! http://forum.arduino.cc/index.php?topic=55119.15

Antworten sind nur für Antworten. Sie sollten Ihre Antwort so bearbeiten, dass es nur die Lösung ist, die Sie gefunden haben, und vielleicht etwas mehr ausarbeiten?