Innholdsfortegnelse:

Arduino -basert pulsinduksjonsdetektor - Flip Coil: 5 trinn (med bilder)
Arduino -basert pulsinduksjonsdetektor - Flip Coil: 5 trinn (med bilder)

Video: Arduino -basert pulsinduksjonsdetektor - Flip Coil: 5 trinn (med bilder)

Video: Arduino -basert pulsinduksjonsdetektor - Flip Coil: 5 trinn (med bilder)
Video: Что купить новичку в Arduino? Большой обзор 2024, Juli
Anonim
Arduino -basert pulsinduksjonsdetektor - Flip Coil
Arduino -basert pulsinduksjonsdetektor - Flip Coil
Arduino -basert pulsinduksjonsdetektor - Flip Coil
Arduino -basert pulsinduksjonsdetektor - Flip Coil

Ideen

Etter å ha bygget noen metalldetektorer tidligere med varierende resultater, ønsket jeg å utforske mulighetene til Arduino i den retningen.

Det er noen gode eksempler på hvordan man bygger metaldetektorer med Arduino, noen her som instrukser. Men når man ser på dem, krever de vanligvis enten ganske mange eksterne komponenter for den analoge signalbehandlingen eller sensitiviteten er ganske lav.

Når du tenker på metalldetektorer, er hovedtemaet hvordan du kan føle de små endringene i spenningen i signaler relatert til søkespolen. Disse endringene er vanligvis veldig små. Den mest åpenbare tilnærmingen vil være å bruke de analoge inngangene til ATmega328. Men når vi ser på spesifikasjonene, er det to grunnleggende problemer: de er (ofte) for sakte og oppløsningen er (i de fleste tilfeller) for lav.

På den annen side kjører Arduino på 16MHz og har ganske mange timingmuligheter i. e. en oppløsning på 0,0625µS hvis du bruker klokkehastighet. Så i stedet for å bruke den analoge inngangen for sensing, er den enkleste måten å føle små dynamiske endringer i spenning å sammenligne endringen i spenningsfall over tid ved en fast referansespenning.

For dette formålet har ATmega328 den fine egenskapen til en intern komparator mellom D6 og D7. Denne komparatoren kan utløse et avbrudd, noe som muliggjør presis hendelseshåndtering. Ved å gå ved siden av de pent kodede timingsrutinene som millis () og micos () og gå inn i den interne timeren til ATmega328 med mye høyere oppløsning, er Arduino et flott grunnlag for metaldetekteringsmetoder.

Så fra en kildekodevisning, ville en god start være å programmere den interne komparatoren for "endring" i polariteten til inngangene og bruke en intern teller med høyest mulig hastighet for endring i timingen av endringene.

Den generelle koden i Arduido for å oppnå dette er:

// Definere alle nødvendige forhåndsvariabler etc. og sette opp registrene

usignert char clockSelectBits = _BV (CS10); // uten forhåndsskala, full xtal oppsett av tomrom () {pinMode (6, INPUT); // + av komparatoren - ved å sette dem som INPUT, blir de // satt til pinMode med høy impedans (7, INPUT); // - av komparatoren - ved å sette dem som INPUT, blir de // satt til høy impedans cli (); // stopp avbryter TCCR1A = 0; // sett hele TCCR1A -registeret til 0 TCCR1B = 0; // samme for TCCR1B -> normal modusTCNT1 = 0; // initialiser telleverdi til 0; TCCR1B | = clockSelectBits; // stiller inn forhåndskalkulator og starter klokken TIMSK1 = _BV (TOIE1); // angir timeroverflow interrupt enable bit sei (); // tillat avbrudd ACSR = (0 << ACD) | // Analog komparator: Aktivert (0 << ACBG) | // Analog Comparator Bandgap Select: AIN0 brukes på den positive inngangen (0 << ACO) | // Analog komparatorutgang: Av (1 << ACI) | // Analog Comparator Interrupt Flag: Fjern ventende avbrudd (1 << ACIE) | // Analog Comparator Interrupt: Aktivert (0 << ACIC) | // Analog Comparator Input Capture: Deaktivert (0 << ACIS1 | 0 << ACIS0 // avbrudd på utgangsknappen // (0 << ACIS1 | 1 << ACIS0 // reservert // (1 << ACIS1 | 0 << ACIS0 // avbrudd på fallende utgangskant // (1 << ACIS1 | 1 << ACIS0 // avbrudd på stigende inngangskant;}

// denne rutinen kalles hver gang komparatoren lager et avbrudd

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

// denne rutinen kalles hver gang det er et overløp i intern teller

ISR (TIMER1_OVF_vect) {timer1_overflow_count ++; }

// denne rutinen brukes til å tilbakestille timeren til 0

void resetTimer (void) {oldSREG = SREG; cli (); // Deaktiver avbrudd TCNT1 = 0; // initialiser tellerverdi til 0 SREG = oldSREG; // Gjenopprett statusregister TCCR1B | = clockSelectBits; // setter forhåndskalkulator og starter klokken timer1_overflow_count = 0; // tilbakestiller overløpsteller}

Selvfølgelig er denne ideen ikke helt ny. Hoveddelen av denne koden finnes andre steder. En god implementering slik en fremgangsmåte for en mikrokontroller funnet på TPIMD - Tiny Pulse Induction Metal Detector hjemmeside.

www.miymd.com/index.php/projects/tpimd/ (dessverre er denne siden ikke online lenger, det er for øyeblikket en sikkerhetskopi av nettstedet på www.basic4mcu.com, søk etter "TPIMD").

Trinn 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

Ideen er å bruke Arduino som en pulsinduksjonsdetektor, som i TPIMD, ettersom timingen om forfallskurven ser ut til å fungere ganske bra. Problemet med pulsinduksjonsdetektorer er at de vanligvis trenger forskjellig spenning for å fungere. En spenning for å drive spolen og en egen spenning for å håndtere forfallskurven. Disse to spenningskildene gjør pulsinduksjonsdetektorer alltid litt kompliserte.

Ser man på spenningen til spolen i en PI -detektor, kan den resulterende kurven deles i to forskjellige stadier. Det første trinnet er selve pulsen som driver spolen og bygger opp magnetfeltet (1). Det andre trinnet er spenningsforfallskurve, som starter med en spenningstopp, og justerer deretter raskt til spenningen (2) uten strøm. Problemet er at spolen endrer polaritet etter pulsen. Er pulsen positiv (Var 1. på vedlagte bilde) er forfallskurven negativ. Er pulsen negativ, vil forfallskurven være positiv (Var 2. i vedlagte bilde)

For å løse dette grunnleggende problemet, må spolen "vendes" elektronisk etter pulsen. I dette tilfellet kan pulsen være positiv og forfallskurven kan også være positiv.

For å oppnå dette må spolen isoleres fra Vcc og GND etter pulsen. For øyeblikket flyter det bare en strøm gjennom en dempningsmotstand. Dette isolerte systemet med spole og dempningsmotstand kan enn så være "orientert" til hvilken som helst referansespenning. Dette vil i teorien skape den kombinerte positive kurven (nederst på tegningen)

Denne positive kurven kan deretter brukes via komparatoren til å oppdage tidspunktet hvor forfallsspenningen "krysser" en referansespenning. Ved skatter nær spolen endres forfallskurven og tidspunktet som krysser referansespenningen endres. Denne endringen kan oppdages.

Etter litt eksperimentering viste følgende krets å fungere.

Kretsen består av en Arduino Nano -modul. Denne modulen driver to MOSFET -transistorer som driver spolen (ved SV3) via D10. Når pulsen ved D10 slutter, isolerer begge MOSFET -spolene fra 12V og GND. Den lagrede energien i spolen bløder ut gjennom R2 (220 ohm). Samtidig kobler R1 (560 Ohm) den tidligere positive siden av spolen til GND. Dette endrer den negative forfallskurven ved R5 (330 Ohm) til en positiv kurve. Diodene beskytter inngangspinnen til Arduino.

R7 er en spenningsdeler på omtrent 0,04V. For øyeblikket blir forfallskurven ved D7 mer negativ enn 0,04 ved D6, et avbrudd utløses og varigheten etter at pulsen er avsluttet lagres.

Ved metall i nærheten av spolen varer forfallskurven lenger, og tiden mellom slutten av pulsen og avbruddet blir lengre.

Trinn 2: Bygg detektoren (brødbrett)

Bygge detektoren (brødbrett)
Bygge detektoren (brødbrett)
Bygge detektoren (brødbrett)
Bygge detektoren (brødbrett)
Bygge detektoren (brødbrett)
Bygge detektoren (brødbrett)

Det er ganske enkelt å bygge detektoren. Dette kan gjøres enten på et brødbrett (holder seg til den opprinnelige kretsen) eller ved å lodde delene på en PCB.

D13 LED på Arduino Nano -kortet brukes som en indikasjon for metall

Å kaste ut et brødbrett er den raskeste veien til arbeidsdetektoren. Det trengs ganske mange ledninger, men dette kan gjøres på et lite brødbrett. På bildene vises dette i 3 trinn mens Arduino og MOSFETene gjemmer noen av ledningene. Når jeg testet, koblet jeg fra dioder på en eller annen måte uten å merke det først. Dette hadde ingen negativ effekt på detektorens oppførsel. I PCB -versjonen av kretsen forlot jeg dem helt.

Tilkoblingen til en 0,96 OLED -skjerm vises ikke på bildene. Denne skjermen er tilkoblet:

Vcc - 5V (ved Arduino -pinnen, ikke forsyningsspenningen !!!)

GND - GND

SCL - A5

SDA - A4

Denne OLED -skjermen er nødvendig for å kalibrere detektoren først. Dette gjøres ved å sette riktig spenning til PIN6 på Arduino. Denne spenningen skal være rundt 0,04V. Displayet hjelper til med å stille riktig spenning.

Brettbrettversjonen fungerer ganske bra, selv om den sannsynligvis ikke er egnet for å komme seg ut i naturen.

Trinn 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 gjelder lodding, liker jeg egentlig ikke tosidig høyteknologisk kretskort, så jeg endret kretsen for å passe på en sidekretskort.

Følgende modifikasjoner ble gjort:

1. Diodene ble utelatt.

2. portene til MOSFETene fikk en motstand på 10 Ohm

3. forsyningsspenningen for spenningsdeleren ved D6 er gitt av et HIGH-nivå signal ved D8

4. driver -pin for MOSFET -er ble endret.

På denne måten kan det opprettes en ensidig PCB som kan loddes på universelle PCB. Ved bruk av denne kretsen vil du ha en fungerende PI-detektor med bare 8-10 eksterne komponenter (avhengig av om OLED-skjermen og/eller en høyttaler brukes).

Trinn 4: Sette opp og bruke detektoren

Sette opp og bruke detektoren
Sette opp og bruke detektoren
Sette opp og bruke detektoren
Sette opp og bruke detektoren
Sette opp og bruke detektoren
Sette opp og bruke detektoren

Hvis detektoren er riktig bygget og programmet er skrevet til Arduino, er den enkleste (om ikke den eneste) måten å sette opp enheten på, å bruke en OLED -skjerm. Displayet er festet til 5V, GND, A4, A5. Displayet skal vise "kalibrering" etter at enheten er slått på. Etter noen sekunder skal det stå "kalibrering utført", og tre tall skal vises på displayet.

Det første tallet er "referanseverdien" som ble identifisert under kalibrering. Den andre verdien er den siste målte verdien og den tredje verdien er en middelverdi av de siste 32 målingene.

Disse tre verdiene bør være mer eller mindre de samme (i mine test-tilfeller under 1000). Den mellomste verdien skal være mer eller mindre stabil.

For å starte det første oppsettet, bør det ikke være metall i nærheten av spolen.

Nå skal spenningsdeleren (trimpotensiometeret) trimmes slik at de to nedre verdiene skal settes til et maksimum mens de fortsatt gir stabil avlesning. Det er en kritisk setting, der mellomverdien begynner å gi rare avlesninger. Snu trimmeren tilbake for å oppnå stabile verdier igjen.

Det kan skje at skjermen fryser. Bare trykk på tilbakestillingsknappen og begynn på nytt.

For mitt oppsett (spole: 18 svinger @ 20cm) er den stabile verdien rundt 630-650. Når den er angitt, trykker du på tilbakestillingsknappen, enheten kalibrerer på nytt og alle treverdier skal være i samme område igjen. Hvis metall nå bringes til spole, bør LED-lampen på Arduino-kortet (D13) lyse. En vedlagt høyttaler gir noen klikkelyder (det er rom for forbedring av programmeringen der).

For å forhindre høye forventninger:

Detektoren oppdager noen ting, men den forblir en veldig enkel og begrenset detektor.

For å gi et inntrykk av evnene, gjorde jeg noen referansedeteksjoner med forskjellige andre detektorer. Ser vi på resultatene, er det fortsatt ganske imponerende for en detektor med bare 8 eksterne deler, men ikke matchende profesjonelle detektorer.

Når man ser på kretsen og programmet, er det mye rom for forbedringer. Verdiene til motstandene ble funnet av erfaring, pulstiden på 250 ms ble valgt tilfeldig, spoleparametrene også. Hvis du har ideer til forbedringer, vil jeg mer enn gjerne diskutere dem.

Ha det gøy!

Trinn 5: Oppdatering1: Bruke en 16x2 LCD

Oppdatering 1: Bruke en 16x2 LCD
Oppdatering 1: Bruke en 16x2 LCD
Oppdatering 1: Bruke en 16x2 LCD
Oppdatering 1: Bruke en 16x2 LCD
Oppdatering 1: Bruke en 16x2 LCD
Oppdatering 1: Bruke en 16x2 LCD

Forbedringer

Under ytterligere testing innså jeg at biblioteket for I2C OLED -skjermen brukte lang tid. Så jeg bestemte meg for å bruke en 16x2 skjerm med en I2C -omformer i stedet.

Så jeg adopterte programmet til LCD -skjermen og la til noen nyttige funksjoner. Den første linjen i displayet viser nå signalstyrken til en mulig indikasjon. Den andre linjen viser nå to verdier. Knyttneven indikerte gjeldende signalavvik sammenlignet med kalibreringsverdien. Denne verdien skal være "0". Hvis denne verdien er konstant negativ eller positiv, bør detektoren kalibreres på nytt ved å trykke på tilbakestillingsknappen. Positive verdier indikerer metall nær spolen.

Den andre verdien viser den faktiske forsinkelsesverdien til forfallskurven. Denne verdien er normalt ikke så interessant, men er nødvendig for det første oppsettet av detektoren.

Programmet åpner nå for flere pulsvarigheter i en sekvens (metoder for å eksperimentere / forbedre ytelsen). Jeg oppnådde ingen gjennombrudd. Så standard er satt til en pulsvarighet.

Første oppsett av detektoren

Når du setter opp detektoren, er den andre verdien på den andre linjen relevant (den første kan ignoreres). I utgangspunktet kan verdien være "ustabil" (se bilde). Vri trimmotstanden til verdien er stabil. Vri den deretter for å øke verdien til en maksimal stabil verdi. Trykk på tilbakestillingsknappen for å kalibrere på nytt, og detektoren er klar til bruk.

Jeg fikk inntrykk av at ved å sette maksimal stabil verdi, mistet jeg følsomheten for ikke-jernmetaller. Så det kan være verdt å eksperimentere med innstillingene for å ha en god følsomhet for ting som ikke er jern.

Spoler

Jeg bygger 3 spoler for videre testing

1 -> 18 svinger @ 200 mm

2 -> 25 svinger @ 100mm

3 -> 48 svinger @ 100mm

Interessant nok fungerte alle spoler ganske bra, med nesten samme ytelse (20 ct mynt på 40-50 mm i luft). Dette kan være en ganske subjektiv observasjon.

Anbefalt: