Sommario:

Rilevatore a induzione di impulsi basato su Arduino - Flip Coil: 5 passaggi (con immagini)
Rilevatore a induzione di impulsi basato su Arduino - Flip Coil: 5 passaggi (con immagini)

Video: Rilevatore a induzione di impulsi basato su Arduino - Flip Coil: 5 passaggi (con immagini)

Video: Rilevatore a induzione di impulsi basato su Arduino - Flip Coil: 5 passaggi (con immagini)
Video: День 8 Концепция идентификации системы и настройка ПИ-регулятора 2024, Dicembre
Anonim
Rilevatore a induzione di impulsi basato su Arduino - Flip Coil
Rilevatore a induzione di impulsi basato su Arduino - Flip Coil
Rilevatore a induzione di impulsi basato su Arduino - Flip Coil
Rilevatore a induzione di impulsi basato su Arduino - Flip Coil

L'idea

Avendo costruito alcuni metal detector in passato con risultati variabili, volevo esplorare le capacità di Arduino in quella direzione.

Ci sono alcuni buoni esempi di come costruire metal detector con Arduino, alcuni qui come istruttori. Ma guardandoli, normalmente richiedono alcuni componenti esterni per il trattamento del segnale analogico o la sensibilità è piuttosto bassa.

Quando si pensa ai metal detector, l'argomento principale è come rilevare i leggeri cambiamenti di tensione nei segnali relativi alla bobina di ricerca. Questi cambiamenti sono normalmente molto piccoli. L'approccio più ovvio consisterebbe nell'usare gli ingressi analogici dell'ATmega328. Ma guardando le specifiche ci sono due problemi fondamentali: sono (spesso) troppo lente e la risoluzione è (nella maggior parte dei casi) troppo bassa.

D'altra parte, Arduino funziona a 16 MHz e ha alcune capacità di temporizzazione i. e. una risoluzione di 0,0625 µS se si utilizza la velocità di clock. Quindi, invece di utilizzare l'ingresso analogico per il rilevamento, il modo più semplice per rilevare piccole variazioni dinamiche di tensione è confrontare la variazione della caduta di tensione nel tempo a una tensione di riferimento fissa.

A questo scopo l'ATmega328 ha la caratteristica caratteristica di un comparatore interno tra D6 e D7. Questo comparatore è in grado di attivare un interrupt, consentendo una gestione precisa degli eventi. Lasciando da parte le routine di temporizzazione ben codificate come millis() e micos() e andando nel timer interno dell'ATmega328 con una risoluzione molto più alta, Arduino è un'ottima base per gli approcci di rilevamento dei metalli.

Quindi, da una vista del codice sorgente, un buon inizio sarebbe programmare il comparatore interno per "cambiare" la polarità degli ingressi e utilizzare un contatore interno con la massima velocità possibile per cambiare la tempistica delle modifiche.

Il codice generale in Arduido per ottenere questo è:

// Definire tutte le pre-variabili richieste ecc. e impostare i registri

unsigned char clockSelectBits = _BV(CS10); // nessuna prescala, configurazione completa xtal void() { pinMode(6, INPUT); // + del comparatore - impostandoli come INPUT, vengono // impostati ad alta impedenza pinMode(7, INPUT); // - del comparatore - impostandoli come INPUT, vengono // impostati ad alta impedenza cli(); // interrompe gli interrupt TCCR1A = 0; // imposta l'intero registro TCCR1A a 0 TCCR1B = 0; // lo stesso per TCCR1B -> modalità normaleTCNT1 = 0; //inizializza il valore del contatore a 0; TCCR1B |= clockSelectBits; // imposta il prescaler e avvia l'orologio TIMSK1 = _BV(TOIE1); // imposta il bit di abilitazione dell'interrupt di overflow del timer sei(); //consenti interruzioni ACSR = (0 << ACD) | // Comparatore analogico: abilitato (0 << ACBG) | // Analog Comparator Bandgap Select: AIN0 viene applicato all'ingresso positivo (0 << ACO) | // Uscita comparatore analogico: Off (1 << ACI) | // Flag di interruzione del comparatore analogico: Cancella l'interruzione in sospeso (1 << ACIE) | // Interrupt comparatore analogico: abilitato (0 << ACIC) | // Cattura ingresso comparatore analogico: disabilitato (0 << ACIS1 | 0 << ACIS0 // interruzione su uscita commuta // (0 << ACIS1 | 1 << ACIS0 // riservato // (1 << ACIS1 | 0 << ACIS0 // interrupt sul fronte di uscita in discesa // (1 << ACIS1 | 1 << ACIS0 // interrupt sul fronte di ingresso in salita; }

