INHOUDSOPGAWE:

Arduino -gebaseerde polsinduksiedetektor - flip -spoel: 5 stappe (met foto's)
Arduino -gebaseerde polsinduksiedetektor - flip -spoel: 5 stappe (met foto's)

Video: Arduino -gebaseerde polsinduksiedetektor - flip -spoel: 5 stappe (met foto's)

Video: Arduino -gebaseerde polsinduksiedetektor - flip -spoel: 5 stappe (met foto's)
Video: Lesson 98: Arduino 10 LED Push button Projects, Potentiometer LED Voltmeter and Traffic Light 2024, Julie
Anonim
Arduino -gebaseerde polsinduksiedetektor - flip -spoel
Arduino -gebaseerde polsinduksiedetektor - flip -spoel
Arduino -gebaseerde polsinduksiedetektor - flip -spoel
Arduino -gebaseerde polsinduksiedetektor - flip -spoel

Die idee

Nadat ek 'n paar metaalverklikkers in die verlede met verskillende resultate gebou het, wou ek die moontlikhede van die Arduino in daardie rigting ondersoek.

Daar is 'n paar goeie voorbeelde van hoe om metaalverklikkers met die Arduino te bou, sommige hier as instruksies. Maar as u daarna kyk, benodig hulle gewoonlik baie eksterne komponente vir die analoge seinbehandeling, of die sensitiwiteit is redelik laag.

As ons oor metaalverklikkers dink, is die hoofonderwerp hoe u die geringe spanningsveranderinge in seine wat met die soekspoel verband hou, kan aanvoel. Hierdie veranderinge is gewoonlik baie klein. Die mees voor die hand liggende benadering sou wees in die gebruik van die analoog insette van die ATmega328. Maar as ons na die spesifikasies kyk, is daar twee basiese probleme: dit is (dikwels) te stadig en die resolusie is (in die meeste gevalle) te laag.

Aan die ander kant werk die Arduino op 16MHz en beskik hy oor 'n paar tydsberekening. e. 'n resolusie van 0,0625µS as die kloksnelheid gebruik word. Dus, in plaas van om die analoog ingang te gebruik vir die opsporing, is die eenvoudigste manier om klein dinamiese spanningsveranderinge te waarneem, die verandering in spanningsval oor tyd met 'n vaste verwysingspanning te vergelyk.

Vir hierdie doel het die ATmega328 die netjiese kenmerk van 'n interne vergelyking tussen D6 en D7. Hierdie vergelyker kan 'n onderbreking veroorsaak, wat presiese gebeurtenishantering moontlik maak. Deur die netjies gekodeerde tydsroetines soos millis () en micos () te verlaat en met 'n veel hoër resolusie in die interne timer van die ATmega328 te gaan, is die Arduino 'n uitstekende basis vir metaalopsporingsbenaderings.

Dus, vanuit 'n bronkode -aansig, sou 'n goeie begin wees om die interne vergelyker te programmeer vir 'verandering' in polariteit van die insette en 'n interne teller met die hoogste spoed moontlik te gebruik om die tydsberekening van die veranderinge te verander.

Die algemene kode in Arduido om dit te bereik, is:

// Omskryf alle vereiste vooraf veranderlikes ens. En die opstel van die registers

ongetekende char clockSelectBits = _BV (CS10); // geen voorafskaalse, volledige xtal -leemte -opstelling () {pinMode (6, INPUT); // + van die vergelyker - deur hulle as INPUT in te stel, word hulle // ingestel op pinMode met hoë impedansie (7, INPUT); // - van die vergelyker - deur hulle as INPUT te stel, word hulle // ingestel op hoë impedansie cli (); // stop onderbreek TCCR1A = 0; // stel die hele TCCR1A -register op 0 TCCR1B = 0; // dieselfde vir TCCR1B -> normale modusTCNT1 = 0; // initialiseer tellerwaarde na 0; TCCR1B | = clockSelectBits; // stel prescaler in en begin die klok TIMSK1 = _BV (TOIE1); // stel die timer oorloop onderbreek aktiveer bietjie sei (); // laat onderbrekings toe ACSR = (0 << ACD) | // Analoog vergelyker: geaktiveer (0 << ACBG) | // Analoog vergelyking Bandgap Kies: AIN0 word toegepas op die positiewe invoer (0 << ACO) | // Uitgang analoog vergelyker: af (1 << ACI) | // Onderbreking vlag van analoog vergelyker: duidelike hangende onderbreking (1 << ACIE) | // Onderbreking van analoog vergelyking: geaktiveer (0 << ACIC) | // Analoog vergelyking se invoeropname: gedeaktiveer (0 << ACIS1 | 0 << ACIS0 // onderbreek op uitsetwissel // (0 << ACIS1 | 1 << ACIS0 // voorbehou // (1 << ACIS1 | 0 << ACIS0 // onderbreking op dalende uitsetrand // (1 << ACIS1 | 1 << ACIS0 // onderbreking op stygende insetrand;}

// hierdie roetine word genoem elke keer as die vergelyker 'n onderbreking skep

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

// hierdie roetine word genoem elke keer as daar 'n oorloop in die interne teller is

ISR (TIMER1_OVF_vect) {timer1_overflow_count ++; }

// hierdie roetine word gebruik om die timer op 0 terug te stel

void resetTimer (void) {oldSREG = SREG; cli (); // Deaktiveer onderbrekings TCNT1 = 0; // initialiseer tellerwaarde na 0 SREG = oldSREG; // Herstel statusregister TCCR1B | = clockSelectBits; // stel prescaler in en begin die klok timer1_overflow_count = 0; // stel oorloopteller terug}

Hierdie idee is natuurlik nie heeltemal nuut nie. Die grootste deel van hierdie kode kan elders gevind word. 'N Goeie implementering, so 'n benadering vir 'n mikrobeheerder, gevind op die tuisblad van TPIMD - Tiny Pulse Induction Metal Detector.

www.miymd.com/index.php/projects/tpimd/ (ongelukkig is hierdie bladsy nie meer aanlyn nie; daar is tans 'n rugsteun van die webwerf by www.basic4mcu.com, soek "TPIMD").

Stap 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

Die idee is om die Arduino as 'n Pulse Induction -detector te gebruik, soos in TPIMD, aangesien die tydsberekening van die vervalskurwe redelik goed werk. Die probleem met Pulse Induction -detektore is dat hulle normaalweg verskillende spanning benodig om te werk. Een spanning om die spoel aan te dryf en 'n aparte spanning om die vervalskurwe te hanteer. Hierdie twee spanningsbronne maak pulsinduksiedetektore altyd 'n bietjie ingewikkeld.

As ons kyk na die spanning van die spoel in 'n PI -detektor, kan die resulterende kromme in twee verskillende fases verdeel word. Die eerste fase is die pols self wat die spoel dryf en die magnetiese veld opbou (1). Die tweede fase is die spanningsvervalkromme, begin met 'n spanningspiek en pas dan vinnig aan op die 'geen-krag' spanning van die spoel (2). Die probleem is dat die spoel sy polariteit na die pols verander. Is die pols positief (Var 1. in die aangehegte prentjie), is die verval-kromme negatief. Is die pols negatief, sal die vervalskurwe positief wees (Var 2. op die aangehegte prentjie)

Om hierdie basiese probleem op te los, moet die spoel elektronies na die pols "omgedraai" word. In hierdie geval kan die pols positief wees en die vervalskurwe ook positief wees.

Om dit te bereik, moet die spoel na die pols van Vcc en GND geïsoleer word. Op hierdie oomblik vloei daar slegs 'n stroom deur 'n dempingsweerstand. Hierdie geïsoleerde stelsel van spoel- en dempingsweerstand kan dan 'gerig' wees op watter verwysingspanning ook al. Dit sal in teorie die gekombineerde positiewe kurwe (onderkant van die tekening) skep

Hierdie positiewe kromme kan dan via die vergelyker gebruik word om die tydstip waar die vervalspanning 'n verwysingsspanning "kruis" op te spoor. In die geval van skatte naby die spoel, verander die vervalskurwe en verander die tyd wat die verwysingspanning oorskry. Hierdie verandering kan waargeneem word.

Na 'n bietjie eksperimenteer het die volgende stroombaan gewerk.

Die kring bestaan uit 'n Arduino Nano -module. Hierdie module dryf twee MOSFET -transistors aan wat die spoel (by SV3) via D10 aandryf. As die pols by D10 eindig, isoleer beide MOSFET's die spoel van 12V en GND. Die bespaarde energie in die spoel bloei uit deur R2 (220 Ohm). Terselfdertyd verbind R1 (560 Ohms) die voormalige positiewe kant van die spoel met GND. Dit verander die negatiewe vervalkromme by R5 (330 Ohm) na 'n positiewe kromme. Die diodes beskerm die ingangspen van die Arduino.

R7 is 'n spanningsverdeler teen ongeveer 0,04V. Op die oomblik word die vervalkromme by D7 meer negatief as die 0.04 by D6, 'n onderbreking word geaktiveer en die tydsduur na die einde van die pols word gestoor.

In die geval van metaal naby die spoel, duur die vervalskurwe langer, en die tyd tussen die einde van die pols en die onderbreking word langer.

Stap 2: Bou die detektor (broodbord)

Bou van die detektor (broodbord)
Bou van die detektor (broodbord)
Bou van die detektor (broodbord)
Bou van die detektor (broodbord)
Bou van die detektor (broodbord)
Bou van die detektor (broodbord)

Die bou van die detektor is redelik maklik. Dit kan gedoen word op 'n broodbord (by die oorspronklike stroombaan) of deur die dele op 'n PCB te soldeer.

Die D13 LED op die Arduino Nano -bord word gebruik as 'n aanduiding vir metaal

Om 'n broodbord uit te trek, is die vinnigste manier om na die werkende detektor te kom. 'N Paar bedrading is nodig, maar dit kan nog steeds op 'n klein broodbord gedoen word. Op die foto's word dit in drie stappe getoon terwyl die Arduino en die MOSFET's 'n paar drade verberg. By die toets het ek die diodes op een of ander manier ontkoppel sonder om eers op te let. Dit het geen negatiewe uitwerking op die gedrag van die detektor gehad nie. In die PCB -weergawe van die kring het ek hulle heeltemal uitgelaat.

Die verbindings met 'n 0.96 OLED -skerm word nie op die foto's getoon nie. Hierdie skerm is gekoppel:

Vcc - 5V (by die Arduino -pen, nie die voedingsspanning nie!)

GND - GND

SCL - A5

SDA - A4

Hierdie OLED -skerm is nodig om die detektor aanvanklik te kalibreer. Dit word gedoen deur die regte spanning op PIN6 van die Arduino in te stel. Hierdie spanning moet ongeveer 0,04V wees. Die skerm help om die regte spanning in te stel.

Die broodbordweergawe werk redelik goed, hoewel dit waarskynlik nie geskik is om in die natuur te gaan nie.

Stap 3: Gaan na PCB

Gaan PCB toe
Gaan PCB toe
Gaan PCB toe
Gaan PCB toe
Gaan PCB toe
Gaan PCB toe
Gaan PCB toe
Gaan PCB toe

Wat soldeer betref, hou ek nie regtig van dubbelzijdige hoëtegnologie-PCB nie, so ek het die stroombaan aangepas om op 'n eenkantige PCB te pas.

Die volgende wysigings is aangebring:

1. die diodes is weggelaat.

2. die hekke van die MOSFET's het 'n weerstand van 10 Ohm

3. die voedingspanning vir die spanningsverdeler by D6 word gegee deur 'n HOOG vlaksein by D8

4. bestuurderpen vir die MOSFET's is verander.

Op hierdie manier kan 'n enkelzijdige PCB geskep word wat op universele PCB's gesoldeer kan word. As u hierdie kring gebruik, sal u 'n werkende PI-detektor hê met slegs 8-10 eksterne komponente (afhangende van die OLED-skerm en/of 'n luidspreker).

Stap 4: Die opstel en gebruik van die detektor

Die opstel en gebruik van die detektor
Die opstel en gebruik van die detektor
Die opstel en gebruik van die detektor
Die opstel en gebruik van die detektor
Die opstel en gebruik van die detektor
Die opstel en gebruik van die detektor

As die detector behoorlik gebou is en die program aan die Arduino geskryf is, is die maklikste (indien nie die enigste) manier om die eenheid op te stel deur 'n OLED -skerm te gebruik. Die skerm is gekoppel aan 5V, GND, A4, A5. Die skerm moet "kalibreer" vertoon nadat die eenheid aangeskakel is. Na 'n paar sekondes moet dit sê "kalibrasie gedoen" en drie getalle moet op die skerm verskyn.

Die eerste nommer is die 'verwysingswaarde' wat tydens kalibrasie geïdentifiseer is. Die tweede waarde is die laaste gemete waarde en die derde waarde is 'n gemiddelde waarde van die laaste 32 metings.

Hierdie drie waardes moet min of meer dieselfde wees (in my toetsgevalle onder 1000). Die middelwaarde moet min of meer stabiel wees.

Om die aanvanklike opstelling te begin, moet daar geen metaal naby die spoel wees nie.

Nou moet die spanningsverdeler (trimpotentiometer) afgewerk word, sodat die onderste twee waardes op 'n maksimum gestel moet word terwyl dit steeds stabiel lees. Daar is 'n kritieke omgewing, waar die middelwaarde vreemde metings begin gee. Draai die trimmer terug om weer stabiele waardes te verkry.

Dit kan gebeur dat die skerm vries. Druk net op die reset -knoppie en begin weer.

Vir my opstelling (spoel: 18 draaie @ 20cm) is die stabiele waarde ongeveer 630-650. Sodra dit ingestel is, druk die reset-knoppie, die eenheid herkalibreer en alle boomwaardes moet weer in dieselfde reeks wees. As metaal nou na die spoel gebring word, moet die LED op die Arduino-bord (D13) brand. 'N Aangeslote luidspreker gee 'n paar klikgeluide (daar is ruimte vir verbetering in die programmering daar).

Om hoë verwagtinge te voorkom:

Die detektor bespeur wel dinge, maar dit bly 'n baie eenvoudige en beperkte detector.

Om 'n indruk te gee van die vermoëns, het ek 'n paar verwysingsopsporings met verskillende ander detektore gedoen. As ons na die resultate kyk, is dit nog steeds indrukwekkend vir 'n detektor met slegs 8 eksterne dele, maar nie bypassende professionele detektore nie.

As ons na die kring en die program kyk, is daar baie ruimte vir verbetering. Die waardes van die weerstande is deur ervaring gevind, die polstyd van 250 ms is lukraak gekies, ook die spoelparameters. As u idees vir verbeterings het, bespreek ek dit graag.

Hê pret!

Stap 5: Update1: Gebruik 'n 16x2 LCD

Opdatering 1: Gebruik 'n 16x2 LCD
Opdatering 1: Gebruik 'n 16x2 LCD
Opdatering 1: Gebruik 'n 16x2 LCD
Opdatering 1: Gebruik 'n 16x2 LCD
Opdatering 1: Gebruik 'n 16x2 LCD
Opdatering 1: Gebruik 'n 16x2 LCD

Verbeterings

Tydens verdere toetse het ek besef dat die biblioteek vir die I2C OLED -skerm baie tyd in beslag neem. Daarom het ek besluit om eerder 'n 16x2 -skerm met 'n I2C -omskakelaar te gebruik.

Daarom het ek die program op die LCD -skerm aangeneem en 'n paar nuttige funksies bygevoeg. Die eerste reël van die skerm toon nou die seinsterkte van 'n moontlike aanduiding. Die tweede reël toon nou twee waardes. Die vuis het die huidige seinafwyking in vergelyking met die kalibrasiewaarde aangedui. Hierdie waarde moet "0" wees. As hierdie waarde voortdurend negatief of positief is, moet die detektor herkalibreer word deur op die reset -knoppie te druk. Positiewe waardes dui op metaal naby die spoel.

Die tweede waarde toon die werklike vertragingswaarde van die vervalkurwe. Hierdie waarde is gewoonlik nie so interessant nie, maar is nodig vir die aanvanklike opstelling van die detektor.

Die program maak nou voorsiening vir meervoudige polsduur in 'n ry (manier om die prestasie te eksperimenteer / te verbeter). Ek het geen deurbraak behaal nie. Die standaard is dus ingestel op een polsduur.

Aanvanklike opstelling van die detektor

By die opstel van die detektor is die tweede waarde van die tweede reël relevant (die eerste kan geïgnoreer word). Die waarde kan aanvanklik 'onstabiel' wees (sien prentjie). Draai die afwerkingweerstand totdat die waarde stabiel is. Draai dit dan om die waarde tot 'n maksimum stabiele waarde te verhoog. Druk die reset -knoppie om te herkalibreer en die detektor is gereed vir gebruik.

Ek het die indruk gekry dat ek die sensitiwiteit vir nie-yster metale verloor het deur die maksimum stabiele waarde in te stel. Dit kan dus die moeite werd wees om die instellings te eksperimenteer om 'n goeie sensitiwiteit vir nie-yster dinge te hê.

Spoel

Ek bou 3 spoele vir verdere toetsing

1 -> 18 draaie @ 200 mm

2 -> 25 draaie by 100 mm

3 -> 48 draaie @ 100 mm

Interessant genoeg het alle spoele redelik goed gewerk, met byna dieselfde prestasie (20 sent muntstuk by 40-50 mm in die lug). Dit kan 'n baie subjektiewe waarneming wees.

Aanbeveel: