Richtungshören

Mit dieser kleinen Arduino-Spielerei möchte ich das Prinzip des Richtungshören aufzeigen. Durch die beiden menschlichen Ohren sind wir imstande, die Richtung der Schallquelle zu lokalisieren. Es kommt nämlich aufgrund des Ohrenabstands d zu einem Laufzeitunterschied Δt der Schallwellen, wenn diese an das linke bzw. rechte Ohr gelangen. In meinem Fall sind es keine Ohren, sondern 2 Mikrofone vom Typ KY-038. Diese erhält man um 2-3 Euro/Stück auf ebay oder Amazon.

Die digitalen Ausgänge der beiden Mikrofone lösen jeweils ein interrupt am Arduino aus, wobei mittels der Funktion micros() jeweils der Zeitpunkt der Auslösung gespeichert wird. Daraus lässt sich dann der Laufzeitunterschied Δt einfach durch Subtraktion der beiden Zeiten berechnen. Die Mikrofonmodule KY-038 besitzen zwei Ausgänge: Einmal einen analogen Ausgang, welcher das vom Mikrofon erfasste Signal analog ausgibt. Zum anderen besitzt es auch noch einen digitalen Ausgang. Dieser liefert nur dann ein Signal (5V), wenn das Mikrofonsignal einen über ein Potentiometer eingestellten Spannungswert übersteigt. Ansonsten liegt dessen Ausgang auf GND (0V).

Anhand der oberen Abbildung erkennt man, dass der digitale Ausgang bei einem längeren, lauteren analogen Signal öfters auf High geht. Dadurch würde das interrupt mehrfach ausgelöst werden, was aber unerwünscht ist. Um dies zu umgehen, überprüfe ich mit dem Programm beim interrupt noch die seit dem letzten interrupt vergangene Zeitspanne. Nur wenn diese größer als ein bestimmter Wert ist (variable silence), wird durch den ausgelösten interrupt auch die aktuelle Zeit des interrupts gespeichert. Ist die seit dem letzten interrupt vergangene Zeit zu gering (dies wäre eben in der oberen Abbildung der Fall, da die interrupts zum gleichen Schallereignis gehören würden), so wird dieses interrupt ignoriert.

In dieser Abbildung habe ich nun zwei Mikrofone an das Oszilloskop angeschlossen. Man erkennt schön den Laufzeitunterschied von ca. 400 µs zwischen den beiden Signalen. Auch hier würde das interrupt mehrfach ausgelöst werden.

Die Schaltung ist denkbar einfach. Sie besteht nur aus den beiden Mikrofonmodulen und einem Servo, der dann die berechnete Richtung der Schallquelle anzeigt. Die mit der Funktion asin() berechneten Winkel liegen im Bereich [-90°,90°]. Sie müssen noch durch eine simple Addition von 90° in den für den Servo ansteuerbaren Bereich zwischen 0° und 180° gelangen.

Hier ein erster Testaufbau, welcher zufriedenstellend funktionierte.

Die Spielerei ist soweit fertig. Mit der Empfindlichkeit der Mikrofone muss man sich ein wenig spielen. Ist diese zu hoch, so reagiert der Servo zu oft und zu ungenau. Bei geringerer Empfindlichkeit muss man hingegen schon kräftig mit den Händen klatschen, dafür gibt es weniger Fehlmessungen. Als Servo verwende ich einen Micro-Servo vom Typ SG90. Dieser verbraucht relativ wenig Strom (ca. 60 mA bei Bewegung) und kann deshalb direkt vom 5V-pin des Arduino gespeist werden. Untergebracht ist alles in einem kleinen Plastikgehäuse mit den Abmessungen 110 x 70 x 45 mm.


Arduino-Code: