Cuprins:

Detector colibri / Picture-Taker: 12 pași (cu imagini)
Detector colibri / Picture-Taker: 12 pași (cu imagini)

Video: Detector colibri / Picture-Taker: 12 pași (cu imagini)

Video: Detector colibri / Picture-Taker: 12 pași (cu imagini)
Video: CEA MAI RAPIDĂ MINI PTZ CCTV Cameră IEFTINĂ! 2024, Iulie
Anonim
Detector de colibri / Picture-Taker
Detector de colibri / Picture-Taker

Avem un alimentator de colibri pe puntea noastră din spate și, în ultimii câțiva ani, le fotografiez. Colibri sunt mici creaturi uimitoare, foarte teritoriale, iar luptele lor pot fi atât de hilar, cât și uimitoare. Dar mă săturasem să stau ca o statuie pe fundul casei pentru a le face poze. Aveam nevoie de o modalitate de a face fotografii fără a fi nevoie să stau în spatele casei pentru perioade lungi de timp în așteptare. Știu că aș fi putut folosi un declanșator controlat de la distanță, dar am vrut ca fotografiile să fie făcute automat fără ca eu să fiu acolo. Așa că am decis să fac un dispozitiv pentru detectarea colibriilor și să fac o poză automat.

Întotdeauna am intenționat să folosesc un microcontroler pentru a face acest lucru. Microcontrolerul ar putea conduce declanșatorul camerei sub control software. Dar senzorul pentru detectarea unei mici colibri a fost un alt lucru. Aș fi putut folosi un senzor de mișcare, dar am vrut să încerc ceva unic. Am decis să folosesc sunetul ca declanșator.

Pasul 1: Alegerea unui microcontroler

Alegerea unui microcontroler
Alegerea unui microcontroler

Microcontrolerul pe care l-am ales a fost un PJRC Teensy. Teensy utilizează un microcontroler ARM, în special un ARM Cortex M4. Cortex M4 conține hardware-ul pentru a efectua o FFT (Fast Fourier Transform) care ar face detectarea. PJRC vinde, de asemenea, o placă audio care vă permite să utilizați Teensy pentru a reda muzică, precum și pentru a înregistra audio cu o intrare externă sau un mic microfon pe care îl puteți adăuga pe placă. Planul meu a fost ca Teensy să efectueze un FFT pe audio de la microfon.

Pasul 2: FFT?

FFT?
FFT?

Un FFT este o formulă / algoritm matematic care transformă un semnal din domeniul timpului în domeniul frecvenței. Ceea ce înseamnă acest lucru este că preia sunetul eșantionat din timp de la microfon și îl transformă în magnitudini ale frecvențelor prezente în unda originală. Vedeți, orice undă continuă arbitrară poate fi construită dintr-o serie de unde sinusoidale sau cosinus care sunt multipli întregi ai unei anumite frecvențe de bază. Un FFT face opusul: ia o undă arbitrară și o transformă în magnitudinile undelor care, dacă ar fi însumate, ar crea unda arbitrară originală. O modalitate și mai simplă de a spune acest lucru este că am planificat să folosesc software-ul și hardware-ul FFT în Teensy pentru a stabili dacă „aude” aripa aripilor unui colibri la frecvența în care apar aripile aripilor. Dacă „aude” o colibri, voi trimite o comandă unei camere pentru a face o fotografie.

A mers! Deci, cum am făcut-o, cum ați putut-o face și cum ați putea-o face și mai bună?

Pasul 3: Cum sună un colibri care planează?

Ce sună un colibri care planează?
Ce sună un colibri care planează?

În primul rând, trebuia să-mi dau seama cu ce frecvență aș auzi clapetele aripii colibriului. Pentru a determina acest lucru, mi-am folosit iPhone-ul. Am atașat iPhone-ul la un trepied și l-am pus să înregistreze videoclipuri cu mișcare lentă direct în fața alimentatorului colibri de pe puntea noastră. După o perioadă de timp am îndepărtat camera și am descărcat videoclipul. Am urmărit apoi videoclipul în căutarea unei colibri în fața alimentatorului. Când am găsit o secvență bună, am numărat numărul de cadre individuale necesare colibriului pentru a bate din aripi dintr-o poziție până la aceeași poziție. Mișcarea lentă pe iPhone este de aproximativ 240 de cadre pe secundă. Am observat un colibri planând în fața alimentatorului și am numărat 5 cadre pentru ca acesta să-și mute aripile din poziția înainte în poziția din spate și apoi să revină în poziția înainte. Este vorba de 5 cadre din 240. Amintiți-vă, auzim un sunet la fiecare lovitură a aripilor colibriului (una pe cursa înainte și una pe cursa înapoi). Pentru 5 cadre pentru un ciclu sau perioadă, putem calcula frecvența ca una împărțită la perioada adică 1 / (5/240) sau 48 Hz. Aceasta înseamnă că, atunci când colibriul acesta planează, sunetul pe care îl auzim trebuie să fie de două ori mai mare sau aproximativ 96 Hz. Frecvența este probabil mai mare atunci când zboară și nu planează. Poate fi afectat și de masa lor, dar cred că putem presupune că majoritatea păsărilor din aceeași specie au aproximativ aceeași masă.

Pasul 4: Seria Fourier și Teensy

Seria Fourier și Teensy
Seria Fourier și Teensy

Teensy (am folosit un Teensy 3.2) este realizat de PJRC (www.pjrc.com). FFT va fi calculat pe un eșantion de sunet. Pentru a obține sunetul, PJRC vinde o placă de adaptor audio pentru Teensy (TEENSY3_AUDIO - 14,25 USD). De asemenea, vând un mic microfon care poate fi lipit pe placa adaptorului audio (MICROFON - 1,25 USD). Placa adaptorului audio utilizează un cip (SGTL5000) cu care Teensy poate vorbi printr-o magistrală serial (I2S). Teensy folosește SGTL5000 pentru a prelua audio de la microfon și a-l digitaliza, adică a crea un set de numere care reprezintă sunetul pe care îl aude microfonul.

Un FFT este doar o versiune rapidă a ceea ce se numește Transformată Fourier Discretă (DFT). Un DFT poate fi efectuat pe un număr arbitrar de eșantioane, totuși, un FFT trebuie să aibă eșantioanele stocate în seturi care sunt multipli binari. Hardware-ul Teensy poate efectua un FFT pe un set de 1024 mostre (1024 = 2 ^ 10), deci asta vom folosi.

Un FFT produce de obicei, ca ieșire, mărimile ȘI relațiile de fază dintre diferitele unde reprezentate. Pentru această aplicație nu ne preocupă relațiile de fază, ci suntem interesați de mărimi și de frecvența acestora.

Placa audio Teensy probează sunetul la o frecvență de 44, 100 Hz. Deci, 1024 probe la această frecvență reprezintă un interval de timp de 1024/44100 sau aproximativ 23,2 milisecunde. În acest caz, FFT va produce ca ieșire, magnitudini care sunt multipli întregi ai perioadei de eșantionare de 43 Hz (din nou, 1 / 0,0232 este egal cu aproximativ 43 Hz). Am dori să căutăm magnitudini care sunt de aproximativ două ori mai mari decât această frecvență: 86 Hz. Nu este tocmai frecvența calculatoarelor aripilor colibri, dar este suficient de aproape așa cum vom vedea.

Pasul 5: Utilizarea datelor Fourier

Folosind datele Fourier
Folosind datele Fourier

Bibliotecile oferite de PJRC pentru Teensy vor procesa probele și vor returna o serie de valori de magnitudine. Vom face referire la fiecare magnitudine din matricea returnată ca un coș. Primul coș (la offset zero în tabloul de date pe care îl obținem înapoi) este decalajul DC al undei. Putem ignora în siguranță această valoare. Al doilea coș (la offset 1) va reprezenta magnitudinea componentei de 43 Hz. Aceasta este perioada noastră de bază. Următorul compartiment (la offset 2) va reprezenta magnitudinea componentei de 86 Hz și așa mai departe. Fiecare coș ulterior este un multiplu întreg al perioadei de bază (43 Hz).

Acum, aici devine puțin ciudat. Dacă am folosi un FFT pentru a analiza un sunet perfect de 43 Hz, atunci FFT ar întoarce primul coș la o magnitudine mare și toate restul coșurilor ar fi egal cu zero (din nou, într-o lume perfectă). Dacă sunetul pe care l-am captat și analizat a fost de 86 Hz, atunci coșul la offset unul ar fi zero, iar coșul la offset 2 (a doua armonică) ar avea o magnitudine mare, iar restul coșurilor ar fi zero și așa mai departe. Dar dacă am captura sunetul unei colibri și ar fi 96 Hz (așa cum am măsurat pe o singură pasăre), atunci offset 2 bin @ 86 Hz ar avea o magnitudine de o valoare ușor mai mică (decât ar avea unda perfectă de 86 Hz) și coșurile din jur (unul mai jos și câteva mai mari) ar avea fiecare o valoare diferită de zero.

Dacă dimensiunea eșantionului pentru FFT-ul nostru a fost mai mare de 1024 sau dacă frecvența noastră de eșantionare audio a fost mai mică, am putea îmbunătăți rezoluția coșurilor noastre (adică mai mică). Dar chiar dacă am schimba aceste lucruri pentru a face coșurile noastre FFT 1 Hz multipli ai perioadei de bază, ar trebui totuși să ne ocupăm de această „coadă” a coșului. Acest lucru se datorează faptului că nu am primi niciodată o frecvență aripă care să aterizeze, întotdeauna și exact, pe un singur coș. Aceasta înseamnă că nu putem să ne bazăm doar detectarea unei colibri pe valoarea din coșul offset 2 și să ignorăm restul. Avem nevoie de o modalitate de a analiza datele în câteva coșuri pentru a încerca să le dăm sens. Mai multe despre asta mai târziu.

Pasul 6: Începeți construcția

Începeți construcția
Începeți construcția
Începeți construcția
Începeți construcția

Pentru prototipul meu de detector de colibri, am folosit știfturi bărbați-bărbați foarte lungi lipite pe știfturile din Teensy. Am făcut acest lucru pentru a putea conecta Teensy la o mică placă de lipit fără lipire. Am făcut acest lucru pentru că am presupus că voi face o mulțime de modificări în prototip și, cu panoul de măsurare, aș putea schimba acest lucru și doar firele jumper oriunde am nevoie. Am lipit benzi feminine pe partea inferioară a plăcii audio, ceea ce îi permite să fie conectat la partea superioară a Teensy. Microfonul este lipit în partea superioară a plăcii audio (vezi imagini). Mai multe detalii despre asamblare găsiți pe site-ul PJRC:

(https://www.pjrc.com/store/teensy3_audio.html).

Pasul 7: Hardware pentru a face o imagine

Hardware pentru a face o imagine
Hardware pentru a face o imagine
Hardware pentru a face o imagine
Hardware pentru a face o imagine

Am (bine, soția mea are) o cameră digitală Canon Rebel. Există o mufă pe cameră care vă permite să conectați un control manual al declanșatorului. Am achiziționat o telecomandă manuală de la B&H Photo. Cablul are mufa corectă pentru a se potrivi camerei la un capăt și are o lungime de aproximativ 6 picioare. Am tăiat cablul la capăt lângă cutia de comandă a butonului și am dezbrăcat firele și le-am lipit pe trei știfturi de antet pe care le puteam conecta la panoul de control. Există un fir gol care este împământat și alte două semnale: vârful este declanșator (roz) și inelul (alb) este focalizat (vezi imaginile). Scurtcircuitul vârfului și / sau inelului la sol acționează obturatorul și focalizarea pe cameră.

Folosind un fir jumper, am pornit de la Teensy către o zonă comună unde o puteam folosi pe panou. De asemenea, am conectat anodul unui LED la pinul 2 de pe Teensy și catodul LED-ului la un rezistor (100-220 ohmi) la masă. De asemenea, am conectat pinul 2 al Teensy la un rezistor de 10K și cealaltă parte a rezistorului am conectat-o la baza unui tranzistor NPN (un 2N3904 găsit peste tot). Am conectat emițătorul tranzistorului la masă și colectorul l-am conectat la firele albe și roz de la cablul care merge la cameră. Sârmă goală, din nou, a fost conectată la masă. Ori de câte ori LED-ul este pornit de Teensy, tranzistorul NPN se va aprinde și va declanșa camera (și focalizarea). Vezi schema.

Pasul 8: Proiectarea sistemului

Proiectarea sistemului
Proiectarea sistemului

Deoarece frecvențele de aripi ale colibriului Hummingbird nu depășesc probabil câteva sute de Hz, atunci nu este nevoie să înregistrăm frecvențe de sunet peste, să zicem, câteva sute de Hz. Avem nevoie de o modalitate de a filtra doar frecvențele dorite. Un filtru bandpass sau chiar lowpass ar fi minunat. În mod tradițional, am implementa un filtru în hardware folosind OpAmps sau filtre cu condensator comutat. Dar, datorită procesării digitale a semnalului și a bibliotecilor software ale Teensy, putem folosi un filtru digital (nu este nevoie de lipire … doar software).

PJRC are o GUI excelentă disponibilă, care vă permite să glisați și să fixați sistemul audio pentru placa Teensy și audio. O găsiți aici:

www.pjrc.com/teensy/gui/

Am decis să folosesc unul dintre filtrele în cascadă biquadratic furnizate de PJRC pentru a restricționa frecvențele sunetului de la microfon (filtru). Am montat în cascadă trei astfel de filtre și le-am setat pentru funcționarea bandpass la 100 Hz. Acest filtru va permite accesul la frecvențele sistemului puțin mai sus și puțin sub frecvența care ne interesează.

În diagrama bloc (a se vedea imaginea) i2s1 este intrarea audio la placa audio. Am conectat ambele canale audio la un mixer și apoi la filtre (microfonul este doar un canal, dar le-am amestecat pe amândouă, așa că nu a trebuit să-mi dau seama ce canal era … spune-mi leneș). Rulez ieșirea filtrului către ieșirea audio (așa că pot auzi sunetul dacă vreau). Am conectat și sunetul de la filtre la blocul FFT. În diagrama bloc, blocul etichetat sgtl5000_1 este cipul controlerului audio. Nu are nevoie de conexiuni în diagramă.

După ce faceți toate aceste construcții de blocuri, faceți clic pe Export. Aceasta afișează o casetă de dialog în care puteți copia codul care a fost generat din diagrama bloc și îl puteți lipi în aplicația dvs. Teensy. Dacă vă uitați la cod, puteți vedea că este o instanțiere a fiecărui control împreună cu „conexiunile” dintre componente.

Pasul 9: Cod

Cod
Cod

Ar fi nevoie de prea mult spațiu în acest instructabil pentru a trece peste software în detaliu. Ceea ce voi încerca să fac este să evidențiez câteva dintre elementele cheie de cod. Dar oricum nu este o aplicație foarte mare. PJRC are un tutorial video excelent despre utilizarea Teensy și a bibliotecilor / instrumentelor audio (https://www.youtube.com/embed/wqt55OAabVs).

Am început cu câteva exemple de cod FFT de la PJRC. Am lipit ceea ce am obținut de la instrumentul de proiectare a sistemului audio în partea de sus a codului. Dacă te uiți la cod după aceasta, vei vedea câteva inițializări și atunci sistemul începe să digitalizeze sunetul de la microfon. Software-ul intră în bucla „forever” () și așteaptă ca datele FFT să fie disponibile utilizând un apel către funcția fft1024_1.available (). Când datele FFT sunt disponibile, iau o copie a datelor și le procesez. Rețineți că, obțin date numai dacă cea mai mare magnitudine a coșului este peste o valoare setată. Această valoare este modul în care am setat sensibilitatea sistemului. Dacă coșurile sunt peste valoarea setată, atunci normalizez valul și îl transfer într-o matrice temporară pentru procesare, în caz contrar, îl ignor și continuu să aștept un alt FFT. Ar trebui să menționez că folosesc și funcția de control a câștigului microfonului pentru a regla sensibilitatea circuitului (sgtl5000_1.micGain (50)).

Normalizarea valului înseamnă doar că ajustez toate coșurile astfel încât coșul cu cea mai mare valoare să fie setat egal cu unul. Toate celelalte coșuri sunt reduse la aceeași proporție. Acest lucru face ca datele să fie mai ușor de analizat.

Am folosit mai mulți algoritmi pentru a analiza datele, dar am decis să folosesc doar doi. Un algoritm calculează aria de sub curba formată de pubele. Acesta este un calcul simplu care adaugă doar valorile coșurilor din regiunea de interes. Compar această zonă pentru a determina dacă este peste un prag.

Celălalt algoritm folosește o matrice constantă de valori care reprezintă un FFT normalizat. Aceste date sunt rezultatele unei semnături reale (optime) de colibri. Eu numesc asta un gard viu. Compar datele de acoperire cu datele FFT normalizate pentru a vedea dacă pubelele corespunzătoare se află la 20% una de cealaltă. Am ales 20%, dar această valoare poate fi ajustată cu ușurință.

De asemenea, număr de câte ori algoritmii individuali cred că au o potrivire, adică cred că aud un colibri. Folosesc acest număr ca parte a determinării colibriului, deoarece poate apărea o declanșare falsă. De exemplu, atunci când orice sunet este puternic sau conține frecvența aripilor păsărilor, cum ar fi palme de mâini, este posibil să obțineți un declanșator. Dar dacă numărul este peste un anumit număr (un număr pe care îl aleg) spun că este o colibri. Când se întâmplă acest lucru, aprind LED-ul pentru a indica faptul că avem o lovitură și aceleași circuite declanșează camera prin tranzistorul NPN. În software am setat timpul de declanșare al camerei la 2 secunde (timpul în care LED-ul și tranzistorul sunt aprinși).

Pasul 10: Montare

Montare
Montare

Puteți vedea în imagine cum am montat (necerimonios) dispozitivele electronice. Am avut Teensy conectat la o placă de prindere care era lipită de o placă de transport împreună cu un alt compatibil Arduino (neutilizat) (un Arduino Zero cred). Am legat toate lucrurile de un stâlp metalic de copertină de pe puntea mea (am adăugat, de asemenea, o tensiune la cablul care rulează spre cameră). Stâlpul era chiar lângă alimentatorul colibriului. Am alimentat dispozitivele electronice cu o cărămidă mică LiPo pe care s-ar putea să o folosiți pentru a reîncărca un telefon mobil mort. Caramida de alimentare avea un conector USB pe care l-am folosit pentru a trece la Teensy. Am rulat cablul de declanșare de la distanță către cameră și l-am conectat. Eram pregătit pentru o acțiune de pasăre!

Pasul 11: Rezultate

Rezultate
Rezultate

Am montat camera pe un trepied lângă alimentator. Am avut camera focalizată chiar pe marginea frontală a alimentatorului și am setat-o pe modul Sport, care face mai multe fotografii rapide atunci când declanșatorul este apăsat. Cu timpul de declanșare de 2 secunde am capturat aproximativ 5 fotografii pe eveniment declanșator.

Am petrecut câteva ore jucându-mă cu software-ul prima dată când am încercat asta. A trebuit să ajustez sensibilitatea și numărul succesor de algoritmi succesivi. În cele din urmă l-am modificat și am fost gata.

Prima fotografie pe care a făcut-o a fost o pasăre care a zburat în cadru, ca și cum ar fi luat o viraj de mare viteză ca un avion de luptă (vezi mai sus). Nu pot să vă spun cât de emoționată am fost. Am stat liniștit pe cealaltă parte a punții o vreme și am lăsat sistemul să funcționeze. Am reușit să înregistrez o mulțime de imagini, dar am aruncat destul de multe. Se pare că, uneori, ai doar capul sau coada unei păsări. De asemenea, am declanșatori falși, care pot apărea. În total cred că am păstrat 39 de poze. Păsărilor le-au trebuit câteva călătorii la alimentator pentru a se obișnui cu sunetul obturatorului de la cameră, dar în cele din urmă păreau să-l ignore.

Pasul 12: Gânduri finale

Gânduri finale
Gânduri finale

Acesta a fost un proiect distractiv și funcționează. Dar, la fel ca majoritatea lucrurilor, există o mulțime de spațiu de îmbunătățit. Filtrul poate fi cu siguranță diferit (cum ar fi un filtru low-pass sau modificări ale aranjamentului și / sau parametrilor) și poate asta ar putea să-l facă să funcționeze mai bine. De asemenea, sunt sigur că există algoritmi mai buni de încercat. Voi încerca ceva din asta vara.

Mi s-a spus că există cod open-source de învățare automată acolo … poate sistemul ar putea fi „antrenat” pentru a identifica colibri! Nu sunt sigur că voi încerca asta, dar poate.

Ce alte lucruri s-ar putea adăuga acestui proiect? În cazul în care aparatul foto avea un ștampilator de dată / oră, puteți adăuga aceste informații la imagini. Un alt lucru pe care l-ați putea face este să înregistrați audio și să îl salvați pe un card uSD (placa audio PJRC are un slot pentru unul). Este posibil ca audio-ul salvat să poată fi utilizat pentru instruirea unui algoritm de învățare.

Poate undeva, o școală de ornitologie ar putea folosi un astfel de dispozitiv? S-ar putea să fie capabili să culeagă informații precum timpii de hrănire, frecvența hrănirii și, cu imaginile, s-ar putea să puteți identifica păsări specifice care se întorc să se hrănească.

Speranța mea este că altcineva extinde acest proiect și împărtășește ceea ce fac cu alții. Unii oameni mi-au spus că această muncă pe care am făcut-o ar trebui transformată într-un produs. Nu sunt atât de sigur, dar aș prefera să o văd folosită ca o platformă de învățare și pentru știință.

Mulțumesc pentru lectură!

Pentru a utiliza codul pe care l-am postat, veți avea nevoie de IDE-ul Arduino (https://www.arduino.cc/en/Main/Software). De asemenea, veți avea nevoie de codul Teensyduino de la PJRC (https://www.pjrc.com/teensy/td_download.html).

Recomandat: