Învață cum să construiești un detector de metale folosind un oscilator Colpitts și un Arduino.

Cum funcționează detectoarele de metale?

Circuitul rezervor

În circuitul de mai sus, condensatorul și inductorul în serie formează un circuit rezervor. Într-un circuit rezervor, energia este transferată în mod repetat între un condensator și un inductor, rezultând o oscilație. Curentul descărcat din condensator trece prin inductor; când condensatorul este complet descărcat, câmpul magnetic descrescător al inductorului menține fluxul de curent. Condensatorul se va încărca apoi cu polaritate opusă, iar când câmpul magnetic s-a prăbușit complet, condensatorul se va descărca, rezultând un flux de curent în direcția opusă celei a curentului inițial. Acest ciclu continuă.

Inductorul din circuitul rezervorului de mai sus formează detectorul detectorului de metale (o bobină mare de sârmă). Atunci când materialul metalic se apropie de centrul inductorului (bobina detectorului), acesta intră în câmpul magnetic creat de inductor. Acest lucru modifică permeabilitatea magnetică a miezului inductorului, determinând modificarea inductanței. Schimbarea inductanței, la rândul ei, modifică frecvența de oscilație a circuitului rezervorului.

Dacă componentele ar fi ideale, circuitul rezervorului ar oscila la nesfârșit fără o sursă de energie externă. Dar, în practică, componentele nu sunt ideale. Rezistența nedorită a componentelor va introduce pierderi de energie, ceea ce va face ca curentul oscilant să se reducă până la oprire. Pentru a contracara acest lucru, se folosește un amplificator invertor BJT cu un singur etaj pentru a adăuga continuu câștig în circuitul rezervor.

Oscilatorul Colpitts

Din moment ce oscilația la nodurile de dinaintea și de după inductor sunt defazate la 180° unul față de celălalt, unul dintre noduri va furniza oscilația la baza tranzistorului, va amplifica și inversa semnalul la colector, apoi îl va returna în fază la celălalt nod al circuitului rezervor. Acest întreg circuit se numește oscilatorul Colpitts.

Oscilatorul Colpitts de mai sus furnizează o oscilație constantă cu o frecvență în intervalul 100kHz. Metalele din obiectele de uz casnic care modifică permeabilitatea miezului inductorului vor fluctua această frecvență în jurul valorii de 10kHz. Deoarece această gamă de frecvențe se află în afara spectrului audio uman (de la 20Hz la 20kHz), va trebui să traducem oscilația într-un ton audibil.

Detectoarele de metale tradiționale BFO (beat-frequency oscillator) depășesc această problemă prin încorporarea unui alt circuit rezervor cu o frecvență fixă egală cu frecvența circuitului rezervor al detectorului, fără influența metalelor. Apoi, luarea diferenței dintre cele două frecvențe va izola frecvențele fluctuante ale circuitului detectorului și le va reduce la o gamă audibilă.

Pentru acest proiect de detector de metale, vom folosi un Arduino pentru a procesa semnalul de oscilație în loc să compensăm oscilația cu un al doilea circuit rezervor. Arduino va stoca frecvența fixă și va compara continuu frecvența de intrare a circuitului detectorului cu frecvența stocată (mai multe despre programul Arduino mai jos).

Materiale pentru detectorul de metale DIY

Pentru acest proiect, a fost ales un burlan de jucărie pentru a găzdui toate componentele. Aceasta include următoarele caracteristici:

  • un buton de declanșare, pe care îl vom refolosi pentru a declanșa difuzorul
  • un buton lateral, pe care îl vom folosi pentru a seta frecvența fixă
  • un compartiment pentru baterii (3 baterii AAA) cu un comutator ON/OFF
  • un difuzor, prin care vom reda tonul
  • un motor cu LED-uri atașate, care se vor activa atunci când diferența de frecvență depășește un anumit prag
  • un cap circular în care vom introduce o bobină de sârmă pentru inductorul circuitului rezervorului

De asemenea, vom adăuga un potențiometru (argintiu) pentru a face reglabilă sensibilitatea schimbărilor de ton.

Spiralul inductorului este realizat din aproximativ 50 de înfășurări de sârmă 26 AWG în jurul unei bobine cu diametrul de 5,5 inci.

În interiorul carcasei, vom înlocui placa de circuit originală cu propriul nostru circuit și vom atașa toate perifericele la circuit cu ajutorul unor capse cu pini.

Schemele circuitului de detectare a metalelor

Am folosit un Arduino UNO pentru a programa un DIP ATMega328. Apoi am scos ATMega328 de pe placa de dezvoltare și l-am încorporat într-o placă perfboard împreună cu restul circuitului.

Oscilatorul Colpitts, în stânga jos pe diagramă, alimentează oscilația în contorul 1 (pinul T1) al cipului (marcat ca pinul digital 5 pe Arduino UNO), unde numără constant frecvența de oscilație.

La nivelul superior al diagramei, o sursă de alimentare de 4.5V (baterii 3xAA, cu condensatori de bypass) este folosită pentru a alimenta ATmega328, oscilatorul, difuzorul și motorul (cu LED-uri).

Pentru a menține consumul de curent al pinilor digitali ai microcontrolerului la un nivel sigur (40 mA per pin maxim pentru ATmega328), se folosește un tranzistor NPN (C2878) pentru a comanda difuzorul și un MOSFET cu canal N (SUB45N03) pentru a comanda motorul.

Atât comutatorul de declanșare cât și cel de resetare (stabilește frecvența fixă) sunt cablate la pinii digitali folosind o configurație internă de tragere în sus. Condensatoare mici sunt adăugate în paralel pentru a debloca întrerupătoarele.

Potențiometrul de sensibilitate este configurat ca un divizor de tensiune, iar diviziunea este citită folosind un pin analogic.

Cod de parcurgere a codului

Codul sursă complet pentru acest proiect poate fi găsit aici:

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

Mai jos este o parcurgere detaliată a codului.

Funcția de configurare

Pentru a urmări frecvența de oscilație a detectorului prin intermediul contorului temporizator 1, trebuie mai întâi să configurăm registrele controlerului temporizator/contor (TCCR). Aceste TCCRs sunt accesate prin intermediul celor trei numere întregi: TTCR1A, TTCR1B și TTCR1C.

TCCR1A = 0b00000000;TCCR1B = 0b00000111;

Trebuie să setăm generarea formei de undă în modul normal prin setarea la 0 a stegulețelor WGM din TCCR1A și TCCR1B și să setăm modul de selectare a vitezei de ceas la sursa de ceas extern prin setarea stegulețelor CS din TCCR1B la modul 3 (ceas extern pe front de creștere). În această configurație, registrul OCR1A va descrește cu 1 de fiecare dată când este detectat un front crescător din oscilație.

TIMSK1 |= (1 << OCIE1A);

În continuare va trebui să activăm întreruperea A a cronometrului/contorului prin setarea flag-ului OCIE1A în registrul TIMSK1. Acest lucru va permite ca funcția de întrerupere SIGNAL(TIMER1_COMPA_vect) să fie apelată ori de câte ori registrul OCR1A ajunge la 0.

OCR1A = 1;

Acum inițializați OCR1A la 1, astfel încât funcția de întrerupere să fie apelată de îndată ce este detectat primul front de creștere.

Funcția de întrerupere

Aceasta este funcția SIGNAL(TIMER1_COMPA_vect). Este apelată atunci când registrul OCR1A ajunge la 0. În această funcție, dorim să ținem evidența numărului de microsecunde scurse de la ultima dată când funcția a fost apelată. Acest delta de timp este stocat ca signalTimeDelta.

storedTimeDelta este delta de timp cu „frecvență fixă” cu care este comparat signalTimeDelta în bucla principală. storedTimeDelta este setat la signalTimeDelta atunci când storedTimeDelta este pus la zero (la pornire și atunci când este apăsat comutatorul de resetare).

OCR1A += CYCLES_PER_SIGNAL;

După efectuarea operațiilor de întrerupere, OCR1A trebuie resetat prin incrementare cu constanta noastră predefinită, CYCLES_PER_SIGNAL (numărul de cicluri înainte de apariția următoarei întreruperi).

Funcția de buclă

În funcția de buclă, verificăm dacă declanșatorul este apăsat. Dacă da, atunci citim valoarea analogică a potențiometrului de sensibilitate și interpolăm liniar valoarea analogică (de la 0 la 1023) la o scală mai ușor de utilizat (de la 0,5 la 10,0).

int storedTimeDeltaDifference = (storedTimeDelta - signalTimeDelta) * sensitivity;

Se calculează diferența dintre frecvența fixă (storedTimeDelta) și frecvența măsurată (signalTimeDelta) și se înmulțește cu valoarea sensibilității.

tone(SPEAKER_PIN, BASE_TONE_FREQUENCY + storedTimeDeltaDifference);

Această valoare este apoi însumată cu o frecvență de ton de bază audibilă, BASE_TONE_FREQUENCY, și redată prin difuzor cu ajutorul funcției Arduino tone().

Dacă diferența depășește pragul definit de SPINNER_THRESHOLD, atunci motorul este activat.

Dacă declanșatorul este eliberat, atunci tonul difuzorului este oprit (prin apelarea funcției noTone()) și motorul este dezactivat.

Dacă butonul de resetare a fost apăsat, acesta va aduce la zero storedTimeDelta, permițând ca următorul apel de întrerupere să stabilească o nouă valoare.

Cât de funcțional este detectorul nostru de metale bazat pe Arduino?

Cu cea mai mică setare a sensibilității, detectorul de metale poate capta obiecte mari, cum ar fi cutii de suc, telefoane mobile și unelte de fier la câțiva centimetri distanță de bobină. La cea mai mare setare de sensibilitate, pot fi detectate și obiecte mai mici, precum inele de oțel, șuruburi și monede aflate în aceeași proximitate. Vedeți videoclipul din partea de sus a articolului pentru o demonstrație!

Pentru a extinde raza de acțiune a detectorului, putem mări aria câmpului magnetic creat de inductor. Acest lucru poate fi realizat prin creșterea fluxului de curent prin inductor (prin creșterea tensiunii de intrare în oscilator, permițând un câștig mai mare în amplificator), sau prin creșterea numărului de înfășurări de fire în bobina inductorului.

Cu un detector de metale bazat pe Arduino, putem face și alte lucruri interesante care nu pot fi realizate cu detectoarele de metale BFO tradiționale. Rămâneți pe recepție pentru proiecte viitoare despre cum putem profita de acest mecanism de detectare a metalelor în alte scopuri!

ArduinoMetalDetector-master.zip

Încercați acest proiect pentru dumneavoastră! Obțineți BOM.

Lasă un răspuns

Adresa ta de email nu va fi publicată.