Du bist hier: Sensor > Ultraschallsensor

Arduino Ultraschallsensor programmieren

Lerne mit dieser Anleitung, wie du den HC-SR04 Ultraschallsensor ohne zusätzliche Library in wenigen Schritten mit einem Arduino programmieren kannst. Messe damit präzise Distanzen zu beliebigen Objekten und verstehe, wie ein Parksensor funktioniert oder wie sich selbstfahrende Autos im Verkehr orientieren.

Diese Anleitung basiert auf dem vereinfachten Controller von PGLU, kann aber mit jedem Arduino UNO oder NANO umgesetzt werden.

Hier geht's zur Übersetzung der Pin-Belegung ↗

1. Vorbereiten

Der Arduino Ultraschallsensor sendet und empfängt ein akustisches Signal und berechnet anhand der verstrichenen Zeit dazwischen, die Distanz zu reflektierenden Objekten.

Der Ultraschallsensor wird so angeschlossen:

  • VCC  →   +5V
  • GND →   -5V
  • Trig   →    L3 -  (Minuspol)
  • Echo →    S3▲(Eingang)

 

Anschluss an Arduino UNO/NANO:

  • VCC  →   +5V
  • GND →   GND
  • Trig   →   D3
  • Echo →   A2

2. Ultraschallsensor Verwenden

Alle Programmierungen werden mit dem grafischen PGLU-Editor ↗ gemacht. Den originalen Arduino Code findest du dann in der Code-Ansicht des Editors

2.1. Simple Verwendung dank einer "Funktion"

Mit dem Ultraschallsensor können Distanzen zwischen 1 cm und ca. 400 cm gemessen werden und dies mit einer erstaunlichen Genauigkeit. Gleich wie beim Servo, wird die Programmierung mit einer Funktion bewerkstelligt. Das ist sehr praktisch, denn die Funktion kann so an jeder beliebigen Stelle im Code eine Distanzmessung vornehmen und das Ergebnis in cm ausgeben.

2.2. Das Sketch

Hinweis: du kannst auch mit dem Ultraschallsensor arbeiten, wenn du dieses Kapitel nicht 100%ig nachvollziehst. Kopiere einfach den Code im grauen Kasten in den grafischen Editor ↗ und experimentiere mit dem Sensor. Den originalen Arduino Code findest du dann in der Code-Ansicht des Editors.


Welche Abläufe braucht es, um mit dem Ultraschallsensor HC-SR04 eine Distanz zu messen?

  • Der Sensor besitzt einen Schall-Sender und einen Empfänger
  • Der Sender wird in den Bereitschaftsmodus versetzt und dazu für die Dauer von 5μs ausgeschaltet
  • Der Sender sendet ein Burst (Schall)-Signal von 10 μs Dauer
  • Der Empfänger erwartet das Echo dieses Signals und misst die verstrichene Zeit zwischen Senden und Empfangen
  • Das Ergebnis dieser Messung wird als Stromimpuls von einer bestimmten Länge ausgegeben und in cm umgerechnet

Sketch 1: Sketch für Arduino Ultraschallsensor (Klick für Zoom)

Kopiere diesen XML-Code mit Klick/Berührung und füge ihn in den PGLU-Editor ↗ ein:

Distanz in cmVerstrichene ZeitSetze diesen Block dort ein, wo du eine Distanz messen möchtestFunktion für den Ultraschallsensor11gemessene Distanz in cmLED3LOW2LED3HIGH10LED3LOWVerstrichene ZeitpulseIn(16, HIGH)Distanz in cm(Verstrichene_Zeit*0.0343)/2Distanz in cm

2.3. Präzise Messungen mit dem Arduino Serial Monitor

Manchmal möchtest du ganz genau wissen, welche Werte dein Ultraschallsensor misst, um ihn zu kalibrieren.

Mit dem Serial Monitor in der Arduino IDE kannst du beliebige Werte von Variablen vom Mikrocontroller an deinen PC zurücksenden. Verbinde deinen Mikrocontroller direkt via USB mit deinem Rechner und lass dir die Messwerte am Monitor live anzeigen.

Kopiere diesen XML-Code mit Klick/Berührung und füge ihn in den PGLU-Editor ↗ ein.

Distanz in cmAbstandZeitstempelVerstrichene ZeitSerial.begin(9600);Gemessene Distanz in cmLED3LOW5LED3HIGH10LED3LOWEQSENSOR3LOWZeitstempelEQSENSOR3HIGHVerstrichene ZeitMINUSZeitstempelDistanz in cmMULTIPLYVerstrichene Zeit0.0175Distanz in cm11AbstandSerial.print("Abstand = ");Serial.print(Abstand, 0);Serial.println(" cm");

3. Challenge

3.1. Selbstfahrendes Auto und Automatisierte Mobilität

Automatisiertes Fahren im Strassenverkehr beflügelt eine ganze Industrie zu intensiver Forschung und Entwicklung. Treibende Kräfte dahinter sind eine Verbesserung der Verkehrssicherheit, effizientere Nutzung der Energie sowie unser Wunsch das Auto noch bequemer zu machen :-)

Der Ultraschallsensor spielt, zusammen mit Videokameras und Messsystemen die auf Laser basieren (Lidar), zu den wichtigsten Technologien für diese Entwicklung.

Kannst du ein einfaches selbstfahrendes Auto bauen, mit nur einem einzigen Ultraschallsensor? Tipp: Wenn dein Auto von Zeit zu Zeit stillsteht, kann es seine Umgebung erkunden, indem es kurz nach links und nach rechts abdreht, um den Raum in beide Richtungen zu vermessen. Eine andere Variante wäre es, den Sensor auf einem Servo zu platzieren.

Die nachfolgenden Videos zeigen 4 Strategien, wie mit dem Ultraschallsensor ein Arduino Roboter mit Hinderniserkennung gesteuert werden kann. Studiere auch die dazugehörigen Flussdiagramme um zu verstehen, wie du dein selbstfahrendes Auto in wenigen Schritten intelligenter machen kannst.


Die Komponenten sind so an den PGLU-Mikrocontroller MOTOR oder KOMFORT angeschlossen:

Diese Teile sind nicht unbedingt notwendig:


Hinweis 1: Du kannst dieses Projekt auch mit einem klassischen Arduino Board umsetzen.


Hinweis 2: Alle vorgestellten Projekte basieren auf unserem Arduino Robotik Starter Set. Sie können aber auch mit jedem Arduino UNO oder NANO umgesetzt werden.

Selbstfahrendes Auto Level 1: Direkt abdrehen

Flussdiagramm Ultraschallsensor Level 1

Distanz in cmZeitstempelDauerUnterprogramm für DistanzmessungLevel 1Gemessene Distanz in cm50LED3LOW5LED3HIGH10LED3LOWEQSENSOR3LOWZeitstempelEQSENSOR3HIGHDauerMINUSZeitstempelDistanz in cmMULTIPLYDauer0.0175Distanz in cmPause zur Verlangsamung des Prozesses11LT30Distanzmessung in cm ruft Unterprogramm aufUnterprogramme für FahrfunktionenRückwärts 300MOTOR1-100MOTOR2-100300VorwärtsMOTOR180MOTOR280Links 500MOTOR1100MOTOR2-100500Rechts 500MOTOR1-100MOTOR2100500

Distanz in cmMesswertZeitstempelDauerLevel 1Unterprogramm für Distanzmessung550LED1Gemessene Distanz in cm50LED3LOW5LED3HIGH10LED3LOWEQSENSOR3LOWZeitstempelEQSENSOR3HIGHDauerMINUSZeitstempelDistanz in cmMULTIPLYDauer0.0175Distanz in cmPause zur Verlangsamung des Prozesses11MesswertORSTANDARDSENSOR1LOWORSTANDARDSENSOR2LOWLTMesswert30MODE1Messwert3025030100151MINUSMesswert3015030100100Distanzmessung in cm ruft Unterprogramm aufUnterprogramme für FahrfunktionenRückwärts 300MOTOR1-100MOTOR2-100300VorwärtsMOTOR180MOTOR280Links 500MOTOR1100MOTOR2-100500Rechts 500MOTOR1-100MOTOR2100500

Mit Klick/Berührung XML-Code kopieren und in PGLU-Editor ↗ einfügen
Links Grundversion, rechts Version wie in Video

Selbstfahrendes Auto Level 2: Stoppen und Umgebung erkunden I

Flussdiagramm Ultraschallsensor Level 2

Distanz in cmMesswert linksZeitstempelDauerMesswert rechtsUnterprogramm DistanzmessungLevel 2Gemessene Distanz in cmLED3LOW5LED3HIGH10LED3LOWEQSENSOR3LOWZeitstempelEQSENSOR3HIGHDauerMINUSZeitstempelDistanz in cmMULTIPLYDauer0.0175Distanz in cm11LT15Messwert linksMesswert rechtsLTMesswert rechtsMesswert linksGTMesswert rechtsMesswert linksReagiere, wenn die Distanz unter 15cm istSpeichere den Messwert als "Messwert links"Speichere den Messwert als "Messwert rechts"Vergleiche die beiden Messwerte und ziehe die Schlüsse daraus: In welche Richtung soll wieder losgefahren werden?Unterprogramme Fahrfunktionen. Die Länge der Pausen beeinflussen das Verhalten erheblich. Experimentiere damit!Rückwärts 300MOTOR1-100MOTOR2-100300Stopp 500MOTOR10MOTOR20500Fahre vorwärts, falls keine Distanzmessung unter 15cm liegtDrehen rechts 200MOTOR1100MOTOR2-100300VorwärtsMOTOR1100MOTOR2100Drehen rechts 201MOTOR1100MOTOR2-100200Drehen links 200MOTOR1-100MOTOR2100300

Distanz in cmMesswert linksZeitstempelDauerMesswert rechtsLevel 2Unterprogramm Distanzmessung550LED1Gemessene Distanz in cmLED3LOW5LED3HIGH10LED3LOWEQSENSOR3LOWZeitstempelEQSENSOR3HIGHDauerMINUSZeitstempelDistanz in cmMULTIPLYDauer0.0175Distanz in cm11MODE1MINUSDistanz in cm30301500150151MINUSMesswert links3015030100100ORORLT15STANDARDSENSOR2LOWSTANDARDSENSOR1LOWMesswert linksMODE242MINUSMULTIPLYMesswert rechts33015030100100Messwert rechtsMODE212MINUSMULTIPLYMesswert links33015030100100LTMesswert rechtsMesswert linksGTMesswert rechtsMesswert linksPixelblöcke visualisieren die Distanzmessungen - sie könnten auch entfernt werdenReagiere, wenn die Distanz unter 15cm isteigentiche Distanzmessung . Die klassischen Sensoren und die "oders" können entfernt werdenSpeichere den Messwert als "Messwert links"Speichere den Messwert als "Messwert rechts"Unterprogramme Fahrfunktionen. Die Länge der Pausen beeinflussen das Verhalten erheblich. Experimentiere damit!Rückwärts 300MOTOR1-100MOTOR2-100300Stopp 500MOTOR10MOTOR20500Vergleiche die beiden Messwerte und ziehe die Schlüsse daraus: In welche Richtung soll wieder losgefahren werden?Drehen rechts 200MOTOR1100MOTOR2-100300VorwärtsMOTOR1100MOTOR2100Fahre vorwärts, falls keine Distanzmessung unter 15cm liegtDrehen rechts 201MOTOR1100MOTOR2-100200Drehen links 200MOTOR1-100MOTOR2100300

Mit Klick/Berührung XML-Code kopieren und in PGLU-Editor ↗ einfügen
Links Grundversion, rechts Version wie in Video

Selbstfahrendes Auto Level 3: Stoppen und Umgebung erkunden II

Flussdiagramm Ultraschallsensor Level 3

