Tinkercad Übung 15 - Ultraschallsensor auslesen
Datenblatt eines Sensors verstehen
In dieser Übung liest du einen Ultraschallsensor mit dem Trigger-Echo-Prinzip aus.
- Empfohlenes Vorwissen: Bedienung Tinkercad Circuits, Oszilloskop, pinMode()
- Neue Inhalte: Datenblatt lesen, Trigger-Echo-Prinzip, pulseIn(), delayMicroseconds()
Schritt 1 - Demo-Entwurf öffnen und inspizieren
Baue die folgende Schaltung auf oder kopiere den Demo-Entwurf. Der Sensor heißt "Ultraschall-Abstandssensor" (der mit den 3 Pins).
https://www.tinkercad.com/things/0dYqWUsN2QK-kkg-robotik-ubung-15-starter
In der Schaltung ist ein preiswerter Ultraschallsensor an einen Arduino angeschlossen. Dieser würde in der Realität so aussehen:
Dieser Sensor nutzt Ultraschall, um den Abstand zu Objekten zu messen. Ultraschall ist ein Ton-Bereich, der für unsere menschlichen Ohren nicht mehr wahrnehmbar ist. Hunde könnten das Gepiepse des Sensor aber vermutlich noch wahrnehmen. Der Sensor sendet einen Schall-Puls in den Raum und misst die Zeit, die es braucht, bis der Schall von einem Objekt wieder zurück reflektiert wird (bis das Echo ankommt). Diese Zeit kann in einen Abstand umgerechnet werden, da die Geschwindigkeit von Schall in Luft auf der Erde bei Normaldruck bekannt ist.
Der Sensor heißt SEN136B5B. Suchst du diese Nummer im Internet, kommst du auf Seiten, die den Sensor verkaufen.
Um herauszufinden, wie man den Sensor an den Arduino anschließt und richtig ausliest, empfiehlt es sich das Datenblatt des Sensors zu konsultieren. Zu jedem elektronischen Bauteil existiert in der Regel ein Datenblatt, dass dessen Eigenschaften beschreibt und in der Regel braucht es der Hardware-Entwickler, um das Bauteil auf korrekte Art in eine Schaltung einzubauen und bei Sensoren ist es auch für den Software-Entwickler interessant, da meist daraus hervorgeht, wie man den Sensor auszulesen hat.
https://www.robotshop.com/media/files/PDF/datasheet-sen136b5b.pdf
Sollte der Link nicht mehr funktionieren, habe ich das Datenblatt noch mal hier:
https://www.dropbox.com/s/ls8hgul4uzqzyja/datasheet-sen136b5b.pdf?dl=0
Öffne das Datenblatt. Leider ist es auf englisch.
Es gibt auch ein offizielles Arduino Tutorial zum Thema (leider auch auf englisch):
https://www.arduino.cc/en/tutorial/ping
Suche folgende Informationen im Datenblatt:
Trigger senden:
Der Sensor misst leider nicht von alleine. Man muss ihn also anweisen, eine Abstandsmessung durchzuführen. Das macht man, indem man auf SIG einen kurzen Trigger-Puls von 10 Mikrosekunden (µs) drauf gibt:
Der Trigger veranlasst den Sensor, einen Ultraschall-Puls in den Raum zu tönen und auf das Echo zu warten. Das dauert ein bisschen. So lang muss das Arduino Programm warten.
Echo auswerten:
Klicke auf den Ultraschallsensor. Seine Keule wird angezeigt. Bewege die kreisförmige Markierung (das simulierte "Objekt"). Beobachte den Echo-Puls im Oszilloskop.
Tipp: Du kannst im Oszilloskop die zeitliche Auflösung verändern (gewissermaßen "zoomen"), indem du das Oszilloskop markierst und in den Einstellungen (blaues Fenster) "Zeit pro Abschnitt" veränderst.
Um kürzer als eine Millisekunde zu verzögern, gibt es einen speziellen Arduino-Befehl:
delayMicroseconds(mikrosekunden); // mikrosekunden verzögern
Benutze delayMicroseconds() anstatt delay() für die ganz kurzen Verzögerungen. Das kann z.B so aussehen:
// 1. Trigger:
pinMode(PIN_ULTRASCHALL, OUTPUT);
digitalWrite(PIN_ULTRASCHALL, LOW);
delayMicroseconds(2);
digitalWrite(PIN_ULTRASCHALL, HIGH);
delayMicroseconds(10);
digitalWrite(PIN_ULTRASCHALL, LOW);
// 2. Auf Echo warten und messen
pinMode(PIN_ULTRASCHALL, INPUT);
delay(50);
Starte die Simulation und teste, ob noch alles genauso funktioniert.
Bisher haben wir den Echo-Puls nur abgewartet (delay(50)) und nicht gemessen. Um diesen zu messen, müssten wir eine kleine Stoppuhr programmieren. Das sparen wir uns jetzt allerdings, denn es gibt einen fertigen Arduino-Befehl zur Pulsweiten-Messung:
long pulseIn(pin, zustand);
Diese Funktion wartet darauf, dass das Signal an Pin pin zu zustand (HIGH oder LOW) wechselt und misst dann die Zeit in Mikrosekunden, die es dauert, bis das Signal in seinen Startzustand zurückkehrt.
Ersetze die Zeile delay(50); durch
long echo_pulsweite_mikrosekunden = pulseIn(PIN_ULTRASCHALL, HIGH);
Wir haben pulseIn() mit HIGH parametriert. Die Funktion wartet also auf HIGH, misst wie lang es dauert, bis das Signal wieder aus LOW zurückgeht und gibt uns diese Dauer in Mikrosekunden zurück.
Schaue dir die Dokumentation dazu in der Arduio-Referenz an:
https://www.arduino.cc/reference/de/language/functions/advanced-io/pulsein/
Gebe die Pulsweite im Serial Monitor aus. Starte die Simulation, öffne den Serial Monitor und verändere den Abstand zum Test-Objekt.
Lösungsvorschlag: https://www.tinkercad.com/things/3xECyzw2PbQ-kkg-robotik-ubung-15-trigger-und-echo
Abstand in cm = Pulsweite in Mikrosekunden / 52
Rechne die Pulsweite in Zentimeter um und gebe den umgerechneten Abstand im Serial Monitor aus.
Starte die Simulation, öffne den Serial Monitor und verändere den Abstand zum Test-Objekt.
Vergleiche mit dem angezeigten Abstand direkt am Ultraschallsensor selbst.
Lösungsvorschlag: https://www.tinkercad.com/things/fhfIQtbLM6O-kkg-robotik-ubung-15-pulsein
Du weißt jetzt alles, um Projekt 3 "Theremin" auszuprobieren.
Weiter zu Übung 16
https://www.tinkercad.com/things/0dYqWUsN2QK-kkg-robotik-ubung-15-starter
![]() |
Abbildung 1 - Ultraschallsensor und Oszilloskop |
In der Schaltung ist ein preiswerter Ultraschallsensor an einen Arduino angeschlossen. Dieser würde in der Realität so aussehen:
![]() |
Abbildung 2 - realer SEB136B5B Ultraschall Abstandssensor |
Dieser Sensor nutzt Ultraschall, um den Abstand zu Objekten zu messen. Ultraschall ist ein Ton-Bereich, der für unsere menschlichen Ohren nicht mehr wahrnehmbar ist. Hunde könnten das Gepiepse des Sensor aber vermutlich noch wahrnehmen. Der Sensor sendet einen Schall-Puls in den Raum und misst die Zeit, die es braucht, bis der Schall von einem Objekt wieder zurück reflektiert wird (bis das Echo ankommt). Diese Zeit kann in einen Abstand umgerechnet werden, da die Geschwindigkeit von Schall in Luft auf der Erde bei Normaldruck bekannt ist.
Der Sensor heißt SEN136B5B. Suchst du diese Nummer im Internet, kommst du auf Seiten, die den Sensor verkaufen.
Um herauszufinden, wie man den Sensor an den Arduino anschließt und richtig ausliest, empfiehlt es sich das Datenblatt des Sensors zu konsultieren. Zu jedem elektronischen Bauteil existiert in der Regel ein Datenblatt, dass dessen Eigenschaften beschreibt und in der Regel braucht es der Hardware-Entwickler, um das Bauteil auf korrekte Art in eine Schaltung einzubauen und bei Sensoren ist es auch für den Software-Entwickler interessant, da meist daraus hervorgeht, wie man den Sensor auszulesen hat.
Schritt 2 - Datenblatt untersuchen
In der Regel ist das Datenblatt auf dem Onlineshop direkt verlinkt. Ich habe mal bei robotshop.com geschaut und dieses hier gefunden:https://www.robotshop.com/media/files/PDF/datasheet-sen136b5b.pdf
Sollte der Link nicht mehr funktionieren, habe ich das Datenblatt noch mal hier:
https://www.dropbox.com/s/ls8hgul4uzqzyja/datasheet-sen136b5b.pdf?dl=0
Öffne das Datenblatt. Leider ist es auf englisch.
Es gibt auch ein offizielles Arduino Tutorial zum Thema (leider auch auf englisch):
https://www.arduino.cc/en/tutorial/ping
Suche folgende Informationen im Datenblatt:
- Größe (Dimensionen) des Sensors in Millimeter (mm) und wo die Löcher gebohrt sind (falls man den Sensor irgendwo festschrauben will).
- Wie viel Spannung der Sensor verträgt.
- Minimaler und maximaler Abstand, den der Sensor messen kann.
Das Datenblatt enthält auch eine schöne Grafik dazu wie breit seine "Keule" ist. Das ist der Bereich, in dem der Sensor messen kann: Der Sensor ist also am empfindlichsten und damit genauesten, wenn ein Object direkt vor ihm positioniert ist. Ist das Objekt schon 30° weiter links oder rechts, wird die Erkennung recht ungenau und darüber hinaus kann der Sensor gar nichts mehr detektieren. Das ist aber auch so gewollt. Der Sensor soll in eine bestimmt Richtung "schauen".
Abbildung 3 - Ausschnitt aus dem Datenblatt |
Schritt 3 - Sensor an Arduino anschließen
Leider bietet das Datenblatt keine Informationen darüber, wie der Sensor anzuschließen ist. Kein gutes Beispiel. Aber damit muss man klar kommen. Schaust du dir den Sensor aber in der Schaltung im Demo-Entwurf (Abbildung 1) genau an, siehst du, dass die Pins beschriftet sind:
- 5V
- GND
- SIG
5V und GND sind eindeutig. Das ist die Spannungsversorgung. Der Arduino muss den Sensor also mit 5V Spannung versorgen, damit er funktioniert.
Zu SIG gibt es erstmal keine weiteres Informationen. Wir können den also vermutlich an jedem beliebigen Arduino-Pin anschließen.
Schritt 4 - Sensor auslesen
Abgesehen von der Spannungsversorgung bleibt nur ein Pin, den wir zur Kommunikation mit dem Sensor verwenden können:
- SIG
Die 2. Seite im Datenblatt zeigt, was mit dem SIG-Signal zu machen ist:
Abbildung 4 - Trigger und Echo Signal |
Trigger senden:
Der Sensor misst leider nicht von alleine. Man muss ihn also anweisen, eine Abstandsmessung durchzuführen. Das macht man, indem man auf SIG einen kurzen Trigger-Puls von 10 Mikrosekunden (µs) drauf gibt:
- Pin als Ausgang konfigurieren
- t1: Pin 7 (SIG) einschalten
- 10 Mikrosekunden verzögern
- t2: Pin 7 (SIG) wieder ausschalten
Der Trigger veranlasst den Sensor, einen Ultraschall-Puls in den Raum zu tönen und auf das Echo zu warten. Das dauert ein bisschen. So lang muss das Arduino Programm warten.
Echo auswerten:
- Pin als Eingang konfigurieren
- t3: Zustand an Pin 7 (SIG) wird vom Ultraschallsensor auf HIGH gesetzt. Der Antwort-Puls beginnt.
- Umso weiter das Objekt entfernt ist, umso länger ist die Verzögerung (also die Breite des Pulses, die Pulsweite).
- t4: Zustand an Pin 7 (SIG) wird vom Ultraschallsensor wieder zurück auf LOW gesetzt. Der Antwort-Puls ist beendet. Jetzt darf der Arduino wieder einen Trigger-Puls senden.
Die Zeit zwischen Beginn und Ende des Antwort Pulses (die Pulsweite) muss das Arduino-Programm messen.
Die Pulsweite ist proportional/linear zum gemessenen Abstand. Die Formel steht im Datenblatt:
Abstand in cm = Pulsweite in Mikrosekunden / 52
Schreibe ein Programm, dass in loop() den SIG-Pin
- erst als Ausgang konfiguriert,
- ausschaltet
- kurz wartet (um sicherzustellen, dass der Pin auch wirklich aus ist)
- einschaltet (Trigger Puls Start)
- kurz wartet
- ausschaltet (Trigger Puls Ende)
- als Eingang konfiguriert (ab jetzt könnte gemessen werden - machen wir aber noch nicht)
- mindestens 50 Millisekunden wartet (In der Zeit passiert der Echo-Puls)
Starte die Simulation und schaue dir das Signal im Oszilloskop an. Erkennst du die 2 Pulse?
Klicke auf den Ultraschallsensor. Seine Keule wird angezeigt. Bewege die kreisförmige Markierung (das simulierte "Objekt"). Beobachte den Echo-Puls im Oszilloskop.
Tipp: Du kannst im Oszilloskop die zeitliche Auflösung verändern (gewissermaßen "zoomen"), indem du das Oszilloskop markierst und in den Einstellungen (blaues Fenster) "Zeit pro Abschnitt" veränderst.
![]() |
Abbildung 5 - Trigger und Echo Puls |
Um kürzer als eine Millisekunde zu verzögern, gibt es einen speziellen Arduino-Befehl:
delayMicroseconds(mikrosekunden); // mikrosekunden verzögern
Benutze delayMicroseconds() anstatt delay() für die ganz kurzen Verzögerungen. Das kann z.B so aussehen:
// 1. Trigger:
pinMode(PIN_ULTRASCHALL, OUTPUT);
digitalWrite(PIN_ULTRASCHALL, LOW);
delayMicroseconds(2);
digitalWrite(PIN_ULTRASCHALL, HIGH);
delayMicroseconds(10);
digitalWrite(PIN_ULTRASCHALL, LOW);
// 2. Auf Echo warten und messen
pinMode(PIN_ULTRASCHALL, INPUT);
delay(50);
Starte die Simulation und teste, ob noch alles genauso funktioniert.
Bisher haben wir den Echo-Puls nur abgewartet (delay(50)) und nicht gemessen. Um diesen zu messen, müssten wir eine kleine Stoppuhr programmieren. Das sparen wir uns jetzt allerdings, denn es gibt einen fertigen Arduino-Befehl zur Pulsweiten-Messung:
long pulseIn(pin, zustand);
Diese Funktion wartet darauf, dass das Signal an Pin pin zu zustand (HIGH oder LOW) wechselt und misst dann die Zeit in Mikrosekunden, die es dauert, bis das Signal in seinen Startzustand zurückkehrt.
Ersetze die Zeile delay(50); durch
long echo_pulsweite_mikrosekunden = pulseIn(PIN_ULTRASCHALL, HIGH);
Wir haben pulseIn() mit HIGH parametriert. Die Funktion wartet also auf HIGH, misst wie lang es dauert, bis das Signal wieder aus LOW zurückgeht und gibt uns diese Dauer in Mikrosekunden zurück.
Schaue dir die Dokumentation dazu in der Arduio-Referenz an:
https://www.arduino.cc/reference/de/language/functions/advanced-io/pulsein/
Gebe die Pulsweite im Serial Monitor aus. Starte die Simulation, öffne den Serial Monitor und verändere den Abstand zum Test-Objekt.
Lösungsvorschlag: https://www.tinkercad.com/things/3xECyzw2PbQ-kkg-robotik-ubung-15-trigger-und-echo
Schritt 5 - In Zentimeter umrechnen
Die Formel kannst du dem Datenblatt entnehmen:Abstand in cm = Pulsweite in Mikrosekunden / 52
Rechne die Pulsweite in Zentimeter um und gebe den umgerechneten Abstand im Serial Monitor aus.
Starte die Simulation, öffne den Serial Monitor und verändere den Abstand zum Test-Objekt.
Vergleiche mit dem angezeigten Abstand direkt am Ultraschallsensor selbst.
Lösungsvorschlag: https://www.tinkercad.com/things/fhfIQtbLM6O-kkg-robotik-ubung-15-pulsein
Zusammenfassung
Du kannst nun einen preiswerten Ultraschall-Abstandssensor auslesen (die preiswerten arbeiten alle mit dem Trigger-Echo-Prinzip) und hast mal ein Datenblatt näher angeschaut. Wenn man es genau nimmt, hast du einen Hardware-Treiber gebaut (also ein Stück Software, dass mit einem Stück Hardware interagiert). Du hast gelernt wie man Pulsweiten messen kann. Du weißt jetzt, dass man einen Arduino-Pin als Ein- und Ausgang verwenden, also außerhalb von setup() umkonfigurieren kann.Du weißt jetzt alles, um Projekt 3 "Theremin" auszuprobieren.
Weiter zu Übung 16
Kommentare
Kommentar veröffentlichen