Raspberry Pi Pico: Abstandsmessung mit Temperaturkompensation für Ultraschallsensor HC-SR04

Ein Ultraschallsensor ist ein Abstands- und Entfernungsmesser auf Basis von Ultraschall. Ultraschallsensoren sind oft in den Stoßstangen von Autos eingebaut, um die nahende Gefahr eines Zusammenstoßes mit anderen Fahrzeugen oder Objekten per Piepton anzuzeigen.

Die Abstandsmessung erfolgt durch Messen der Signallaufzeit von Ultraschallsignalen und der anschließenden Umrechnung über die Schallgeschwindigkeit.
Leider ist die Schallgeschwindigkeit temperaturabhängig. Wenn man die Zeit mit einer festen Schallgeschwindigkeit umrechnet, dann gilt der errechnete Abstand nur bei einer bestimmten Temperatur. Wenn die tatsächliche Temperatur von dieser Temperatur abweicht, dann stimmt der berechnete Abstand nicht. Ob die Abweichung in einem konkreten Anwendungsfall ein Problem darstellt, hängt davon ab, wie viel die aktuelle Temperatur von beispielsweise 20°C abweicht und ob die Abweichung akzeptabel ist.

Im folgenden Programmcode führen wir eine Temperaturkompensation durch. Das heißt, wir ermitteln die aktuelle Temperatur mit Hilfe des Temperatursensors im Raspberry Pi Pico und berechnen dann zuerst die Schallgeschwindigkeit für diese Temperatur. Und erst dann berechnen wir den Abstand.

In der Wikipedia steht, dass die Schallgeschwindigkeit mit etwa 0,6 m/s pro Grad Celsius zunimmt. Für die meisten Fälle können wir bei 20°C eine Geschwindigkeit von 343 m/s verwenden. Aber wenn es genauer sein soll, dann sollte man die Schallgeschwindigkeit mit der folgenden Formel berechnen:

Formel zur Berechnung der Schallgeschwindigkeit

V = Schallgeschwindigkeit (m/s)
T = Lufttemperatur (°C)

Aufbau und Bauteile

Raspberry Pi Pico: Abstandsmessung mit Ultraschallsensor (HC-SR04)

Raspberry Pi Pico HC-SR04
Pin 36 3V3 OUT VCC
Pin 38 GND GND
Pin 22 GPIO 17 Echo
Pin 21 GPIO 16 Trigger

Es gibt sehr viele unterschiedliche HC-SR04-Typen mit ähnlichen Typenbezeichnungen, aber unterschiedlichen elektrischen Parametern.
Normalerweise wird man einen Sensor vom Typ HC-SR04 verwenden. Der ist in der Regel nur TTL-kompatibel und somit nur an Arduinos ohne zusätzliche Schaltungsmaßnahmen einsetzbar.
Für den Einsatz mit Raspberry Pi und Raspberry Pi Pico, die mit +3,3-Volt-Signalen arbeiten, eignet sich der Sensor vom Typ HC-SR04P (mit P) besser. Es gibt aber auch einen HC-SR04-Typ, der wahlweise für 3,3 Volt und 5 Volt geeignet ist.

Schnell und einfach alle Bauteile zusammen bestellen

Programmcode

Im Programmcode wird ein GPIO-Ausgang für das Trigger-Signal zum Sensor und ein GPIO-Eingang für das Echo-Signal vom Sensor initialisiert. Anschließend wird in einer Endlos-Schleife die Signallaufzeit gemessen. Innerhalb der Schleife wird aus der Startzeit und Endzeit die Differenz berechnet und mit der Schallgeschwindigkeit multipliziert. Am Ende der Schleife wird der Abstand ausgegeben.

# Bibliotheken laden
from machine import Pin, ADC
from time import sleep, sleep_us, ticks_us

# Initialisierung GPIO-Ausgang für Trigger-Signal
trigger = Pin(16, Pin.OUT)

# Initialisierung GPIO-Eingang für Echo-Signal
echo = Pin(17, Pin.IN)

# Initialisierung des ADC4 (Temperatursensor)
sensor_temp = ADC(4)
conversion_factor = 3.3 / (65535)

# Wiederholung (Endlos-Schleife)
while True:
    # Spannung messen und in Temperatur umrechnen
    read = sensor_temp.read_u16()
    spannung = read * conversion_factor
    temperatur = 27 - (spannung - 0.706) / 0.001721
    # Abstand messen
    trigger.low()
    sleep_us(2)
    trigger.high()
    sleep_us(5)
    trigger.low()
    # Zeitmessungen
    while echo.value() == 0:
       signaloff = ticks_us()
    while echo.value() == 1:         
       signalon = ticks_us()
    # Vergangene Zeit ermitteln
    timepassed = signalon - signaloff
    # Abstand/Entfernung ermitteln
    # Entfernung über die Schallgeschwindigkeit (34320 cm/s bei 20 °C) berechnen
    # Durch 2 teilen, wegen Hin- und Rückweg
    abstand = timepassed * 0.03432 / 2
    # Abstand/Entfernung mit Temperatur-Korrektur
    abstand_korr = timepassed * (331.3 + 0.606 * temperatur) / 10000 / 2
    # Ergebnis ausgeben
    print('  Temp.:', str("%.1f" % temperatur), '°C')
    print('    Off:', signaloff)
    print('     On:', signalon)
    print('   Zeit:', timepassed)
    print('Abstand:', str("%.2f" % abstand), 'cm')
    print('  Korr.:', str("%.2f" % abstand_korr), 'cm')
    print()
    # 3 Sekunde warten
    sleep(3)

Der Programmcode berechnet und gibt den Abstand auch ohne Temperaturkompensation aus. Damit kannst Du die Abweichung ermitteln und prüfen, ob eine Temperaturkompensation für Deine Anwendung notwendig ist.

Über Sinn und Unsinn einer Temperaturkompensation

Grundsätzlich ist eine Temperaturkompensation sinnvoll, wenn man nicht von stabilen Temperaturen ausgehen kann. Vor allem außerhalb von geschlossenen Räumen können Temperaturen erheblich voneinander abweichen. Entsprechend ungenau sind dann auch die Ergebnisse.
Ein Aspekt, bei der Temperaturmessung, muss noch zwingend berücksichtigt werden. Das ist der Ort der Temperaturmessung. In diesem Aufbau ist der Ort grober Unfug. Warum? Weil der integrierte Temperaturfühler die Temperatur des Picos ermittelt. Das ist natürlich Quatsch. Wir brauchen die Temperatur, die innerhalb der Übertragungsstrecke des Schalls herrscht. Dafür brauchen wir einen externen Temperaturfühler. Das Problem dabei ist, dass innerhalb der Übertragungsstrecke kein Temperaturfühler sein darf, weil sonst der Abstand zum Temperaturfühler gemessen wird. Er muss also außerhalb der Übertragungsstrecke des Schalls platziert werden. Die Temperaturmessung wäre dann aber nicht ganz korrekt, weil der Temperaturfühler irgendeine Umgebungstemperatur ermittelt. Eine Temperaturkompensation, egal wie, kann also nur eine grobe Annäherung sein.

Darf es ein bisschen mehr sein?

Damit die Abstandsmessung auch ohne Text-Ausgabe auf einem Host-Computer autark erfolgen kann, verwenden wir ein Ultraschallsensor-Modul, um den Abstand vor dem Sensor zu messen auf auf einem LCD-1602-Display anzuzeigen.

Weitere verwandte Themen:

Frag Elektronik-Kompendium.de

Hardware-nahes Programmieren mit dem Raspberry Pi Pico und MicroPython

Elektronik-Set Pico Edition

Das Elektronik-Set Pico Edition ist ein Bauteile-Sortiment mit Anleitung zum Experimentieren und Programmieren mit MicroPython.

  • LED: Einschalten, ausschalten, blinken und Helligkeit steuern
  • Taster: Entprellen und Zustände anzeigen
  • LED mit Taster einschalten und ausschalten
  • Ampel- und Lauflicht-Steuerung
  • Elektronischer Würfel
  • Eigene Steuerungen programmieren

Elektronik-Set jetzt bestellen Online-Workshop buchen

Online-Workshop: Programmieren mit dem Raspberry Pi Pico

Programmieren mit dem Raspberry Pi Pico

Gemeinsam mit anderen und unter Anleitung experimentieren? Wir bieten unterschiedliche Online-Workshops zum Raspberry Pi Pico und MicroPython an. Einführung in die Programmierung, Sensoren programmieren und kalibrieren, sowie Internet of Things und Smart Home über WLAN und MQTT.

Online-Workshop buchen

Besuchen Sie unser fast monatlich stattfindendes Online-Meeting PicoTalk und lernen Sie uns kennen. Die Teilnahme ist kostenfrei.

Termine und Newsletter-Anmeldung

 

Elektronik-Sets für das Hardware-nahe Programmieren