Bauteil · Sensor

HC-SR04 Ultrasonic Sensor

Der HC-SR04 ist der Ultraschallsensor, mit dem die meisten Roboter Entfernung messen. Echo-Ortung, echte Reichweite, blinde Flecken und wie man ihn verdrahtet.

Was es ist

Der HC-SR04 ist ein Ultraschall-Distanzsensor – die kleine Platine mit zwei silbernen Zylindern, die wie Roboteraugen aussehen. Er misst Entfernung wie eine Fledermaus oder ein U-Boot: Er sendet einen unhörbar hohen Schallstoß, lauscht auf das Echo und stoppt die Zeit des Hin- und Rückwegs. Für wenige Dollar gibt er einem Roboter ein Gefühl für den Raum vor ihm, weshalb er der Standard­sensor für den ersten Hindernis­vermeidungs­roboter ist, den fast alle bauen.

Die zwei Zylinder sind ein Sender und ein Empfänger. Einer zirpt, der andere lauscht. Alles andere auf der Platine ist Timing-Schaltung, die aus diesem Echo ein Signal macht, das dein Mikrocontroller messen kann.

Diagramm eines an einen Mikrocontroller verdrahteten HC-SR04: Farbcodierte VCC-, Trigger-, Echo- und GND-Leitungen laufen zu den vier Pins des Sensors; der Sensor sendet Ultraschallwellen, die von einem Objekt reflektiert werden, und Entfernung gleich Echozeit mal Schallgeschwindigkeit geteilt durch zwei.
Trigger-Puls auslösen, messen, wie lange das Echo zur Rückkehr braucht, und in Entfernung umrechnen – die vier Drähte sind Strom, Masse, Trigger und Echo. SVG herunterladen

Wie es funktioniert

Der Sensor spricht eine einfache Zwei-Draht-Sprache:

  1. Du pulst den Trigger-Pin für 10 Mikrosekunden HIGH.
  2. Der Sensor feuert acht Ultraschall­pulse mit 40 kHz und hebt den Echo-Pin.
  3. Wenn das Echo zurückkehrt, senkt er Echo wieder auf LOW.
  4. Du misst, wie lange Echo HIGH blieb.

Diese Pulsbreite ist die Hin- und Rücklaufzeit. Schall reist etwa 343 m/s in Luft, also Entfernung = (Echozeit × 343) / 2 – die Division durch zwei, weil der Schall hin und zurück ging. Der meiste Arduino-Code packt das in pulseIn() und etwas Arithmetik.

Weil es von der Schall­geschwindigkeit abhängt, driftet der Messwert leicht mit der Temperatur (Schall ist schneller in warmer Luft). Für einen Roboter, der Wände meidet, ist dieser Fehler vernachlässigbar; für präzises Messen zählt er, und du würdest Temperatur kompensieren.

Wann man ihn verwendet

Greife zum HC-SR04, wann immer ein Roboter wissen muss, grob wie weit das nächste Ding entfernt ist – Hindernis­vermeidung, Wandfolgen, ein „Fahr nicht vom Tisch“-Wächter oder Auslösen eines Verhaltens, wenn sich etwas nähert. Sein breiter Strahl hilft hier sogar: Ein Hindernis zu verpassen ist schwer.

Schau dich anderswo um, wenn du eine präzise Distanz, einen schmalen Strahl oder schnelle Updates brauchst. Ein Time-of-Flight-Sensor nutzt Licht statt Schall und gibt einen engen, schnellen, millimeter­genauen Messwert – besser zum Kartieren oder wenn ein Roboter eine bestimmte Lücke beurteilen muss.

Verdrahtung und Fallstricke

  • Echo ist ein 5-V-Pin. An einem 5-V-Board wie dem Arduino Uno ist das in Ordnung. An einem 3,3-V-Board wie dem ESP32 lege einen Spannungsteiler auf Echo, sonst riskierst du den Pin zu beschädigen.
  • Blinden Fleck und Kegel beachten. Nichts näher als ~2 cm registriert, und der ~15°-Strahl heißt, der Sensor meldet das nächste Ding in einem Kegel – ein Tischbein seitlich kann ihn auslösen.
  • Weiche und schräge Ziele lügen. Schaum, Stoff oder eine Wand in steilem Winkel streuen das Echo vom Empfänger weg, also liest der Sensor „weit“ oder nichts. Am besten geht er auf flachen, harten Flächen, die ihm zugewandt sind.
  • Nicht zu schnell abfragen. Lasse ~60 ms zwischen Messungen, damit das vorige Echo verklungen ist; früher gepingt geben Streuechos falsche Messwerte. Den Datenstrom zu filtern hilft – siehe Sensor­rauschen zähmen.

Pinbelegung

Pin Name Richtung Was er tut
1 VCC Hinein 5 V. Das Board zieht etwa 15 mA, mit Spitze beim Ping
2 Trig Hinein Für 10 µs HIGH pulsen, um eine Messung zu starten
3 Echo Hinaus Geht HIGH, wenn der Stoß losgeht, LOW bei Rückkehr. 5-V-Ausgang
4 GND — Masse

Die vier Pins sind immer in dieser Reihenfolge, und das Modul ist fast immer mit den Pins von den Wandlern weg orientiert, also liegt VCC links, wenn du auf die „Augen“ schaust.

An einen Arduino verdrahten

HC-SR04 Arduino Uno ESP32
VCC 5 V 5 V (von VIN, nicht der 3,3-V-Schiene)
Trig Beliebiger Digitalpin Beliebiger GPIO
Echo Beliebiger Digitalpin Über einen Teiler – siehe unten
GND GND GND

Das 3,3-V-Problem

Der Echo-Pin treibt volle 5 V, und ein ESP32- oder Raspberry-Pi-GPIO ist für 3,3 V ausgelegt. 5 V hinein­zuspeisen liegt außerhalb seines absoluten Maximums, und obwohl er oft eine Weile überlebt, beschädigt es den Pin wirklich. Zwei Widerstände beheben es:

Echo ──┬── 1 kΩ ──┬── to 3.3 V GPIO
       │          │
       │        2 kΩ
       │          │
       └──────────┴── GND

Dieser Teiler gibt 5 V × 2/(1+2) = 3,33 V. Jedes Verhältnis nahe 2:1 geht – 1 kΩ und 2 kΩ oder 10 kΩ und 20 kΩ. Nutze keine Werte über etwa 20 kΩ, sonst verlangsamt die Eingangskapazität des Pins die Flanke genug, um das Timing zu verzerren, das du messen willst.

Die Entfernungs­arithmetik, und wo sie schiefläuft

distance = (echo_microseconds x speed_of_sound) / 2

Schall reist 343 m/s bei 20 °C, was 0,0343 cm/µs sind. Das gibt die Konstante, die alle nutzen: Echozeit durch 58,2 teilen für Zentimeter.

Die Schall­geschwindigkeit ist temperatur­abhängig, grob:

speed (m/s) = 331.3 + 0.606 x temperature_celsius
Temperatur Schall­geschwindigkeit Fehler bei Annahme 20 °C
0 °C 331 m/s Liest 3,5 % zu weit
20 °C 343 m/s —
40 °C 356 m/s Liest 3,7 % zu nah

Bei 2 m sind das etwa 7 cm über eine Garage im Winter gegen einen warmen Raum. Zur Hindernis­vermeidung ist es irrelevant. Für alles, was eine Lücke misst, kompensieren – und wenn du einen MPU-6050 oder fast jeden I²C-Sensor am Roboter hast, hast du schon einen Temperatur­messwert.

Minimaler funktionierender Code

const int TRIG = 9, ECHO = 10;
const unsigned long TIMEOUT_US = 25000UL;   // ~4.3 m, past the sensor's range

void setup() {
  Serial.begin(115200);
  pinMode(TRIG, OUTPUT);
  pinMode(ECHO, INPUT);
}

// Returns centimetres, or -1 when nothing came back.
float pingCm() {
  digitalWrite(TRIG, LOW);  delayMicroseconds(2);
  digitalWrite(TRIG, HIGH); delayMicroseconds(10);
  digitalWrite(TRIG, LOW);

  unsigned long us = pulseIn(ECHO, HIGH, TIMEOUT_US);
  if (us == 0) return -1.0f;        // timeout: no echo, NOT "zero distance"
  return us / 58.2f;
}

// Median of three kills the occasional wild reading.
float pingMedianCm() {
  float a = pingCm(); delay(60);
  float b = pingCm(); delay(60);
  float c = pingCm();
  if (a > b) { float t = a; a = b; b = t; }
  if (b > c) { float t = b; b = c; c = t; }
  if (a > b) { float t = a; a = b; b = t; }
  return b;
}

