Tanulja meg, hogyan építsen fémdetektort egy Colpitts oszcillátor és egy Arduino segítségével.
How Do Metal Detectors Work?
A tartálykör
A fenti áramkörben a soros kondenzátor és az induktor egy tartálykört alkot. Egy tartályáramkörben az energia ismételten átkerül egy kondenzátor és egy induktor között, ami rezgést eredményez. A kondenzátorból lemerülő áram átfolyik az induktoron; amikor a kondenzátor teljesen lemerül, az induktor csökkenő mágneses tere fenntartja az áramáramlást. A kondenzátor ezután ellentétes polaritással töltődik, és amikor a mágneses mező teljesen összeomlik, a kondenzátor kisül, ami az eredeti árammal ellentétes irányú áramáramlást eredményez. Ez a ciklus folytatódik.
A fenti tartálykör induktora alkotja a fémdetektor érzékelőjét (egy nagy dróttekercs). Amikor a fémanyag megközelíti az induktor (az érzékelő tekercs) középpontját, belép az induktor által létrehozott mágneses mezőbe. Ez megváltoztatja az induktor magjának mágneses permeabilitását, ami az induktivitás változását okozza. Az induktivitás változása viszont megváltoztatja a tartálykör rezgési frekvenciáját.
Ha az alkatrészek ideálisak lennének, a tartálykör külső áramforrás nélkül a végtelenségig rezegne. A gyakorlatban azonban az alkatrészek nem ideálisak. Az alkatrészek nem kívánt ellenállása energiaveszteséget okoz, ami miatt a rezgőáram kúposan leáll. Ennek ellensúlyozására egy egyfokozatú BJT invertáló erősítővel folyamatosan erősítést adunk a tartályáramkörhöz.
A Colpitts-oszcillátor
Mivel a rezgés az induktor előtti és utáni csomópontokon 180°-kal fázison kívül van egymással, az egyik csomópont a rezgést a tranzisztor bázisára táplálja, a kollektoron erősíti és invertálja a jelet, majd fázisban visszaadja azt a tartályáramkör másik csomópontjára. Ezt az egész áramkört Colpitts-oszcillátornak nevezzük.
A fenti Colpitts-oszcillátor egyenletes oszcillációt biztosít 100 kHz-es frekvenciával. A háztartási tárgyakból származó fémek, amelyek megváltoztatják az induktormag permeabilitását, ezt a frekvenciát 10kHz körül ingadoztatják. Mivel ez a frekvenciatartomány kívül esik az emberi hangspektrumon (20Hz és 20kHz között), az oszcillációt hallható hanggá kell alakítanunk.
A hagyományos BFO (beat-frequency oscillator) fémdetektorok ezt a problémát úgy oldják meg, hogy egy másik, a detektor tartálykörének frekvenciájával megegyező fix frekvenciájú tartálykört építenek be a fémek hatása nélkül. Ezután a két frekvencia közötti különbség felvétele elszigeteli az érzékelő áramkör ingadozó frekvenciáit, és hallható tartományba hozza le.
Ez a fémdetektor projekt esetében egy Arduino-t fogunk használni az oszcillációs jel feldolgozására, ahelyett, hogy egy második tartálykörrel ellensúlyoznánk az oszcillációt. Az Arduino tárolja a rögzített frekvenciát, és folyamatosan összehasonlítja az érzékelő áramkör bejövő frekvenciáját a tárolt frekvenciával (az Arduino programról bővebben alább).
A DIY fémdetektorod anyagai
Ehhez a projekthez egy játék gyomirtót választottunk az összes alkatrész elhelyezésére. A következő funkciókat tartalmazza:
- egy indítógomb, amelyet a hangszóró indítására fogunk áthasználni
- egy oldalsó gomb, amelyet a rögzített frekvencia beállítására fogunk használni
- egy elemtartó (3xAA elem) egy ON/OFF kapcsolóval
- egy hangszóró, amelyen keresztül fogjuk lejátszani a hangot
- egy motor, amelyhez LED-ek csatlakoznak, amelyeket akkor fogunk aktiválni, ha a frekvencia különbség meghalad egy bizonyos küszöbértéket
- egy kör alakú fej, amelybe egy huzal tekercset fogunk illeszteni a tartály áramkör induktorához
Egy potenciométert (ezüst) is hozzá fogunk adni, hogy a hangváltozások érzékenysége állítható legyen.
Az induktortekercs körülbelül 50 tekercs 26 AWG huzalból készül egy 5,5 hüvelyk átmérőjű orsó körül.
A házban az eredeti áramköri lapot saját áramkörrel helyettesítjük, és az összes perifériát tűs fejlécekkel csatlakoztatjuk az áramkörhöz.
Fémérzékelő áramkör kapcsolási rajzai
Egy Arduino UNO-t használtam egy DIP ATMega328 programozásához. Ezután eltávolítottam az ATMega328-at a fejlesztési lapról, és az áramkör többi részével együtt egy perfboardba ágyaztam.
A Colpitts oszcillátor, az ábrán balra lent, az oszcillációt a chip 1-es számlálójába (T1-es csap) táplálja (az Arduino UNO-n digitális 5-ös csapként jelölve), ahol folyamatosan számolja az oszcilláció frekvenciáját.
A diagram felső szintjén egy 4. sz.5V (3xAA elemek, áthidaló kondenzátorokkal) az ATmega328, az oszcillátor, a hangszóró és a motor (LED-ekkel) táplálására szolgál.
A mikrokontroller digitális csapjainak áramfelvételét biztonságos szinten tartandó (az ATmega328 esetében csaponként legfeljebb 40 mA), egy NPN tranzisztort (C2878) használunk a hangszóró meghajtására, és egy N-csatornás MOSFET-et (SUB45N03) a motor meghajtására.
Mind a trigger, mind a reset (fix frekvenciát állít be) kapcsolók belső pull-up konfigurációval digitális csapokhoz vannak kötve. Kis kondenzátorokat adunk hozzá párhuzamosan a kapcsolók debounce-olásához.
Az érzékenységi potenciométer feszültségosztóként van beállítva, és az osztás egy analóg pin segítségével olvasható.
Kódbejárás
A projekt teljes forráskódja itt található:
- https://github.com/evankale/ArduinoMetalDetector
A következőkben a kód részletes bejárása található.
Elhelyezési funkció
Az érzékelő oszcillációs frekvenciájának az időzítő számláló 1 segítségével történő követéséhez először az időzítő/számlálóvezérlő regisztereket (TCCR) kell konfigurálnunk. Ezekhez a TCCR-ekhez a három egész számon keresztül lehet hozzáférni: TTCR1A, TTCR1B és TTCR1C.
TCCR1A = 0b00000000;TCCR1B = 0b00000111;
A TCCR1A és TCCR1B WGM-zászlóinak 0-ra állításával normál üzemmódra kell állítanunk a hullámforma generálását, és a TCCR1B CS-zászlóinak 3. üzemmódra állításával (külső órajel emelkedő élre) külső órajelforrásra kell állítanunk az órajelsebesség-választási módot. Ebben a konfigurációban az OCR1A regiszter minden alkalommal, amikor az oszcilláció emelkedő élét érzékeljük, 1-gyel dekrementálódik.
TIMSK1 |= (1 << OCIE1A);
A következő lépésként engedélyeznünk kell az időzítő/számláló A megszakítását a TIMSK1 regiszter OCIE1A flagjének beállításával. Ez lehetővé teszi a SIGNAL(TIMER1_COMPA_vect) megszakítási függvény meghívását, amikor az OCR1A regiszter eléri a 0 értéket.
OCR1A = 1;
Most inicializáljuk az OCR1A-t 1-re, hogy a megszakítási függvényt az első emelkedő él érzékelésekor azonnal meghívjuk.
megszakítási függvény
Ez a SIGNAL(TIMER1_COMPA_vect) függvény. Akkor hívjuk meg, amikor az OCR1A regiszter eléri a 0-t. Ebben a függvényben a függvény utolsó hívása óta eltelt mikromásodpercek számát akarjuk nyomon követni. Ezt az idődeltát signalTimeDelta néven tároljuk.
storedTimeDelta az a “fix frekvenciájú” idődelta, amellyel a signalTimeDelta a fő ciklusban összehasonlításra kerül. storedTimeDelta akkor kerül signalTimeDelta értékre, amikor a storedTimeDelta nullázásra kerül (indításkor és a reset kapcsoló megnyomásakor).
OCR1A += CYCLES_PER_SIGNAL;
A megszakítási műveletek végrehajtása után az OCR1A-t vissza kell állítani azáltal, hogy növeljük az általunk előre meghatározott CYCLES_PER_SIGNAL (a következő megszakítás bekövetkezése előtti ciklusok száma) konstansunkkal.
Hurokfüggvény
A hurokfüggvényben ellenőrizzük, hogy a trigger megnyomásra került. Ha igen, akkor leolvassuk az érzékenységi potenciométer analóg értékét, és lineárisan interpoláljuk az analóg értéket (0-1023) egy könnyebben használható skálára (0,5-10,0).
int storedTimeDeltaDifference = (storedTimeDelta - signalTimeDelta) * sensitivity;
A rögzített frekvencia (tároltTimeDelta) és a mért frekvencia (signalTimeDelta) közötti különbséget kiszámítjuk és megszorozzuk az érzékenység értékével.
tone(SPEAKER_PIN, BASE_TONE_FREQUENCY + storedTimeDeltaDifference);
Ezt az értéket ezután összegezzük egy hallható alaphang frekvenciával, BASE_TONE_FREQUENCY, és az Arduino tone() függvény segítségével lejátsszuk a hangszórón.
Ha a különbség meghaladja a SPINNER_THRESHOLD által meghatározott küszöbértéket, akkor a motor aktiválódik.
Ha a trigger elengedésre kerül, akkor a hangszóró hangja leáll (a noTone() függvény meghívásával) és a motor deaktiválódik.
Ha a reset gombot megnyomtuk, akkor az nullázza a tároltTimeDelta értéket, így a következő megszakítási hívás új értéket állíthat be.
Milyen funkcionális az Arduino-alapú fémdetektorunk?
A legalacsonyabb érzékenységi beállítással a fémdetektor képes nagyméretű tárgyakat, például üdítős dobozokat, mobiltelefonokat és vasszerszámokat a tekercstől néhány centiméteres távolságon belül felfogni. A legmagasabb érzékenységi beállításon az ugyanilyen közelségben lévő kisebb tárgyak, például acélgyűrűk, csavarok és érmék is érzékelhetők. A bemutatót lásd a cikk tetején található videón!
Az érzékelő hatótávolságának növeléséhez növelhetjük az induktor által létrehozott mágneses mező területét. Ezt elérhetjük az induktoron átfolyó áram növelésével (az oszcillátorba bevitt feszültség növelésével, ami nagyobb erősítést tesz lehetővé az erősítőben), vagy az induktortekercsben lévő huzalcsavarások számának növelésével.
Az Arduino-alapú fémdetektorral más érdekes dolgokat is megtehetünk, amelyeket a hagyományos BFO fémdetektorokkal nem lehet. Maradjon velünk a jövőbeli projekteknél, hogy hogyan tudjuk kihasználni ezt a fémdetektor mechanizmust más célokra!
ArduinoMetalDetector-master.zip
Próbálja ki ezt a projektet maga is! Szerezd meg a BOM-ot.