Lær hvordan du bygger en metaldetektor ved hjælp af en Colpitts oscillator og en Arduino.
Hvordan virker metaldetektorer?
Tankekredsløbet
I ovenstående kredsløb danner seriekondensatoren og induktoren et tankekredsløb. I et tankkredsløb overføres energi gentagne gange mellem en kondensator og en induktor, hvilket resulterer i svingninger. Den strøm, der afledes fra kondensatoren, strømmer gennem spolen; når kondensatoren er helt afladet, opretholder spolens aftagende magnetfelt strømmen. Kondensatoren oplades derefter med den modsatte polaritet, og når magnetfeltet er faldet helt sammen, vil kondensatoren aflade sig, hvilket resulterer i en strømgennemstrømning i modsat retning af den oprindelige strøm. Denne cyklus fortsætter.
Induktoren i ovenstående tankcirkel udgør metaldetektorens detektor (en stor spole af tråd). Når metallisk materiale nærmer sig spolens centrum (detektorspolen), kommer det ind i det magnetfelt, der er skabt af spolen. Dette ændrer den magnetiske permeabilitet i induktorens kerne, hvilket får induktansen til at ændre sig. Ændringen i induktansen ændrer til gengæld tankkredsløbets svingningsfrekvens.
Hvis komponenterne var ideelle, ville tankkredsløbet svinge i det uendelige uden en ekstern strømkilde. Men i praksis er komponenterne ikke ideelle. Komponenternes uønskede modstand vil medføre energitab, hvilket får den svingende strøm til at aftage til et stop. For at modvirke dette anvendes en BJT-inverterende forstærker i et enkelt trin til kontinuerligt at tilføje forstærkning i tankkredsløbet.
The Colpitts oscillator
Da svingningen ved knudepunkterne før og efter spolen er 180° ude af fase med hinanden, vil et af knudepunkterne levere svingningen til transistorbasen, forstærke og invertere signalet ved kollektoren og derefter returnere det i fase til det andet knudepunkt i tankkredsløbet. Hele dette kredsløb kaldes Colpittsoscillatoren.
Colpittsoscillatoren ovenfor giver en stabil svingning med en frekvens i 100kHz-området. Metaller fra husholdningsartikler, der ændrer permeabiliteten af spolekernen, vil svinge denne frekvens omkring 10kHz. Da dette frekvensområde ligger uden for det menneskelige lydspektrum (20 Hz til 20 kHz), skal vi oversætte svingningen til en hørbar tone.
Traditionelle BFO-metaldetektorer (beat-frequency oscillator) overvinder dette problem ved at inkorporere et andet tankekredsløb med en fast frekvens svarende til frekvensen af detektorens tankekredsløb uden påvirkning fra metaller. Hvis man derefter tager forskellen mellem de to frekvenser, isoleres detektorkredsløbets svingende frekvenser og bringes ned til et hørbart område.
I dette metaldetektorprojekt vil vi bruge en Arduino til at behandle svingningssignalet i stedet for at udligne svingningen med et andet tankkredsløb. Arduinoen vil gemme den faste frekvens og løbende sammenligne den indkommende frekvens fra detektorkredsløbet med den lagrede frekvens (mere om Arduino-programmet nedenfor).
Materialer til din DIY-metaldetektor
Til dette projekt blev der valgt en legetøjsurethakker til at huse alle komponenterne. Den indeholder følgende funktioner:
- en udløserknap, som vi vil genbruge til at udløse højttaleren
- en sideknap, som vi vil bruge til at indstille den faste frekvens
- et batterirum (3xAA-batterier) med en tænd/sluk-knap
- en højttaler, som vi vil afspille tonen gennem
- en motor med lysdioder påmonteret, som vi vil aktivere, når frekvensforskellen overstiger en vis tærskel
- et cirkulært hoved, hvor vi vil montere en trådspole i til spolen i tankkredsløbet
Vi vil også tilføje et potentiometer (sølv) for at gøre følsomheden af toneændringerne justerbar.
Induktorspolen er lavet af ca. 50 viklinger af 26 AWG-tråd omkring en spole på 5,5 tommer i diameter.
Inden for huset vil vi erstatte det originale printkort med vores eget kredsløb og fastgøre alle perifere enheder til kredsløbet med pin headers.
Skemaer til kredsløb til metaldetektion
Jeg brugte en Arduino UNO til at programmere en DIP ATMega328. Jeg fjernede derefter ATMega328 fra udviklingskortet og indlejrede den i et perfboard sammen med resten af kredsløbet.
Colpittsoscillatoren, nederst til venstre på diagrammet, fodrer svingningen ind i tæller 1 (pin T1) på chippen (markeret som digital pin 5 på Arduino UNO), hvor den konstant tæller svingningsfrekvensen.
På det øverste niveau i diagrammet er der en strømforsyning på 4.5V (3xAA-batterier, med bypass-kondensatorer) bruges til at forsyne ATmega328, oscillator, højttaler og motor (med lysdioder).
For at holde strømforbruget fra mikrocontrollerens digitale pins på et sikkert niveau (højst 40 mA pr. pin for ATmega328) bruges en NPN-transistor (C2878) til at drive højttaleren og en N-kanals MOSFET (SUB45N03) til at drive motoren.
Både trigger- og reset-kontakterne (indstiller fast frekvens) er koblet til digitale pins ved hjælp af intern pull-up-konfiguration. Små kondensatorer er tilføjet parallelt for at debounce kontakterne.
Følsomhedspotentiometeret er opsat som en spændingsdeler, og divisionen aflæses ved hjælp af en analog pin.
Kodegennemgang
Den fulde kildekode til dette projekt kan findes her:
- https://github.com/evankale/ArduinoMetalDetector
Nedenfor er en detaljeret gennemgang af koden.
Installationsfunktion
For at holde styr på detektorens svingningsfrekvens via timertæller 1 skal vi først konfigurere timer/counter controller-registrene (TCCR). Der er adgang til disse TCCR’er via de tre hele tal: TTCR1A, TTCR1B og TTCR1C.
TCCR1A = 0b00000000;TCCR1B = 0b00000111;
Vi skal indstille bølgeformgenerering til normal tilstand ved at sætte WGM-flagene i TCCR1A og TCCR1B til 0 og indstille urhastighedsvalgtilstanden til ekstern urkilde ved at sætte CS-flagene i TCCR1B til tilstand 3 (eksternt ur på stigende flanke). I denne konfiguration vil registeret OCR1A dekrementere med 1, hver gang der registreres en stigende flanke fra svingningen.
TIMSK1 |= (1 << OCIE1A);
Næst skal vi aktivere timer/count interrupt A ved at sætte OCIE1A-flaget i TIMSK1-registeret. Dette vil aktivere afbrydelsesfunktionen SIGNAL(TIMER1_COMPA_vect) til at blive kaldt, når OCR1A-registeret når 0.
OCR1A = 1;
Initialiser nu OCR1A til 1, så afbrydelsesfunktionen kaldes, så snart den første stigende flanke er registreret.
Afbrydelsesfunktion
Dette er funktionen SIGNAL(TIMER1_COMPA_vect). Den kaldes, når OCR1A-registeret når 0. I denne funktion ønsker vi at holde styr på antallet af mikrosekunder, der er gået siden sidste gang, funktionen blev kaldt. Dette tidsdelta gemmes som signalTimeDelta.
storedTimeDelta er det tidsdelta med “fast frekvens”, som signalTimeDelta sammenlignes med i hovedloopet. storedTimeDelta sættes til signalTimeDelta, når storedTimeDelta nulstilles (ved opstart og når der trykkes på reset-knappen).
OCR1A += CYCLES_PER_SIGNAL;
Når der udføres afbrydelsesoperationer, skal OCR1A nulstilles ved at inkrementere den med vores foruddefinerede konstant, CYCLES_PER_SIGNAL (antal cyklusser, før næste afbrydelse finder sted).
Loopfunktion
I loopfunktionen kontrollerer vi, om udløseren er trykket. Hvis det er tilfældet, aflæses den analoge værdi af følsomhedspotentiometeret, og den analoge værdi (0 til 1023) interpoleres lineært til en skala, der er lettere at bruge (0,5 til 10,0).
int storedTimeDeltaDifference = (storedTimeDelta - signalTimeDelta) * sensitivity;
Differencen mellem den faste frekvens (storedTimeDelta) og den målte frekvens (signalTimeDelta) beregnes og multipliceres med følsomhedsværdien.
tone(SPEAKER_PIN, BASE_TONE_FREQUENCY + storedTimeDeltaDifference);
Denne værdi summeres derefter med en hørbar grundtonefrekvens, BASE_TONE_FREQUENCY, og afspilles ud af højttaleren ved hjælp af Arduino tone()-funktionen.
Hvis forskellen overstiger den tærskelværdi, der er defineret af SPINNER_THRESHOLD, aktiveres motoren.
Hvis udløseren slippes, stoppes højttalertonen (ved at kalde noTone() funktionen) og motoren deaktiveres.
Hvis der er blevet trykket på nulstillingsknappen, vil den nulstille storedTimeDelta, så det næste interruptkald kan indstille en ny værdi.
Hvor funktionel er vores Arduino-baserede metaldetektor?
Med den laveste følsomhedsindstilling kan metaldetektoren opsamle store genstande som sodavandsdåser, mobiltelefoner og jernværktøj inden for få centimeter fra spolen. På den højeste følsomhedsindstilling kan mindre genstande som stålringe, skruer og mønter inden for samme nærhed også detekteres. Se videoen øverst i artiklen for en demonstration!
For at udvide detektorens rækkevidde kan vi øge det magnetfeltområde, der skabes af spolen. Dette kan opnås ved at øge strømgennemstrømningen gennem induktoren (ved at øge spændingsindgangen til oscillatoren, hvilket giver mulighed for en større forstærkning i forstærkeren), eller ved at øge antallet af trådviklinger i induktionsspolen.
Med en Arduino-baseret metaldetektor kan vi gøre andre interessante ting, som ikke kan lade sig gøre med traditionelle BFO-metaldetektorer. Hold øje med fremtidige projekter om, hvordan vi kan drage fordel af denne metaldetektormekanisme til andre formål!
ArduinoMetalDetector-master.zip
Giv dette projekt en chance for selv at prøve! Hent BOM.