void loop() {
  float cm = pingMedianCm();
  if (cm < 0) Serial.println("no echo");
  else        Serial.println(cm);
  delay(60);
}

Drei Details darin sind der Unterschied zwischen einem Sensor, der geht, und einem, der nicht geht:

Das Timeout ist nicht optional. pulseIn ohne Timeout blockiert, bis ein Echo kommt, und auf weicher oder schräger Fläche kommt nie eines. Der Roboter scheint in zufälligen Abständen einzufrieren, und die Ursache sieht nach allem außer dem Sensor aus.

Null ist keine Distanz. Ein Timeout heißt „nichts kam zurück“, was meist heißt, das nächste Ding ist weit weg oder unsichtbar – das Gegenteil von null. Code, der ein Timeout als 0 cm behandelt, löst eine Notbremsung im leeren Raum aus.

Der Median aus drei verwirft den einzelnen wilden Messwert, den diese Sensoren regelmäßig produzieren. Ein einziger falscher 20-cm-Wert im offenen Raum reicht, um einen Roboter in eine Wand zu schwenken.

Das Strahlmuster ehrlich lesen

Die Spezifikation sagt 15°, was wie ein schmaler Taschenlampen­strahl klingt. Ist es nicht – das ist der Halbwinkel der Hauptkeule, und die praktische Folge ist, dass der Sensor bei 1 m auf einen Kegel von grob 50 cm Durchmesser lauscht.

Entfernung Ungefähre Kegelbreite
20 cm ~10 cm
50 cm ~26 cm
1 m ~53 cm
2 m ~105 cm

Der Sensor meldet das nächste Ding irgendwo in diesem Kegel und sagt dir nichts darüber, wo im Kegel es war. Deshalb erkennt ein HC-SR04 einen Türrahmen, den er nicht lokalisieren kann, und deshalb löst ein Tischbein weit seitlich einen Stopp aus.

Zum Herumwandern in einem Raum ist das ein Vorteil – ein Hindernis zu verpassen ist sehr schwer. Um die Entfernung zu einem bestimmten Ding zu messen, ist es disqualifizierend, und du willst einen VL53L0X.

Was er nicht sehen kann

Das ist Physik, kein Defekt, und darum herum zu entwerfen ist der Job:

Fläche Was passiert Warum
Wand über ~45° Liest weit oder nichts Schall reflektiert vom Empfänger weg, wie Licht an einem Spiegel
Polster, Vorhänge, Schaum Liest nichts Das Material schluckt den Puls statt ihn zu reflektieren
Sehr nahe Objekte Liest nichts unter ~2 cm Der Empfänger ist vom Sendestoß noch taub
Dünne Objekte (Stuhlbein von der Kante) Erkannt, aber falsch verortet Der Kegel ist breit; das Echo ist echt, aber die Peilung nicht
Anderer HC-SR04 nearby Zufällige wilde Messwerte Er hört den Zirper des anderen Sensors – Timing versetzen

Ein Roboter, der sich nur auf Ultraschall verlässt, schiebt irgendwann einen Vorhang, bis etwas nachgibt. Genau deshalb ist ein Bump-Schalter die billigste Verlässlichkeit am ganzen Roboter.

Fehlerbehebung

Symptom Wahrscheinliche Ursache Lösung
Liest immer 0 Timeout als Distanz behandelt Sentinel zurückgeben und „kein Echo“ explizit handhaben
Roboter friert zufällig ein pulseIn ohne Timeout Timeout übergeben – 25000 µs decken die volle Reichweite
Messwerte springen wild Schneller als ~60 ms abgefragt Warten, bis das vorige Echo verklungen ist
Stetig, aber paar Prozent falsch Temperatur Mit Schall­geschwindigkeits­formel kompensieren
Auf der Bank ok, am Roboter nicht Motorstörungen auf der 5-V-Schiene Versorgung des Sensors entkoppeln; Leitungen von Motor­leitungen weg
Zwei Sensoren stören sich Beide hören einander Nacheinander triggern, niemals gleichzeitig
ESP32-Pin antwortet nicht mehr 5-V-Echo in 3,3-V-GPIO Teiler ergänzen – und prüfen, ob der Pin noch geht
Erkennt Dinge, die nicht vorn sind Der 15°-Kegel Erwartet; Nutzwinkel mechanisch einengen oder Lasersensor nutzen

HC-SR04 oder VL53L0X?