// questa routine viene chiamata ogni volta che il comparatore crea un interrupt

ISR(ANALOG_COMP_vect) { oldSREG=SREG; cli(); timestamp=TCNT1; SREG = vecchioSREG; }

// questa routine viene chiamata ogni volta che c'è un overflow nel contatore interno

ISR(TIMER1_OVF_vect){ timer1_overflow_count++; }

// questa routine viene utilizzata per reimpostare il timer a 0

void resetTimer(void){ oldSREG = SREG; cli(); // Disabilita gli interrupt TCNT1 = 0; //inizializza il valore del contatore a 0 SREG = oldSREG; // Ripristina registro di stato TCCR1B |= clockSelectBits; // imposta il prescaler e avvia l'orologio timer1_overflow_count=0; // ripristina il contatore di overflow }

Naturalmente questa idea non è del tutto nuova. La parte principale di questo codice può essere trovata altrove. Una buona implementazione di un tale approccio per un microcontrollore trovato sulla home page di TPIMD - Tiny Pulse Induction Metal Detector.

www.miymd.com/index.php/projects/tpimd/ (purtroppo questa pagina non è più online, al momento c'è un backup del sito su www.basic4mcu.com, cerca "TPIMD").

Passaggio 1: idea di induzione a impulsi Arduino - Flip Coil

Idea di induzione a impulsi Arduino - Flip Coil
Idea di induzione a impulsi Arduino - Flip Coil
Idea di induzione a impulsi Arduino - Flip Coil
Idea di induzione a impulsi Arduino - Flip Coil

L'idea è di utilizzare Arduino come rilevatore di induzione di impulsi, come in TPIMD, poiché l'idea di temporizzazione della curva di decadimento sembra funzionare abbastanza bene. Il problema con i rilevatori a induzione di impulsi è che normalmente hanno bisogno di un voltaggio diverso per funzionare. Una tensione per alimentare la bobina e una tensione separata per gestire la curva di decadimento. Queste due sorgenti di tensione rendono i rilevatori a induzione di impulsi sempre un po' complicati.

Osservando la tensione della bobina in un rivelatore PI, la curva risultante può essere suddivisa in due fasi differenti. Il primo stadio è l'impulso stesso che alimenta la bobina e crea il campo magnetico (1). Il secondo stadio è la curva di decadimento della tensione, che inizia con un picco di tensione, quindi si adatta rapidamente alla tensione "senza alimentazione" della bobina (2). Il problema è che la bobina cambia polarità dopo l'impulso. Se l'impulso è positivo (Var 1. nell'immagine allegata) la curva di decadimento è negativa. Se l'impulso è negativo, la curva di decadimento sarà positiva (Var 2. nell'immagine allegata)

Per risolvere questo problema di base, la bobina deve essere "capovolta" elettronicamente dopo l'impulso. In questo caso l'impulso può essere positivo e anche la curva di decadimento può essere positiva.

Per ottenere ciò, la bobina deve essere isolata da Vcc e GND dopo l'impulso. In questo momento, c'è solo una corrente che scorre attraverso un resistore di smorzamento. Questo sistema isolato di bobina e resistenza di smorzamento può essere "orientato" a qualsiasi tensione di riferimento. Questo, in teoria, creerà la curva positiva combinata (in fondo al disegno)

Questa curva positiva può essere utilizzata tramite il comparatore per rilevare il momento in cui la tensione di decadimento "attraversa" una tensione di riferimento. In caso di tesori vicini alla bobina, la curva di decadimento cambia e il momento in cui attraversa la tensione di riferimento cambia. Questo cambiamento può essere rilevato.

Dopo alcuni esperimenti, il seguente circuito si è rivelato funzionare.

Il circuito è costituito da un modulo Arduino Nano. Questo modulo pilota due transistor MOSFET che alimentano la bobina (su SV3) tramite D10. Quando l'impulso su D10 termina, entrambi i MOSFET isolano la bobina da 12V e GND. L'energia risparmiata nella bobina viene dispersa attraverso R2 (220 Ohm). Allo stesso tempo R1 (560 Ohm) collega l'ex lato positivo della bobina a GND. Questo cambia la curva di decadimento negativo a R5 (330 Ohm) in una curva positiva. I diodi proteggono il pin di ingresso dell'Arduino.

R7 è un deviatore di tensione a circa 0,04V. Al momento la curva di decadimento in D7 diventa più negativa dello 0,04 in D6 viene attivato un interrupt e viene salvata la durata dopo la fine dell'impulso.

In caso di metallo vicino alla bobina, la curva di decadimento dura più a lungo e il tempo tra la fine dell'impulso e l'interruzione si allunga.

Passaggio 2: costruzione del rilevatore (breadboard)

Costruire il rivelatore (breadboard)
Costruire il rivelatore (breadboard)
Costruire il rivelatore (breadboard)
Costruire il rivelatore (breadboard)
Costruire il rivelatore (breadboard)
Costruire il rivelatore (breadboard)

Costruire il rilevatore è abbastanza semplice. Questo può essere fatto su una breadboard (attaccando al circuito originale) o saldando le parti su un PCB.

Il LED D13 sulla scheda Arduino Nano viene utilizzato come indicazione per il metallo

L'annullamento di una breadboard è il modo più veloce per il rilevatore funzionante. È necessario un po 'di cablaggio, ma questo può essere fatto su una piccola breadboard. Nelle immagini questo è mostrato in 3 passaggi poiché Arduino e i MOSFET nascondono alcuni dei fili. Durante il test ho scollegato i diodi in qualche modo senza accorgermene all'inizio. Ciò non ha avuto alcun effetto negativo sul comportamento del rivelatore. Nella versione PCB del circuito li ho omessi completamente.

Non mostrate nelle immagini sono le connessioni a un display OLED 0,96. Questo display è collegato:

Vcc – 5V (al pin Arduino, non la tensione di alimentazione!!!)

GND – GND

SCL – A5

SDA – A4

Questo display OLED è necessario per calibrare inizialmente il rilevatore. Questo viene fatto impostando la giusta tensione al PIN6 dell'Arduino. Questa tensione dovrebbe essere di circa 0,04 V. Il display aiuta a impostare la giusta tensione.

La versione breadboard funziona abbastanza bene, anche se probabilmente non è adatta per andare in libertà.

Passaggio 3: passare al PCB

Andando PCB
Andando PCB
Andando PCB
Andando PCB
Andando PCB
Andando PCB
Andando PCB
Andando PCB

Per quanto riguarda la saldatura, non mi piace molto il PCB high-tech a doppia faccia, quindi ho modificato il circuito per adattarlo a un PCB on-sided.

Sono state apportate le seguenti modifiche:

1. i diodi sono stati omessi.

2. le porte dei MOSFET hanno una resistenza di 10 Ohm

3. la tensione di alimentazione per il partitore di tensione su D6 è data da un segnale di livello ALTO su D8

4. Il pin del driver per i MOSFET è stato modificato.

In questo modo è possibile creare un PCB a lato singolo che può essere saldato su PCB universali. Usando questo circuito avrai un rilevatore PI funzionante con solo 8-10 componenti esterni (a seconda se viene utilizzato il display OLED e/o un altoparlante).

Passaggio 4: configurazione e utilizzo del rilevatore

Configurazione e utilizzo del rilevatore
Configurazione e utilizzo del rilevatore
Configurazione e utilizzo del rilevatore
Configurazione e utilizzo del rilevatore
Configurazione e utilizzo del rilevatore
Configurazione e utilizzo del rilevatore

Se il rilevatore è costruito correttamente e il programma è scritto su Arduino, il modo più semplice (se non l'unico) per configurare l'unità è utilizzare un display OLED. Il display è collegato a 5V, GND, A4, A5. Il display dovrebbe mostrare "calibrazione" dopo l'accensione dell'unità. Dopo alcuni secondi dovrebbe essere visualizzato "calibrazione eseguita" e sul display dovrebbero essere visualizzati tre numeri.

Il primo numero è il "valore di riferimento" identificato durante la calibrazione. Il secondo valore è l'ultimo valore misurato e il terzo valore è un valore medio delle ultime 32 misurazioni.

Questi tre valori dovrebbero essere più o meno gli stessi (nei miei casi di test inferiori a 1000). Il valore medio dovrebbe essere più o meno stabile.

Per iniziare la configurazione iniziale, non dovrebbe esserci metallo vicino alla bobina.

Ora il partitore di tensione (potenziometro di regolazione) dovrebbe essere regolato in modo che i due valori inferiori siano impostati al massimo pur continuando a fornire una lettura stabile. C'è un'impostazione critica, in cui il valore medio inizia a dare letture strane. Riportare indietro il trimmer per ottenere nuovamente valori stabili.

Potrebbe succedere che il display si blocchi. Basta premere il pulsante di ripristino e ricominciare da capo.

Per la mia configurazione (bobina: 18 giri a 20 cm) il valore stabile è intorno a 630-650. Una volta impostato, premere il pulsante di ripristino, l'unità si ricalibra e tutti i valori dell'albero dovrebbero essere di nuovo nello stesso intervallo. Se il metallo viene ora portato a bobina, il LED sulla scheda Arduino (D13) dovrebbe accendersi. Un altoparlante collegato emette alcuni rumori di clic (c'è un margine di miglioramento nella programmazione lì).

Per evitare aspettative elevate:

Il rilevatore rileva alcune cose, ma rimane un rilevatore molto semplice e limitato.

Per dare un'idea delle capacità, sono stati eseguiti alcuni rilevamenti di riferimento con diversi altri rilevatori. Guardando i risultati, è ancora abbastanza impressionante per un rilevatore con solo 8 parti esterne ma non corrispondenti a rilevatori professionali.

Guardando al circuito e al programma, ci sono molti margini di miglioramento. I valori dei resistori sono stati trovati per esperienza, il tempo di impulso di 250 ms è stato scelto casualmente, anche i parametri della bobina. Se hai idee per miglioramenti, sarei più che felice di discuterne.

Divertiti!

Passaggio 5: aggiornamento 1: utilizzo di un LCD 16x2

Aggiornamento 1: utilizzo di un LCD 16x2
Aggiornamento 1: utilizzo di un LCD 16x2
Aggiornamento 1: utilizzo di un LCD 16x2
Aggiornamento 1: utilizzo di un LCD 16x2
Aggiornamento 1: utilizzo di un LCD 16x2
Aggiornamento 1: utilizzo di un LCD 16x2

Miglioramenti

Durante ulteriori test mi sono reso conto che la libreria per il display OLED I2C stava consumando molto tempo. Quindi ho deciso di utilizzare invece un display 16x2 con un convertitore I2C.

Così ho adottato il programma per il display LCD aggiungendo alcune utili funzionalità. La prima riga del display ora mostra la potenza del segnale di una possibile indicazione. La seconda riga ora mostra due valori. Il primo indicava la deviazione del segnale attuale rispetto al valore di calibrazione. Questo valore dovrebbe essere "0". Se questo valore è costantemente negativo o positivo, il rivelatore deve essere ricalibrato premendo il pulsante di ripristino. I valori positivi indicano metallo vicino alla bobina.

Il secondo valore mostra il valore di ritardo effettivo della curva di decadimento. Questo valore normalmente non è così interessante, ma è necessario per la configurazione iniziale del rivelatore.

Il programma ora consente più durate di impulso in una sequenza (mezzo per sperimentare/migliorare le prestazioni). Non ho ottenuto alcun sfondamento. Quindi l'impostazione predefinita è una durata dell'impulso.

Configurazione iniziale del rivelatore

Quando si configura il rivelatore, il secondo valore della seconda riga è rilevante (il primo può essere ignorato). Inizialmente il valore può essere "instabile" (vedi foto). Ruotare il resistore di trim fino a quando il valore non raggiunge una lettura stabile. Quindi ruotarlo per aumentare il valore fino a un valore massimo stabile. Premere il pulsante di ripristino per ricalibrare e il rilevatore è pronto per l'uso.

Ho avuto l'impressione che impostando il valore massimo stabile, perdessi sensibilità per i metalli non ferrosi. Quindi potrebbe valere la pena sperimentare le impostazioni per avere una buona sensibilità per le cose non ferrose.

bobine

Costruisco 3 bobine per ulteriori test

1 -> 18 giri @ 200mm

2 -> 25 giri @ 100mm

3 -> 48 giri @ 100mm

È interessante notare che tutte le bobine hanno funzionato abbastanza bene, con quasi le stesse prestazioni (moneta da 20 ct a 40-50 mm in aria). Questa potrebbe essere un'osservazione abbastanza soggettiva.

Consigliato: