abstand-messen
Bauteil: HC-SR04 Ultraschall-Abstandssensor · Kategorie: input
Den Abstand zu einem Hindernis messen und als Balken auf der LED-Matrix zeigen (naeher = mehr LEDs). Der genaue Wert in cm geht zusaetzlich ueber die serielle Konsole raus. Erstes Sample - die Verkabelung gilt fuer alle HC-SR04-Samples.
Material
| Anzahl | Bauteil |
|---|---|
| 1 | micro:bit V2.2 |
| 1 | HC-SR04 Ultraschall-Abstandssensor |
| 4 | Jumperkabel |
Masse fuers CAD: ../../../../hardware/input/hc-sr04-abstandssensor/
Verkabelung
micro:bit HC-SR04
+---------+ +---------+
| P1 |--------| Trig |
| P2 |--------| Echo |
| 3V |--------| Vcc |
| GND |--------| Gnd |
+---------+ +---------+
Betrieb an 3V (statt 5V) - reduziert die Reichweite auf ca. 20-150 cm,
macht Echo dafuer ungefaehrlich fuer den micro:bit-Pin. Fuer mehr Reichweite
(5V + Spannungsteiler): Bauteil-README.
Foto der Verkabelung
Nach dem Test ein Foto in wiring/ ablegen und hier einbinden:
Wie der Code funktioniert
abstand_cm()schickt einen 1-ms-Trigger-Impuls und misst dann mitmachine.time_pulse_us(ECHO, 1, 30000)die Dauer des Echo-Pulses in Mikrosekunden.dauer_us / 58.0ergibt den Abstand in cm. Details: Bauteil-README.- Ein negativer Wert (Timeout) heisst “kein Echo” ->
None. balken(n)zuendetnvon 25 LEDs zeilenweise.nwird linear zwischenNAH_CM(Balken voll) undFERN_CM(Balken leer) berechnet.
Programm
Ganzer Code, Quelle main.py (hier automatisch eingefuegt):
# Sample: abstand-messen (HC-SR04 Ultraschall-Abstandssensor)
# Board: BBC micro:bit V2.2
# Sprache: MicroPython
#
# Ziel: Den Abstand zu einem Hindernis messen und als Balken auf der
# LED-Matrix zeigen (naeher = mehr LEDs). Der Wert in cm geht
# zusaetzlich ueber die serielle Konsole raus (Open Serial).
#
# --------------------------------------------------------------------------
# Verkabelung (Betrieb an 3V - einfach und sicher, siehe Bauteil-README)
# --------------------------------------------------------------------------
# Sensor Trig -> P1
# Sensor Echo -> P2
# Sensor Vcc -> 3V (statt der spezifizierten 5 V - reduziert die
# Reichweite, macht Echo aber ungefaehrlich fuer den Pin)
# Sensor Gnd -> GND
#
# Fuer mehr Reichweite (5V + Spannungsteiler an Echo): siehe Bauteil-README.
# --------------------------------------------------------------------------
import machine
from microbit import *
TRIG = pin1
ECHO = pin2
NAH_CM = 5 # ab hier: Balken komplett voll
FERN_CM = 40 # ab hier: Balken leer
def abstand_cm():
TRIG.write_digital(0)
sleep(2)
TRIG.write_digital(1)
sleep(1) # 1 ms Triggerimpuls (mehr als die geforderten 10 us)
TRIG.write_digital(0)
dauer_us = machine.time_pulse_us(ECHO, 1, 30000) # auf HIGH-Puls warten, Timeout 30 ms
if dauer_us < 0:
return None # kein Echo: zu nah, zu weit, oder nichts im Weg
return dauer_us / 58.0 # Schallgeschwindigkeit -> cm
def balken(n):
# n LEDs anzeigen (0..25), zeilenweise von oben
n = max(0, min(25, n))
display.clear()
for i in range(n):
display.set_pixel(i % 5, i // 5, 9)
while True:
cm = abstand_cm()
if cm is None:
display.show(Image.NO)
print("kein Echo")
else:
n = int(25 * (FERN_CM - cm) / (FERN_CM - NAH_CM))
balken(n)
print("Abstand:", round(cm, 1), "cm")
sleep(100) # >= 60 ms Pause zwischen Messungen (Datenblatt-Empfehlung)
Auf den micro:bit uebertragen
https://python.microbit.org/v/3 -> Code einfuegen -> Connect -> Send to micro:bit. Details: ../../../../docs/setup.md.
Erwartetes Verhalten
- Hand naeher an den Sensor halten (senkrecht, flache Flaeche) -> mehr LEDs leuchten
- Hand weiter weg -> weniger LEDs, ab
FERN_CMnichts mehr - Kein Hindernis im Bereich -> X-Symbol, “kein Echo” auf der seriellen Konsole
- Open Serial zeigt den genauen cm-Wert
Moegliche Erweiterungen
NAH_CM/FERN_CMan das eigene Projekt anpassen- Balken durch eine Zahl ersetzen (
display.scroll(int(cm))) - mehrere Messungen mitteln, um Ausreisser zu glaetten