Innehållsförteckning:

Arduino -baserad pulsinduktionsdetektor - Flip Coil: 5 steg (med bilder)
Arduino -baserad pulsinduktionsdetektor - Flip Coil: 5 steg (med bilder)

Video: Arduino -baserad pulsinduktionsdetektor - Flip Coil: 5 steg (med bilder)

Video: Arduino -baserad pulsinduktionsdetektor - Flip Coil: 5 steg (med bilder)
Video: DIY Mono Coil for Pulse Induction Metal Detector 2024, Juli
Anonim
Arduino -baserad pulsinduktionsdetektor - Flip Coil
Arduino -baserad pulsinduktionsdetektor - Flip Coil
Arduino -baserad pulsinduktionsdetektor - Flip Coil
Arduino -baserad pulsinduktionsdetektor - Flip Coil

Idén

Efter att ha byggt några metalldetektorer tidigare med varierande resultat ville jag utforska Arduino -funktionerna i den riktningen.

Det finns några bra exempel på hur man bygger metaldetektorer med Arduino, några här som instruktioner. Men när man tittar på dem kräver de normalt antingen ganska många externa komponenter för den analoga signalbehandlingen eller känsligheten är ganska låg.

När man tänker på metalldetektorer är huvudämnet hur man känner av de små spänningsförändringarna i signaler relaterade till sökspolen. Dessa förändringar är normalt mycket små. Det mest uppenbara tillvägagångssättet skulle vara att använda de analoga ingångarna till ATmega328. Men när man tittar på specifikationerna finns det två grundläggande problem: de är (ofta) för långsamma och upplösningen är (i de flesta fall) för låg.

Å andra sidan körs Arduino på 16MHz och har en hel del timingfunktioner i. e. en upplösning på 0,0625µS om klockhastigheten används. Så istället för att använda den analoga ingången för avkänning är det enklaste sättet att känna av små dynamiska förändringar i spänning att jämföra förändringen i spänningsfall över tid vid en fast referensspänning.

För detta ändamål har ATmega328 den snygga funktionen hos en intern komparator mellan D6 och D7. Denna komparator kan utlösa ett avbrott, vilket möjliggör exakt händelsehantering. Arduino lämnar bredvid de välkodade tidsrutinerna som millis () och micos () och går in i den interna timern på ATmega328 med mycket högre upplösning, och är en utmärkt grund för metaldetekteringsmetoder.

Så ur en källkodvy skulle en bra start vara att programmera den interna komparatorn för "förändring" i ingångarnas polaritet och använda en intern räknare med den högsta möjliga hastigheten för ändring av tidpunkten för ändringarna.

Den allmänna koden i Arduido för att uppnå detta är:

// Definiera alla nödvändiga förvariabler etc. och konfigurera registren

osignerad char clockSelectBits = _BV (CS10); // ingen förskalning, fullständig xtal tomrumsinställning () {pinMode (6, INPUT); // + av komparatorn - genom att ställa in dem som INPUT är de // inställda på hög impedans pinMode (7, INPUT); // - av jämföraren - genom att ställa in dem som INPUT, är de // inställda på hög impedans cli (); // stopp avbryter TCCR1A = 0; // ställ in hela TCCR1A -registret till 0 TCCR1B = 0; // samma för TCCR1B -> normallägeTCNT1 = 0; // initiera räknevärdet till 0; TCCR1B | = clockSelectBits; // ställer in förkalkylator och startar klockan TIMSK1 = _BV (TOIE1); // ställer in timeroverflow interrupt enable bit sei (); // tillåt avbrott ACSR = (0 << ACD) | // Analog komparator: Aktiverad (0 << ACBG) | // Analog Comparator Bandgap Select: AIN0 tillämpas på den positiva ingången (0 << ACO) | // Analog komparatorutgång: Av (1 << ACI) | // Analog Comparator Interrupt Flag: Rensa väntande avbrott (1 << ACIE) | // Analog Comparator Interrupt: Aktiverad (0 << ACIC) | // Analog Comparator Input Capture: Inaktiverad (0 << ACIS1 | 0 << ACIS0 // avbrott vid växling av utgång // (0 << ACIS1 | 1 << ACIS0 // reserverad // (1 << ACIS1 | 0 << ACIS0 // avbrott på fallande utmatningskant // (1 << ACIS1 | 1 << ACIS0 // avbrott på stigande ingångskant;}

// denna rutin anropas varje gång komparatorn skapar ett avbrott

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

// denna rutin anropas varje gång det finns ett överflöd i intern räknare

ISR (TIMER1_OVF_vect) {timer1_overflow_count ++; }

// denna rutin används för att återställa timern till 0

void resetTimer (void) {oldSREG = SREG; cli (); // Inaktivera avbrott TCNT1 = 0; // initiera räknevärdet till 0 SREG = oldSREG; // Återställ statusregister TCCR1B | = clockSelectBits; // ställer in förkalkylator och startar klockan timer1_overflow_count = 0; // återställer överflödsräknare}

Naturligtvis är denna idé inte helt ny. Huvuddelen av denna kod kan hittas någon annanstans. En bra implementering en sådan metod för en mikrokontroller som finns på TPIMD - Tiny Pulse Induction Metal Detector hemsida.

www.miymd.com/index.php/projects/tpimd/ (tyvärr är denna sida inte längre online, det finns för närvarande en säkerhetskopia av webbplatsen på www.basic4mcu.com, sök efter "TPIMD").

Steg 1: Arduino Pulse Induction Idea - Flip Coil

Arduino Pulse Induction Idea - Flip Coil
Arduino Pulse Induction Idea - Flip Coil
Arduino Pulse Induction Idea - Flip Coil
Arduino Pulse Induction Idea - Flip Coil

Tanken är att använda Arduino som en pulsinduktionsdetektor, som i TPIMD, eftersom tidpunktsidén om förfallskurvan verkar fungera ganska bra. Problemet med pulsinduktionsdetektorer är att de normalt behöver olika spänning för att fungera. En spänning för att driva spolen och en separat spänning för att hantera sönderfallskurvan. Dessa två spänningskällor gör pulsinduktionsdetektorer alltid lite komplicerade.

Om man tittar på spolen i spolen i en PI -detektor kan den resulterande kurvan delas upp i två olika steg. Det första steget är själva pulsen som driver spolen och bygger upp magnetfältet (1). Det andra steget är spänningsförfallskurvan, som börjar med en spänningstopp och justeras sedan snabbt till spänningens (2) spänningslösa spänning (2). Problemet är att spolen ändrar sin polaritet efter pulsen. Är pulsen positiv (Var 1. på bifogad bild) är sönderfallskurvan negativ. Är pulsen negativ kommer sönderfallskurvan att vara positiv (Var 2. i bifogad bild)

För att lösa detta grundläggande problem måste spolen "vändas" elektroniskt efter pulsen. I detta fall kan pulsen vara positiv och sönderfallskurvan kan också vara positiv.

För att uppnå detta måste spolen isoleras från Vcc och GND efter pulsen. För närvarande är det bara en ström som flödar genom ett dämpningsmotstånd. Detta isolerade system med spole och dämpningsmotstånd kan”orienteras” till vilken referensspänning som helst. Detta kommer i teorin att skapa den kombinerade positiva kurvan (nedre delen av ritningen)

Denna positiva kurva kan sedan användas via komparatorn för att detektera den tidpunkt då sönderfallsspänningen "korsar" en referensspänning. Vid skatter nära spolen ändras sönderfallskurvan och tidpunkten som passerar referensspänningen ändras. Denna förändring kan upptäckas.

Efter lite experimenterande visade sig följande krets fungera.

Kretsen består av en Arduino Nano -modul. Denna modul driver två MOSFET -transistorer som driver spolen (vid SV3) via D10. När pulsen vid D10 slutar isolerar båda MOSFET -spolen från 12V och GND. Den sparade energin i spolen blöder ut genom R2 (220 Ohm). Samtidigt ansluter R1 (560 Ohms) den tidigare positiva sidan av spolen till GND. Detta ändrar den negativa sönderfallskurvan vid R5 (330 Ohm) till en positiv kurva. Dioderna skyddar ingångsstiften på Arduino.

R7 är en spänningsdelare på cirka 0,04V. För tillfället blir sönderfallskurvan vid D7 mer negativ än 0,04 vid D6 ett avbrott triggert och varaktigheten efter slutet av pulsen sparas.

För metall nära spolen, förfaller kurvan längre, och tiden mellan slutet av pulsen och avbrottet blir längre.

Steg 2: Bygga detektorn (brödbräda)

Bygga detektorn (brödbräda)
Bygga detektorn (brödbräda)
Bygga detektorn (brödbräda)
Bygga detektorn (brödbräda)
Bygga detektorn (brödbräda)
Bygga detektorn (brödbräda)

Att bygga detektorn är ganska enkelt. Detta kan göras antingen på en brödbräda (håller sig till den ursprungliga kretsen) eller genom att löda delarna på ett kretskort.

D13 LED på Arduino Nano -kortet används som en indikation för metall

Att lossa en brödbräda är det snabbaste sättet att fungera detektorn. Det behövs ganska mycket ledningar, men det går att göra på en liten brödbräda. På bilderna visas detta i 3 steg när Arduino och MOSFET döljer några av trådarna. När jag testade kopplade jag bort dioderna på något sätt utan att först märka det. Detta hade ingen negativ effekt på detektorns beteende. I kretskortversionen av kretsen lämnade jag dem helt.

Anslutningarna till en 0,96 OLED -skärm visas inte på bilderna. Denna display är ansluten:

Vcc - 5V (vid Arduino -stiftet, inte matningsspänningen !!!)

GND - GND

SCL - A5

SDA - A4

Denna OLED -skärm behövs för att kalibrera detektorn från början. Detta görs genom att ställa in rätt spänning vid PIN6 på Arduino. Denna spänning bör vara runt 0,04V. Displayen hjälper till att ställa in rätt spänning.

Bräda -versionen fungerar ganska bra, men förmodligen inte lämpad för att gå i naturen.

Steg 3: Gå på PCB

Går PCB
Går PCB
Går PCB
Går PCB
Går PCB
Går PCB
Går PCB
Går PCB

När det gäller lödning gillar jag inte riktigt dubbelsidig högteknologiskt kretskort, så jag ändrade kretsen för att passa på ett på sidigt kretskort.

Följande ändringar gjordes:

1. dioderna utelämnades.

2. MOSFETs portar fick ett motstånd på 10 Ohm

3. matningsspänningen för spänningsdelaren vid D6 ges av en HIGH-nivåsignal vid D8

4. förarpinnen för MOSFET: erna ändrades.

På så sätt kan ett ensidigt kretskort skapas som kan lödas på universella kretskort. Med denna krets kommer du att ha en fungerande PI-detektor med endast 8-10 externa komponenter (beroende på om OLED-skärmen och/eller en högtalare används).

Steg 4: Installera och använda detektorn

Installera och använda detektorn
Installera och använda detektorn
Installera och använda detektorn
Installera och använda detektorn
Installera och använda detektorn
Installera och använda detektorn

Om detektorn är korrekt byggd och programmet skrivs till Arduino är det enklaste (om inte det enda) sättet att ställa in enheten att använda en OLED -display. Displayen är ansluten till 5V, GND, A4, A5. Displayen ska visa "kalibrering" när enheten startas. Efter några sekunder ska det stå "kalibrering klar" och tre siffror ska visas på displayen.

Det första numret är det "referensvärde" som identifierats under kalibreringen. Det andra värdet är det sista uppmätta värdet och det tredje värdet är ett medelvärde för de senaste 32 mätningarna.

Dessa tre värden bör vara mer eller mindre desamma (i mina testfall under 1000). Mittvärdet bör vara mer eller mindre stabilt.

För att starta den första installationen bör det inte finnas någon metall nära spolen.

Nu ska spänningsdelaren (trimpotentiometern) trimmas så att de två nedre värdena ska sättas till ett maximum samtidigt som de ger en stabil avläsning. Det finns en kritisk inställning, där mittvärdet börjar ge konstiga avläsningar. Vrid tillbaka trimmern för att få stabila värden igen.

Det kan hända att displayen fryser. Tryck bara på återställningsknappen och börja om.

För min inställning (spole: 18 varv @ 20cm) är det stabila värdet cirka 630-650. När det väl är inställt trycker du på återställningsknappen, enheten kalibrerar om och alla trädvärden ska vara i samma intervall igen. Om metall nu förs in i spolen ska lysdioden på Arduino-kortet (D13) lysa. En bifogad högtalare ger några klickljud (det finns utrymme för förbättringar i programmeringen där).

För att förhindra höga förväntningar:

Detektorn upptäcker vissa saker, men det förblir en mycket enkel och begränsad detektor.

För att ge ett intryck av möjligheterna, a gjorde några referensdetekteringar med olika andra detektorer. Ser man på resultaten är det fortfarande ganska imponerande för en detektor med endast 8 yttre delar men inte matchande professionella detektorer.

Om man tittar på kretsen och programmet finns det mycket utrymme för förbättringar. Resistornas värden hittades genom erfarenhet, pulstiden på 250 ms valdes slumpmässigt, spolparametrarna också. Om du har idéer till förbättringar diskuterar jag dem gärna.

Ha så kul!

Steg 5: Uppdatering1: Använda en 16x2 LCD

Update1: Använda en 16x2 LCD
Update1: Använda en 16x2 LCD
Update1: Använda en 16x2 LCD
Update1: Använda en 16x2 LCD
Update1: Använda en 16x2 LCD
Update1: Använda en 16x2 LCD

Förbättringar

Under ytterligare tester insåg jag att biblioteket för I2C OLED -skärmen tog mycket tid. Så jag bestämde mig för att använda en 16x2 -skärm med en I2C -omvandlare istället.

Så jag antog programmet till LCD -skärmen och lade till några användbara funktioner. Displayens första rad visar nu signalstyrkan för en möjlig indikation. Den andra raden visar nu två värden. Näven indikerade den aktuella signalavvikelsen jämfört med kalibreringsvärdet. Det här värdet ska vara "0". Om detta värde ständigt är negativt eller positivt bör detektorn kalibreras igen genom att trycka på återställningsknappen. Positiva värden indikerar metall nära spolen.

Det andra värdet visar det faktiska fördröjningsvärdet för sönderfallskurvan. Det här värdet är normalt inte så intressant, men behövs för den första installationen av detektorn.

Programmet tillåter nu flera pulstider i en sekvens (sätt att experimentera / förbättra prestanda). Jag uppnådde ingen genombrott. Så standard är inställd på en pulslängd.

Initial installation av detektorn

När du ställer in detektorn är det andra värdet på den andra raden relevant (den första kan ignoreras). Initialt kan värdet vara "instabilt" (se bild). Vrid trimmotståndet tills värdet är stabilt. Vrid sedan det för att öka värdet till ett maximalt stabilt värde. Tryck på återställningsknappen för att kalibrera om och detektorn är klar att användas.

Jag fick intrycket att genom att ställa in det maximala stabila värdet förlorade jag känsligheten för icke-järnmetaller. Så det kan vara värt att experimentera med inställningarna för att ha en bra känslighet för saker som inte är av järn.

Spolar

Jag bygger 3 spolar för vidare testning

1 -> 18 varv @ 200 mm

2 -> 25 varv @ 100 mm

3 -> 48 varv @ 100 mm

Intressant nog fungerade alla spolar ganska bra, med nästan samma prestanda (20ct mynt vid 40-50 mm i luft). Detta kan vara en ganska subjektiv observation.

Rekommenderad: