Fledermausscanner LoRaWAN


Nachdem ich einen Fledermaus-Scanner zum Anschluss an einen PC oder RaspberryPi gebaut habe, diesen dann mit Display als tragbare Mobilversion (siehe Fledermaus-Mobil) weiterentwickelte, fehlte nur noch eine Version, die man irgendwo im Wald verstecken kann, um die Daten dann per LoRaWAN einzusammeln.
Im Rahmen der besseren Kartierung von Naturräumen im Stadtgebiet Calw, wird dieser Scanner dann auch zum Einsatz kommen.

Bild "Elektronik:FledermausTTN_Platine.jpg"

Die Verstärkerschaltung habe ich vom originalen Fledermausscanner 1:1 übernommen.
Das Feather M0+ Board gibt es auch in einer Version mit LoRaWAN Modem - so konnte die schnelle DMA basierte ADC Software wiederverwendet werden. Allerdings musste ich eine andere Library verwenden (siehe unten).

Übersicht

Um die Ultraschallsignale der Fledermäuse aufzuzeichnen, ein Frequenzspektrum daraus zu machen und dass dann per LoRaWAN zu übertragen und dann auf einer Webseite anzuzeigen, sind einige Schritte notwendig.
Diese sind hier schematisch dargestellt.

Bild "Elektronik:FledermausTTM_Datenfluss.png"

Die folgende Beschreibung orientiert sich an diesem Übersichtsbild.

MEMS Mikrofon und Verstärker

Das Mikrofon und der 60dB Verstärker ist identisch mit der Schaltung des originalen Fledermausscanners (Fledermaus-Scanner).
Hier noch mal die Schaltung:
Bild "Fledermaus_Schaltplan.png"

FeatherM0+ Board mit ADC DMA

Ich habe hier wieder das Adafruit FeatherM0+ board verwendet, da es mit bis zu 500kSamples/s digitalisiert und so theoretisch bis 250kHz Bandbreite erfassen kann. Da das MEMS Mikrofon allerdings nur bis ca. 90kHz überträgt, habe ich mich hier für eine Samplingrate von 196kHz entschieden. Damit bekomme ich bei gleicher Anzahl von Samples eine bessere Frequenzauflösung.

Entgegen meiner ersten Implementierung habe ich hier die originale Adafruit DMA ADC Library verwendet. Das war nötig, damit diese zusammen mit der LMIC Library für den LoRAWAN Teil der Schaltung funktioniert.
Hierzu verwendet man die Adafruit ZeroDMA Library, die vom Boardmanager bei Installation des FeatherM0+ Boards automatisch mit installiert wird.

Man findet diese Library auch auf Github: https://github.com/adafruit/Adafruit_ZeroDMA

FFT

Um die digitalisierten Signale aus dem Zeitbereich in ein Frequenzspektrum zu wandeln, verwende ich die Fast Fourier Transformation aus der Adafruit Zero_FFT Library.

https://github.com/adafruit/Adafruit_ZeroFFT

LMIC LoRaWAN Library für Feather M0+

Damit das LoRaWAN Modem mit SEMTECH SX1272 auch auf dem FeatherM0+ funktioniert, darf man nicht die Standard LMIC Library erwenden, sondern muss die für den M0 modifizierte Version nehmen.
Damit ich nicht mit den anderen Applikationen für CaLoRa-Node ins Gehege komme, habe ich hier einen eigenen Arduino-Library Pfad gemacht.

Die zugehörigen Git-Repos sind hier:

1. Für das Beispiel m0-lorawan-ttn: https://github.com/werktag/m0-lorawan-ttn

2. Für die modifizierte lmic-library: https://github.com/huebe/arduino-lmic

Außerdem muss noch eine Drahtbrücke verlötet werden, so wie im Bild gezeigt (blauer Draht). Als Antenne reicht ein 8.5cm langer Draht (gelber Draht im Bild unten):

Bild "Elektronik:FledermausTTN_wiring.png"

Real Time Clock - DS1337

Da Fledermäuse nur in den Abendstunden zu erwarten sind, soll die Schaltung auch nur dann aktiv sein. So kann der Akku über einige Abende durchhalten. Dazu muss die Schaltung in den Schlaf versetzt und durch eine externe Real Time Clock (RTC) geweckt werden.
Ich verwende die DS1337, die über einen Alarmausgang verfügt, der mittels NPN Transistor den Enable Eingang des Spannungswandlers auf dem Featherboard steuert. Ist der Alarm aktiv, dann geht der Alarmausgang auf Null Volt. dadurch wird die Basis des NPN Transistors entsprechend auf Null Volt gelegt, der Transistor sperrt, womit der Enable-Eingang hochohmig wird und der Spannungswandler aus dem Akku die Betriebsspannung der Schaltung erzeugt.
Ist der Alrm des DS1337 nicht aktiv, dann schaltet der NPN Transistor durch und zieht den Enable Eingang des Featherboards auf Null Volt und schaltet den Spannungswandler so aus. Das Featherboard ist ausgeschaltet und verbraucht nur minimal Strom.
Da auch der Verstärker und das Mikrofon am 3V Ausgang des Featherboards liegt, sind diese Teile der Schaltung ebenfalls stromlos.

Der DS1337 braucht einen externen 32.768Hz Quarz und wird über SCL und SDA vom FeatherM0+ per I2C Protokol programmiert.

Die Schaltung ist identisch mit der unseres CaLoRa-Nodes, der hier dokumentiert ist:
https://github.com/c-hack/CaLoRa-Node

Bild "FledermausTTN_DS1337.png"

/!\ Achtung:Leider kann man im laufenden Sampling-Betrieb die RTC nicht mehr per I2C abfragen. Das kollidiert mit den anderen Libraries. Daher greife ich nur am Anfang des Programms darauf zu zur Programmierung der Uhrzeit und Aufwachzeit. Läuft die Schaltung im wachen Zustand, dann benutze ich die Millisecondsfunktion, um nach 2 Stunden den Schlafzustand (Alarm deaktiviert) einzuschalten.

Programmieren von Uhrzeit und Aufwachzeit: Sobald der Mikrocontroller gestartet wird, läuft er 30 Sekunden lang durch eine Warteschleife, in der gecheckt wird, ob über USB ein "s" empfangen wurde. Sendet man also mit dem seriellen Monitor des Arduino IDE ein "s", dann schaltet die Software in den Programmiermodus. Nun können mit hh:mm hh:mm die Uhrzeit und die Weckzeit gesetzt werden. Die Betriebszeit ist fest auf 2 Stunden programmiert, was natürlich im Source Code geändert werden kann.  

TTN Setup

Nun muss das Device im TheThingsStack in der Console angelegt werden. Wie das geht habe ich hier beschrieben: TTN V3 Client Setup
Am einfachsten geht das im OTAA-Modus, der hier verwendet wird.

TTN Payload Formatter

Der Fledermaus-Scanner muss sich auf eine sehr kleine Datenmenge beschränken. Man kann maximal 54 bytes einmal pro Minute schicken. Es ist also nicht möglich, die 1024 FFT Werte mit 16 bit Auflösung zu übermitteln.
Daher verwende ich folgende Methode:
  1. Samplen der Daten
  2. FFT berechnen
  3. Die FFT nach Größe des jeweiligen Frequenzsignals sortieren - höchstes Signal zuerst
  4. Die 12 höchsten Frequenzen werden in das Sende-Array übernommen: 12 * (2 Byte Frequenz + 2 Byte Signalamplitude)
  5. Zusätzlich wird noch die Batteriespannung als ein Byte übertragen (42 = 4.2V)
Also werden pro Minute 48 FFT Bytes + 1 Byte Batteriespannung gesendet.

So sehen die Rohdaten in der Konsole des TTNs aus:

Bild "Elektronik:FledermausTTN_TTNRaw.png"

In der TTN Application wählt man nun einen Custom-Payload-Formatter aus, der aus diesen 49 Bytes eine Payload macht, die man zu einer URL schicken kann zur weiteren Verarbeitung bzw. Anzeige.
Dieser ist in JavaScript geschrieben und sieht für diesen Anwendungsfall so aus:

Bild "Elektronik:FledermausTTN_PayloadFormatter.png"

Schaltet man den Payload-Formatter ein, dann sieht man schon in der Konsole, dass die Frequenz-Bins und Byte 49 für die Batteriespannung richtig dekodiert wurden:

Bild "FledermausTTN_TTNFormatted.png"

Data Collector

Das TTN-Network erlaubt es, eine oder mehrere "Integrations" für jede Application anzugeben. Das kann ein Webdienst wie Cayenne sein oder eine eigene URL, was im TTN als "Webhook" bezeichnet wird.
In meinem Fall ist es die eigene Webseite, auf der ein PHP Skript läuft, dessen URL hier als Webhook angegeben wird. Siehe auch: TTN V3 Client Setup
In meinem Fall dekodiert dieser Code die JSON Daten mit den 12 höchsten FFT Frequenzen und schreibt sie in eine Textdatei auf dem Webserver.
Die Textdatei enthält alle 1024 Frequenzen und wird nur dann überschrieben, wenn einer der 12 neu übermittelten Frequenzen eine höhere Amplitude hat, als die jeweilige in der Datei.

Grafische Anzeige im Web

Das index.php Skipt erlaubt es, die Daten in der FFT-Datei im Browser grafisch anzuzeigen. Die Grafik erzeuge ich mit SVG-Befehlen inline im HTML-Code.
Bild "FledermausTTN_Plot.png"

Test, test, test...

Zunächst einmal habe ich die Elektronik ohne Fledermaus mit dem Frequenzgenerator ausprobiert. Hier verwende ich einen Piezo-Hochtöner, der bis über 50kHz kommt, allerdings alles andere als konstant über den Frequenzbereich ist. Aber man kann so auch überprüfen, ob die Frequenzen richtig skaliert werden:

Bild "Elektronik:FledermausTTN_TestSetup.jpg"

Außendienst

Zum Test hängt das Modul verpackt in einem HT50 Rohr am Baum im Garten. Oben ist er mit einem passenden HT50 Rohrstopfen verschlossen. Unten verschließt ein 3D-gedruckter Stopfen mit passendem Mikrofonloch das Rohr. Die Druckdateien sind Teil des Pakets, das unten zum Download zur Verfügung steht.

Es sollen aber mehrere dieser Sensoren im Stadtgebiet und naheliegenden Wald verteilt werden.

Bild "Elektronik:FledermausTTN_Aussentest.jpg"

Dadurch, dass die Akkuspannung überwacht wird, kann man die Teile rechtzeitig zum Laden einsammeln. Hierzu steckt man das Faetherboard einfach an ein USB Netzteil. Die integrierte Ladeschaltung lädt die LiPo-Zelle mit 100mA.

Was man noch besser machen kann...


Dokumentation und Source Code zum Download

Alles, was man zum Übersetzen des Codes braucht, habe ich hier in einem Package zusammengestellt. Es enthält auch den Payload-Formatter und die PHP Skripte sowie die Druckdaten für den HT50 Stopfen mit Mikrofonloch.

FledermausTTN-Package-Surasto-5-2022.zip

Auch, wenn es alle Libraries aud Github gibt (siehe die Links im Text) habe ich sie noch mal in dieses Package mit eingefügt, um sicherzustellen, dass alles komplett ist, so wie ich es kompiliert habe - auch, wenn sich der Code in Git ändert oder gelöscht werden sollte.