Lär dig att bygga en metalldetektor med hjälp av en Colpitts oscillator och en Arduino.

Hur fungerar metalldetektorer?

Tankkretsen

I ovanstående krets bildar seriekondensatorn och spolen en tankkrets. I en tankkrets överförs energi upprepade gånger mellan en kondensator och en induktor, vilket resulterar i svängning. Den ström som laddas ur kondensatorn flödar genom induktorn; när kondensatorn är helt urladdad upprätthåller induktorns minskande magnetfält strömflödet. Kondensatorn kommer då att laddas med motsatt polaritet, och när magnetfältet har kollapsat helt och hållet kommer kondensatorn att urladdas, vilket resulterar i ett strömflöde i motsatt riktning till den ursprungliga strömmen. Denna cykel fortsätter.

Induktorn i den ovanstående tankströmkretsen utgör metalldetektorns detektor (en stor trådspole). När metalliskt material närmar sig mitten av induktorn (detektorspolen) går det in i det magnetfält som skapas av induktorn. Detta förändrar den magnetiska permeabiliteten hos induktorns kärna, vilket gör att induktansen förändras. Förändringen av induktansen ändrar i sin tur tankkretsens oscilleringsfrekvens.

Om komponenterna var idealiska skulle tankkretsen oscillera i all oändlighet utan en extern strömkälla. Men i praktiken är komponenterna inte idealiska. Komponenternas oönskade motstånd kommer att införa energiförlust, vilket gör att den oscillerande strömmen avtar till ett stopp. För att motverka detta används en enstegs BJT-inverterande förstärkare för att kontinuerligt lägga till förstärkning i tankkretsen.

Colpittsoscillatorn

Då oscillationen vid noderna före och efter induktorn är 180° ur fas med varandra kommer en av noderna att leverera oscillationen till transistorbasen, förstärka och invertera signalen vid kollektorn, för att sedan återföra den i fas till den andra noden i tankkretsen. Hela denna krets kallas Colpittsoscillator.

Colpittsoscillatorn ovan ger en jämn svängning med en frekvens i 100 kHz-området. Metaller från hushållsartiklar som förändrar permeabiliteten hos induktorkärnan kommer att fluktuera denna frekvens runt 10 kHz. Eftersom detta frekvensområde ligger utanför människans ljudspektrum (20 Hz till 20 kHz) måste vi översätta oscillationen till en hörbar ton.

Traditionella BFO-metalldetektorer (beat-frequency oscillator) övervinner detta problem genom att införliva en annan tankkrets med en fast frekvens som är lika med frekvensen för detektortankens krets, utan påverkan av några metaller. Genom att ta skillnaden mellan de två frekvenserna isoleras sedan de fluktuerande frekvenserna i detektorkretsen och förs ner till ett hörbart område.

För det här metalldetektorprojektet kommer vi att använda en Arduino för att bearbeta oscillationssignalen i stället för att kompensera oscillationen med en andra tankkrets. Arduino kommer att lagra den fasta frekvensen och kontinuerligt jämföra den inkommande frekvensen från detektorkretsen med den lagrade frekvensen (mer om Arduinoprogrammet nedan).

Material för din DIY metalldetektor

För det här projektet valdes en leksaks ogräsrensare för att rymma alla komponenter. Den innehåller följande funktioner:

  • en utlösarknapp, som vi kommer att återanvända för att utlösa högtalaren
  • en sidoknapp, som vi kommer att använda för att ställa in den fasta frekvensen
  • ett batterifack (3xAA-batterier) med en ON/OFF-omkopplare
  • en högtalare, som vi kommer att spela upp tonen genom
  • en motor med lysdioder som vi kommer att aktivera när frekvensskillnaden överskrider ett visst tröskelvärde
  • ett cirkulärt huvud där vi kommer att montera en trådspole i för tankkretsens induktans

Vi kommer också att lägga till en potentiometer (i silver) för att göra känsligheten för tonförändringarna justerbar.

Inspektorns spole är tillverkad av cirka 50 lindningar av 26 AWG-tråd runt en spole med en diameter på 5,5 tum.

Inuti höljet kommer vi att ersätta det ursprungliga kretskortet med vår egen krets och fästa alla kringutrustning till kretsen med stifthuvuden.

Scheman för kretsen för metalldetektering

Jag använde en Arduino UNO för att programmera en DIP ATMega328. Jag tog sedan bort ATMega328 från utvecklingskortet och bäddade in den i ett perfboard tillsammans med resten av kretsen.

Colpittsoscillatorn, längst ner till vänster i diagrammet, matar oscillationen till räknare 1 (stift T1) på chipet (markerad som digital stift 5 på Arduino UNO), där den ständigt räknar frekvensen av oscillationen.

På den översta nivån i diagrammet, en strömförsörjning på 4.5V (3xAA-batterier, med bypass-kondensatorer) används för att driva ATmega328, oscillatorn, högtalaren och motorn (med lysdioder).

För att hålla strömförbrukningen från mikrokontrollerns digitala stift på en säker nivå (högst 40 mA per stift för ATmega328) används en NPN-transistor (C2878) för att driva högtalaren och en N-kanalig MOSFET (SUB45N03) för att driva motorn.

Både utlösaren och återställaren (ställer in fast frekvens) är kopplade till digitala stift med hjälp av intern pull-up-konfiguration. Små kondensatorer läggs till parallellt för att debounca switcharna.

Känslighetspotentiometern är konfigurerad som en spänningsdelare, och divisionen avläses med hjälp av ett analogt stift.

Kodgenomgång

Den fullständiga källkoden för det här projektet finns här:

  • https://github.com/evankale/ArduinoMetalDetector

Nedan följer en detaljerad genomgång av koden.

Inställningsfunktion

För att hålla koll på detektorns svängningsfrekvens genom timerräknare 1 måste vi först konfigurera timer/counter controller-registren (TCCR). Dessa TCCR:er nås via de tre heltalen: TTCR1A, TTCR1B och TTCR1C.

TCCR1A = 0b00000000;TCCR1B = 0b00000111;

Vi måste ställa in vågformsgenereringen till normalläge genom att ställa in WGM-flaggorna i TCCR1A och TCCR1B till 0 och ställa in klockfrekvensvalsläget till extern klockkälla genom att ställa in CS-flaggorna i TCCR1B till läge 3 (extern klocka vid stigande kant). I denna konfiguration kommer registret OCR1A att dekrementera med 1 varje gång en stigande flank upptäcks från oscillationen.

TIMSK1 |= (1 << OCIE1A);

Nästan måste vi aktivera timer/räkningsavbrott A genom att ställa in OCIE1A-flaggan i TIMSK1-registret. Detta kommer att göra det möjligt för avbrottsfunktionen SIGNAL(TIMER1_COMPA_vect) att anropas när OCR1A-registret når 0.

OCR1A = 1;

Nu initialiserar du OCR1A till 1 så att avbrottsfunktionen anropas så snart den första stigande flanken upptäcks.

Avbrottsfunktion

Det här är funktionen SIGNAL(TIMER1_COMPA_vect). Den anropas när OCR1A-registret når 0. I den här funktionen vill vi hålla reda på hur många mikrosekunder som förflutit sedan den senaste gången funktionen anropades. Detta tidsdelta lagras som signalTimeDelta.

storedTimeDelta är det tidsdelta med ”fast frekvens” som signalTimeDelta jämförs med i huvudslingan. storedTimeDelta sätts till signalTimeDelta när storedTimeDelta nollställs (vid uppstart och när återställningsknappen trycks in).

OCR1A += CYCLES_PER_SIGNAL;

Efter att ha utfört avbrottsoperationer måste OCR1A återställas genom att öka den med vår fördefinierade konstant CYCLES_PER_SIGNAL (antal cykler innan nästa avbrott inträffar).

Loop-funktion

I loop-funktionen kontrollerar vi om utlösaren har tryckts. Om så är fallet läser vi av det analoga värdet på känslighetspotentiometern och interpolerar linjärt det analoga värdet (0 till 1023) till en skala som är lättare att använda (0,5 till 10,0).

int storedTimeDeltaDifference = (storedTimeDelta - signalTimeDelta) * sensitivity;

Differensen mellan den fasta frekvensen (storedTimeDelta) och den uppmätta frekvensen (signalTimeDelta) beräknas och multipliceras med känslighetsvärdet.

tone(SPEAKER_PIN, BASE_TONE_FREQUENCY + storedTimeDeltaDifference);

Detta värde summeras sedan med en hörbar bastonfrekvens, BASE_TONE_FREQUENCY, och spelas ut ur högtalaren med hjälp av Arduino-funktionen tone().

Om skillnaden överstiger det tröskelvärde som definieras av SPINNER_THRESHOLD aktiveras motorn.

Om utlösaren släpps stoppas högtalartonen (genom att anropa funktionen noTone()) och motorn avaktiveras.

Om återställningsknappen har tryckts in nollställs storedTimeDelta, vilket gör det möjligt för nästa avbrottsanrop att ställa in ett nytt värde.

Hur funktionell är vår Arduino-baserade metalldetektor?

Med den lägsta känslighetsinställningen kan metalldetektorn plocka upp stora föremål som läskburkar, mobiltelefoner och järnverktyg inom några centimeter från spolen. På den högsta känslighetsinställningen kan även mindre föremål som stålringar, skruvar och mynt inom samma närhet upptäckas. Se videon högst upp i artikeln för en demonstration!

För att utöka detektorns räckvidd kan vi öka magnetfältsområdet som skapas av spolen. Detta kan åstadkommas genom att öka strömflödet genom induktorn (genom att öka spänningsingången till oscillatorn, vilket möjliggör en större förstärkning i förstärkaren), eller genom att öka antalet trådomlindningar i induktorspolen.

Med en Arduino-baserad metalldetektor kan vi göra andra intressanta saker som inte går att göra med traditionella BFO-metalldetektorer. Håll ögonen öppna för framtida projekt om hur vi kan dra nytta av denna metalldetektormekanism för andra ändamål!

ArduinoMetalDetector-master.zip

Att prova detta projekt själv! Hämta BOM.

Lämna ett svar

Din e-postadress kommer inte publiceras.