» elettronica » Metal detector »Metal detector su Arduino Pro Mini. Elaborazione delle profondità del Kolokolov-Shchedrin secondo il principio di "Trasmissione"

Metal Detector su Arduino Pro Mini. Elaborazione delle profondità del Kolokolov-Shchedrin secondo il principio di "Trasmissione"


Riciclaggio del programma di acque profonde di Kolokolov-Shchedrin Differenze dallo schema originale:
1. Non c'è oscillatore di cristallo sul chip k561 .. e al quarzo 32 kHz. Il segnale a 32 kHz fornisce Arduino Pro Mini.
2. Sono assenti anche i circuiti di notifica sonora su diversi microcircuiti della serie 561 - esprime anche gli obiettivi Arduino (e devo dire, voci eccellenti, rispetto al circuito dell'autore).
3. Alimentato da tensione unipolare 12v (batteria al piombo-acido).
4. Regola la sensibilità con i pulsanti. Con la scala ADC da 0 a 1023, la soglia di risposta è regolabile da 1 a 38 (il valore può essere facilmente modificato nello schizzo).


Metal Detector su Arduino Pro Mini. Elaborazione delle profondità del Kolokolov-Shchedrin secondo il principio di


Ancora più importante, ho voluto mostrare in questo articolo che è possibile assemblare MD su Arduino non inferiore all'originale in termini di sensibilità (questo ha funzionato, perché gli originali del circuito originale sono stati raccolti nell'ordine di 10 pezzi, quindi c'è materiale per il confronto). Circuito originale:


Quando ho iniziato a lavorare con Arduino, ero così entusiasta che pensavo di poter trovare e assemblare qualsiasi circuito di Metal Detector da Internet su Arduino che potevo facilmente trovare nella vasta discarica. In linea di principio, si è rivelato in questo modo, ma i circuiti si basavano su un contatore di frequenza, che non consentiva di raggiungere un intervallo davvero buono. Alcuni giocattoli per bambini e un test della penna + tentano di fare soldi per i principianti. L'originale di questo MD è un vero cavallo di battaglia che ti consente di trovare oggetti di grandi dimensioni a una distanza di 2 m (vedi il libro Kolokolov-Shchedrin su Google). Non ci sono statistiche sul md trasformato. Spero che appaia con il supporto dei fan di MD e Arduino. Lo schema ha funzionato con Arduino Uno e Arduino Pro Mini.

Più avanti sul collegamento è illustrato il processo di nascita di questo MD sul sito web del Saldatore, che è durato più di un anno e ha spinto l'autore a studiare il duin di programmazione. Forse lo schizzo sembrerà disgraziato a qualcuno - accetterò volentieri i tuoi FIXES.




Al momento, esiste uno schizzo che consente di regolare la barriera di sensibilità (il pin 7 fa +1 alla barriera, il pin 8 -1 alla barriera). .
Arduino circa mini 5v, 16MHz, ATmega168 e il display li utilizzava. Accanto alla bilancia si trova l'adattatore Mini SD


Come già detto 1602 costa 86 rubli, ProMini - 82 rubli. Se lo desideri, puoi generalmente prendere un ATmega168 nudo, sviluppare una scheda per esso e riempire lo schizzo direttamente al suo interno.E così, per esempio, ho installato mamma-papà sulla scheda MD usando il connettore. La foto mostra la spina a 6 pin di Arduino, attraverso la quale gli schizzi sono stati versati direttamente sulla lavagna.

Sketch-MD.Rx-Tx.ProMini.SrednjajaTochkaRegBar.ino

// Ingresso analogico A3 per voltmetro
// Ingresso analogico A4 per segnale
// 6- conclusione dello zook
// 9 - frequenza di uscita 31200 Hz
#include
LCD a cristalli liquidi (12, 11, 5, 4, 3, 2);
                                       
  byte z1 [8] = {// icona batteria
  0b01100, 0b11110, 0b11110, 0b11110, 0b11110, 0b11110, 0b11110};
 
 int countleds = 0; // variabile per memorizzare il valore del livello di scala
 int voltag = 0; // variabile per memorizzare il valore di tensione
 int noll = 0; // variabile per memorizzare il valore del punto medio
   #define NUM_SAMPLES 10 // 10 campioni analogici da leggere in 1 secondo
   int sum = 0; // somma dei campioni prelevati
   int sun = 0; // stesso, ma diviso per 10
   char senza segno sample_count = 0; // numero del campione corrente con
   tensione a galleggiante = 0,0; // tensione calcolata
   const int button1 = 7; // pulsante barriera più
   const int button2 = 8; // pulsante barriera-meno
   int i = 5; // barriera
   
void setup () {
     lcd.begin (16, 2); // visualizza l'inizializzazione
     lcd.setCursor (1, 0);
     lcd.setCursor (10, 1);
     lcd.print ("Rx-Tx");
     ritardo (3000);
     lcd.clear ();
     
     TCCR1A = TCCR1A & amp; 0xe0 | 2;
     TCCR1B = TCCR1B & amp; 0xe0 | 0x09;
     analogWrite (9, 126); // al pin 10 PWM = 50% f = 31200Hz
     
     lcd.createChar (1, z1);
     }
     
void loop () {
     int buttonState1 = HIGH; // Lo stato del pulsante è uno
     int buttonState2 = HIGH; // Stato a due pulsanti
   sample_count = 0; // ripristina il contorno del numero di aggiunte
   somma = 0; // resetta la somma di 10 aggiunte
   while (sample_count & lt; NUM_SAMPLES) {
   somma + = analogRead (A4); // la misura successiva viene aggiunta alla somma
   sample_count ++; // l'unità viene aggiunta al numero di misurazione
   sun = sum / 10;} // trova il valore medio tra 10 misurazioni
   
   noll = analogRead (A3) / 2; // potenza del punto medio
   tensione a galleggiante = mappa (analogRead (A3), 0,1023,0,1500) /100,0;
                                        // Voltmetro incorporato all'ingresso A3
   if (sun & gt; = noll + i) {countleds = map (sun, noll + i, noll * 2 - 250, 9, 14);
                                        // se il risultato ricevuto si trova sul 9-15 ° segmento della scala
    tono (6, conteggi * 100);}
   if (sun & lt; = noll - i) {countleds = map (sun, 116, noll - i, 0, 7);
                                        // se il risultato risultante è 0-7 segmenti della scala
    tono (6, contorni * 50); }
     if (sun & lt; noll & amp; & amp; sun & gt; = noll - (i-1)) {countleds = 7;
    noTone (6); } // isolotto di ZERO virtuale (7 segmenti)
     if (sun & gt; noll & amp; & amp; sun & lt; = noll + (i-1)) {countleds = 8;
    noTone (6); } // isola di scala ZERO virtuale (8 segmenti)

   
    {lcd.setCursor (countleds, 0); // imposta il cursore sulla colonna dei conteggi, riga 0
    lcd.print ("\ xff"); // icona riempita
    lcd.setCursor (0, 1); // passa a 2 righe, colonna-0
    lcd.print (char (1)); // Indicazione icona batteria
    lcd.setCursor (1, 1); // passa all'indicazione di tensione
    lcd.print (voltaggio); // voltaggio
    lcd.setCursor (7, 0); // 8a colonna 1a fila
    if (sun & lt; noll) {lcd.print ("{");} // print
    lcd.setCursor (8, 0); // 9a colonna 1a riga
    if (sun & gt; noll) {lcd.print ("}");} // print
    lcd.setCursor (7, 1);
    lcd.print ("B =");
    lcd.setCursor (9, 1); // 11 colonna seconda riga
    lcd.print (i); // barriera
    lcd.setCursor (13, 1); // 13ª colonna seconda riga
    lcd.print (sun); // stampa il valore medio del valore ADC
    ritardo (100); // aspetta
    
  buttonState1 = digitalRead (button1); // Leggi lo stato del pulsante 1
  buttonState2 = digitalRead (button2); // Leggi lo stato del pulsante 2
  if (buttonState1 == LOW) {i = i + 1; ritardo (50);}
                                        // Quando si preme il pulsante, la barriera aumenta di 1. Ritardo 50
  if (buttonState2 == LOW) {i = i - 1; ritardo (50);}
                                        // Quando si preme il pulsante, la barriera diminuisce di 1. Ritardo 50
  if (i & lt; 1) {i = 1;} // Limite inferiore della barriera
  if (i & gt; 38) {i = 38;} // Il limite superiore della barriera
 
 lcd.clear ();
    }
}

Non ho usato la macchina. Gli ultimi due elementi di TL074 sono stati lasciati inattivi. Ma sul circuito e sulla scheda lo sono. Potresti volerli portare in condizioni di lavoro un po 'più tardi. Credo di aver raggiunto il mio obiettivo. L'unità display funziona meravigliosamente. Tutto il resto dipende dal MD.
9.8
10
10

Aggiungi un commento

    • sorrideresorrisiXaxabeneDONTKNOWyahoonea
      capozeroimbrogliaresìSì-sìaggressivosegreto
      scusaballaredance2dance3perdonoaiutobevande
      arrestoamicibuonogoodgoodfischiodeliquiolinguetta
      fumobattimanicraydeclarederisoriodon-t_mentionscaricare
      caloreadiratolaugh1mdaincontromoskingnegativo
      not_ipopcornpunireleggerespaventarespaventacerca
      schernirethank_youquestoto_clueumnikacutoconcordare
      cattivobeeeblack_eyeblum3arrossirevanterianoia
      censuratospiritosagginesecret2minacciarevittoriayusun_bespectacled
      ShokRespektlolPrevedbenvenutoKrutoyya_za
      ya_dobryiaiutantene_huliganne_othodiFludbandovicino
24 commenti
L'autore
Grazie puteec FU! L'ho richiesto dalla seconda volta. Ho ricucito Arduino Uno. Il problema è scomparso dopo l'aggiornamento del bootloader. Ora interessa come configurare ulteriormente.
puteec fu
Qualsiasi Arduino è adatto per atmega168, atmega328. A proposito di nano questo con un connettore USB se non sbaglio. Cuci nell'ide di Arduino dagli esempi dello schizzo Blink (LED lampeggianti sul pin 13, il LED è installato sulla scheda). Assicurati di utilizzare la porta corretta, la scheda è selezionata correttamente, il processore sulla scheda è selezionato correttamente, la frequenza del quarzo sulla scheda è selezionata correttamente e il metodo del firmware (μ2) è selezionato correttamente.
Errore non riscontrato.
Crea un nuovo file in Arduino, copia lo schizzo da qui in uno nuovo e pulito e funzionerà.Ma prima, fai lampeggiare il LED sulla scheda Arduino con un esempio lampeggiante standard. Quindi vai avanti.
Ho comprato Arduino p nano solo sul processore Atmega328. Ho esaminato un sacco di video e forum ... hanno detto che dovrebbe venire fuori .... ma poi il bummer NON lampeggia .... dà #include si aspetta "FILENAME" o . Qualcuno ha riscontrato questo?
L'autore
Uno schizzo funziona con questa scheda. Che cos'è esattamente la spina?
Se si versa l'ultimo schizzo, non è possibile installare tutti i dettagli relativi a D3.3 e D3.4 e loro stessi. Sul saldatore c'è un ridisegno su questo argomento
Anjey888
Ciao Questo argomento è molto interessato. Voglio assemblare il dispositivo. Ho fatto una tavola da saldatore fuori dal giro ... e poi mi sono bloccato. Dal momento che c'è molto disaccordo tra la scheda e il circuito. Ho iniziato a confrontare la tua scheda ... questa è una grande differenza. Ma confuso con l'imbracatura di Arduino.
Chiedo l'aiuto di persone esperte.
L'autore
Lo stesso per gli altri metalli. La profondità di rilevamento dipende dall'area del bersaglio. Più è profondo.
Ospite Eugene
Quali sono i limiti per il rilevamento di oggetti? Oro, alluminio, rame.
Ospite Alexander
Cosa fare adesso, perché esiste ancora una barriera Schottky?
L'autore
Bene qui! Anche il valore più piccolo è fuori discussione! Grazie per il chiarimento
Citazione: puteec_80
E le persone capiranno più rapidamente e intuitivamente di cosa sto parlando.
Puoi continuare a rimanere in questo errore. ((Le persone tecnicamente competenti saranno in perdita.
BARRIERA, marito.
1. Un ostacolo (una specie di muro, una trave trasversale) si è messo di mezzo.
2. Recinzione, recinzione.

SOGLIA, soglia, marito.
1. Nella scienza e nella tecnologia, la soglia è chiamata il valore più piccolo, il grado di manifestazione di qualcosa.
La soglia di sensibilità del dispositivo. | Soglia uditiva. | Soglia del dolore | Il sensore viene attivato quando viene superata la soglia di temperatura impostata.
sorridere
L'autore
Restiamo con i nostri. Scriverò "aumentando la barriera di un'unità" e "la sensibilità del ricevitore era di 5 μV". E scrivi “Aumentare la soglia di funzionamento di un'unità” e “soglia di sensibilità del ricevitore ..” Inoltre, le persone capiranno intuitivamente più rapidamente di cosa sto parlando.
E spiego in questo esempio. Non esiste una soglia in senso stretto, perché non esiste una scala di riferimento chiara. Esiste una sorta di banda fluttuante da un segnale fluttuante. Quindi, mi sembra che la definizione di barriera sia molto più adatta per questa striscia "fluttuante" che per una soglia.
Argomento generalmente inutile e stupido. Avete domande?
Citazione: puteec_80
Quali sono le loro soglie inferiore e superiore?
Forse i significati delle parole tradotte non corrispondono o leggermente non corrispondono. Ma descrivono perfettamente il processo e gradualmente entrano in gergo.
Proprio quella soglia. La soglia di risposta è nel tuo caso. Spiegare come la "barriera" descrive il processo.
Per quanto riguarda l'adesione al gergo - ora ci sono molti tipi di equivoci lì ((
L'autore
In questo caso, tendo ancora ad usare la parola "barriera", perché è la barriera impostata nel testo del programma, ma senza entrare nel suo raggio d'azione, il segnale viene percepito dal microcontrollore come utile. Ed è la barriera perché Ha due valori: i limiti superiore e inferiore del rodaggio, ad es. l'operazione si verifica al di sopra del "superiore" e al di sotto del bordo "inferiore" della barriera sulla scala ADC. Tuttavia, lo sai meglio. Quali sono le loro soglie inferiore e superiore?
Forse i significati delle parole tradotte non corrispondono o leggermente non corrispondono. Ma descrivono perfettamente il processo e gradualmente entrano in gergo.
A proposito. La sensibilità e la barriera sono cose completamente diverse.
Sì.Si intersecano. Ma non di più.
Citazione: puteec_80
In MD straniero, il menu dice "Barier".

Potrei sorprenderti, ma molte parole inglesi che assomigliano alle nostre hanno un significato diverso, a volte vicino, a volte no. Cerca le parole "falsi traduttori amici".
Ora essenzialmente. In russo tecnico documentazione no semplicemente non esiste una frase del genere "barriera della sensibilità" - e basta! Esiste una "soglia di sensibilità", in alcuni casi si può dire un "limite di sensibilità", ma non una "barriera di sensibilità". Forse in alcune altre branche della conoscenza viene utilizzato, ma non nell'elettronica.
L'autore
Bene, significa che tutti gli ingegneri stranieri stanno saltando su un bastone sulla strada. In MD straniero, il menu dice "Barier". Compagno Ivan, mi stai cadendo negli occhi con un tale pignolo! Dove sono i tuoi commenti sul merito? Dopo di che devi battere le mani sulla fronte? Mi viziavi spesso punire
La differenza è significativa: la soglia è un termine tecnico, la barriera è un "bastone dall'altra parte della strada".
L'autore
Forse. Ma non vedo la differenza.
Forse non una "barriera", ma una soglia? ;)
L'autore
Il diagramma non mostra i pulsanti di regolazione della barriera. Sono collegati ai pin 7 e 8 dell'Arduino. Ciascuno tirato su con una resistenza di 10k al più, si chiude quando si preme la massa.
L'autore
void loop () {
int buttonState1 = HIGH; // Lo stato del pulsante è uno
int buttonState2 = HIGH; // Stato a due pulsanti

int pot = analogRead (A4); // filtro per cambio rapido del segnale
segno = segno * (1-K) + vaso * K;

noll = noll * (1-L) + segno * L; // filtro di segnale a lungo termine
// Voltmetro incorporato all'ingresso A3
tensione a galleggiante = mappa (analogRead (A3), 0,1023,0,1500) /100,0;

if (segno> = noll + i) {countleds = map (segno, noll + i, 1023, 9, 14);
// se il risultato ricevuto si trova sul 9-15 ° segmento della scala
tono (6, conteggi * 100);}
if (segno <= noll - i) {countleds = map (segno, 0, noll - i, 0, 7);
// se il risultato risultante è 0-7 segmenti della scala
tono (6, contorni * 50); }
if (segno = noll - (i-1)) {countleds = 7;
noTone (6); } // isolotto di ZERO virtuale (7 segmenti)
if (sign> noll && sign <= noll + (i-1)) {countleds = 8;
noTone (6); } // isola di scala ZERO virtuale (8 segmenti)


{lcd.setCursor (countleds, 0); // imposta il cursore sulla colonna dei conteggi, riga 0
lcd.print ("\ xff"); // icona riempita
lcd.setCursor (0, 1); // passa a 2 righe, colonna-0
lcd.print (char (1)); // Indicazione icona batteria
lcd.setCursor (1, 1); // passa all'indicazione di tensione
lcd.print (voltaggio); // voltaggio
lcd.setCursor (7, 0); // 8a colonna 1a fila
if (sign lcd.setCursor (8, 0); // 9a colonna 1a riga
if (sign> noll) {lcd.print ("}");} // print
lcd.setCursor (7, 1);
lcd.print ("B =");
lcd.setCursor (9, 1); // 11 colonna seconda riga
lcd.print (i); // barriera
lcd.setCursor (13, 1); // 13ª colonna seconda riga
lcd.print (segno); // stampa il valore medio del valore ADC
ritardo (10); // aspetta

buttonState1 = digitalRead (button1); // Leggi lo stato del pulsante 1
buttonState2 = digitalRead (button2); // Leggi lo stato del pulsante 2
if (buttonState1 == LOW) {i = i + 1; ritardo (50);}
// Quando si preme il pulsante, la barriera aumenta di 1. Ritardo 50
if (buttonState2 == LOW) {i = i - 1; ritardo (50);}
// Quando si preme il pulsante, la barriera diminuisce di 1. Ritardo 50
if (i <1) {i = 1;} // Limite inferiore della barriera
if (i> 38) {i = 38;} // Il limite superiore della barriera

lcd.clear ();
}
}
L'autore
Nuovo schizzo. L'algoritmo per rilevare il segnale utile è stato modificato. Lo schema è semplificato, non ci sono elementi D3.4 e D3.3 con tutte le loro associazioni. Se prendi il tuo sigillo, semplicemente tutti questi dettagli non possono essere installati. Più sensibilità. Nessun falso positivo.
schizzo:

// Ingresso A3-analogico per un voltmetro impostabile dal potenziometro R32.
// Ingresso A4-analogico per il segnale Impostato con il segnale minimo su D3.2
// resistenza R40 per letture ADC di circa 510.
// 6- conclusione dello zook
// 9 - frequenza di uscita 31200 Hz
#include
LCD a cristalli liquidi (12, 11, 5, 4, 3, 2);

byte z1 [8] = {// icona batteria
0b01100, 0b11110, 0b11110, 0b11110, 0b11110, 0b11110, 0b11110};
int countleds = 0; // variabile per memorizzare il valore del livello di scala

tensione a galleggiante = 0,0; // tensione calcolata
const int button1 = 7; // pulsante barriera più
const int button2 = 8; // pulsante barriera-meno
int i = 5; // barriera
const float K = 0.1; // filtro per il rilevamento rapido delle variazioni (coefficiente. più piccolo è il più forte)
const float L = 0,07; // filtro tiene traccia delle modifiche per lungo tempo
segno float = 0; // filtro
float noll = 0;

void setup () {
lcd.begin (16, 2); // visualizza l'inizializzazione
lcd.createChar (1, z1);
pinMode (9, OUTPUT);
pinMode (6, OUTPUT);
TCCR1A = TCCR1A e 0xe0 | 2;
TCCR1B = TCCR1B e 0xe0 | 0x09;
analogWrite (9, 126); // al pin 10 PWM = 50% f = 31200Hz
// infatti, per PWM = 50% è necessario impostare almeno 220 riempimento, secondo l'oscilloscopio
// il duino non può gestirlo. Questo non è critico.
}
L'autore
Coloro che guarderanno lo schizzo. I segni> = e <= sono stati sostituiti da strane combinazioni di & gt e & lt. Perché non lo so. Quando il debug era normale.

Ti consigliamo di leggere:

Passalo per lo smartphone ...