Opi rakentamaan metallinpaljastin Colpittsin oskillaattorin ja Arduinon avulla.
Miten metallinpaljastimet toimivat?
Säiliöpiiri
Yllä olevassa piirissä sarjakondensaattori ja induktori muodostavat säiliöpiirin. Säiliöpiirissä energiaa siirretään toistuvasti kondensaattorin ja induktorin välillä, jolloin syntyy värähtelyä. Kondensaattorista purkautuva virta kulkee induktorin läpi; kun kondensaattori on kokonaan purkautunut, induktorin pienenevä magneettikenttä ylläpitää virran kulkua. Kondensaattori latautuu tällöin vastakkaisella napaisuudella, ja kun magneettikenttä on täysin luhistunut, kondensaattori purkautuu, jolloin virta kulkee vastakkaiseen suuntaan kuin alkuperäinen virta. Tämä sykli jatkuu.
Yllä olevan säiliöpiirin induktori muodostaa metallinilmaisimen ilmaisimen (suuri lankakela). Kun metallimateriaali lähestyy induktorin (ilmaisinkelan) keskustaa, se joutuu induktorin luomaan magneettikenttään. Tämä muuttaa induktorin ytimen magneettista permeabiliteettia, jolloin induktanssi muuttuu. Induktanssin muutos puolestaan muuttaa säiliöpiirin värähtelytaajuutta.
Jos komponentit olisivat ihanteellisia, säiliöpiiri värähtelisi loputtomiin ilman ulkoista virtalähdettä. Käytännössä komponentit eivät kuitenkaan ole ihanteellisia. Komponenttien ei-toivottu resistanssi aiheuttaa energiahäviötä, jolloin värähtelyvirta kapenee pysähtyen. Tämän vastapainoksi käytetään yksivaiheista BJT-invertoivaa vahvistinta lisäämään jatkuvasti vahvistusta säiliöpiiriin.
Colpittsin oskillaattori
Koska induktoria edeltävissä ja sen jälkeisissä solmupisteissä tapahtuva värähtely on 180°:n erivaiheinen toisiinsa nähden, toinen solmupisteistä syöttää värähtelyn transistorin emäksessä olevaan transistoriosaan, vahvistaa ja invertoi signaalin kollektorissa, minkä jälkeen se palaa vaiheittain takaisin säiliöpiirin toiseen solmupisteeseen. Tätä koko piiriä kutsutaan Colpitts-oskillaattoriksi.
Yllä oleva Colpitts-oskillaattori tuottaa tasaisen värähtelyn, jonka taajuus on 100 kHz:n alueella. Kotitaloustavaroiden metallit, jotka muuttavat induktoriytimen permeabiliteettia, heiluttelevat tätä taajuutta noin 10kHz:n tienoilla. Koska tämä taajuusalue on ihmisen äänispektrin (20 Hz – 20 khz) ulkopuolella, värähtely on muunnettava kuultavaksi ääneksi.
Traditionaaliset BFO (beat-frequency oscillator) -metalli-ilmaisimet ratkaisevat tämän ongelman sisällyttämällä siihen toisen säiliöpiirin, jonka kiinteä taajuus on sama kuin ilmaisimen säiliöpiirin taajuus ilman metallien vaikutusta. Sitten näiden kahden taajuuden erotuksen ottaminen eristää ilmaisimen piirin vaihtelevat taajuudet ja laskee ne kuuluvalle alueelle.
Tässä metallinilmaisinprojektissa käytämme Arduinoa värähtelysignaalin käsittelyyn sen sijaan, että kuittaisimme värähtelyn toisella säiliöpiirillä. Arduino tallentaa kiinteän taajuuden ja vertaa jatkuvasti detektoripiirin tulevaa taajuutta tallennettuun taajuuteen (lisää Arduino-ohjelmasta jäljempänä).
Materiaalit DIY-metallipaljastimeesi
Tälle projektille valittiin leluinen rikkaruohohakkuri, johon kaikki komponentit sijoitetaan. Se sisältää seuraavat ominaisuudet:
- laukaisupainike, jonka käytämme uudelleen kaiuttimen käynnistämiseen
- sivupainike, jota käytämme kiinteän taajuuden asettamiseen
- paristokotelo (3xAA-paristot), jossa on ON/OFF-kytkin
- kaiutin, jonka kautta soitamme äänen
- moottori, johon on kiinnitetty LEDit, jotka aktivoituvat, kun taajuusero ylittää tietyn kynnysarvon
- ympyränmuotoinen pää, johon sovitamme lankakelan säiliöpiirin induktoria varten
Lisäämme myös potentiometrin (hopea), jotta äänimuutosten herkkyys on säädettävissä.
Induktorikela on valmistettu noin 50 kierteestä 26 AWG:n lankaa halkaisijaltaan 5,5 tuuman kelan ympärille.
Kotelon sisällä korvaamme alkuperäisen piirilevyn omalla piirillämme ja kiinnitämme kaikki oheislaitteet piiriin nastapäätteillä.
Metallintunnistuspiirin piirikaaviot
Käytin Arduino UNO:ta ohjelmoidakseni DIP ATMega328:n. Sitten irrotin ATMega328:n kehityslevyltä ja upotin sen perfboardiin muun piirin kanssa.
Kaaviossa vasemmalla alhaalla oleva Colpitts-oskillaattori syöttää värähtelyn sirun laskuriin 1 (tappi T1) (merkitty digitaaliseksi tappi 5:ksi Arduino UNO:ssa), jossa se laskee jatkuvasti värähtelytaajuutta.
Kaavion ylimmällä tasolla virtalähteellä 4.5V (3xAA-paristot, ohituskondensaattoreilla) käytetään ATmega328:n, oskillaattorin, kaiuttimen ja moottorin (LEDeillä) virransyöttöön.
Jotta mikrokontrollerin digitaalisten nastojen virrankulutus pysyisi turvallisella tasolla (ATmega328:n osalta maksimissaan 40 mA nastaa kohti), käytetään NPN-transistoria (C2878) kaiuttimen ohjaamiseen ja N-kanavaista MOSFET:iä (SUB45N03) moottorin ohjaamiseen.
Kumpikin liipaisu- ja nollauskytkin (asettaa kiinteän taajuuden) on kytketty digitaalisiin nastoihin käyttäen sisäistä pull-up-konfiguraatiota. Pienet kondensaattorit lisätään rinnakkain kytkimien debounceaamiseksi.
Herkkyyspotentiometri on asetettu jännitteenjakajaksi, ja jako luetaan analogisella nastalla.
Koodin läpikäynti
Tämän projektin koko lähdekoodi löytyy täältä:
- https://github.com/evankale/ArduinoMetalDetector
Alhaalla on koodin yksityiskohtainen läpikäynti.
Asennusfunktio
Jotta voimme seurata ilmaisimen värähtelytaajuutta ajastinlaskurin 1 avulla, meidän on ensin konfiguroitava ajastin/laskurin ohjainrekisterit (TCCR). Näihin TCCR-rekistereihin päästään käsiksi kolmen kokonaisluvun kautta: TTCR1A, TTCR1B ja TTCR1C.
TCCR1A = 0b00000000;TCCR1B = 0b00000111;
Meidän on asetettava aaltomuodon generointi normaalitilaan asettamalla TCCR1A:n ja TCCR1B:n WGM-liput arvoon 0 ja asetettava kellotaajuuden valintatila ulkoiseen kellolähteeseen asettamalla TCCR1B:n CS-liput arvoon 3 (ulkoinen kello nousevalla reunalla). Tässä kokoonpanossa rekisteri OCR1A pienenee 1:llä joka kerta, kun oskillaatiosta havaitaan nouseva reuna.
TIMSK1 |= (1 << OCIE1A);
Seuraavaksi meidän on otettava käyttöön ajastimen/laskennan keskeytys A asettamalla OCIE1A-lippu TIMSK1-rekisteriin. Tämä mahdollistaa SIGNAL(TIMER1_COMPA_vect) -keskeytysfunktion kutsumisen aina, kun OCR1A-rekisteri saavuttaa arvon 0.
OCR1A = 1;
Nyt alustetaan OCR1A:n arvoksi 1, jotta keskeytysfunktiota kutsutaan heti, kun ensimmäinen nouseva reuna havaitaan.
Keskeytysfunktio
Tämä on SIGNAL(TIMER1_COMPA_vect) -funktio. Sitä kutsutaan, kun OCR1A-rekisteri saavuttaa arvon 0. Tässä funktiossa halutaan seurata, kuinka monta mikrosekuntia on kulunut siitä, kun funktiota viimeksi kutsuttiin. Tämä aikadelta tallennetaan nimellä signalTimeDelta.
storedTimeDelta on ”kiinteän taajuuden” aikadelta, johon signalTimeDelta:a verrataan pääsilmukassa. storedTimeDelta asetetaan arvoon signalTimeDelta, kun storedTimeDelta nollataan (käynnistyksen yhteydessä ja kun reset-kytkintä painetaan).
OCR1A += CYCLES_PER_SIGNAL;
Keskeytystoimintojen suorittamisen jälkeen OCR1A on nollattava lisäämällä siihen ennalta määrittelemämme vakio CYCLES_PER_SIGNAL (syklien määrä ennen seuraavan keskeytyksen tapahtumista).
Silmukan funktio
Silmukan funktiossa tarkistetaan, onko liipaisinta painettu. Jos on, luetaan herkkyyspotentiometrin analoginen arvo ja interpoloidaan analoginen arvo (0-1023) lineaarisesti helpommin käytettävään asteikkoon (0,5-10,0).
int storedTimeDeltaDifference = (storedTimeDelta - signalTimeDelta) * sensitivity;
Kiinteän taajuuden (tallennettuTimeDelta) ja mitatun taajuuden (signalTimeDelta) välinen ero lasketaan ja kerrotaan herkkyysarvolla.
tone(SPEAKER_PIN, BASE_TONE_FREQUENCY + storedTimeDeltaDifference);
Tämä arvo summataan sitten kuultavan perusäänen taajuuden, BASE_TONE_FREQUENCY, kanssa ja toistetaan kaiuttimesta Arduinon tone()-funktiolla.
Jos ero ylittää SPINNER_THRESHOLDin määrittämän kynnysarvon, moottori aktivoituu.
Jos laukaisin vapautetaan, kaiuttimen ääni pysäytetään (kutsumalla noTone()-funktiota) ja moottori deaktivoidaan.
Jos nollauspainiketta on painettu, se nollaa tallennetunTimeDeltan, jolloin seuraava keskeytyssoitto voi asettaa uuden arvon.
Miten toimiva on Arduino-pohjainen metallinpaljastimemme?
Alhaisimmalla herkkyysasetuksella metallinpaljastin voi poimia suuria esineitä, kuten limsatölkkejä, kännyköitä ja rautatyökaluja muutaman sentin etäisyydeltä kelasta. Suurimmalla herkkyysasetuksella voidaan havaita myös pienempiä esineitä, kuten teräsrenkaita, ruuveja ja kolikoita samassa läheisyydessä. Katso esittelyä artikkelin yläosassa olevalta videolta!
Lisätäksemme ilmaisimen kantamaa voimme kasvattaa induktorin luoman magneettikentän pinta-alaa. Tämä voidaan saavuttaa lisäämällä induktorin läpi kulkevaa virtaa (lisäämällä oskillaattoriin syötettävää jännitettä, mikä mahdollistaa suuremman vahvistuksen vahvistimessa) tai lisäämällä induktorikelan lankakäämien määrää.
Arduino-pohjaisella metallinilmaisimella voimme tehdä muitakin mielenkiintoisia asioita, joita ei voi tehdä perinteisillä BFO-metallinilmaisimilla. Pysy kuulolla tulevissa projekteissa siitä, miten voimme hyödyntää tätä metallinilmaisinmekanismia muihin tarkoituksiin!
ArduinoMetalDetector-master.zip
Kokeile tätä projektia itse! Hanki BOM.