Sisukord:

Arduino baasil impulssinduktsiooni detektor - klapp: 5 sammu (piltidega)
Arduino baasil impulssinduktsiooni detektor - klapp: 5 sammu (piltidega)

Video: Arduino baasil impulssinduktsiooni detektor - klapp: 5 sammu (piltidega)

Video: Arduino baasil impulssinduktsiooni detektor - klapp: 5 sammu (piltidega)
Video: Arduino Garden Controller - Automatic Watering and Data Logging 2024, Juuli
Anonim
Arduino baasil impulssinduktsiooni detektor - klapp
Arduino baasil impulssinduktsiooni detektor - klapp
Arduino baasil impulssinduktsiooni detektor - klapp
Arduino baasil impulssinduktsiooni detektor - klapp

Idee

Olles varem ehitanud mõningate metallidetektori, mille tulemused olid erinevad, tahtsin uurida Arduino võimalusi selles suunas.

Siin on mõned head näited Arduino abil metallidetektorite ehitamise kohta, mõned siin juhenditena. Kuid neid vaadates vajavad nad tavaliselt analoogsignaali töötlemiseks mõnda välist komponenti või on tundlikkus üsna madal.

Metallidetektoritele mõeldes on põhiteemaks see, kuidas otsimismähisega seotud signaalides pingeid kergelt muuta. Need muutused on tavaliselt väga väikesed. Kõige ilmsem lähenemisviis oleks ATmega328 analoogsisendite kasutamine. Kuid spetsifikatsioone vaadates on kaks põhiprobleemi: need on (sageli) aeglased ja eraldusvõime (enamikul juhtudel) madal.

Teisest küljest töötab Arduino sagedusel 16 MHz ja sellel on üsna palju ajastamisvõimalusi, st. e. eraldusvõime on 0,0625 µS, kui kasutatakse taktsagedust. Nii et selle asemel, et kasutada analoogsisendit sensori jaoks, on lihtsaim viis väikeste pinge dünaamiliste muutuste tuvastamiseks võrrelda pingelanguse muutumist aja jooksul fikseeritud võrdluspinge korral.

Sel eesmärgil on ATmega328 -l sisemine võrdlusvõime D6 ja D7 vahel. See võrdlusseade võib käivitada katkestuse, võimaldades sündmuste täpset käsitlemist. Jättes kõrvale korralikult kodeeritud ajastamisrutiinid, nagu millis () ja micos () ning minnes palju suurema eraldusvõimega ATmega328 sisemisse taimerisse, on Arduino suurepärane alus metalli tuvastamiseks.

Nii et lähtekoodi vaates oleks hea algus programmeerida sisemine võrdlusvõrk sisendite polaarsuse muutmiseks ja kasutada muudatuste ajastamise muutmiseks võimalikult kiiret sisemist loendurit.

Arduido üldine kood selle saavutamiseks on järgmine:

// Kõigi nõutavate eelmuutujate jne määramine ja registrite seadistamine

signeerimata char clockSelectBits = _BV (CS10); // eelseadistust pole, täielik xtal void setup () {pinMode (6, INPUT); // + võrdlejast - seades need INPUT -iks, seatakse nad // kõrgele takistusele pinMode (7, INPUT); // - võrdlejast - määrates need INPUT -iks, seatakse need // kõrgele takistusele cli (); // stop katkestab TCCR1A = 0; // kogu TCCR1A registri seadmine väärtuseks 0 TCCR1B = 0; // sama TCCR1B puhul -> tavarežiimTCNT1 = 0; // lähtestada loenduri väärtus väärtuseks 0; TCCR1B | = clockSelectBits; // seab eelseadistuse ja käivitab kella TIMSK1 = _BV (TOIE1); // määrab taimeri ülevoolu katkestamise lubamise biti sei (); // lubab katkestusi ACSR = (0 << ACD) | // Analoogvõrdleja: lubatud (0 << ACBG) | // Analoogvõrdleja ribalaiuse valik: positiivsele sisendile rakendatakse AIN0 (0 << ACO) | // Analoogvõrdleja väljund: väljas (1 << ACI) | // Analoogvõrdleja katkestuse lipp: Kustuta ootel olev katkestus (1 << ACIE) | // Analoogvõrdleja katkestus: lubatud (0 << ACIC) | // Analoogvõrdleja sisendi püüdmine: keelatud (0 << ACIS1 | 0 << ACIS0 // katkestus väljundi lülitil // (0 << ACIS1 | 1 << ACIS0 // reserveeritud // (1 << ACIS1 | 0 << ACIS0 // katkestus väljuva serva langemisel // (1 << ACIS1 | 1 << ACIS0 // katkestus sisendi serva tõusmisel;}

// seda rutiini kutsutakse iga kord, kui võrdleja loob katkestuse

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

// seda rutiini kutsutakse iga kord, kui sisemisel loenduril on ülevool

ISR (TIMER1_OVF_vect) {timer1_overflow_count ++; }

// seda rutiini kasutatakse taimeri 0 lähtestamiseks

void resetTimer (tühine) {oldSREG = SREG; cli (); // Katkestuste keelamine TCNT1 = 0; // lähtestada loenduri väärtus väärtusele 0 SREG = oldSREG; // Taasta olekuregister TCCR1B | = clockSelectBits; // määrab eelvaliku ja käivitab kella taimer1_ ülevoolu_arv = 0; // lähtestab ülevoolu loenduri}

Muidugi pole see idee täiesti uus. Selle koodi põhiosa võib leida mujalt. Hea lähenemine sellisele lähenemisele mikrokontrollerile, mis leiti TPIMD -lt - Tiny Pulse Induction Metal Detector kodulehelt.

www.miymd.com/index.php/projects/tpimd/ (kahjuks pole see leht enam võrgus, praegu on saidi varukoopia aadressil www.basic4mcu.com, otsige "TPIMD").

Samm: Arduino impulsi induktsiooni idee - klapp

Arduino impulsi induktsiooni idee - klapp
Arduino impulsi induktsiooni idee - klapp
Arduino impulsi induktsiooni idee - klapp
Arduino impulsi induktsiooni idee - klapp

Idee on kasutada Arduinot impulssinduktsiooni detektorina, nagu TPIMD -s, kuna lagunemiskõvera ajastusidee näib toimivat päris hästi. Pulseinduktsiooniandurite probleem on see, et nende tööks on tavaliselt vaja erinevat pinget. Üks pinge mähise toiteks ja eraldi pinge lagunemiskõvera käsitlemiseks. Need kaks pingeallikat muudavad impulsi induktsiooniandurid alati natuke keeruliseks.

Vaadates mähise pinget PI -detektoris, saab saadud kõvera jagada kaheks erinevaks etapiks. Esimene etapp on impulss, mis toidab mähist ja loob magnetvälja (1). Teine etapp on pinge vähenemise kõver, alustades pingepiigist, seejärel reguleerides kiiresti mähise pingevabale pingele (2). Probleem on selles, et mähis muudab pärast impulsi oma polaarsust. Kas pulss on positiivne (Var 1. lisatud pildil), on kõdunemiskõver negatiivne. Kui impulss on negatiivne, on kõdunemiskõver positiivne (Var 2. lisatud pildil)

Selle põhiprobleemi lahendamiseks tuleb mähis pärast impulsi elektrooniliselt üle pöörata. Sel juhul võib impulss olla positiivne ja ka kõverkõver võib olla positiivne.

Selle saavutamiseks tuleb mähis pärast impulsi isoleerida Vcc ja GND -st. Praegu liigub summutustakisti kaudu ainult vool. See isoleeritud mähise ja summutustakisti süsteem võib olla "orienteeritud" mis tahes võrdluspingele. See loob teoreetiliselt kombineeritud positiivse kõvera (joonise alumine osa)

Seda positiivset kõverat saab võrreldava seadme abil tuvastada ajahetkel, mil lagunemispinge „ületab“võrdluspinge. Mähise lähedal asuvate aarete korral lagunemiskõver muutub ja võrdluspinge ületamise aeg muutub. Seda muutust on võimalik tuvastada.

Pärast mõningast katsetamist osutus järgmine ahel toimima.

Vooluahel koosneb Arduino Nano moodulist. See moodul juhib kahte MOSFET -transistorit, mis toidavad mähist (SV3 juures) D10 kaudu. Kui impulss D10 -l lõpeb, eraldavad mõlemad MOSFET -i mähise 12 V ja GND. Mähises salvestatud energia väljub R2 kaudu (220 oomi). Samal ajal ühendab R1 (560 oomi) mähise endise positiivse külje GND -ga. See muudab negatiivse lagunemiskõvera R5 juures (330 oomi) positiivseks. Dioodid kaitsevad Arduino sisendnõela.

R7 on pingejaotur umbes 0,04 V juures. Hetkel muutub lagunemiskõver D7 juures negatiivsemaks kui 0,04 D6 korral, katkestus käivitatakse ja kestus pärast impulsi lõppu salvestatakse.

Spiraali lähedal asuva metalli korral kestab lagunemiskõver kauem ja aeg impulsi lõpu ja katkestuse vahel pikeneb.

2. samm: detektori (leivaplaadi) ehitamine

Detektori ehitamine (paneel)
Detektori ehitamine (paneel)
Detektori ehitamine (paneel)
Detektori ehitamine (paneel)
Detektori ehitamine (paneel)
Detektori ehitamine (paneel)

Detektori ehitamine on üsna lihtne. Seda saab teha kas leivaplaadil (originaalskeemile jäädes) või osade jootmisel trükkplaadil.

Arduino Nano plaadil olevat D13 LED -i kasutatakse metalli tähisena

Leivalaua lahtiühendamine on kiireim viis töötava detektori juurde. Vaja on üsna palju juhtmeid, kuid seda saab teha väikese leivalauaga. Piltidel on seda näidatud kolmes etapis, kuna Arduino ja MOSFET -id peidavad osa juhtmeid. Testimisel ühendasin dioodid kuidagi lahti, ilma et oleksin seda alguses märganud. See ei avaldanud detektori käitumisele negatiivset mõju. Ahela trükkplaadi versioonis jätsin need täielikult välja.

Piltidel pole näidatud ühendusi 0,96 OLED -ekraaniga. See ekraan on ühendatud:

Vcc - 5V (Arduino tihvti juures, mitte toitepinge !!!)

GND - GND

SCL - A5

SDA - A4

Seda OLED -ekraani on vaja detektori esialgseks kalibreerimiseks. Seda tehakse, seadistades Arduino PIN6 -le õige pinge. See pinge peaks olema umbes 0,04 V. Ekraan aitab seadistada õiget pinget.

Leivaplaadi versioon töötab päris hästi, kuigi ilmselt ei sobi loodusesse minekuks.

3. samm: PCB -le minek

Läheb PCB
Läheb PCB
Läheb PCB
Läheb PCB
Läheb PCB
Läheb PCB
Läheb PCB
Läheb PCB

Jootmise osas ei meeldi mulle kahepoolne kõrgtehnoloogiline trükkplaat, seega muutsin vooluringi nii, et see sobiks ühepoolsele trükkplaadile.

Tehti järgmised muudatused:

1. dioodid jäeti välja.

2. MOSFET -ide väravad said takisti 10 oomi

3. pingejaguri toitepinge D6 juures antakse kõrge taseme signaaliga D8 juures

4. vahetati MOSFET -ide juhi tihvti.

Nii saaks luua ühepoolse trükkplaadi, mida saab joota universaalsetele trükkplaatidele. Seda vooluringi kasutades on teil töökorras PI-andur, millel on ainult 8-10 välist komponenti (sõltuvalt sellest, kas kasutatakse OLED-ekraani ja/või kõlarit).

4. samm: detektori seadistamine ja kasutamine

Detektori seadistamine ja kasutamine
Detektori seadistamine ja kasutamine
Detektori seadistamine ja kasutamine
Detektori seadistamine ja kasutamine
Detektori seadistamine ja kasutamine
Detektori seadistamine ja kasutamine

Kui detektor on õigesti ehitatud ja programm on Arduinole kirjutatud, on lihtsaim (kui mitte ainus) viis seadme seadistamiseks kasutada OLED -ekraani. Ekraan on ühendatud 5V, GND, A4, A5 külge. Pärast seadme sisselülitamist peaks ekraanile ilmuma „kalibreerimine“. Mõne sekundi pärast peaks ekraanile ilmuma teade „kalibreerimine tehtud“ja ekraanile peaks ilmuma kolm numbrit.

Esimene number on kalibreerimisel tuvastatud võrdlusväärtus. Teine väärtus on viimane mõõdetud väärtus ja kolmas väärtus viimase 32 mõõtmise keskmine väärtus.

Need kolm väärtust peaksid olema enam-vähem samad (minu testjuhtudel alla 1000). Keskmine väärtus peaks olema enam -vähem stabiilne.

Esmase seadistamise alustamiseks ei tohiks pooli läheduses olla metalli.

Nüüd tuleks pingejagurit (trimmipotentiomeetrit) kärpida nii, et kaks alumist väärtust tuleks seada maksimumile, andes samal ajal stabiilse näidu. On kriitiline seade, kus keskmine väärtus hakkab andma imelikke näitu. Stabiilsete väärtuste saamiseks keerake trimmer tagasi.

Võib juhtuda, et ekraan külmub. Vajutage lihtsalt lähtestamisnuppu ja alustage otsast peale.

Minu seadistuse jaoks (mähis: 18 pööret @ 20 cm) on stabiilne väärtus umbes 630-650. Pärast seadistamist vajutage lähtestusnuppu, seade kalibreerub uuesti ja kõik puude väärtused peaksid olema uuesti samas vahemikus. Kui metall on nüüd mähiseni viidud, peaks Arduino-Board (D13) LED-tuli põlema. Lisatud kõlar annab mõningaid klõpsamismürasid (seal on programmeerimisel natuke arenguruumi).

Kõrgete ootuste vältimiseks:

Detektor tuvastab küll mõned asjad, kuid jääb väga lihtsaks ja piiratud detektoriks.

Võimetest mulje jätmiseks tegi ta teatud viiteid teiste erinevate detektoritega. Tulemusi vaadates on see endiselt üsna muljetavaldav detektori jaoks, millel on ainult 8 välist osa, kuid mis ei sobi professionaalsete detektoritega.

Ringkonda ja programmi vaadates on arenguruumi palju. Takistite väärtused leiti kogemuste põhjal, impulsi aeg 250 ms valiti juhuslikult, mähise parameetrid samuti. Kui teil on ideid paranduste tegemiseks, arutan neid hea meelega.

Lõbutse hästi!

5. samm: värskendus1: 16x2 vedelkristallekraani kasutamine

Värskendus 1: 16x2 vedelkristallekraani kasutamine
Värskendus 1: 16x2 vedelkristallekraani kasutamine
Värskendus 1: 16x2 vedelkristallekraani kasutamine
Värskendus 1: 16x2 vedelkristallekraani kasutamine
Värskendus 1: 16x2 vedelkristallekraani kasutamine
Värskendus 1: 16x2 vedelkristallekraani kasutamine

Parandused

Edasise testimise käigus mõistsin, et I2C OLED -ekraani raamatukogu kasutas märkimisväärselt aega. Seega otsustasin selle asemel kasutada 16x2 ekraani koos I2C muunduriga.

Nii võtsin programmi LCD -ekraanile vastu, lisades mõned kasulikud funktsioonid. Ekraani esimene rida näitab nüüd võimaliku näidu signaali tugevust. Teine rida näitab nüüd kahte väärtust. Rusikas näitas praegust signaali kõrvalekallet võrreldes kalibreerimisväärtusega. See väärtus peaks olema "0". Kui see väärtus on pidevalt negatiivne või positiivne, tuleb andurit uuesti kalibreerida, vajutades lähtestusnuppu. Positiivsed väärtused näitavad mähise lähedal asuvat metalli.

Teine väärtus näitab lagunemiskõvera tegelikku viivitusväärtust. See väärtus ei ole tavaliselt nii huvitav, kuid seda on vaja detektori esialgseks seadistamiseks.

Programm võimaldab nüüd mitu impulsi kestust järjest (vahendid katsetamiseks / jõudluse parandamiseks). Mingit läbimurret ma ei saavutanud. Seega on vaikimisi seatud üks impulsi kestus.

Detektori esialgne seadistamine

Detektori seadistamisel on asjakohane teise rea teine väärtus (esimest võib ignoreerida). Esialgu võib väärtus olla "ebastabiilne" (vt pilti). Keerake trimmitakistit, kuni väärtus saavutab stabiilse näidu. Seejärel keerake seda väärtuse suurendamiseks maksimaalseks stabiilseks väärtuseks. Uuesti kalibreerimiseks vajutage lähtestusnuppu ja andur on kasutamiseks valmis.

Mulle jäi mulje, et maksimaalse stabiilse väärtuse seadmisega kaotasin tundlikkuse mitteraudmetallide suhtes. Seega võib olla väärt seadete katsetamist, et oleks hea tundlikkus rauaga mitteseotud asjade suhtes.

Rullid

Ehitan edasiseks testimiseks 3 mähist

1 -> 18 pööret @ 200 mm

2 -> 25 pööret @ 100 mm

3 -> 48 pööret @ 100 mm

Huvitaval kombel töötasid kõik mähised üsna hästi, peaaegu sama jõudlusega (20-tolline münt 40–50 mm õhus). See võib olla üsna subjektiivne tähelepanek.

Soovitan: