Lees hoe je een metaaldetector kunt bouwen met behulp van een Colpitts oscillator en een Arduino.

Hoe werken metaaldetectoren?

De tankschakeling

In de bovenstaande schakeling vormen de seriecondensator en de spoel een tankschakeling. In een tankschakeling wordt herhaaldelijk energie overgedragen tussen een condensator en een spoel, waardoor een oscillatie ontstaat. De stroom die door de condensator wordt afgevoerd, vloeit door de spoel; wanneer de condensator volledig is ontladen, houdt het afnemende magnetische veld van de spoel de stroom in stand. De condensator zal dan opladen met de tegenovergestelde polariteit, en wanneer het magnetisch veld volledig is ingestort, zal de condensator ontladen, wat resulteert in stroom in de richting tegengesteld aan die van de oorspronkelijke stroom. Deze cyclus gaat door.

De spoel van de bovenstaande tankschakeling vormt de detector van de metaaldetector (een grote spoel van draad). Wanneer metaalachtig materiaal het centrum van de spoel (de detectorspoel) nadert, komt het in het magnetische veld dat door de spoel wordt gecreëerd. Hierdoor verandert de magnetische permeabiliteit van de kern van de spoel, waardoor de inductantie verandert. De verandering in inductie verandert op haar beurt de oscillerende frequentie van de tankschakeling.

Als de componenten ideaal zouden zijn, zou de tankschakeling oneindig oscilleren zonder externe stroombron. Maar in de praktijk zijn de componenten niet ideaal. De ongewenste weerstand van de componenten zal energieverlies veroorzaken, waardoor de oscillerende stroom tot stilstand komt. Om dit tegen te gaan wordt een enkeltraps BJT inverterende versterker gebruikt om voortdurend versterking aan de tankschakeling toe te voegen.

De Colpitts oscillator

Omdat de oscillatie op de knooppunten voor en na de spoel 180° uit fase met elkaar zijn, zal een van de knooppunten de oscillatie aan de transistorbasis leveren, het signaal versterken en inverteren bij de collector, en het dan in fase terugzenden naar het andere knooppunt van de tankschakeling. Deze hele schakeling wordt de Colpitts oscillator genoemd.

De Colpitts oscillator hierboven levert een gestage oscillatie met een frequentie in het 100kHz bereik. Metalen uit huishoudelijke artikelen die de doorlaatbaarheid van de spoelkern veranderen, zullen deze frequentie rond 10kHz doen schommelen. Aangezien dit frequentiebereik buiten het menselijk audiospectrum ligt (20Hz tot 20kHz), zullen we de oscillatie moeten vertalen in een hoorbare toon.

Traditionele BFO (beat-frequency oscillator) metaaldetectoren ondervangen dit probleem door een andere tank-kring in te bouwen met een vaste frequentie die gelijk is aan de frequentie van de tank-kring van de detector zonder de invloed van enig metaal. Vervolgens zal het verschil tussen de twee frequenties de fluctuerende frequenties van de detectorkring isoleren en terugbrengen tot een hoorbaar bereik.

Voor dit metaaldetectorproject zullen we een Arduino gebruiken om het oscillatiesignaal te verwerken in plaats van de oscillatie te compenseren met een tweede tank-kring. De Arduino slaat de vaste frequentie op en vergelijkt voortdurend de inkomende frequentie van de detectorkring met de opgeslagen frequentie (meer over het Arduino-programma hieronder).

Materialen voor uw DIY metaaldetector

Voor dit project werd een speelgoed onkruidverdelger gekozen om alle componenten in onder te brengen. Het bevat de volgende functies:

  • een triggerknop, die we zullen hergebruiken om de luidspreker te activeren
  • een zijknop, waarmee we de vaste frequentie zullen instellen
  • een batterijcompartiment (3xAA batterijen) met een aan/uit-schakelaar
  • een luidspreker, waar we de toon door zullen laten horen
  • een motor met LED’s eraan die we zullen activeren als het frequentieverschil een bepaalde drempel overschrijdt
  • een ronde kop waar we een spoel draad in zullen plaatsen voor de spoel van het tankcircuit

We zullen ook een potentiometer (zilver) toevoegen om de gevoeligheid van de toonveranderingen instelbaar te maken.

De spoel van de spoel is gemaakt van ongeveer 50 wikkelingen 26 AWG draad rond een spoel van 5,5 inch in diameter.

In de behuizing vervangen we de originele printplaat door onze eigen schakeling en bevestigen we alle randapparatuur aan de schakeling met pin headers.

Metaaldetectie schakelschema

Ik heb een Arduino UNO gebruikt om een DIP ATMega328 te programmeren. Vervolgens heb ik de ATMega328 van het ontwikkelbord gehaald en samen met de rest van de schakeling in een perfboard ingebouwd.

De Colpitts oscillator, linksonder in het schema, voert de oscillatie naar teller 1 (pen T1) van de chip (op de Arduino UNO gemarkeerd als digitale pen 5), waar hij constant de frequentie van de oscillatie telt.

Op het bovenste niveau van het schema, een voeding van 4..5V (3xAA batterijen, met bypass-condensatoren) gebruikt om de ATmega328, oscillator, luidspreker, en motor (met LED’s) van stroom te voorzien.

Om de stroomopname van de digitale pennen van de microcontroller op een veilig niveau te houden (40 mA per pen maximum voor de ATmega328), wordt een NPN-transistor (C2878) gebruikt om de luidspreker aan te drijven, en een N-kanaals MOSFET (SUB45N03) om de motor aan te drijven.

Zowel de trigger- als de reset-schakelaars (stelt vaste frequentie in) zijn bedraad op digitale pennen met behulp van interne pull-up-configuratie. Kleine condensatoren zijn parallel toegevoegd om de schakelaars te debounden.

De gevoeligheidspotentiometer is ingesteld als spanningsdeler, en de deling wordt afgelezen met een analoge pin.

Code Walkthrough

De volledige broncode voor dit project is hier te vinden:

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

Hieronder staat een gedetailleerde walkthrough van de code.

Setup Functie

Om de oscillatiefrequentie van de detector bij te houden via timer counter 1, moeten we eerst de timer/counter controller registers (TCCR) configureren. Deze TCCR’s zijn toegankelijk via de drie gehele getallen: TTCR1A, TTCR1B, en TTCR1C.

TCCR1A = 0b00000000;TCCR1B = 0b00000111;

We moeten de golfvormgeneratie op normale modus zetten door de WGM-flags van TCCR1A en TCCR1B op 0 te zetten, en de kloksnelheidselectiemodus op externe klokbron zetten door de CS-flags van TCCR1B op modus 3 te zetten (externe klok op opgaande flank). In deze configuratie zal het register OCR1A telkens wanneer een opgaande flank van de oscillatie wordt gedetecteerd met 1 worden verlaagd.

TIMSK1 |= (1 << OCIE1A);

Naar aanleiding hiervan moeten we timer/tel interrupt A inschakelen door de OCIE1A vlag in TIMSK1 register te zetten. Hierdoor kan de SIGNAL(TIMER1_COMPA_vect) interrupt functie worden aangeroepen zodra het OCR1A register 0 wordt.

OCR1A = 1;

Initialiseer OCR1A nu op 1 zodat de interrupt functie wordt aangeroepen zodra de eerste opgaande flank wordt gedetecteerd.

Interrupt Functie

Dit is de SIGNAL(TIMER1_COMPA_vect) functie. Deze wordt aangeroepen wanneer het OCR1A register 0 bereikt. In deze functie willen we het aantal microseconden bijhouden dat verstreken is sinds de laatste keer dat de functie werd aangeroepen. Deze tijd delta wordt opgeslagen als signalTimeDelta.

storedTimeDelta is de “vaste frequentie” tijd delta waarmee signalTimeDelta wordt vergeleken in de hoofdlus. storedTimeDelta wordt ingesteld op signalTimeDelta wanneer storedTimeDelta op nul wordt gezet (bij het opstarten en wanneer de reset-schakelaar wordt ingedrukt).

OCR1A += CYCLES_PER_SIGNAL;

Na het uitvoeren van interrupt operaties moet OCR1A worden gereset door deze te verhogen met onze vooraf gedefinieerde constante, CYCLES_PER_SIGNAL (aantal cycli voordat de volgende interrupt optreedt).

Loop Functie

In de loop-functie controleren we of de trigger is ingedrukt. Zo ja, dan lezen we de analoge waarde van de gevoeligheidspotentiometer en interpoleren de analoge waarde (0 tot 1023) lineair naar een makkelijker te gebruiken schaal (0,5 tot 10,0).

int storedTimeDeltaDifference = (storedTimeDelta - signalTimeDelta) * sensitivity;

Het verschil tussen de vaste frequentie (storedTimeDelta) en de gemeten frequentie (signalTimeDelta) wordt berekend en vermenigvuldigd met de gevoeligheidswaarde.

tone(SPEAKER_PIN, BASE_TONE_FREQUENCY + storedTimeDeltaDifference);

Deze waarde wordt dan gesommeerd met een hoorbare basistoonfrequentie, BASE_TONE_FREQUENCY, en uit de luidspreker gespeeld met behulp van de Arduino tone() functie.

Als het verschil de drempel overschrijdt die is gedefinieerd door SPINNER_THRESHOLD, dan wordt de motor geactiveerd.

Als de trigger wordt losgelaten, wordt de luidsprekertoon gestopt (door de functie noTone() op te roepen) en wordt de motor gedeactiveerd.

Als de reset-knop is ingedrukt, wordt de opgeslagenTimeDelta op nul gezet, zodat de volgende interrupt-oproep een nieuwe waarde kan instellen.

Hoe functioneel is onze Arduino-gebaseerde metaaldetector?

Bij de laagste gevoeligheidsinstelling kan de metaaldetector grote voorwerpen zoals frisdrankblikjes, mobiele telefoons en ijzeren gereedschap binnen een paar centimeter afstand van de spoel oppikken. Op de hoogste gevoeligheidsinstelling kunnen ook kleinere voorwerpen zoals stalen ringen, schroeven en munten in dezelfde nabijheid worden gedetecteerd. Zie de video bovenaan het artikel voor een demonstratie!

Om de reikwijdte van de detector te vergroten, kunnen we het magnetisch veld dat door de spoel wordt opgewekt, vergroten. Dit kan worden bereikt door de stroom door de spoel te verhogen (door de spanningsingang naar de oscillator te verhogen, waardoor een grotere versterking in de versterker mogelijk wordt), of door het aantal draadwikkelingen in de spoel van de spoel te verhogen.

Met een op Arduino gebaseerde metaaldetector kunnen we andere interessante dingen doen die niet kunnen worden gedaan met traditionele BFO metaaldetectoren. Blijf op de hoogte van toekomstige projecten over hoe we dit metaaldetectiemechanisme voor andere doeleinden kunnen gebruiken!

ArduinoMetalDetector-master.zip

Probeer dit project zelf eens! Krijg de BOM.

Geef een antwoord

Het e-mailadres wordt niet gepubliceerd.