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
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:

  1. Pin als Ausgang konfigurieren
  2. t1: Pin 7 (SIG) einschalten
  3. 10 Mikrosekunden verzögern
  4. 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:

  1. Pin als Eingang konfigurieren
  2. t3: Zustand an Pin 7 (SIG) wird vom Ultraschallsensor auf HIGH gesetzt. Der Antwort-Puls beginnt.
  3. Umso weiter das Objekt entfernt ist, umso länger ist die Verzögerung (also die Breite des Pulses, die Pulsweite).
  4. 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
  1. erst als Ausgang konfiguriert,
  2. ausschaltet
  3. kurz wartet (um sicherzustellen, dass der Pin auch wirklich aus ist)
  4. einschaltet (Trigger Puls Start)
  5. kurz wartet
  6. ausschaltet (Trigger Puls Ende)
  7. als Eingang konfiguriert (ab jetzt könnte gemessen werden - machen wir aber noch nicht)
  8. mindestens 50 Millisekunden wartet (In der Zeit passiert der Echo-Puls)
Für das ganz kurze Warten kannst du delay(1) verwenden. Das verzögert 1 Millisekunde und ist viel länger als wir eigentlich brauchen (100 mal länger als die benötigten 10 Mikrosekunden).

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

Beliebte Posts aus diesem Blog

Tinkercad Übung 6 - LED mit Taster ansteuern

Tinkercad Übung 11 - LED dimmen