Kazalo:

Detektor impulzne indukcije na osnovi Arduina - preklopna tuljava: 5 korakov (s slikami)
Detektor impulzne indukcije na osnovi Arduina - preklopna tuljava: 5 korakov (s slikami)

Video: Detektor impulzne indukcije na osnovi Arduina - preklopna tuljava: 5 korakov (s slikami)

Video: Detektor impulzne indukcije na osnovi Arduina - preklopna tuljava: 5 korakov (s slikami)
Video: Senzori na motornim vozilima 1 2024, Julij
Anonim
Arduino detektor impulzne indukcije - preklopna tuljava
Arduino detektor impulzne indukcije - preklopna tuljava
Arduino detektor impulzne indukcije - preklopna tuljava
Arduino detektor impulzne indukcije - preklopna tuljava

Ideja

Ker sem v preteklosti izdelal nekaj detektorjev kovin z različnimi rezultati, sem želel raziskati zmogljivosti Arduina v tej smeri.

Obstaja nekaj dobrih primerov, kako sestaviti detektorje kovin z Arduinom, nekateri tukaj kot navodila. Toda ko jih gledamo, običajno potrebujejo kar nekaj zunanjih komponent za obdelavo analognega signala ali pa je občutljivost precej nizka.

Pri razmišljanju o detektorjih kovin je glavna tema, kako zaznati rahle spremembe napetosti v signalih, povezanih z iskalno tuljavo. Te spremembe so običajno zelo majhne. Najbolj očiten pristop bi bil pri uporabi analognih vhodov ATmega328. Če pogledamo specifikacije, pa obstajata dve osnovni težavi: (pogosto) se upočasnjujeta, ločljivost pa je (v večini primerov) prenizka.

Po drugi strani pa Arduino deluje na 16MHz in ima kar nekaj časovnih zmogljivosti i. e. ločljivost 0,0625 μS, če uporabljate takto. Namesto analognega vhoda za zaznavanje je najpreprostejši način zaznavanja majhnih dinamičnih sprememb napetosti primerjati spremembo padca napetosti skozi čas pri fiksni referenčni napetosti.

V ta namen ima ATmega328 lepo funkcijo notranjega primerjalnika med D6 in D7. Ta primerjalnik lahko sproži prekinitev, kar omogoča natančno obravnavo dogodkov. Arduino je poleg lepo kodiranih rutinskih časov, kot sta millis () in micos (), in z veliko višjo ločljivostjo prešel v notranji časovnik ATmega328, je Arduino odlična podlaga za pristope odkrivanja kovin.

Torej, s pogleda izvorne kode, bi bil dober začetek programiranje notranjega primerjalnika za „spremembo“polarnosti vhodov in uporaba notranjega števca z največjo možno hitrostjo za spremembo časa sprememb.

Splošna koda v Arduidu za dosego tega je:

// Določanje vseh zahtevanih spremenljivk itd. In nastavitev registrov

nepodpisana ura charSelectBits = _BV (CS10); // brez prednamestitve, polna nastavitev xtal void () {pinMode (6, INPUT); // + primerjalnika - če jih nastavimo kot INPUT, so // nastavljeni na visoko impedančni pinMode (7, INPUT); // - primerjalnika - z nastavitvijo na INPUT so // nastavljene na visoko impedanco cli (); // ustavitev prekine TCCR1A = 0; // nastavimo celoten register TCCR1A na 0 TCCR1B = 0; // enako za TCCR1B -> normalni načinTCNT1 = 0; // inicializiramo vrednost števca na 0; TCCR1B | = clockSelectBits; // nastavi predkaler in zažene uro TIMSK1 = _BV (TOIE1); // nastavi bit za omogočanje prekinitve pretoka časovnika sei (); // dovoli prekinitve ACSR = (0 << ACD) | // Analogni primerjalnik: omogočeno (0 << ACBG) | // Analogni primerjalnik Bandpap Select: AIN0 se uporabi za pozitivni vhod (0 << ACO) | // Analogni primerjalni izhod: izklopljen (1 << ACI) | // Oznaka prekinitve analognega primerjalnika: Počisti prekinitev v teku (1 << ACIE) | // Prekinitev analognega primerjalnika: omogočeno (0 << ACIC) | // Zajem vhoda analognega primerjalnika: onemogočen (0 << ACIS1 | 0 << ACIS0 // prekinitev pri preklopu izhoda // (0 << ACIS1 | 1 << ACIS0 // rezervirano // (1 << ACIS1 | 0 << ACIS0 // prekinitev na padajočem izhodnem robu // (1 << ACIS1 | 1 << ACIS0 // prekinitev na naraščajočem vhodnem robu;}

// ta rutina se pokliče vsakič, ko primerjalnik ustvari prekinitev

ISR (ANALOG_COMP_vect) {oldSREG = SREG; cli (); časovni žig = TCNT1; SREG = oldSREG; }

// ta rutina se pokliče vsakič, ko pride do prelivanja v notranjem števcu

ISR (TIMER1_OVF_vect) {timer1_overflow_count ++; }

// ta rutina se uporablja za ponastavitev časovnika na 0

void resetTimer (void) {oldSREG = SREG; cli (); // Onemogoči prekinitve TCNT1 = 0; // inicializiramo vrednost števca na 0 SREG = oldSREG; // Obnovi register stanja TCCR1B | = clockSelectBits; // nastavi predkaler in zažene uro timer1_overflow_count = 0; // ponastavi števec prelivov}

Seveda ta ideja ni povsem nova. Glavni del te kode najdete drugje. Dober izvajanje takšnega pristopa za mikrokrmilnik je na domači strani TPIMD - Tiny Pulse Induction Metal Detector.

www.miymd.com/index.php/projects/tpimd/ (žal ta stran ni več na spletu, trenutno obstaja varnostna kopija spletnega mesta na naslovu www.basic4mcu.com, poiščite "TPIMD").

Korak: 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

Ideja je, da bi Arduino uporabili kot detektor impulzne indukcije, tako kot v TPIMD, saj se zdi, da časovna zamisel krivulje razpada deluje zelo dobro. Težava pri detektorjih impulzne indukcije je, da običajno potrebujejo različno napetost za svoje delovanje. Ena napetost za napajanje tuljave in ločena napetost za obravnavo krivulje razpada. Zaradi teh dveh napetostnih virov je detektor impulzne indukcije vedno nekoliko zapleten.

Če pogledamo napetost tuljave v detektorju PI, lahko nastalo krivuljo razdelimo v dve različni fazi. Prva stopnja je impulz, ki napaja tuljavo in ustvarja magnetno polje (1). Druga stopnja je krivulja upadanja napetosti, ki se začne z vrhom napetosti, nato pa se hitro prilagodi napetosti tuljave "brez moči" (2). Težava je v tem, da tuljava po impulzu spremeni svojo polarnost. Ali je impulz pozitiven (Var 1. na priloženi sliki), je krivulja razpada negativna. Če je impulz negativen, bo krivulja razpada pozitivna (Var 2. na priloženi sliki)

Za rešitev tega osnovnega problema je treba tuljavo po impulzu elektronsko „prevrniti“. V tem primeru je lahko impulz pozitiven in krivulja razpada je lahko tudi pozitivna.

Da bi to dosegli, mora biti tuljava po impulzu izolirana od Vcc in GND. V tem trenutku skozi dušilni upor teče le tok. Ta izolirani sistem tuljave in dušilnega upora se lahko nato "usmeri" na katero koli referenčno napetost. To bo v teoriji ustvarilo kombinirano pozitivno krivuljo (dno risbe)

To pozitivno krivuljo lahko nato uporabite s primerjalnikom za zaznavanje trenutka, ko napetost razpada "prečka" referenčno napetost. V primeru zakladov v bližini tuljave se krivulja razpada spremeni in čas, ki prečka referenčno napetost, se spremeni. To spremembo je mogoče zaznati.

Po nekaj poskusih se je izkazalo, da deluje naslednje vezje.

Vezje je sestavljeno iz modula Arduino Nano. Ta modul poganja dva tranzistorja MOSFET, ki napajata tuljavo (pri SV3) prek D10. Ko se impulz pri D10 konča, oba MOSFET -a izolirata tuljavo od 12V in GND. Prihranjena energija v tuljavi izteče skozi R2 (220 ohmov). Hkrati R1 (560 Ohmov) povezuje nekdanjo pozitivno stran tuljave GND. To spremeni krivuljo negativnega razpada pri R5 (330 Ohmov) v pozitivno krivuljo. Diode ščitijo vhodni pin Arduina.

R7 je razdelilnik napetosti pri približno 0,04 V. V trenutku, ko krivulja upadanja pri D7 postane bolj negativna kot 0,04 pri D6, se sproži prekinitev in shrani se trajanje po koncu impulza.

V primeru kovine blizu tuljave krivulja razpada traja dlje, čas med koncem impulza in prekinitvijo pa se podaljša.

2. korak: Izdelava detektorja (ploščad)

Izdelava detektorja (Breadboard)
Izdelava detektorja (Breadboard)
Izdelava detektorja (Breadboard)
Izdelava detektorja (Breadboard)
Izdelava detektorja (Breadboard)
Izdelava detektorja (Breadboard)

Sestavljanje detektorja je precej preprosto. To lahko storite bodisi na plošči (drži se prvotnega vezja) bodisi s spajkanjem delov na tiskano vezje.

LED D13 na plošči Arduino Nano se uporablja kot indikacija za kovino

Odstranitev mize je najhitrejša pot do delujočega detektorja. Potrebnih je kar nekaj ožičenja, vendar je to mogoče narediti na majhni ploščici. Na slikah je to prikazano v treh korakih, saj Arduino in MOSFET -i skrivajo nekatere žice. Pri testiranju sem diode nekako odklopil, ne da bi jih sprva opazil. To ni imelo negativnega vpliva na obnašanje detektorja. V PCB različici vezja sem jih popolnoma izpustil.

Na slikah niso prikazane povezave z 0,96 OLED zaslonom. Ta zaslon je priključen:

Vcc - 5V (na zatiču Arduino, ne napajalna napetost !!!)

GND - GND

SCL - A5

SDA - A4

Ta zaslon OLED je potreben za prvo kalibracijo detektorja. To naredite tako, da nastavite pravo napetost na PIN6 Arduina. Ta napetost mora biti okoli 0,04 V. Zaslon pomaga nastaviti pravo napetost.

Različica na mizo deluje precej dobro, čeprav verjetno ni primerna za odhod v divjino.

3. korak: Prehod na tiskano vezje

Gremo na PCB
Gremo na PCB
Gremo na PCB
Gremo na PCB
Gremo na PCB
Gremo na PCB
Gremo na PCB
Gremo na PCB

Kar zadeva spajkanje, mi ni všeč obojestransko visokotehnološko tiskano vezje, zato sem vezje spremenil tako, da se prilega enostranskemu tiskanemu vezju.

Narejene so bile naslednje spremembe:

1. diode so bile izpuščene.

2. vrata MOSFET -ov so dobila upor 10 Ohm

3. napajalna napetost delilnika napetosti pri D6 je podana s signalom VISOKE ravni pri D8

4. gonilni pin za MOSFET -e je bil spremenjen.

Na ta način bi lahko ustvarili enostransko tiskano vezje, ki ga je mogoče spajkati na univerzalnih tiskanih vezjih. S tem vezjem boste imeli delujoč detektor PI z le 8-10 zunanjimi komponentami (odvisno, če uporabljate zaslon OLED in/ali zvočnik).

4. korak: Nastavitev in uporaba detektorja

Nastavitev in uporaba detektorja
Nastavitev in uporaba detektorja
Nastavitev in uporaba detektorja
Nastavitev in uporaba detektorja
Nastavitev in uporaba detektorja
Nastavitev in uporaba detektorja

Če je detektor pravilno sestavljen in je program zapisan na Arduino, je najlažji (če ne edini) način nastavitve enote uporaba zaslona OLED. Zaslon je priključen na 5V, GND, A4, A5. Na zaslonu mora biti po vklopu enote prikazano „umerjanje“. Po nekaj sekundah bi moralo pisati „kalibracija opravljena“in na zaslonu bi morale biti prikazane tri številke.

Prva številka je „referenčna vrednost“, ugotovljena med kalibracijo. Druga vrednost je zadnja izmerjena vrednost, tretja vrednost pa srednja vrednost zadnjih 32 meritev.

Te tri vrednosti bi morale biti bolj ali manj enake (v mojih testnih primerih pod 1000). Srednja vrednost bi morala biti bolj ali manj stabilna.

Za začetek prve nastavitve v bližini tuljave ne sme biti kovine.

Zdaj je treba obrezovalnik napetosti (trim potenciometer) obrezati, tako da morata biti spodnji dve vrednosti nastavljeni na največjo vrednost, medtem ko še vedno zagotavljata stabilno odčitavanje. Obstaja kritična nastavitev, pri kateri srednja vrednost začne dajati čudne odčitke. Trimer obrnite nazaj, da ponovno dobite stabilne vrednosti.

Lahko se zgodi, da zaslon zamrzne. Samo pritisnite gumb za ponastavitev in začnite znova.

Za mojo nastavitev (tuljava: 18 obratov pri 20 cm) je stabilna vrednost okoli 630-650. Ko je nastavljena, pritisnite gumb za ponastavitev, enota se ponovno umerja in vse vrednosti drevesa morajo biti spet v istem območju. Če se kovina pripelje do tuljave, naj zasveti LED na plošči Arduino (D13). Priloženi zvočnik oddaja nekaj klikov (tam je nekaj prostora za izboljšave pri programiranju).

Da bi preprečili velika pričakovanja:

Detektor sicer zazna nekaj stvari, vendar ostaja zelo preprost in omejen detektor.

Da bi dali vtis o zmogljivostih, je naredil nekaj referenčnih odkritij z drugimi detektorji. Če pogledamo rezultate, je še vedno zelo impresivno za detektor z le 8 zunanjimi deli, ki pa se ne ujemajo s profesionalnimi detektorji.

Če pogledamo vezje in program, je veliko prostora za izboljšave. Vrednosti uporov so bile ugotovljene po izkušnjah, naključno je bil izbran impulzni čas 250 ms, tudi parametri tuljave. Če imate ideje za izboljšave, bi jih z veseljem razpravljal.

Zabavaj se!

5. korak: Posodobitev 1: Uporaba LCD zaslona 16x2

Posodobitev 1: Uporaba LCD zaslona 16x2
Posodobitev 1: Uporaba LCD zaslona 16x2
Posodobitev 1: Uporaba LCD zaslona 16x2
Posodobitev 1: Uporaba LCD zaslona 16x2
Posodobitev 1: Uporaba LCD zaslona 16x2
Posodobitev 1: Uporaba LCD zaslona 16x2

Izboljšave

Med nadaljnjim testiranjem sem spoznal, da knjižnica za zaslon I2C OLED porabi veliko časa. Zato sem se odločil, da namesto tega uporabim zaslon velikosti 16x2 s pretvornikom I2C.

Zato sem program sprejel na LCD zaslon in dodal nekaj uporabnih funkcij. Prva vrstica zaslona zdaj prikazuje moč signala možne indikacije. Druga vrstica zdaj prikazuje dve vrednosti. Pest je pokazala trenutno odstopanje signala v primerjavi z umeritveno vrednostjo. Ta vrednost mora biti "0". Če je ta vrednost stalno negativna ali pozitivna, je treba detektor znova umeriti s pritiskom na gumb za ponastavitev. Pozitivne vrednosti označujejo kovino blizu tuljave.

Druga vrednost prikazuje dejansko vrednost zakasnitve krivulje upadanja. Ta vrednost običajno ni tako zanimiva, vendar je potrebna za začetno nastavitev detektorja.

Program zdaj omogoča večkratno trajanje impulzov v zaporedju (sredstvo za eksperimentiranje / izboljšanje delovanja). Nisem dosegel nobenega preboja. Tako je privzeto nastavljeno na eno trajanje impulza.

Začetna nastavitev detektorja

Pri nastavitvi detektorja je pomembna druga vrednost druge vrstice (prve lahko prezrete). Sprva je lahko vrednost "nestabilna" (glej sliko). Zavrtite trim upor, dokler vrednost ne doseže stabilnega odčitka. Nato ga obrnite, da vrednost povečate na največjo stabilno vrednost. Pritisnite gumb za ponastavitev za ponovno kalibracijo in detektor je pripravljen za uporabo.

Dobil sem vtis, da sem z nastavitvijo največje stabilne vrednosti izgubil občutljivost za kovine, ki niso železove. Zato bi bilo vredno poskusiti z nastavitvami, da bi imeli dobro občutljivost za stvari, ki niso železne.

Tuljave

Zgradim 3 tuljave za nadaljnje testiranje

1 -> 18 zavojev pri 200 mm

2 -> 25 obratov pri 100 mm

3 -> 48 zavojev pri 100 mm

Zanimivo je, da so vse tuljave delovale precej dobro, s skoraj enakimi zmogljivostmi (kovanec 20ct pri 40-50 mm v zraku). To je lahko precej subjektivno opazovanje.

Priporočena: