
Die wichtigsten Bestandteile des Ultraschallsensors sind der “Transducer” (T) und der “Receiver” (R). Der Transducer ist praktisch ein Lautsprecher, der für uns nicht hörbare Schallwellen (Ultraschallwellen) aussendet. Der Receiver entspricht einem Mikrofon für Schallwellen. Die Schallwellen werden also vom Transducer ausgesendet, an einem Hindernis reflektiert und vom Receiver empfangen.

Ultraschallsensoren gibt es in verschiedenen Varianten und mit verschiedenen Verbindungsmöglichkeiten.

Das schwarze Kabel verbindet die beiden GND-Anschlüsse (Minus-Pol), das rote Kabel verbindet die beiden VCC-Anschlüsse (Plus-Pol, Spannung 3,3V). Das weiße Kabel verbindet den TX-Pin am Calliope mit dem NC-Pin am Ultraschallsensor. Über dieses Kabel kann der Calliope ein Signal an den Ultraschallsensor senden (daher TX - transmit) und darüber die Messung starten. Das gelbe Kabel verbindet den RX-Pin am Calliope mit dem SIG-Pin am Ultraschallsensor. Über dieses Kabel kann der Ultraschallsensor ein Signal an den Calliope senden, das dieser dann lesen kann (daher RX - receive).

Zum Programmieren mit Makecode muss die Erweiterung "Grove" geladen werden. Darüber können mehrere Sensoren, die alle über einen Grove-Anschluss verfügen, angesteuert bzw. ausgelesen werden. Für den Ultraschallsensor wird der Block Entfernung <pin> cm benötigt, der die Entfernung in Zentimetern zurückgibt, die mit dem Ultraschallsensor gemessen wurde. Als Pin muss C16 (A1 RX) ausgewählt werden, da dies der Echo-Pin ist, der das Signal zurückgibt.


Zunächst muss der Ultraschallsensor in der Roboterkonfiguration angelegt werden. Dort steht nur der Anschluss über A1 zur Verfügung, an dem der Ultraschallsensor auch angeschlossen sein sollte (A0 funktioniert nicht). Danach kann der gemessene Abstand über den Block gib Abstand cm Ultraschallsensor U ausgelesen werden.


Zunächst muss das Modul "Ultraschallsensor" hinzugefügt werden. Gehe dazu links unten auf "Projekt" -> "Module hinzufügen" und wähle das Modul "Ultraschallsensor" aus. DIeses stellt die beiden Funktionen measure_in_cm( pin ) und measure_in_inch( pin ) bereit, wobei als pin der ECHO-Pin des Ultraschallsensors angegeben werden muss. Bei der Grove-Verbindung ist das A1_RX.
# Imports go at the top
from calliopemini import *
import Ultraschallsensor # Import des Moduls für den Ultraschallsensor
# Code in a 'while True:' loop repeats forever
while True:
entfernung = Ultraschallsensor.measure_in_cm(pin_A1_RX) # Pin beim Grove-Anschluss
display.scroll(entfernung)
display.clear()
sleep(500)
Über den Jacdac-Anschluss können auf einfache Weise Sensoren und Aktoren an den Calliope angeschlossen und angesteuert werden. Es können mehrere Jacdac-Bauteile hintereinander angeschlossen werden. Über den Jacdac-Hub können sie auch parallel angeschlossen werden. Jacdac ermöglicht nicht nur die Kommunikation von Sensor und Calliope, sondern auch per WebUSB mit Makecode. Auf diese Weise wird der aktuelle Sensorwert direkt in Makecode angezeigt.
Der Anschluss und die Programmierung ist auf der Jacdac-Seite von calliope.cc schön gezeigt.

Das Vorgehen für das Laden der Jacdac-Erweiterung und erste Programmierschritte zeigt die Jacdac-Dokumentation der offiziellen Calliope-Seite sehr gut. Im Überblick:
Der Block <messwert> Entfernung (m) stellt vier mögliche Messwerte in Metern bereit, nämlich entfernung1, entfernung2, distance3 und distance4. Welcher davon einen geeigneten Wert liefert, lässt sich durch ausprobieren herausfinden.


Achtung: Der HC-SR04 funktioniert nur mit dem Calliope, wenn er sich mit 3,3V betreiben lässt! Die meisten Ultraschallsensoren, die man findet, funktionieren allerdings nur mit 5V, daher muss man genau hinschauen.
Der Ultraschallsensor HC-SR04 ist für wenig Geld zu haben und daher sehr beliebt. Die Verkabelung erfolgt hier einzeln mit sogenannten Jumper-Kabeln. Sie ist dem folgenden Schaltplan zu entnehmen.

Grundsätzlich sind die folgenden Pins sowohl für den Trigger-Pin als auch für den Echo-Pin geeignet: P0, P1, P2, P3, C8, C9, C13, C14, C15, C16, C17. Beachte, dass die Pins P0, P1, P2, P3 über die äußeren Ringpads (goldene Ringe) schon belegt sein können. Für weitere Informationen schaue dir die Pin-Belegung des Calliope an.
Zur Bestimmung des Abstands muss man auf das Funktionsprinzip des Ultraschallsensors zurückgreifen, das oben beschrieben wurde. Mit dem folgenden Programm wird die Entfernung ermittelt und auf dem Display des Calliope ausgegeben.

Impuls in Mikrosekunden an Pin C8 mit hoch wird die Zeit in Mikrosekunden ermittelt, die das Ultraschallsignal braucht, um nach dem Aussenden wieder zurück zum Ultraschallsensor zu gelangen. Dies wird in der Variable zeit gespeichert.Für die Verwendung in größeren Zusammenhängen ist es sinnvoll, diese Abfolge in eine Funktion auszulagern, die die Entfernung zurückgibt.
Zur Bestimmung des Abstands muss man auf das Funktionsprinzip des Ultraschallsensors zurückgreifen, das oben beschrieben wurde. Zunächst wird der Trigger-Pin als digitaler Aktor und der Echo-Pin als digitaler Sensor konfiguriert.

Mit dem folgenden Programm wird dann die Entfernung ermittelt und auf dem Display des Calliope ausgegeben.

gib <pulszeit high> Pin Echo wird die Zeit in Mikrosekunden ermittelt, die das Ultraschallsignal braucht, um nach dem Aussenden wieder zurück zum Ultraschallsensor zu gelangen. Dies wird in der Variable zeit gespeichert. Hinweis: In der Blockauswahl für Sensoren steht zunächst gib <digitalen wert> Pin Echo. Dort kann dann Pulszeit HIGH ausgewählt werden.Für die Verwendung in größeren Zusammenhängen ist es sinnvoll, diese Abfolge in eine Funktion auszulagern, die die Entfernung zurückgibt.
Zur Bestimmung des Abstands muss man auf das Funktionsprinzip des Ultraschallsensors zurückgreifen, das oben beschrieben wurde. Zunächst wird der Trigger-Pin als digitaler Aktor und der Echo-Pin als digitaler Sensor konfiguriert.
# Imports go at the top
from calliopemini import *
import machine
# Code in a 'while True:' loop repeats forever
while True:
pin9.write_digital(0) # Trigger-Pin auf 0 setzen, um den Startzeitpunkt des folgenden Signals festzulegen
sleep(5)
pin9.write_digital(1) # Trigger-Pin für 30ms auf 1 setzen, um ein Ultraschallsignal auszusenden
sleep(30)
pin8.write_digital(0) # Echo-Pin auf 0 setzen, um Signal vorzubereiten
pin9.write_digital(0) # Trigger-Pin auf 0 setzen, um Ultraschallsignal zu beenden
zeit = machine.time_pulse_us(pin8, 1, 50000) # hier wird die Zeit in Mikrosekunden (us) ermittelt, die das
# Ultraschallsignal braucht, um nach dem Aussenden wieder zurück zum Ultraschallsensor zu gelangen
# die 50000 ist ein Timeout in Mikrosekunden, falls kein Signal zurückkommt
# die Zeit in Mikrosekunden wird in der Variable zeit gespeichert
entfernung = (zeit / 2) * 0.034346 # die gemessene Zeit muss nun durch 2 geteilt werden, weil die gesuchte
# Strecke zwei Mal vom Ultraschall durchlaufen wurde (Hin- und Rückweg)
# das Ergebnis wird mit der Geschwindigkeit des Ultraschalls in Zentimeter pro Mikrosekunde multipliziert
entfernung = round(entfernung,1) # Runden des Ergebnisses auf eine Nachkommastelle
display.scroll(entfernung) # Ausgabe auf dem Calliope
display.clear()
sleep(500)
Baue eine Einparkhilfe für ein Auto, die umso schneller piepst, je näher man dem Hindernis kommt. Ab einer Entfernung von 30 cm soll der Ton durchgängig ertönen.
Recherche: Wie wird Ultraschall erzeugt und gemessen?
Die Erzeugung des Ultraschalls beruht wie beim Piezo-Summer auf dem inversen piezo-elektrischen Effekt (vgl. Piezo-Summer); die Messung des Ultraschalls beruht auf dem piezo-elektrischen Effekt. Recherchiere im Internet die Hintergründe dieser Effekte und fasse sie zusammen.