Bei Hackster.io gibt es das Projekt Spread Spectrum Phased Array Sonar. Hier geht es darum nach dem Prinzip einer Phased-Array-Antenne durch den gleichzeitigen Einsatz von zwei Ultraschall-Entfernungsmessern vom Typ HC-SR04 nicht nur die Entfernung zu einem Objekt, sondern auch dessen Richtung zu bestimmen. Das ganze sieht dann so aus:

Spread Spectrum Phased Array Sona

Projekte mit ähnlichen Inhalten sind hier zu finden:

Virtual touch screen (3D Ultrasonic Radar)

Das Funktionsprinzip ist leicht zu verstehen. Die verschieden Eingangskanäle werden zeitverzögert überlagert (Interferenz). Setzt man die Zeitverzögerung in Relation zu der Sendefrequenz bzw. zur Wellenlänge, entspricht die Zeitverzögerung einer Phasenverschiebung. Die Phasenlage, die die höchsten Amplituden ergibt, gibt Hinweise auf die Richtung des reflektierenden Objekts.

In beiden Projekten werden immer komplette Ultraschall-Messer verwand, wobei jeweils nur ein Sendeteil aktiv ist. Bei emil habe ich einen Schaltplan des HC-SR04 gefunden und eine Anleitung, wie man das Ganze optimieren kann.

Original Optimiert

Die Idee ist nun die Steuereinheit und das Sendeteil nur einmal zu bauen und die Empfangseinheit mehrfach auf einer Platine anzuordnen, wobei die US-Empfänger sehr genau positioniert werden können.

Eine sehr detaillierte Analyse des HC-SR04 findet man unter http://www.pcserviceselectronics.co.uk/arduino/Ultrasonic/index.php.

Andere Ansätze

Lösung von Alex Toussaint: How I built an ultrasonic 3d scanner

Einige Fakten rund um das Thema

Die Schallgeschwindigkeit in Luft beträgt etwa c=343 m/s.

Ein US-Signal mit der Frequenz von f = 40 kHz hat eine Wellenlänge in Luft von λ = c / f ≈ 0,86 cm. Die Dauer einer Schwingung beträgt 0,025 ms = 25 µs.

Der Original SR-HC04 sendet 8 Wellenzüge (Rechteck). Die Gesamtlänge dieses Wellenzugs ist 8 × λ ≈ 7 cm. Die Dauer, die der gesamte Wellenzug zum passieren eines Punkts benötigt, beträgt 8 × 25  µs = 200 µs.

Die Laufzeit des Signal bei Reflektion durch ein Objekt hängt von der Schallgeschwindigkeit ab: t = s / c.

Entfernung Laufzeit
einfach
Laufzeit
hin & zurück
50 cm 1,5 ms 2,9 ms
100 cm 2,9 ms 5,8 ms
150 cm 4,4 ms 8,7 ms
200 cm 5,8 ms 11,6 ms
300 cm 8,7 ms 17,4 ms
400 cm 11,6 ms 23,3 ms
500 cm 14,6 ms 29,0 ms

Die Reichweite des HC-SR04 beträgt nominal 400 cm. Hierbei ist die Frage ob der interne Prozessor Impulse nach etwa 25 ms nicht mehr auswertet oder ob die Signale bei größeren Entfernungen zu schwach werden um den internen Komparator zu triggern.

Exkurs Richtungsdetektion

Schwenken der Sende-Antenne mechanisch (Radar) elektrisch (Phased Array Radar)

Interferometrie (Schwenken der Empfangsantenne, Radioastronomie)

Moduliertes Dauerstrichradar (Wikipedia)

Optische Abstandsmessung (Wikipedia)

Homemade phase laser rangefinder (übersetzt)

Homebrew phase laser rangefinder (hackaday.com)

A twofold modulation frequency laser range finder

Problemstellung

Problemstellung   Ein Ultraschallsender T sendet ein Signal aus. Hindernisse Oi im Abstand Xi im Winkel αi von der Symmetrieachse reflektieren dieses Signal. Zwei Ultraschallempfänger empfangen das Signal nach unterschiedlichen Zeiten und versetzter Pahsenlage.

Bestimme die Xi und αi.
Physikalisches Modell   Die linke Grafik zeigt das physikalische Modell für ein einzelnes Hindernis.

X: Entfernung des Hindernisses vom Sender = Laufweg des Hin-Signals
A: Entfernung des linken Sensors vom Hindernis = Lauf des Rück-Signals zum linken Sensor
A+D: Entfernung des rechten Sensors vom Hindernis = Lauf des Rück-Signals zum rechten Sensor
D: Entfernungsunterschied des Hindernissen von den beiden Sensoren. D kann negativ werden, wenn sich das Hindernis auf der rechten Seite befindet.
S: Abstand der Ultraschallempfänger
Näherungsmodell   Ist der Abstand des Hindernisses genügend groß, kann man davon ausgehen, dass die Wellenfronten nahezu parallel und senkrecht zu X verlaufen. Der hierdurch entstehende Fehler ist wahrscheinlich deutlich geringer als der, der durch ein nicht punktförmiges reflektierendes (also ein über mehrere Wellenlängen ausgedehntes) Hindernis entsteht.

In diesem Fall gilt:
    X  A + D / 2
    α ≈ arcsin(D / S)
Größenabschätzung von D   In der linken Grafik wurde die Größe von D abgeschätzt. Dazu wurde das Näherungsmodell genutzt.

Die Größenordnung von D liegt in der gleichen Größenordnung wie die üblichen Messgenauigkeit von Ultraschallentfernungsmessgeräten (± ein bis einige cm). D direkt aus der Laufzeitmessung abzuleiten ist nicht möglich.

Simulation

Mit einem kleinen Basic-Programm kann die Richtungsabhängigkeit eines Phased Array simuliert werden.

Arduino Uno?

Geschwindigkeit

Ist es möglich, die Auswertung der Ultraschallempfänger direkt mit einem Arduino vorzunehmen? Das Abtasttheorem besagt, dass die Abtastfrequenz mindestens doppelt so hoch wie die Signalfrequenz sein muss. Das Datenblatt des ATmega328 gibt folgende Auskunft:

Verzichtet man auf die höchste Genauigkeit von 10 Bit, könnte man das Signal mit fast 77 kHz abtasten. Das ist schon knapp! Bedenkt man weiterhin, dass mindestens zwei Signale gescannt werden müssen wird klar, dass ein einzelner AVR nicht ausreicht. Nutzt man für jedes Signal einen eigenen AVR müssen diese irgendwie synchronisiert werden.

Speicherbedarf

Will man den gesamten Datenstrom speichern, müssen die Scann-Daten für etwa 29 ms (max. Entfernung 5 m) gespeichert werden. Dies bedeutet, dass die Daten von etwa 2300 Samples abgelegt werden müssen. Bei nur 1 Byte pro Sample übersteigt dies die vorhandene Speicherkapazität von 2 KB.

Legt man nur die interessanten Daten ab, also diejenigen, die um den Zeitpunkt des Empfangs des reflektierten Signals herum liegen, müssen Daten für mindestens 200 µs Signaldauer und weitere 150 µs Laufzeitdifferenz abgelegt werden. Insgesamt also für rund 500 µs, entsprechend etwa 40 Byte. Die notwendige Synchronisation zweier Prozessoren ist dadurch aber deutlich aufwendiger, da man sie sich erst im Laufe der Messung darüber einigen können, wann mit der Aufzeichnung der Daten begonnen werden muss.

Fazit: Nahezu nicht machbar!

Die Alternative, z.B. einen ATmega1284 einzusetzen, entschärft zwar die Speicherproblematik, löst aber nicht das Geschwindigkeitsproblem.

STM32F103C8T6

Eine mögliche Alternative zu einem AVR-Prozessor wäre z.B. ein kleines Board auf Basis einer ARM®32-bit Cortex®-M3 CPU, das für etwa 5 € zu haben ist:

STM32F103C8T6

Die relevanten technischen Angaben sind:

Hinzu kommt die Taktfrequenz von 72 MHz, die eine zügige Auswertung auch bei umfangreichen Berechnungen verspricht. Und, für dieses Board gibt es eine Arduino-Bibliothek, so dass man sich nicht mit unbekannten Prozessor-Strukturen herum schlagen muss.

Messung der Laufzeit-Differenz

Wie bereits oben erwähnt, die Messung der Laufzeit-Differenz auf Basis einer Zeitmessung zu ungenau. Das größte Problem dabei ist, den genauen Zeitpunkt zu bestimmen, zu dem das reflektierte Signal eintrifft.

Alternative

Die Phasenüberlagerung mehrerer Empfänger ist ein extrem aufwändiger Vorgang:

Einfacher scheint der umgekehrte Vorgang. Statt mehrerer Empfänger verwendet man mehrere Sender.

Siehe dazu die oben aufgeführte Simulation und auch das Beispiel von Alex Toussaint: How I built an ultrasonic 3d scanner

Beispiel-Konfiguration

 Rahmenbedingungen

Mit dem o.a. Simulationsprogramm lässt sich einiges ausprobieren.

Transmitteranzahl, μC-abhängig

Die Port-Breite der meisten μC beträgt 8 Bit. Will man die Schallsignale mit einem μC generieren, bietet es sich an, mit einem Vielfachen von acht Transmitter zu arbeiten. Bei einem Arduino Uno (ATmega328p) stehen sogar nur 2x6 Bits zur Verfügung: PORTB PB0..PB5 und PORTD PD2..PD7 . PD0 und PD1 sind für die serielle Schnittstelle reserviert. Das Ändern von PD1 (= TX) ist unbedingt zu vermeiden. Da die serielle Schnittstelle über Interrupts angesteuert wird, muss außerdem auf Threadsicherheit geachtet werden.

Bei einem ATmega1284 sind alle vier Ports (PORTA..PORTB) verfügbar. Hier lässt sich ein komplett freier 8-Bit-Port finden.

Alternativ bietet es sich an die Signale z.B. von einem ATtiny2313 zu erzeugen. Hier ist ein kompletter Port (PORTB) verfügbar. Der Chip besitzt eine eingebaute USART, mit der er elegant angesteuert werden kann. Alternativ stehen sieben Pins zur Steuerung zur Verfügung.

Andere Möglichkeiten wäre die Benutzung von Schieberegister oder eines i²C-Port-Expanders (z.B. PCF8574). Da hier die Ausgabe seriell erfolgt, müssen entsprechend hohe Taktfrequenzen vorliegen.

Abstand der Transmitter, Winkelabhängigkeit

Mit dem Simulationsprogramm kann man ausprobieren, welche Abstände der Transmitter zu einem konzentrierten Beam führen. Alle beispiele wurden mit 8 Transmittern berechnet.

Abstand 10 mm Abstand 15 mm Abstand 20 mm

Durch die Baugröße der Transmitter (MDO-P1040H07T) ist der kleinste Abstand 10 mm (~1,16 λ). Bereits ab einem Abstand von 20 mm (~2,3 λ) nehmen die Nebenbeams beträchtliche Ausmaße an.

Für die Erstellung des Simulationsprogramms wurde die Winkelabhängigkeit des Transmitters ermittelt. Der Schalldruckpegel und damit die Reichweite nimmt relativ schnell ab, wenn man die Hauptrichtung verlässt. Bei etwa 25° beträgt dessen Wert nur noch das 0,7-fache (= 1/√2 ~ -3 dB). Bei 30° ist der Schallpegel bereits aus 2/3 gefallen. Ein sinnvoller Schwenkbereich scheint bei etwa max. ±25° zu liegen.

Die Simulation zeigt jedoch, dass dieses Abschätzung deutlich zu optimistisch ist.

Signalgenerierung

Die Erzeugung der phasenverschobenen Signale ist ein exaktes Timing notwendig. Die Resonanzfrequenz der Transmitter und die Phasenverschiebung sollte präzise eingehalten werden können. Hierzu ist meist gute Kenntnisse über das "Innenleben" und die Programmierung der verwendeten μC notwendig. Die Signale über die Standard-Arduino-Umgebung zu erzeugen wird nicht funktionieren.

 

Ansteuerung der Transmitter

Die Methode des HC-SR04 einen MAX3232 zur Signalverstärkung zu nutzen, scheint eine recht einfache Möglichkeit zu sein. Breakout-Boards mit diesem Chip sind für etwas mehr als 1€ erhältlich. Beim HC-SR04 werden die beiden RS323-Ausgänge im Gegentakt betrieben. Somit liegt die Spannung am US-Transmitter bei etwa ±16 Volt. Damit wird eine Reichweite von 3-4 m erzielt (je nach Lieferant unterscheiden sich die Angaben ein wenig). Für den Nahbereich sollte es ausreichen, mit einem einfachen Takt zu arbeiten. Dann könnten zwei Transmitter mit einem MAX3232 betrieben werden.