Servo-PositionPauseServo PinDistanz in cmMesswertMesswert rechtsZeitstempelMesswert linksDauerUnterprogramm für DistanzmessungGemessene Distanz in cmLED3LOW5LED3HIGH10LED3LOWEQSENSOR3LOWZeitstempelEQSENSOR3HIGHDauerMINUSZeitstempelDistanz in cmMULTIPLYDauer0.0175Distanz in cmLevel 3Die Funktionalität des Roboters wird erheblich von der ersten Distanzmessung (während des Fahrens) beeinflusst. Experimentiere mit dem Wert 25cm115010LTDistanz in cm255500Messwert rechtsMesswert95500Messwert linksMesswertLTMesswert rechtsMesswert linksLTMesswert linksMesswert rechts50LED2200Eigentliche Distanzmessung aus der Fahrt heraus. Sie entscheidet, ob eine Umgebungsmessung gemacht werden sollDie Umgebungsmessung beinhaltet einen Servo-Befehl und eine Distanzmessung (siehe Unterprogramme). Hier: Umgebungsmessung rechtsSpeichere den Messwert für rechtsDie Umgebungsmessung beinhaltet einen Servo-Befehl und eine Distanzmessung (siehe Unterprogramme). Hier: Umgebungsmessung linksSpeichere den Messwert für linksVergleiche die beiden Messwerte und ziehe deine Schlüsse daraus für die WeiterfahrtUnter- Unterprogramm für UmgebungsmessungMesse UmgebungServo-PositionLED2PauseMesswertFahre vorwärts, falls keine Distanzmessung während der Fahrt bei unter 25cm liegtUnterprogramm für Servo-Positionstelle Servo8Servo PinHIGHServo-Position01006002400Servo PinLOW19Unterprogramme für die Fahrfunktion - die Pausen haben erheblichen Einfluss auf das Verhalten des Roboters. Experimentiere damit!Rückwärts 150MOTOR1-100MOTOR2-100150VorwärtsMOTOR1100MOTOR2100StoppMOTOR10MOTOR20Drehen links 200MOTOR1-100MOTOR2100250Drehen rechts 200MOTOR1100MOTOR2-100250

Servo-PositionPauseServo PinDistanz in cmMesswertMesswert linksZeitstempelMesswert rechtsDauerLevel 3Unterprogramm für DistanzmessungDie Funktionalität des Roboters wird erheblich von der ersten Distanzmessung (während des Fahrens) beeinflusst. Experimentiere mit dem Wert 25cmGemessene Distanz in cmLED3LOW5LED3HIGH10LED3LOWEQSENSOR3LOWZeitstempelEQSENSOR3HIGHDauerMINUSZeitstempelDistanz in cmMULTIPLYDauer0.0175Distanz in cm550LED1115010MODE1MINUSDistanz in cm35301500150151MINUSMesswert links3015030100100ORORLTDistanz in cm25STANDARDSENSOR2LOWSTANDARDSENSOR1LOW5500MODE242MINUSMULTIPLYMesswert rechts33015030100100Messwert rechtsMesswert95500MODE212MINUSMULTIPLYMesswert links33015030100100Messwert linksMesswertLTMesswert rechtsMesswert linksLTMesswert linksMesswert rechts50LED2200Pixelblöcke zur Visualisierung der Messwerte - können auch entfernt werdenEigentliche Distanzmessung aus der Fahrt heraus. Sie entscheidet, ob eine Umgebungsmessung gemacht werden sollDie klassischen Sensoren, sowie die "oders" können entfernt werdenDie Umgebungsmessung beinhaltet einen Servo-Befehl und eine Distanzmessung (siehe Unterprogramme). Hier: Umgebungsmessung rechtsSpeichere den Messwert für rechtsDie Umgebungsmessung beinhaltet einen Servo-Befehl und eine Distanzmessung (siehe Unterprogramme). Hier: Umgebungsmessung linksUnter- Unterprogramm für UmgebungsmessungSpeichere den Messwert für linksMesse UmgebungServo-PositionLED2PauseMesswertVergleiche die beiden Messwerte und ziehe deine Schlüsse daraus für die WeiterfahrtUnterprogramm für Servo-Positionstelle Servo8Servo PinHIGHServo-Position01006002400Servo PinLOW19Fahre vorwärts, falls keine Distanzmessung während der Fahrt bei unter 25cm liegtUnterprogramme für die Fahrfunktion - die Pausen haben erheblichen Einfluss auf das Verhalten des Roboters. Experimentiere damit!Rückwärts 150MOTOR1-100MOTOR2-100150VorwärtsMOTOR1100MOTOR2100StoppMOTOR10MOTOR20Drehen rechts 200MOTOR180MOTOR2-80250Drehen links 200MOTOR1-80MOTOR280250

Mit Klick/Berührung XML-Code kopieren und in PGLU-Editor ↗ einfügen
Links Grundversion, rechts Version wie in Video

Selbstfahrendes Auto Level 4: Fahren und Umgebung erkunden

Flussdiagramm Ultraschallsensor Level 4

Servo-PositionServo PinDistanz in cmMesswertZeitstempelMesswert linksDauerMesswert rechtsMOTOR10MOTOR204000Zeitstempel0Level 4Die Grenzwerte Seitenmessung=45cm und Messung geradeaus=20cm beeinflussen die Funktionalität des Roboters erheblich. experimentiere damitUnterprogramm DistanzmessungDieser Roboter reagiert sensibler auf die Messungen an den Seitenpositionen, als auf die Messung geradeaus. Siehe Video.Gemessene Distanz in cm10LED3LOW5LED3HIGH10LED3LOWEQSENSOR3LOWZeitstempelEQSENSOR3HIGHDauerMINUSZeitstempelDistanz in cmMULTIPLYDauer0.0175Distanz in cmWozu diese Pause? Das wissen die Götter aber ohne geht's nicht ;-)115LTDistanz in cm45GT4050LTDistanz in cm3595Messwert linksDistanz in cm5005Messwert rechtsDistanz in cmLTMesswert rechtsMesswert linksLTMesswert linksMesswert rechts50LED210095LTDistanz in cm45GT40Messe während der Fahrt rechts (an Position 5)Lag die Messung (welche in "Distanz in cm" gespeichert ist) unter 45cm?Wenn ja: Messe weiterhin rechts, bis die Distanz grösser als 40cm wird (sich der Roboter von der seitlichen Wand entfernt hat). Mache in dieser Zeit eine leichte LinkskurveFahre vorwärts, solange keine Messung unter 45cm lagMesse während der Fahrt geradeaus (an Position 50)Lag die Messung geradeaus (welche in "Distanz in cm" gespeichert ist) unter 35cm? wenn ja: StoppeJetzt folgt der selbe Ablauf wie im Programm "Strategie 3": Während dem Stopp wird eine Umgebungsmessung in beide Richtungen gemacht um zu entscheiden, in welche Richtung weitergefahren wirdMesse Distanz links und speichere den MesswertUnter- Unterprogramm UmgebungsmessungMesse Distanz rechts und speichere den MesswertMesse UmgebungServo-PositionLED2200MesswertVergleiche die beiden Messwerte und entscheide, in welche Richtung weitergefahren werden sollUnterporgramm Servo-Positionstelle Servo8Servo PinHIGHServo-Position01006002400Servo PinLOW19Stelle Sensor wieder Geradeaus, bevor du gerade weiterfährstFahre vorwärts, solange keine Messung unter 35cm lagMesse während der Fahrt links (an Position 95)Lag die Messung (welche in "Distanz in cm" gespeichert ist) unter 45cm?Wenn ja: Messe weiterhin links, bis die Distanz grösser als 40cm wird (sich der Roboter von der seitlichen Wand entfernt hat). Mache in dieser Zeit eine leichte RechtskurveUnterprogramme Fahrfunktionen. Die Werte der Pausen beeinflussen die Funktionalität des Roboters erheblich. Experimentiere!Rückwärts 200MOTOR1-100MOTOR2-100200VorwärtsMOTOR170MOTOR270Drehen rechts 100MOTOR150MOTOR2-50200Kurve rechtsMOTOR180MOTOR220Drehen links 100MOTOR1-50MOTOR250200Kurve linksMOTOR120MOTOR280StoppMOTOR10MOTOR20