HC-SR04 VL53L0X
Methode 40-kHz-Schall 940-nm-Laser-Time-of-Flight
Reichweite 2 cm – 4 m 3 cm – 2 m (bis 4 m im besten Fall)
Strahl ~15° Halbwinkel – breiter Kegel ~25° Sichtfeld, aber effektiv ein enger Fleck
Aktualisierungs­rate ~16 Hz (60-ms-Zyklus) Bis 50 Hz
Blind für Weiche und steil schräge Flächen Dunkle matte und spiegelnde Flächen, helles Sonnenlicht
Schnittstelle Zwei Pins, keine Bibliothek nötig I²C
Kosten ~2 $ ~5 $

Sie versagen auf entgegengesetzten Materialien, was die Wahl leicht macht, wenn man den Raum kennt. Sonar sieht eine schwarz bespannte Kiste, die der Laser nicht kann; der Laser sieht eine Glastür im Winkel, die Sonar nicht kann. An einem Roboter, der verlässlich sein muss, ist die ehrliche Antwort oft beides – plus Bump-Schalter für wenn beide falschliegen.

Den Graphen erkunden

Verwendet in diesen Bauprojekten

Projekte, Lernpfade und Simulatoren, die HC-SR04 Ultrasonic Sensor verwenden.

Vergleich

Alternativen

Fragen

FAQ zu HC-SR04 Ultrasonic Sensor

Was ist der HC-SR04-Ultraschallsensor?

Der HC-SR04 ist ein preiswerter Distanzsensor, der misst, wie weit ein Objekt entfernt ist, indem er einen Ultraschallstoß daran reflektieren lässt – dasselbe Prinzip wie Fledermäuse und Sonar. Es ist der Sensor, mit dem die meisten Einsteigerroboter Hindernisse erkennen und meiden.

Wie funktioniert der HC-SR04?

Du sendest einen kurzen Puls an seinen Trigger-Pin. Der Sensor sendet acht 40-kHz-Ultraschallstöße und hebt seinen Echo-Pin, bis die Reflexion zurückkehrt. Du misst, wie lange Echo high bleibt, und da Schall etwa 343 m/s reist, ist Entfernung gleich diese Zeit mal Schallgeschwindigkeit, geteilt durch zwei für Hin- und Rückweg.

Was ist die maximale Reichweite des HC-SR04?

Der HC-SR04 misst grob 2 cm bis 4 m. Am genauesten ist er im Band 5 cm bis 2 m; nahe der 4-m-Grenze werden Messwerte unzuverlässig, und Objekte näher als etwa 2 cm fallen in seinen blinden Fleck und lassen sich nicht messen.

Ist der HC-SR04 genau und verlässlich?

Genau genug zur Hindernisvermeidung – etwa 3 mm Auflösung an einem flachen, harten Ziel, das ihm gerade zugewandt ist. Er kämpft mit weichen oder schrägen Flächen (die das Echo streuen), wird von Temperatur beeinflusst und hat einen breiten ~15°-Strahl, also erfasst er einen Kegel, keinen Punkt.

Wie schließt man einen HC-SR04 an einen Arduino an?

Verdrahte VCC auf 5 V, GND auf Masse, Trigger an einen beliebigen Digitalausgangspin und Echo an einen Digitaleingangspin. Eine Warnung: Echo gibt 5 V aus, also senke es mit einem Spannungsteiler, wenn du ein 3,3-V-Board wie einen ESP32 nutzt, bevor du es liest.

HC-SR04 vs. US-100 – welcher ist besser?

Der US-100 ist ein naher Verwandter mit temperaturkompensiertem Modus, optionaler serieller Schnittstelle und 3,3–5-V-Betrieb, was ihn genauer und einfacher an 3,3-V-Boards macht. Der HC-SR04 ist billiger und hat mehr Tutorials. Zum Lernen reicht der HC-SR04; für Präzision liegt der US-100 vorn.

Wie prüfe ich, ob mein Ultraschallsensor funktioniert?

Gib die gemessene Distanz auf dem seriellen Monitor aus und bewege deine Hand zum Sensor hin und weg – der Messwert soll glatt folgen. Wenn er bei null oder einem Maximalwert klemmt, prüfe Trigger- und Echo-Verdrahtung, bestätige eine stabile 5-V-Versorgung und stelle sicher, dass dein Timeout für die vollen 4 m Reichweite reicht.

Weiterführende Literatur

Quellen