Ultraschall
Vorkenntnisse
Ziel:
- Funktionsweise eines Ultraschall Sensors kennenlernen.
- Vorgefertigte Bibliothek nutzen.
- HC-SR04 Ultraschall Sensor auslesen.
Funktionsweise
Der Ultraschallsensor HC-SR04 verwendet Sonar zur Bestimmung der Entfernung zu einem Objekt. Der Sensor funktioniert in einem Bereich von 2cm - 4m, mit einer Genauigkeit von 0,3cm.
- Der Ultraschallsender (Triggerstift) sendet einen hochfrequenten Ton (40 kHz) aus.
- Der Schall wandert durch die Luft. Wenn er auf ein Objekt trifft, wird er zum Modul zurückgeworfen.
- Der Ultraschallempfänger (Echo-Pin) empfängt den reflektierten Schall (Echo).
Unter Berücksichtigung der Geschwindigkeit des Schalls in der Luft und der Laufzeit (Zeit, die seit der Übertragung und dem Empfang des Signals verstrichen ist) können wir die Entfernung zu einem Objekt berechnen. Hier ist die Formel:
Bei 20° ist die Schallgeschwindigkeit in der Luft 343
Verwendung
Ok wir wissen nun wie der Sensor in der Theorie funktioniert, schauen wir uns nun die Praxis an.
Aufbau:
Um das Modul zu verwenden müssen wir es zunächst an den ESP32 anschließen. Im folgenden sehen Sie eine mögliche Verdrahtung.
Sie können den TRIGGER
und ECHO
Pin auch an zwei andere Pins (z.B GPIO 5
und GPIO 18
) anschließen.
Dies müssen Sie dementsprechend später im Programm berücksichtigen.
Hier finden Sie den Aufbau auf ⭐ Wokwi
Programmcode
Ok, verkabelt ist. Nun müssen wir also ein Signal über den TRIGGER
Pin senden und am ECHO
Pin messen wie lange es dauert bis das Signal zurück kommt. Anschließend noch mit der Formel die Zeit in cm umrechnen und schon haben wir unseren Abstand.
Wir könnten uns nun die Mühe machen, das alles selbst zu programmieren, aber zum Glück hat schon jemand anderes sich für uns die Arbeit gemacht. Im folgenden finden Sie eine Bibliothek (python Datei) welche wir in unser Projekt einbinden können.
HC-SR04 Bibliothek (hcrs04.py)
HC-SR04 Bibliothek (hcrs04.py)
import machine, time
from machine import Pin
__version__ = '0.2.0'
__author__ = 'Roberto Sánchez'
__license__ = "Apache License 2.0. https://www.apache.org/licenses/LICENSE-2.0"
class HCSR04:
"""
Driver to use the untrasonic sensor HC-SR04.
The sensor range is between 2cm and 4m.
The timeouts received listening to echo pin are converted to OSError('Out of range')
"""
# echo_timeout_us is based in chip range limit (400cm)
def __init__(self, trigger_pin, echo_pin, echo_timeout_us=500*2*30):
"""
trigger_pin: Output pin to send pulses
echo_pin: Readonly pin to measure the distance. The pin should be protected with 1k resistor
echo_timeout_us: Timeout in microseconds to listen to echo pin.
By default is based in sensor limit range (4m)
"""
self.echo_timeout_us = echo_timeout_us
# Init trigger pin (out)
self.trigger = Pin(trigger_pin, mode=Pin.OUT, pull=None)
self.trigger.value(0)
# Init echo pin (in)
self.echo = Pin(echo_pin, mode=Pin.IN, pull=None)
def _send_pulse_and_wait(self):
"""
Send the pulse to trigger and listen on echo pin.
We use the method `machine.time_pulse_us()` to get the microseconds until the echo is received.
"""
self.trigger.value(0) # Stabilize the sensor
time.sleep_us(5)
self.trigger.value(1)
# Send a 10us pulse.
time.sleep_us(10)
self.trigger.value(0)
try:
pulse_time = machine.time_pulse_us(self.echo, 1, self.echo_timeout_us)
return pulse_time
except OSError as ex:
if ex.args[0] == 110: # 110 = ETIMEDOUT
raise OSError('Out of range')
raise ex
def distance_mm(self):
"""
Get the distance in milimeters without floating point operations.
"""
pulse_time = self._send_pulse_and_wait()
# To calculate the distance we get the pulse_time and divide it by 2
# (the pulse walk the distance twice) and by 29.1 becasue
# the sound speed on air (343.2 m/s), that It's equivalent to
# 0.34320 mm/us that is 1mm each 2.91us
# pulse_time // 2 // 2.91 -> pulse_time // 5.82 -> pulse_time * 100 // 582
mm = pulse_time * 100 // 582
return mm
def distance_cm(self):
"""
Get the distance in centimeters with floating point operations.
It returns a float
"""
pulse_time = self._send_pulse_and_wait()
# To calculate the distance we get the pulse_time and divide it by 2
# (the pulse walk the distance twice) and by 29.1 becasue
# the sound speed on air (343.2 m/s), that It's equivalent to
# 0.034320 cm/us that is 1cm each 29.1us
cms = (pulse_time / 2) / 29.1
return cms
Sie können sich gerne einmal den Quellcode der Bibliothek anschauen und versuchen nachzuvollziehen. Aber das wichtige für uns ist wie man die Bibliothek nutzen kann und nicht sie in allen Einzelheiten zu verstehen.
Bibliothek einbinden
Damit wir die Bibliothek nutzen können müssen wir sie zuerst in unser Projekt einbinden. Gehen Sie dazu wie folgt vor.
- Öffnen Sie Thonny und stecken Sie den ESP32 an.
- Erstellen Sie eine neue Datei und kopieren Sie den kompletten Inhalt der Bibliothek in diese Datei.
- Speichern Sie diese Datei unter dem Namen
hcrs04.py
auf dem Micropython Device.
Danach sollten Sie die neue Datei auf dem Gerät sehen können.
Bibliothek nutzen
Als nächsten Schritt müssen wir die Bibliothek in unsere main.py
einbinden.
from hcsr04 import HCSR04
Anschließend können wir ein Objekt der Klasse HCSR04
erzeugen.
sensor = HCSR04(trigger_pin=26, echo_pin=25, echo_timeout_us=20000)
Das Objekt speichern wir in der Variablen sensor
. Der Konstruktor benötigt 3 Argumente.
Die Pin-Nummer, welche mit dem TRIGGER
verbunden ist. Die Pin-Nummer, welche mit dem ECHO
verbunden ist. Sowie eine Zeit nachdem die Messung abgebrochen wird.
Dann können wir in unserer Endlosschleife die Methode distance_cm()
aufrufen, welche uns die gemessene Distanz in cm zurück liefert.
distance = sensor.distance_cm()
Ein Blick in die Bibliothek verrät uns das es auch eine Methode distance_mm()
gibt, welche die Distanz in mm zurück gibt.
Hier sehen Sie nochmal die komplette main.py
auf einen Blick.
from hcsr04 import HCSR04
from time import sleep
sensor = HCSR04(trigger_pin=26, echo_pin=25, echo_timeout_us=20000)
while True:
distance = sensor.distance_cm()
print('Distance:', distance, 'cm')
sleep(1)
Liefert die Methode distance_cm
einen negativen Wert zurück, ist die Entfernung zum Hinderniss zu groß und der Timeout hat die Messung abgebrochen.
- Ist der maximale gemessene Abstand kleiner als 4m können Sie den Timeout Wert erhöhen.
- Benötigen Sie nur die Info ob ein Abstand kleiner oder größer als ein Schwellwert ist, z.B 22cm, können Sie den Timeout-Wert auch verkleinern um die Messzeit zu reduzieren.
Übungen
- Probieren Sie verschiedene Messungen indem Sie den Abstand mit ihrer Hand verändern.
- Überprüfen Sie mit einem Lineal ob die Messungen (abzüglich Messfehler und Genauigkeit) stimmen.
- Lassen Sie je nach Abstand zum Sensor eine LED leuchten. Bsp: < 8cm LED aus. > 8cm LED an.
- Erweitern Sie ihren Aufbau mit einem zweiten Abstandssensor und lassen Sie zwei LEDs bei einem Schwellwert leuchten oder eben nicht.
Bildquelle: random nerd tutorials