Servo-PositionServo PinDistanz in cmPixelMesswertZeitstempelPulsdauerMesswert linksMesswert rechtsMOTOR10MOTOR20Pixel1161MODE1Pixel1MULTIPLYPixel810050100Zeitstempel0Level 4Die Grenzwerte Seitenmessung=45cm und Messung geradeaus=20cm beeinflussen die Funktionalität des Roboters erheblich. experimentiere damitUnterprogramm DistanzmessungDieser Roboter reagiert sensibler auf die Messungen an den Seitenpositionen, als auf die Messung geradeaus. Siehe Video.Gemessene Distanz in cm10LED3LOW2LED3HIGH10LED3LOWPulsdauerpulseIn(16, HIGH)Distanz in cmMULTIPLYPulsdauer0.0175Distanz in cm1650LED1Wozu diese Pause? Das wissen die Götter aber ohne geht's nicht ;-)115MODE2134MINUSMesswert301503010060ORLTDistanz in cm45STANDARDSENSOR2LOWORGT40STANDARDSENSOR2LOW50MODE258MINUSMesswert301503010060ORORLTDistanz in cm35STANDARDSENSOR2LOWSTANDARDSENSOR1LOW95Messwert linksDistanz in cm5005Messwert rechtsDistanz in cmLTMesswert rechtsMesswert linksLTMesswert linksMesswert rechts50LED210095MODE214MINUSMesswert301503010060ORLTDistanz in cm45STANDARDSENSOR1LOWORGT40STANDARDSENSOR1LOWMesse während der Fahrt rechts (an Position 5)Die Pixelbefehle visualisieren die Messergebnisse und sind freiwilligLag die Messung (welche in "Distanz in cm" gespeichert ist) unter 45cm?Die klassischen Sensorblöcke sind freiwilligWenn ja: Messe weiterhin rechts, bis die Distanz grösser als 40cm wird (sich der Roboter von der seitlichen Wand entfernt hat). Mache in dieser Zeit eine leichte LinkskurveFahre vorwärts, solange keine Messung unter 45cm lagMesse während der Fahrt geradeaus (an Position 50)Unter- Unterprogramm UmgebungsmessungLag die Messung geradeaus (welche in "Distanz in cm" gespeichert ist) unter 35cm? wenn ja: StoppeMesse UmgebungServo-PositionLED2200MesswertJetzt folgt der selbe Ablauf wie im Programm "Strategie 3": Während dem Stopp wird eine Umgebungsmessung in beide Richtungen gemacht um zu entscheiden, in welche Richtung weitergefahren wirdMesse Distanz links und speichere den MesswertMesse Distanz rechts und speichere den MesswertUnterporgramm Servo-Positionstelle Servo8Servo PinHIGHServo-Position01006002400Servo PinLOW19Vergleiche die beiden Messwerte und entscheide, in welche Richtung weitergefahren werden sollStelle Sensor wieder Geradeaus, bevor du gerade weiterfährstUnterprogramme Fahrfunktionen. Die Werte der Pausen beeinflussen die Funktionalität des Roboters erheblich. Experimentiere!Fahre vorwärts, solange keine Messung unter 20cm lagRückwärts 200MOTOR1-100MOTOR2-100200VorwärtsMOTOR170MOTOR270Messe während der Fahrt links (an Position 95)Drehen rechts 100MOTOR150MOTOR2-50200Lag die Messung (welche in "Distanz in cm" gespeichert ist) unter 45cm?Kurve rechtsMOTOR180MOTOR220Wenn ja: Messe weiterhin links, bis die Distanz grösser als 40cm wird (sich der Roboter von der seitlichen Wand entfernt hat). Mache in dieser Zeit eine leichte RechtskurveFahre vorwärts, solange keine Messung unter 45cm lagDrehen links 100MOTOR1-50MOTOR250200Kurve linksMOTOR120MOTOR280StoppMOTOR10MOTOR20

Mit Klick/Berührung XML-Code kopieren und in PGLU-Editor ↗ einfügen
Links Grundversion, rechts Version wie in Video