Fledermaus-Scanner
In der Sommerzeit verlassen die Fledermäuse ihre Winterquartiere und sind in den Abendstunden oft in den Gärten unterwegs um dort Insekten zu fressen. Nachdem auch bei uns die Mäuse jeden Abend durch den Garten flederten, wollten wir genauer wissen, welche das sind und natürlich, ob sie wirklich solch lauten Ultraschall zur Objekterkennung aussenden.
Man kann Geräte kaufen oder bauen, die mittels Mixer einen Bereich des Ultraschallspektrums im Frequenzbereich so nach unten verschiebt, dass wir es hören können. Man kann dann auch gleich noch das charakteristische An- und Abklingen hörbar machen und so noch besser erkennen, um welche Fledermausart es sich handelt.
Scannen statt Mixen
Ich habe einen anderen Ansatz gewählt. Ich wollte einfach den ganzen Frequenzbereich von 0 bis 100kHz über einen Zeitraum scannen und so ein Zusammenfassung aller Fledermäuse eines Abends in meinem Garten erhalten.Dazu braucht man eine Abtastrate von 200ksps oder mehr und natürlich ein Mikrofon, das bis 100kHz empfindlich ist.
Vorversuche
Um die Verstärkerschaltung auszuprobieren und die Bandbreite des Mikrofons zu testen habe ich erst mal mit dem Bitscope experimentiert.Ein Piezo-Hochtöner reicht aus, um bis weit über 50kHz zu senden. Der Frequenzgang ist zwar alles andere als linear aber für erste Versuche reichte das schon mal aus.
Mit einem einstufigen Verstärker kommt man nicht weit. Auch wenn Federmäuse bis zu 140dBA laut schreien, sollte der Verstärker schon ca. 1000-fach verstärken. Die meisten OpAmps schaffen das aber nicht wegen des Verstärkungs-Bandbreite-Produkts (GBP), das üblicherweise im einstelligen MHz-Bereich liegt.
Verstärker
Der verwendete TS912 ist eine rail-to-rail Ausführung, die auch mit den 3.3V, die für die Schaltung zur Verfügung stehen, prima zurecht kommt. Mit seinem GBP von 800kHz muss man aber dreistufig bauen:
Das Mikrofon
Übliche Kondensator- oder Elektretmikrofone hören schon knapp oberhalb von 20kHz nicht mehr viel. Abhilfe schaffen MEMS Mikrofone, die durch ihre Verwendung in Smartphones erschwinglich geworden sind. MEMS Mikrofone sind aber so klein, dass sie mit Hobby-Technologie unmöglich lötbar sind. Zum Glück gibt es sie auf Breakoutboards zu kaufen. Bei meinem handelt es sich um das SPU0410LR5H-QB von Knowles, das von ELV auf einem Board geliefert wird mit 2.54mm Pfostensteckern.
So sieht das das auf einer Lochrasterplatine aus:
Sampling
Hier soll das ganze Frequenzband von 0 bis 100kHz digitalisiert und dann in seine Frequenzbestandteile aufgeteilt werden. Das Abtasttheorem verlangt dazu, dass das Signal mindestens doppelt so schnell abgetastet wird, wie der höchste darin enthaltene Frequenzanteil. Also mindestens mit 200.000 Abtastungen pro Sekunde für diesen Anwendungsfall.
Das kann man mit dem ADC des Arduino nicht erreichen. Eine Möglichkeit wäre ein externer ADC mit dieser Sampling-Rate oder man steigt auf einen ARM-M0+ um, der einen schnellen ADC bereits mitbringt.
Ich habe mich für das Featherboard von Adafruit entschieden, das einen SAMD21 ARM verwendet mit integriertem ADC mit einer Maximalrate von 500ksps, die hier auch genutzt wird. Um so schnell zu sein, muss der ADC asynchron laufen und per DMA die Ergebnisse direkt in das RAM des Controller schreiben.
Ich war erfolgreich mit dem Code von Manitou: https://github.com/manitou48/ZERO/blob/master/adcdma.ino - Vielen Dank!
Frequenzspektrum
Wenn man wissen will, welche Frequenzen in dem Bereich von 0 bis halber Abtastrate vorkommen, dann bedient man sich der Fouriertransformation.Diese liefert ähnlich einem Histogramm für jede Frequenz die Amplitude der jeweiligen Sinusschwingung.
Je länger man abtastet desto feiner wird die Auflösung.
Beispiel:
500ksps --> Spektrum von 0...250kHz wird im Frequenzbereich abgebildet.
4096 Abtastwerte --> 2048 Frequenzpunkte im Spektrum
Auflösung = 250.000 / 2048 = 122Hz
Um es für den Prozessor einfacher zu machen, benutzt man die Fast Fourier Transformation (FFT), bei der Symmetrien ausgenutzt werden um weniger und somit schneller rechnen zu können. Hier sollte die Samplinglänge einer 2er-Potenz entsprechen - also 1024, 2048, 4096 oder so.
Auch hier muss man nicht selber programmieren. Es gibt eine für den SAMD21-Prozessor optimierte Library: "Adafruit_ZeroFFT.h"
Hier der Link: https://github.com/adafruit/Adafruit_ZeroFFT
Anzeigen
In dieser ersten Version habe ich es mir leicht gemacht. Nach jeder Abtastung und FFT-Wandlung des Spektrums sende ich es mit 115200 bit/s über die serielle Schnittstelle. Ein in Processing.org geschriebenes Programm auf dem PC stellt das Spektrum grafisch dar. Dabei wird jede neue Messung hinzugefügt. Über die Zeit entsteht so ein Gesamtbild der empfangenen Spektren.
Es gibt derzeit nur eine rudimentäre Skalierung. Das kann man natürlich noch viel schöner machen.
Hier scheint es sich um die Zwergfledermaus zu handeln, die bei 45kHz sendet. Die Frequenzanteile im Bereich um 20kHz sind vermutlich Sozialtöne, mit denen die Fledermäuse untereinander kommunizieren. Diese werden nicht zur Ortung verwendet.
Finaler Formfaktor
Damit das Ganze wassergeschützt fest installiert werden kann, sollte es in einem 32mm Isolationsrohr untergebracht werden.
Dazu musste der Verstärker schrumpfen.
Ich habe dazu die TS912 und die passiven Bauteile als SMD-Versionen verwendet.
Download
Der Arduino-Code for den Feather M0+
Fledermaus.ino
Der Processing.org-Code für das Anzeige-Tool auf dem PC
Fledermaus_DisplayTool.zip
Die OpenSCAD und Druckdateien für die Endkappen des Isolationsrohrs
Fledermaus_Gehaeuse.zip
MQTT
Eigentlich will man ja nicht den Abend damit verbringen, hinter dem Laptop sitzend auf Fledermäuse zu lauern. Schöner ist, wenn man einfach alles aufzeichnet und im Web-Browser anguckt. Egal von wo.Dazu braucht man einen Aufstellungsort mit WLAN.
Ich habe meinen Feather M0+ mit der Mikrofonschaltung an einen RaspberryPi angeschlossen via USB. Auf dem Raspi, der im WLAN angemeldet ist, läuft ein Python-Skript, das mit der Paho-Bibliothek MQTT-Nachrichten verschickt.
Das Skript liest genauso die FFT Daten vom Feather Board, wie es auch das Processing-Programm tut. Das Skript checkt dann, ob es zumindest bei einer Frequenz ein relevantes Signal gab, das den Schwellenwert überschritten hat. War das der Fall, dann wird das Sende-Array aktualisiert und per MQTT an den MQTT Broker verschickt.
Die Aktualisierung des Sende-Arrays erfolgt nach dem folgenden Algorithmus: Alle Frequenzwerte, die im aktuell empfangenen Spektrum höher sind, als im Sende-Array werden im Sende-Array überschrieben. In jedem Frequenz-Bin steht also immer der höchste bisher empfangene Wert. Nach 1000
empfangenen Signalen wird das Array wieder auf Null zurückgesetzt, damit das nicht über alle Maßen wächst.
Hier das Python-Skript: FledermausMQTT.py
Der MQTT-Broker läuft bei mir auf einem Server. Ich verwende Mosquitto als Broker. Mit Mosquito_sub kann man sich die gesendeten Daten im Terminal angucken.
Will man das allerdings in einem Web-Browser sehen, dann empfiehlt sich Node-Red.js, eine serverseitige Umgebung, die die MQTT Daten beim Broker abonniert und weiterverarbeitet. Damit die Daten als XY-Chart angezeigt werden können, müssen sie in einen JSON-Record verpackt werden. Das macht das Python-Skript auf dem Raspi.
Der MQTT Block erhält die Daten vom Broker. Der JSON Parser macht daraus ein Javascript-Objekt, das der Chart-Block verarbeiten kann und anzeigt.
Das Ergebnis kann im Webbrowser unter der Adresse <Server URL>:1880/ui angeguckt werden.
Mehr Infos zu Fledermäusen
Übersicht der Fledermausrufe
https://www.uni-giessen.de/faculties/f08/departments/tsz/mammalian-ecology-group/downloads/kriner-rufe-fledermaeuse
Übersicht über die heimischen Fledermausarten
https://de.wikipedia.org/wiki/Liste_von_Fledermausarten_in_Deutschland
https://www.fledermausschutz.de/fledermausarten-in-europa/