Impara come costruire un metal detector usando un oscillatore di Colpitts e un Arduino.
Come funzionano i metal detector?
Il circuito del serbatoio
Nel circuito sopra, il condensatore in serie e l’induttore formano un circuito serbatoio. In un circuito serbatoio, l’energia viene trasferita ripetutamente tra un condensatore e un induttore, con conseguente oscillazione. La corrente scaricata dal condensatore scorre attraverso l’induttore; quando il condensatore è completamente scaricato, il campo magnetico decrescente dell’induttore mantiene il flusso di corrente. Il condensatore si carica poi con la polarità opposta, e quando il campo magnetico è completamente crollato, il condensatore si scarica, con conseguente flusso di corrente nella direzione opposta a quella della corrente originale. Questo ciclo continua.
L’induttore del circuito del serbatoio di cui sopra forma il rivelatore del metal detector (una grande bobina di filo). Quando il materiale metallico si avvicina al centro dell’induttore (la bobina del rivelatore), entra nel campo magnetico creato dall’induttore. Questo cambia la permeabilità magnetica del nucleo dell’induttore, facendo cambiare l’induttanza. Il cambiamento di induttanza, a sua volta, cambia la frequenza di oscillazione del circuito del serbatoio.
Se i componenti fossero ideali, il circuito del serbatoio oscillerebbe indefinitamente senza una fonte di alimentazione esterna. Ma, in pratica, i componenti non sono ideali. La resistenza indesiderata dei componenti introdurrà una perdita di energia, facendo sì che la corrente oscillante si assottigli fino a fermarsi. Per contrastare questo, un amplificatore invertente BJT a singolo stadio è usato per aggiungere continuamente guadagno al circuito del serbatoio.
L’oscillatore Colpitts
Siccome l’oscillazione ai nodi prima e dopo l’induttore sono 180° fuori fase tra loro, uno dei nodi fornisce l’oscillazione alla base del transistor, amplifica e inverte il segnale al collettore, poi lo restituisce in fase all’altro nodo del circuito serbatoio. L’intero circuito è chiamato oscillatore di Colpitts.
L’oscillatore di Colpitts di cui sopra fornisce un’oscillazione costante con una frequenza nella gamma dei 100kHz. I metalli degli oggetti domestici che cambiano la permeabilità del nucleo dell’induttore faranno fluttuare questa frequenza intorno ai 10kHz. Poiché questa gamma di frequenza è al di fuori dello spettro audio umano (da 20Hz a 20kHz), avremo bisogno di tradurre l’oscillazione in un tono udibile.
I metal detector tradizionali BFO (beat-frequency oscillator) superano questo problema incorporando un altro circuito serbatoio con una frequenza fissa uguale alla frequenza del circuito serbatoio del rivelatore senza l’influenza di alcun metallo. Quindi, prendendo la differenza tra le due frequenze, si isolano le frequenze fluttuanti del circuito del rivelatore e le si porta ad un range udibile.
Per questo progetto di metal detector, useremo un Arduino per elaborare il segnale di oscillazione invece di compensare l’oscillazione con un secondo circuito serbatoio. L’Arduino memorizzerà la frequenza fissa e confronterà continuamente la frequenza in entrata del circuito del rivelatore con la frequenza memorizzata (più avanti sul programma Arduino).
Materiali per il tuo metal detector fai da te
Per questo progetto, è stato scelto un diserbante giocattolo per ospitare tutti i componenti. Include le seguenti caratteristiche:
- un pulsante di attivazione, che riutilizzeremo per attivare l’altoparlante
- un pulsante laterale, che useremo per impostare la frequenza fissa
- un vano batteria (3xAA batterie) con un interruttore ON/OFF
- un altoparlante, attraverso il quale suoneremo il tono
- un motore con dei LED attaccati che si attiverà quando la differenza di frequenza supera una certa soglia
- una testa circolare in cui inseriremo una bobina di filo per l’induttore del circuito del serbatoio
Aggiungeremo anche un potenziometro (argento) per rendere regolabile la sensibilità delle variazioni del tono.
La bobina dell’induttore è fatta da circa 50 avvolgimenti di filo 26 AWG intorno a una bobina di 5,5 pollici di diametro.
All’interno dell’alloggiamento, sostituiremo il circuito originale con il nostro circuito e attaccheremo tutte le periferiche al circuito con i pin header.
Schema del circuito di rilevamento del metallo
Ho usato un Arduino UNO per programmare un DIP ATMega328. Ho poi rimosso l’ATMega328 dalla scheda di sviluppo e incorporato in una perfboard insieme al resto del circuito.
L’oscillatore Colpitts, in basso a sinistra nel diagramma, alimenta l’oscillazione nel contatore 1 (pin T1) del chip (segnato come pin digitale 5 sull’Arduino UNO), dove conta costantemente la frequenza di oscillazione.
Al livello superiore del diagramma, un’alimentazione di 4. 5V (batterie 3xAA, con un’alimentazione a batteria).5V (batterie 3xAA, con condensatori di bypass) è usato per alimentare l’ATmega328, l’oscillatore, l’altoparlante e il motore (con i LED).
Per mantenere l’assorbimento di corrente dei pin digitali del microcontrollore a un livello sicuro (40 mA massimo per pin per l’ATmega328), un transistor NPN (C2878) è usato per guidare l’altoparlante e un MOSFET a canale N (SUB45N03) per guidare il motore.
Entrambi gli interruttori di trigger e reset (imposta la frequenza fissa) sono cablati ai pin digitali utilizzando la configurazione pull-up interna. Piccoli condensatori sono aggiunti in parallelo per far rimbalzare gli interruttori.
Il potenziometro della sensibilità è impostato come un divisore di tensione, e la divisione è letta usando un pin analogico.
Passaggio del codice
Il codice sorgente completo per questo progetto può essere trovato qui:
- https://github.com/evankale/ArduinoMetalDetector
Di seguito una dettagliata spiegazione del codice.
Funzione di configurazione
Per tenere traccia della frequenza di oscillazione del rivelatore attraverso il contatore del timer 1, dobbiamo prima configurare i registri del controller del timer/contatore (TCCR). Si accede a questi TCCR attraverso i tre interi: TTCR1A, TTCR1B, e TTCR1C.
TCCR1A = 0b00000000;TCCR1B = 0b00000111;
Dovremo impostare la generazione della forma d’onda sulla modalità normale impostando i flag WGM di TCCR1A e TCCR1B su 0, e impostare la modalità di selezione della velocità di clock sulla sorgente di clock esterna impostando i flag CS di TCCR1B sulla modalità 3 (clock esterno sul fronte di salita). In questa configurazione, il registro OCR1A diminuirà di 1 ogni volta che viene rilevato un fronte di salita dall’oscillazione.
TIMSK1 |= (1 << OCIE1A);
Poi dovremo abilitare l’interrupt A del timer/conteggio impostando il flag OCIE1A nel registro TIMSK1. Questo permetterà alla funzione di interrupt SIGNAL(TIMER1_COMPA_vect) di essere chiamata ogni volta che il registro OCR1A raggiunge lo 0.
OCR1A = 1;
Ora inizializziamo OCR1A a 1 in modo che la funzione di interrupt sia chiamata non appena viene rilevato il primo fronte di salita.
Funzione di Interrupt
Questa è la funzione SIGNAL(TIMER1_COMPA_vect). Viene chiamata quando il registro OCR1A raggiunge lo 0. In questa funzione, vogliamo tenere traccia del numero di microsecondi trascorsi dall’ultima volta che la funzione è stata chiamata. Questo delta di tempo è memorizzato come signalTimeDelta.
storedTimeDelta è il delta di tempo a “frequenza fissa” con cui signalTimeDelta è confrontato nel ciclo principale. storedTimeDelta è impostato su signalTimeDelta quando storedTimeDelta è azzerato (all’avvio e quando viene premuto il pulsante di reset).
OCR1A += CYCLES_PER_SIGNAL;
Dopo aver eseguito le operazioni di interrupt, OCR1A deve essere resettato incrementandolo con la nostra costante predefinita, CYCLES_PER_SIGNAL (numero di cicli prima del prossimo interrupt).
Funzione loop
Nella funzione loop, controlliamo se il trigger è premuto. In caso affermativo, si legge il valore analogico del potenziometro della sensibilità e si interpola linearmente il valore analogico (da 0 a 1023) in una scala più facile da usare (da 0,5 a 10,0).
int storedTimeDeltaDifference = (storedTimeDelta - signalTimeDelta) * sensitivity;
La differenza tra la frequenza fissa (storedTimeDelta) e la frequenza misurata (signalTimeDelta) viene calcolata e moltiplicata per il valore della sensibilità.
tone(SPEAKER_PIN, BASE_TONE_FREQUENCY + storedTimeDeltaDifference);
Questo valore viene poi sommato a una frequenza di tono base udibile, BASE_TONE_FREQUENCY, e riprodotto dall’altoparlante usando la funzione Arduino tone().
Se la differenza supera la soglia definita da SPINNER_THRESHOLD, il motore viene attivato.
Se il grilletto viene rilasciato, allora il tono dell’altoparlante viene fermato (chiamando la funzione noTone()) e il motore viene disattivato.
Se il pulsante di reset è stato premuto, esso azzera storedTimeDelta, permettendo alla prossima chiamata di interrupt di impostare un nuovo valore.
Quanto è funzionale il nostro Arduino-Based Metal Detector?
Con l’impostazione di sensibilità più bassa, il metal detector può raccogliere grandi oggetti come lattine di soda, telefoni cellulari e strumenti di ferro entro pochi centimetri di distanza dalla bobina. Con l’impostazione di sensibilità più alta, possono essere rilevati anche oggetti più piccoli come anelli d’acciaio, viti e monete nelle stesse vicinanze. Vedere il video all’inizio dell’articolo per una dimostrazione!
Per estendere la portata del rivelatore, possiamo aumentare l’area del campo magnetico creato dall’induttore. Questo può essere ottenuto aumentando il flusso di corrente attraverso l’induttore (aumentando la tensione in ingresso all’oscillatore, permettendo un maggiore guadagno nell’amplificatore), o aumentando il numero di avvolgimenti di filo nella bobina dell’induttore.
Con un metal detector basato su Arduino, possiamo fare altre cose interessanti che non possono essere fatte con i tradizionali metal detector BFO. Rimanete sintonizzati per progetti futuri su come possiamo approfittare di questo meccanismo di rilevazione di metallo per altri scopi!
ArduinoMetalDetector-master.zip
Prova tu stesso questo progetto! Ottieni il BOM.