Inhaltsverzeichnis:
- Schritt 1: Auswahl eines Mikrocontrollers
- Schritt 2: FFT?
- Schritt 3: Wie klingt ein schwebender Kolibri?
- Schritt 4: Fourier-Serie und das Teensy
- Schritt 5: Verwenden von Fourier-Daten
- Schritt 6: Bau beginnen
- Schritt 7: Hardware zum Aufnehmen eines Bildes
- Schritt 8: Systemdesign
- Schritt 9: Code
- Schritt 10: Montage
- Schritt 11: Ergebnisse
- Schritt 12: Abschließende Gedanken
Video: Kolibri-Detektor/Picture-Taker - Gunook
2024 Autor: John Day | [email protected]. Zuletzt bearbeitet: 2024-01-30 07:21
Wir haben einen Kolibri-Feeder auf unserem Achterdeck und in den letzten Jahren habe ich ihn fotografiert. Kolibris sind erstaunliche kleine Kreaturen, sehr territorial und ihre Kämpfe können sowohl urkomisch als auch erstaunlich sein. Aber ich hatte es satt, wie eine Statue an der Rückseite meines Hauses zu stehen, um sie zu fotografieren. Ich brauchte eine Möglichkeit, Bilder aufzunehmen, ohne lange Zeit hinter dem Haus stehen zu müssen. Ich weiß, dass ich einen ferngesteuerten Auslöser hätte verwenden können, aber ich wollte, dass Bilder automatisch aufgenommen werden, ohne dass ich dabei sein muss. Also beschloss ich, ein Gerät zu entwickeln, das die Kolibris erkennt und automatisch ein Bild macht.
Ich wollte immer einen Mikrocontroller verwenden, um dies zu tun. Der Mikrocontroller könnte den Kameraverschluss softwaregesteuert ansteuern. Aber der Sensor zum Erkennen eines winzigen Kolibri war eine andere Sache. Ich hätte einen Bewegungssensor verwenden können, aber ich wollte etwas Einzigartiges ausprobieren. Ich beschloss, Sound als Auslöser zu verwenden.
Schritt 1: Auswahl eines Mikrocontrollers
Der Mikrocontroller, den ich wählte, war ein PJRC Teensy. Der Teensy verwendet einen ARM-Mikrocontroller, insbesondere einen ARM Cortex M4. Der Cortex M4 enthält die Hardware, um eine FFT (Fast Fourier Transform) durchzuführen, die die Erkennung durchführen würde. PJRC verkauft auch ein Audioboard, mit dem Sie den Teensy zum Abspielen von Musik sowie zum Aufnehmen von Audio mit einem externen Eingang oder einem kleinen Mikrofon verwenden können, das Sie dem Board hinzufügen können. Mein Plan war es, den Teensy eine FFT auf dem Audio vom Mikrofon durchführen zu lassen.
Schritt 2: FFT?
Eine FFT ist eine mathematische Formel/ein Algorithmus, der ein Signal vom Zeitbereich in den Frequenzbereich transformiert. Das bedeutet, dass es das zeitabgetastete Audio vom Mikrofon nimmt und es in Größen der Frequenzen umwandelt, die in der Originalwelle vorhanden sind. Sie sehen, jede beliebige kontinuierliche Welle kann aus einer Reihe von Sinus- oder Cosinuswellen konstruiert werden, die ganzzahlige Vielfache einer Grundfrequenz sind. Eine FFT macht das Gegenteil: Sie nimmt eine willkürliche Welle und wandelt sie in die Größen der Wellen um, die, wenn sie zusammengezählt würden, die ursprüngliche willkürliche Welle erzeugen würden. Eine noch einfachere Art, dies zu sagen, ist, dass ich geplant habe, Software und die FFT-Hardware im Teensy zu verwenden, um festzustellen, ob er das Flügelschlag eines Kolibris mit der Frequenz „hört“, mit der die Flügelschläge auftreten. Wenn es einen Kolibri "hört", sende ich einen Befehl an eine Kamera, um ein Bild aufzunehmen.
Es funktionierte! Also, wie habe ich es gemacht, wie konntest du es tun und wie könntest du es noch besser machen?
Schritt 3: Wie klingt ein schwebender Kolibri?
Als erstes musste ich herausfinden, auf welcher Frequenz ich die Flügelschläge des Kolibri hören würde. Um dies festzustellen, habe ich mein iPhone verwendet. Ich befestigte das iPhone auf einem Stativ und ließ es Zeitlupenvideos direkt vor dem Kolibri-Feeder auf unserem Deck aufnehmen. Nach einiger Zeit habe ich die Kamera entfernt und das Video heruntergeladen. Ich habe mir dann das Video angesehen, in dem ich nach einem Kolibri vor dem Feeder gesucht habe. Als ich eine gute Sequenz gefunden hatte, zählte ich die Anzahl der Einzelbilder, die der Kolibri brauchte, um seine Flügel von einer Position bis zurück in dieselbe Position zu schlagen. Die Zeitlupe auf dem iPhone beträgt etwa 240 Bilder pro Sekunde. Ich beobachtete, wie ein Kolibri vor dem Feeder schwebte und zählte 5 Frames, bis er seine Flügel von der vorderen Position in die hintere Position bewegte und dann in die vordere Position zurückkehrte. Dies sind 5 von 240 Bildern. Denken Sie daran, dass wir bei jedem Schlag der Flügelklappen des Kolibris ein Geräusch hören (einer beim Vorwärtsschlag und einer beim Rückwärtsschlag). Für 5 Frames für einen Zyklus oder eine Periode können wir die Frequenz als eins dividiert durch die Periode berechnen, d. h. 1 / (5/240) oder 48 Hz. Das bedeutet, dass, wenn dieser Kolibri schwebt, der Ton, den wir hören, doppelt so hoch sein muss oder etwa 96 Hz. Die Frequenz ist wahrscheinlich höher, wenn sie fliegen und nicht schweben. Es kann auch durch ihre Masse beeinflusst werden, aber ich denke, wir können davon ausgehen, dass die meisten Vögel derselben Art ungefähr dieselbe Masse haben.
Schritt 4: Fourier-Serie und das Teensy
Der Teensy (ich habe einen Teensy 3.2 verwendet) wird von PJRC (www.pjrc.com) hergestellt. Die FFT wird anhand einer Tonprobe berechnet. Um den Ton zu erwerben, verkauft PJRC eine Audio-Adapterplatine für Teensy (TEENSY3_AUDIO - 14,25 $). Sie verkaufen auch ein kleines Mikrofon, das an die Audioadapterplatine gelötet werden kann (MIKROFON - 1,25 $). Die Audioadapterplatine verwendet einen Chip (SGTL5000), mit dem der Teensy über einen seriellen Bus (I2S) kommunizieren kann. Der Teensy verwendet den SGTL5000, um den Ton vom Mikrofon abzutasten und zu digitalisieren, d. h. eine Reihe von Zahlen zu erstellen, die den Ton darstellen, den das Mikrofon hört.
Eine FFT ist nur eine schnelle Version einer sogenannten diskreten Fourier-Transformation (DFT). Eine DFT kann mit einer beliebigen Anzahl von Abtastwerten durchgeführt werden, jedoch müssen bei einer FFT die Abtastwerte in Sätzen gespeichert werden, die binäre Vielfache sind. Die Teensy-Hardware kann eine FFT an einem Satz von 1024 Samples (1024=2^10) durchführen, also verwenden wir das.
Eine FFT erzeugt normalerweise als Ausgabe die Beträge UND die Phasenbeziehungen zwischen den verschiedenen dargestellten Wellen. Für diese Anwendung interessieren uns nicht die Phasenbeziehungen, sondern Größen und deren Frequenz.
Das Teensy-Audioboard tastet Audio mit einer Frequenz von 44, 100 Hz ab. Somit repräsentieren 1024 Abtastungen bei dieser Frequenz ein Zeitintervall von 1024/44100 oder etwa 23,2 Millisekunden. In diesem Fall erzeugt die FFT als Ausgabe Größen, die ganzzahlige Vielfache der Abtastperiode von 43 Hz sind (wiederum entspricht 1/0,0232 etwa 43 Hz). Wir möchten nach Größen suchen, die etwa doppelt so hoch sind wie diese Frequenz: 86 Hz. Es ist nicht genau die Frequenz unserer berechneten Kolibri-Flügelklappen, aber sie ist nah genug, wie wir sehen werden.
Schritt 5: Verwenden von Fourier-Daten
Die Bibliotheken, die PJRC für das Teensy bereitstellt, verarbeiten die Samples und geben ein Array von Magnitudenwerten zurück. Wir werden jede Größe im zurückgegebenen Array als Bin bezeichnen. Das erste Bin (bei Offset Null im Array der Daten, die wir zurückbekommen) ist der DC-Offset der Welle. Wir können diesen Wert getrost ignorieren. Das zweite Bin (bei Offset 1) repräsentiert die Größe der 43-Hz-Komponente. Dies ist unsere Basisperiode. Das nächste Bin (bei Offset 2) repräsentiert die Größe der 86-Hz-Komponente und so weiter. Jedes nachfolgende Bin ist ein ganzzahliges Vielfaches der Basisperiode (43 Hz).
Jetzt wird es hier etwas seltsam. Wenn wir eine FFT verwenden, um einen perfekten 43-Hz-Sound zu analysieren, dann würde die FFT den ersten Bin mit einer großen Größenordnung zurückgeben und alle anderen Bins wären gleich Null (wiederum in einer perfekten Welt). Wenn der von uns erfasste und analysierte Ton 86 Hz beträgt, wäre der Bin bei Offset eins Null und der Bin bei Offset 2 (die zweite Harmonische) wäre eine große Größenordnung und der Rest der Bins wäre Null und so weiter. Aber wenn wir den Klang eines Kolibris einfangen und er 96 Hz beträgt (wie ich an meinem einen Vogel gemessen habe), dann hätte der Offset 2-Bin @ 86 Hz einen etwas niedrigeren Wert (als die perfekte 86-Hz-Welle) und die Bins darum herum (eine niedrigere und einige höhere) hätten jeweils einen abnehmenden Wert ungleich Null.
Wenn die Sample-Größe für unsere FFT größer als 1024 war oder unsere Audio-Sampling-Frequenz niedriger war, könnten wir die Auflösung unserer Bins verbessern (d. h. kleiner). Aber selbst wenn wir diese Dinge ändern würden, um unsere FFT-Bins zu 1-Hz-Vielfachen der Basisperiode zu machen, müssten wir uns immer noch mit diesem Bin-'Verschütten' befassen. Dies liegt daran, dass wir nie eine Flügelfrequenz bekommen würden, die immer und genau auf einem einzigen Bin landete. Das bedeutet, dass wir unsere Erkennung eines Kolibris nicht einfach auf den Wert im Offset 2-Bin stützen und den Rest ignorieren können. Wir brauchen eine Möglichkeit, die Daten in einigen Bins zu analysieren, um zu versuchen, sie zu verstehen. Dazu später mehr.
Schritt 6: Bau beginnen
Für meinen Prototyp-Kolibridetektor habe ich extra lange Steckerstifte verwendet, die an die Stifte im Teensy gelötet sind. Ich tat dies, damit ich den Teensy in ein kleines lötfreies Steckbrett stecken konnte. Ich tat dies, weil ich davon ausging, dass ich viele Änderungen am Prototyp vornehmen würde und mit dem Steckbrett könnte ich dies ändern und nur Überbrückungsdrähte überall dort brauchen, wo ich es brauchte. Auf der Unterseite der Audioplatine habe ich Buchsenleisten angelötet, die es ermöglichen, sie auf den Teensy zu stecken. Das Mikrofon ist an der Oberseite der Audioplatine angelötet (siehe Bilder). Weitere Einzelheiten zur Montage finden Sie auf der PJRC-Website:
(https://www.pjrc.com/store/teensy3_audio.html).
Schritt 7: Hardware zum Aufnehmen eines Bildes
Ich habe (naja, meine Frau hat) eine Canon Rebel Digital Camera. An der Kamera befindet sich eine Buchse, an die Sie eine manuelle Fernauslösersteuerung anschließen können. Ich habe eine manuelle Fernbedienung von B&H Photo gekauft. Das Kabel hat an einem Ende die richtige Buchse für die Kamera und ist ungefähr 6 Fuß lang. Ich schneide das Kabel am Ende in der Nähe des Knopfsteuerkastens ab und ich habe die Drähte zurückgezogen und sie an drei Kopfstifte gelötet, die ich in das Steckbrett stecken konnte. Es gibt einen blanken Draht, der geerdet ist und zwei andere Signale: die Spitze ist Trigger (rosa) und der Ring (weiß) ist der Fokus (siehe Bilder). Das Kurzschließen der Spitze und/oder des Rings mit dem Boden betätigt den Verschluss und den Fokus auf der Kamera.
Mit einem Überbrückungsdraht führte ich eine gemeinsame Masse vom Teensy zu einem Bereich, in dem ich ihn auf dem Steckbrett verwenden konnte. Ich habe auch die Anode einer LED an Pin 2 am Teensy und die Kathode der LED an einen Widerstand (100-220 Ohm) an Masse angeschlossen. Ich habe auch Pin 2 des Teensy mit einem 10K-Widerstand verbunden und die andere Seite des Widerstands habe ich mit der Basis eines NPN-Transistors (ein 2N3904 überall gefunden) verbunden. Ich habe den Emitter des Transistors mit Masse verbunden und den Kollektor mit den weißen und rosa Drähten des Kabels verbunden, das zur Kamera führt. Der blanke Draht war wiederum mit Masse verbunden. Immer wenn die LED vom Teensy eingeschaltet wird, schaltet sich auch der NPN-Transistor ein und löst die Kamera (und den Fokus) aus. Siehe den Schaltplan.
Schritt 8: Systemdesign
Da die Flügelschlagfrequenzen des Kolibri wahrscheinlich nicht über ein paar hundert Hz hinausgehen, müssen wir Schallfrequenzen über, sagen wir, ein paar hundert Hz nicht wirklich aufnehmen. Was wir brauchen, ist eine Möglichkeit, nur die gewünschten Frequenzen herauszufiltern. Ein Bandpass oder sogar Tiefpassfilter wäre toll. Traditionell implementieren wir einen Filter in Hardware mit OpAmps oder Switched-Capacitor-Filtern. Aber dank der digitalen Signalverarbeitung und der Softwarebibliotheken des Teensy können wir einen digitalen Filter verwenden (kein Löten erforderlich … nur Software).
PJRC verfügt über eine großartige GUI, mit der Sie Ihr Audiosystem per Drag & Drop für das Teensy und das Audioboard ziehen können. Sie finden es hier:
www.pjrc.com/teensy/gui/
Ich entschied mich, einen der von der PJRC bereitgestellten biquadratischen kaskadierten Filter zu verwenden, um die Schallfrequenzen des Mikrofons (Filters) zu begrenzen. Ich habe drei solcher Filter kaskadiert und für den Bandpassbetrieb auf 100 Hz eingestellt. Dieser Filter lässt die Systemfrequenzen etwas über und etwas unter der Frequenz, an der wir interessiert sind, durch.
Im Blockschaltbild (siehe Bild) ist i2s1 der Audioeingang zum Audioboard. Ich habe beide Audiokanäle an einen Mixer und dann an die Filter angeschlossen (das Mikrofon ist nur ein Kanal, aber ich habe beide gemischt, damit ich nicht herausfinden musste, welcher Kanal es war … nennen Sie mich faul). Ich leite den Ausgang des Filters zum Audioausgang (damit ich das Audio hören kann, wenn ich möchte). Ich habe auch das Audio von den Filtern mit dem FFT-Block verbunden. Im Blockdiagramm ist der mit sgtl5000_1 bezeichnete Block der Audio-Controller-Chip. Es braucht keine Verbindungen im Diagramm.
Nachdem Sie all diese Blockkonstruktionen durchgeführt haben, klicken Sie auf Exportieren. Dadurch wird ein Dialogfeld geöffnet, in dem Sie den aus dem Blockdiagramm generierten Code kopieren und in Ihre Teensy-Anwendung einfügen können. Wenn Sie sich den Code ansehen, können Sie sehen, dass es sich um eine Instanz jedes Steuerelements zusammen mit den "Verbindungen" zwischen den Komponenten handelt.
Schritt 9: Code
Es würde zu viel Platz in diesem Instructable beanspruchen, die Software im Detail durchzugehen. Was ich versuchen werde, ist, einige der Schlüsselbits des Codes hervorzuheben. Aber dies ist sowieso keine sehr große Anwendung. PJRC hat ein großartiges Video-Tutorial zur Verwendung von Teensy und den Audiobibliotheken/Tools (https://www.youtube.com/embed/wqt55OAabVs).
Ich begann mit etwas FFT-Beispielcode von PJRC. Ich habe das, was ich vom Audiosystem-Design-Tool erhalten habe, oben in den Code eingefügt. Wenn Sie sich den Code danach ansehen, sehen Sie eine Initialisierung und dann beginnt das System, Audio vom Mikrofon zu digitalisieren. Die Software tritt in die 'forever'-Schleife() ein und wartet mit einem Aufruf der Funktion fft1024_1.available() darauf, dass FFT-Daten verfügbar sind. Wenn FFT-Daten verfügbar sind, nehme ich eine Kopie der Daten und verarbeite sie. Beachten Sie, dass ich nur Daten erfasse, wenn die größte Bin-Größe über einem festgelegten Wert liegt. Mit diesem Wert stelle ich die Empfindlichkeit des Systems ein. Wenn die Bins über dem eingestellten Wert liegen, normalisiere ich die Welle und übertrage sie zur Verarbeitung in ein temporäres Array, andernfalls ignoriere ich sie und warte weiter auf eine weitere FFT. Ich sollte erwähnen, dass ich auch die Mikrofonverstärkungsfunktion verwende, um die Empfindlichkeit der Schaltung anzupassen (sgtl5000_1.micGain(50)).
Das Normalisieren der Welle bedeutet nur, dass ich alle Bins so anpasse, dass die Bin mit dem größten Wert gleich eins ist. Alle anderen Bins werden im gleichen Verhältnis skaliert. Dies erleichtert die Analyse der Daten.
Ich habe mehrere Algorithmen verwendet, um die Daten zu analysieren, aber ich habe mich darauf festgelegt, nur zwei zu verwenden. Ein Algorithmus berechnet die Fläche unter der durch die Bins gebildeten Kurve. Dies ist eine einfache Berechnung, die nur die Werte der Bins über den interessierenden Bereich addiert. Ich vergleiche diesen Bereich, um festzustellen, ob er über einem Schwellenwert liegt.
Der andere Algorithmus verwendet ein konstantes Array von Werten, die eine normalisierte FFT darstellen. Diese Daten sind das Ergebnis einer echten (optimalen) Kolibri-Signatur. Ich nenne das eine Hecke. Ich vergleiche die Hedge-Daten mit den normalisierten FFT-Daten, um zu sehen, ob die entsprechenden Bins innerhalb von 20% voneinander liegen. Ich habe 20% gewählt, aber dieser Wert könnte leicht angepasst werden.
Ich zähle auch, wie oft die einzelnen Algorithmen denken, sie hätten eine Übereinstimmung, das heißt, sie meinen, einen Kolibri zu hören. Ich verwende diese Zählung als Teil der Kolibri-Bestimmung, da es zu einer falschen Auslösung kommen kann. Wenn zum Beispiel ein Geräusch laut ist oder die Flügelfrequenz des Vogels enthält, wie zum Beispiel Händeklatschen, erhalten Sie möglicherweise einen Auslöser. Aber wenn die Zählung über einer bestimmten Zahl liegt (eine Zahl, die ich wähle), sage ich, dass es sich um einen Kolibri handelt. Wenn dies geschieht, schalte ich die LED ein, um anzuzeigen, dass wir einen Treffer haben, und dieselbe Schaltung löst die Kamera über den NPN-Transistor aus. In der Software habe ich die Auslösezeit der Kamera auf 2 Sekunden eingestellt (die Zeit, in der die LED und der Transistor an sind).
Schritt 10: Montage
Auf dem Bild seht ihr, wie ich (kurzfristig) die Elektronik montiert habe. Ich hatte den Teensy an ein Steckbrett gesteckt, das zusammen mit einem anderen (unbenutzten) Arduino-kompatiblen (einem Arduino Zero, glaube ich) auf einer Trägerplatine befestigt war. Ich habe das Ganze an einer Metallmarkisenstange auf meinem Deck drahtgebunden (ich habe auch das Kabel zur Kamera zugentlastet). Die Stange war direkt neben dem Kolibri-Feeder. Ich habe die Elektronik mit einem kleinen LiPo-Power-Brick betrieben, mit dem Sie ein totes Handy aufladen können. Der Power-Brick hatte einen USB-Anschluss, mit dem ich den Teensy mit Strom versorgte. Ich führte das Fernauslösekabel zur Kamera und steckte es ein. Ich war bereit für einige Vogelaktionen!
Schritt 11: Ergebnisse
Ich habe die Kamera auf einem Stativ in der Nähe des Feeders aufgestellt. Ich hatte die Kamera auf die vordere Kante des Einzugs fokussiert und sie auf den Sportmodus eingestellt, der mehrere schnelle Bilder macht, wenn der Auslöser gedrückt wird. Mit der Auslösezeit von 2 Sekunden habe ich ca. 5 Fotos pro Triggerereignis aufgenommen.
Ich habe ein paar Stunden damit verbracht, an der Software herumzufummeln, als ich das zum ersten Mal ausprobierte. Ich musste die Empfindlichkeit und die sukzessive Algorithmus-Trefferzahl anpassen. Ich habe es endlich gezwickt und ich war bereit.
Das erste Bild, das es machte, war ein Vogel, der wie ein Düsenjäger in den Rahmen flog, als würde er eine schnelle Kurvenfahrt machen (siehe oben). Ich kann Ihnen nicht sagen, wie aufgeregt ich war. Ich saß eine Weile ruhig auf der anderen Seite des Decks und ließ das System arbeiten. Ich habe es geschafft, viele Bilder aufzunehmen, aber ich habe einige weggeworfen. Es stellt sich heraus, dass man manchmal nur einen Vogelkopf oder -schwanz bekommt. Außerdem habe ich falsche Trigger, die auftreten können. Insgesamt habe ich glaube ich 39 Bilder behalten. Die Vögel brauchten einige Fahrten zum Futterhäuschen, um sich an das Auslösegeräusch der Kamera zu gewöhnen, aber sie schienen es schließlich zu ignorieren.
Schritt 12: Abschließende Gedanken
Das war ein lustiges Projekt und es funktioniert. Aber wie bei den meisten Dingen gibt es viel Raum für Verbesserungen. Der Filter könnte sicherlich anders sein (wie ein Tiefpassfilter oder Änderungen an der Anordnung und / oder Parametern) und vielleicht funktioniert es dadurch besser. Ich bin mir auch sicher, dass es bessere Algorithmen zum Ausprobieren gibt. Ich werde im Sommer einiges davon ausprobieren.
Mir wurde gesagt, dass es Open-Source-Code für maschinelles Lernen gibt … vielleicht könnte das System "trainiert" werden, um Kolibris zu identifizieren! Ich bin mir nicht sicher, ob ich das versuchen werde, aber vielleicht.
Welche anderen Dinge könnten zu diesem Projekt hinzugefügt werden? Wenn die Kamera über einen Datums-/Zeitstempel verfügt, können Sie diese Informationen zu den Bildern hinzufügen. Eine andere Sache, die Sie tun können, ist das Audio aufzunehmen und auf einer uSD-Karte zu speichern (das PJRC-Audioboard hat einen Steckplatz dafür). Das gespeicherte Audio kann möglicherweise zum Trainieren eines Lernalgorithmus verwendet werden.
Vielleicht könnte irgendwo eine Ornithologieschule ein solches Gerät verwenden? Sie können Informationen wie Fütterungszeiten und Fütterungshäufigkeit sammeln und mit den Bildern können Sie möglicherweise bestimmte Vögel identifizieren, die zum Fressen zurückkehren.
Meine Hoffnung ist, dass jemand anderes dieses Projekt erweitert und das, was sie machen, mit anderen teilt. Einige Leute haben mir gesagt, dass diese Arbeit, die ich gemacht habe, in ein Produkt umgewandelt werden sollte. Ich bin mir nicht so sicher, aber ich würde es eher als Lernplattform und für die Wissenschaft sehen.
Danke fürs Lesen!
Um den von mir geposteten Code zu verwenden, benötigen Sie die Arduino IDE (https://www.arduino.cc/en/Main/Software). Sie benötigen außerdem den Teensyduino-Code von PJRC (https://www.pjrc.com/teensy/td_download.html).