Turinys:

„Arduino“impulsų indukcijos detektorius - apversta ritė: 5 žingsniai (su nuotraukomis)
„Arduino“impulsų indukcijos detektorius - apversta ritė: 5 žingsniai (su nuotraukomis)

Video: „Arduino“impulsų indukcijos detektorius - apversta ritė: 5 žingsniai (su nuotraukomis)

Video: „Arduino“impulsų indukcijos detektorius - apversta ritė: 5 žingsniai (su nuotraukomis)
Video: Mikrovaldiklių sistemos - Impulso pločio moduliacija (PWM) 2024, Liepa
Anonim
„Arduino“pagrindu sukurtas pulso indukcijos detektorius - apversta ritė
„Arduino“pagrindu sukurtas pulso indukcijos detektorius - apversta ritė
„Arduino“pagrindu sukurtas pulso indukcijos detektorius - apversta ritė
„Arduino“pagrindu sukurtas pulso indukcijos detektorius - apversta ritė

Idėja

Anksčiau sukūręs keletą metalo detektorių su skirtingais rezultatais, norėjau ištirti „Arduino“galimybes ta kryptimi.

Yra keletas gerų pavyzdžių, kaip sukurti metalo detektorius naudojant „Arduino“, kai kurie čia yra kaip instrukcijos. Tačiau, žiūrint į juos, jiems paprastai reikalingi kai kurie išoriniai komponentai analoginiam signalui apdoroti arba jautrumas yra gana mažas.

Galvojant apie metalo detektorius, pagrindinė tema yra tai, kaip pajusti nedidelius įtampos pokyčius signaluose, susijusiuose su paieškos ritė. Šie pokyčiai paprastai yra labai maži. Akivaizdžiausias būdas būtų naudoti analogines ATmega328 įvestis. Tačiau žvelgiant į specifikacijas yra dvi pagrindinės problemos: jos (dažnai) lėtėja, o skiriamoji geba (daugeliu atvejų) yra maža.

Kita vertus, „Arduino“veikia 16MHz dažniu ir turi gana daug laiko galimybių, t. e. naudojant 0,0625µS skiriamąją gebą, jei naudojamas laikrodžio greitis. Taigi, užuot naudojęs analoginį įvestį jutimui, paprasčiausias būdas aptikti mažus dinaminius įtampos pokyčius yra palyginti įtampos kritimo pokyčius laikui bėgant esant fiksuotai etaloninei įtampai.

Šiuo tikslu „ATmega328“turi puikią vidinio D6 ir D7 palyginimo savybę. Šis lygintuvas gali sukelti pertrauką, leidžiančią tiksliai apdoroti įvykius. Palikdamas greta tvarkingai koduotų laiko nustatymo procedūrų, tokių kaip millis () ir micos (), ir pereidamas prie vidinės daug didesnės skiriamosios gebos ATmega328 laikmačio, „Arduino“yra puikus pagrindas metalo aptikimo metodais.

Taigi, žiūrint iš šaltinio kodo, gera pradžia būtų užprogramuoti vidinį palyginamąjį elementą „keisti“įvesties poliškumą ir naudoti vidinį skaitiklį su didžiausiu įmanomu greičiu, kad būtų galima pakeisti pakeitimų laiką.

Bendras „Arduido“kodas, skirtas tai pasiekti, yra toks:

// Visų būtinų išankstinių kintamųjų apibrėžimas ir kt. Ir registrų nustatymas

unsigned char clockSelectBits = _BV (CS10); // nėra išankstinės skalės, pilna xtal void setup () {pinMode (6, INPUT); // + lyginamasis - nustačius juos kaip INPUT, jie // nustatomi į didelės varžos pinMode (7, INPUT); // - lyginamojo - nustatant juos kaip INPUT, jie // nustatomi į didelės varžos cli (); // stop pertraukia TCCR1A = 0; // nustatyti visą TCCR1A registrą į 0 TCCR1B = 0; // tas pats TCCR1B -> normalus režimasTCNT1 = 0; // inicijuoti skaitiklio reikšmę į 0; TCCR1B | = clockSelectBits; // nustato prescaler ir paleidžia laikrodį TIMSK1 = _BV (TOIE1); // nustato laikmačio perpildymo pertraukos įjungimo bitą sei (); // leisti pertraukas ACSR = (0 << ACD) | // Analoginis palyginiklis: įjungtas (0 << ACBG) | // Analog Comparator Bandgap Select: AIN0 taikomas teigiamam įėjimui (0 << ACO) | // Analoginio palyginimo išvestis: išjungta (1 << ACI) | // Analoginio palyginiklio pertraukimo vėliava: išvalyti laukiantį pertraukimą (1 << ACIE) | // Analoginio palyginiklio pertraukimas: įjungtas (0 << ACIC) | // Analoginio palyginiklio įvesties fiksavimas: išjungtas (0 << ACIS1 | 0 << ACIS0 // pertraukimas išvesties perjungimo režimu // (0 << ACIS1 | 1 << ACIS0 // rezervuotas // (1 << ACIS1 | 0 << ACIS0 // pertraukimas krentančiame išvesties krašte // (1 << ACIS1 | 1 << ACIS0 // pertraukimas kylant įvesties kraštui;}

// ši rutina iškviečiama kiekvieną kartą, kai lygintuvas sukuria pertrauką

ISR (ANALOG_COMP_vect) {oldSREG = SREG; cli (); laiko žymė = TCNT1; SREG = senas SREG; }

// ši rutina iškviečiama kiekvieną kartą, kai vidiniame skaitiklyje yra perpildymas

ISR (TIMER1_OVF_vect) {timer1_overflow_count ++; }

// ši rutina naudojama norint atstatyti laikmatį į 0

void resetTimer (void) {oldSREG = SREG; cli (); // Išjungti pertraukas TCNT1 = 0; // inicijuoti skaitiklio reikšmę į 0 SREG = oldSREG; // Atkurti būsenos registrą TCCR1B | = clockSelectBits; // nustato prescaler ir paleidžia laikrodį timer1_overflow_count = 0; // iš naujo nustato perpildymo skaitiklį}

Žinoma, ši idėja nėra visiškai nauja. Pagrindinę šio kodo dalį galima rasti kitur. Geras tokio požiūrio į mikrovaldiklį pasiekimas TPIMD - „Tiny Pulse Induction Metal Detector“pagrindiniame puslapyje.

www.miymd.com/index.php/projects/tpimd/ (deja, šis puslapis nebėra internete, šiuo metu yra svetainės atsarginė kopija www.basic4mcu.com, ieškoma „TPIMD“).

1 žingsnis: „Arduino“impulsų indukcijos idėja - apversta ritė

„Arduino“impulsų indukcijos idėja - apversta ritė
„Arduino“impulsų indukcijos idėja - apversta ritė
„Arduino“impulsų indukcijos idėja - apversta ritė
„Arduino“impulsų indukcijos idėja - apversta ritė

Idėja yra naudoti „Arduino“kaip pulso indukcijos detektorių, kaip ir TPIMD, nes skilimo kreivės laiko idėja, atrodo, veikia gana gerai. Impulsų indukcijos detektorių problema yra ta, kad jiems paprastai reikia skirtingos įtampos, kad jie veiktų. Viena įtampa ritę maitinti ir atskira įtampa skilimo kreivei valdyti. Dėl šių dviejų įtampos šaltinių impulsų indukcijos detektoriai visada yra šiek tiek sudėtingi.

Žvelgiant į ritės įtampą PI detektoriuje, gautą kreivę galima padalyti į du skirtingus etapus. Pirmasis etapas yra pats impulsas, maitinantis ritę ir sukuriantis magnetinį lauką (1). Antrasis etapas yra įtampos mažėjimo kreivė, pradedant nuo įtampos smailės, tada greitai sureguliuojant ritės „be galios“įtampą (2). Problema ta, kad ritė keičia poliškumą po impulso. Ar pulsas teigiamas (1 variantas pridėtame paveikslėlyje), skilimo kreivė yra neigiama. Jei pulsas neigiamas, skilimo kreivė bus teigiama (2 variantas pridedamame paveikslėlyje)

Norėdami išspręsti šią pagrindinę problemą, ritę reikia „apversti“elektroniniu būdu po impulso. Šiuo atveju pulsas gali būti teigiamas, o irimo kreivė taip pat gali būti teigiama.

Norint tai pasiekti, ritė po impulso turi būti izoliuota nuo Vcc ir GND. Šiuo metu per slopinimo rezistorių teka tik srovė. Ši izoliuota ritės ir slopinimo rezistoriaus sistema gali būti „orientuota“į bet kokią etaloninę įtampą. Tai teoriškai sukurs teigiamą kreivę (brėžinio apačioje)

Šią teigiamą kreivę galima naudoti per lygintuvą, kad būtų galima nustatyti laiko momentą, kai skilimo įtampa „kerta“pamatinę įtampą. Jei lobiai yra šalia ritės, skilimo kreivė pasikeičia ir pasikeičia atskaitos įtampos kirtimo laikas. Šį pokytį galima aptikti.

Po tam tikrų eksperimentų sekanti grandinė pasirodė esanti veiksminga.

Grandinę sudaro „Arduino Nano“modulis. Šis modulis valdo du MOSFET tranzistorius, maitinančius ritę (SV3) per D10. Kai D10 impulsas baigiasi, abu MOSFET izoliuoja ritę nuo 12 V ir GND. Sutaupyta energija ritėje išsiskiria per R2 (220 omų). Tuo pačiu metu R1 (560 omų) jungia buvusią teigiamą ritės pusę ir GND. Tai pakeičia neigiamą skilimo kreivę ties R5 (330 omų) į teigiamą kreivę. Diodai apsaugo „Arduino“įvesties kaištį.

R7 yra apie 0,04 V įtampos skirstytojas. Šiuo metu skilimo kreivė ties D7 tampa neigiamesnė nei 0,04, esant D6, nutraukimas įjungiamas ir išsaugoma trukmė pasibaigus impulsui.

Jei metalas yra šalia ritės, skilimo kreivė trunka ilgiau, o laikas nuo impulso pabaigos iki pertraukos pailgėja.

2 žingsnis: sukurkite detektorių (duonos lentą)

Detektoriaus kūrimas (duonos lenta)
Detektoriaus kūrimas (duonos lenta)
Detektoriaus kūrimas (duonos lenta)
Detektoriaus kūrimas (duonos lenta)
Detektoriaus kūrimas (duonos lenta)
Detektoriaus kūrimas (duonos lenta)

Sukurti detektorių yra gana paprasta. Tai galima padaryti ant duonos lentos (laikantis originalios grandinės) arba lituojant dalis ant PCB.

D13 šviesos diodas „Arduino Nano“plokštėje naudojamas kaip metalo nuoroda

Duonos lentos išardymas yra greičiausias būdas pasiekti veikiantį detektorių. Reikia šiek tiek laidų, tačiau tai galima padaryti maža duonos lenta. Nuotraukose tai parodyta 3 žingsniais, nes „Arduino“ir „MOSFET“slepia kai kuriuos laidus. Bandydamas kažkaip atjungiau diodus iš pradžių nepastebėdamas. Tai neturėjo neigiamos įtakos detektoriaus elgesiui. Grandinės PCB versijoje aš juos visiškai palikau.

Nuotraukose nerodomi ryšiai su 0,96 OLED ekranu. Šis ekranas prijungtas:

Vcc - 5V (ties „Arduino“kaiščiu, o ne maitinimo įtampa !!!)

GND - GND

SCL - A5

SDA - A4

Šis OLED ekranas reikalingas iš pradžių kalibruoti detektorių. Tai daroma nustatant tinkamą „Arduino“PIN6 įtampą. Ši įtampa turėtų būti apie 0,04 V. Ekranas padeda nustatyti tinkamą įtampą.

Duonos lentos versija veikia gana gerai, nors tikriausiai netinka eiti į lauką.

3 žingsnis: pereikite prie PCB

Eina PCB
Eina PCB
Eina PCB
Eina PCB
Eina PCB
Eina PCB
Vyksta PCB
Vyksta PCB

Kalbant apie litavimą, man nelabai patinka dvipusės aukštųjų technologijų PCB, todėl pakeičiau grandinę, kad ji tilptų į vienpusę PCB.

Buvo atlikti šie pakeitimai:

1. diodai buvo palikti.

2. MOSFET vartai gavo 10 omų rezistorių

3. D6 įtampos skirstytuvo maitinimo įtampa pateikiama aukšto lygio signalu D8

4. pakeistas MOSFET tvarkyklės kaištis.

Tokiu būdu galima sukurti vienpusę PCB, kuri gali būti lituojama ant universalių PCB. Naudodami šią grandinę turėsite veikiantį PI detektorių, kuriame yra tik 8–10 išorinių komponentų (priklausomai nuo to, ar naudojamas OLED ekranas ir (arba) garsiakalbis).

4 veiksmas: detektoriaus nustatymas ir naudojimas

Detektoriaus nustatymas ir naudojimas
Detektoriaus nustatymas ir naudojimas
Detektoriaus nustatymas ir naudojimas
Detektoriaus nustatymas ir naudojimas
Detektoriaus nustatymas ir naudojimas
Detektoriaus nustatymas ir naudojimas

Jei detektorius tinkamai sukonstruotas ir programa parašyta „Arduino“, paprasčiausias (jei ne vienintelis) įrenginio nustatymo būdas yra naudoti OLED ekraną. Ekranas prijungtas prie 5V, GND, A4, A5. Įjungus įrenginį, ekrane turėtų būti rodoma „kalibravimas“. Po kelių sekundžių ekrane turėtų būti rodoma „kalibravimas atliktas“ir trys skaičiai.

Pirmasis skaičius yra „pamatinė vertė“, nustatyta kalibravimo metu. Antroji vertė yra paskutinė išmatuota vertė, o trečioji-paskutinių 32 matavimų vidutinė vertė.

Šios trys vertės turėtų būti daugmaž vienodos (mano bandymų atveju-mažiau nei 1000). Vidutinė vertė turėtų būti daugiau ar mažiau stabili.

Norėdami pradėti pirminį nustatymą, šalia ritės neturėtų būti metalo.

Dabar įtampos skirstytuvą (apdailos potenciometrą) reikia apkarpyti taip, kad apatinės dvi vertės būtų maksimaliai nustatytos, tačiau rodmenys būtų stabilūs. Yra kritinis nustatymas, kai vidutinė vertė pradeda rodyti keistus rodmenis. Pasukite žoliapjovę atgal, kad vėl gautumėte stabilias vertes.

Gali atsitikti taip, kad ekranas užšąla. Tiesiog paspauskite atstatymo mygtuką ir pradėkite iš naujo.

Mano sąrankai (ritė: 18 apsisukimų @ 20 cm) stabili vertė yra maždaug 630-650. Kai nustatysite, paspauskite atstatymo mygtuką, įrenginys iš naujo kalibruos ir visos medžio vertės vėl turėtų būti tame pačiame diapazone. Jei metalas dabar susukamas į ritę, „Arduino-Board“(D13) šviesos diodas turėtų užsidegti. Pridedamas garsiakalbis skleidžia paspaudimų garsus (ten yra kur tobulėti programuojant).

Norėdami išvengti didelių lūkesčių:

Detektorius aptinka kai kuriuos dalykus, tačiau jis išlieka labai paprastas ir ribotas detektorius.

Kad susidarytų įspūdis apie galimybes, kai kurie kiti aptikimai buvo atlikti naudojant kitus detektorius. Žvelgiant į rezultatus, jis vis dar yra gana įspūdingas detektoriui, kuriame yra tik 8 išorinės dalys, bet neatitinka profesionalių detektorių.

Žvelgiant į grandinę ir programą, yra daug kur tobulėti. Rezistorių vertės buvo nustatytos pagal patirtį, 250 ms impulsų laikas buvo pasirinktas atsitiktinai, ritės parametrai taip pat. Jei turite idėjų, kaip patobulinti, man būtų malonu jas aptarti.

Pasilinksmink!

5 veiksmas: atnaujinimas1: 16x2 LCD ekrano naudojimas

1 atnaujinimas: naudojant 16x2 LCD ekraną
1 atnaujinimas: naudojant 16x2 LCD ekraną
1 atnaujinimas: naudojant 16x2 LCD ekraną
1 atnaujinimas: naudojant 16x2 LCD ekraną
1 atnaujinimas: naudojant 16x2 LCD ekraną
1 atnaujinimas: naudojant 16x2 LCD ekraną

Patobulinimai

Tolesnių bandymų metu supratau, kad I2C OLED ekrano biblioteka užima daug laiko. Taigi nusprendžiau naudoti 16x2 ekraną su I2C keitikliu.

Taigi programą perėmiau į LCD ekraną, pridėdamas keletą naudingų funkcijų. Pirmoje ekrano eilutėje rodomas galimo indikatoriaus signalo stiprumas. Antroje eilutėje dabar rodomos dvi vertės. Kumštis rodė dabartinį signalo nuokrypį, palyginti su kalibravimo verte. Ši vertė turėtų būti „0“. Jei ši vertė nuolat yra neigiama arba teigiama, detektorių reikia iš naujo sukalibruoti paspaudus atstatymo mygtuką. Teigiamos vertės rodo metalą šalia ritės.

Antroji vertė rodo faktinę skilimo kreivės uždelsimo vertę. Ši vertė paprastai nėra tokia įdomi, tačiau reikalinga pradinei detektoriaus sąrankai.

Programa dabar leidžia kelis impulsų trukmes iš eilės (priemonės eksperimentuoti / pagerinti našumą). Aš nepasiekiau jokio persilaužimo. Taigi numatytoji nustatoma viena impulsų trukmė.

Pradinė detektoriaus sąranka

Nustatant detektorių, svarbi antroji antrosios eilutės reikšmė (pirmoji gali būti ignoruojama). Iš pradžių vertė gali būti „nestabili“(žr. Paveikslėlį). Sukite apdailos rezistorių, kol vertė bus stabili. Tada pasukite jį, kad padidintumėte vertę iki didžiausios stabilios vertės. Norėdami iš naujo kalibruoti, paspauskite atstatymo mygtuką ir detektorius yra paruoštas naudoti.

Susidariau įspūdį, kad nustačius didžiausią stabilią vertę praradau jautrumą ne geležies metalams. Taigi gali būti verta šiek tiek eksperimentuoti su nustatymais, kad būtų geras jautrumas ne geležies gaminiams.

Ritės

Aš sukuriu 3 ritinius tolesniam bandymui

1 -> 18 apsisukimų @ 200 mm

2 -> 25 apsisukimai @ 100 mm

3 -> 48 apsisukimai @ 100 mm

Įdomu tai, kad visos ritės veikė gana gerai, beveik to paties našumo (20ct moneta 40-50 mm ore). Tai gali būti gana subjektyvus pastebėjimas.

Rekomenduojamas: