Naučte se, jak postavit detektor kovů pomocí Colpittsova oscilátoru a Arduina.

Jak fungují detektory kovů?

Obvod nádrže

V uvedeném obvodu tvoří sériový kondenzátor a induktor obvod nádrže. V tankovém obvodu se energie opakovaně přenáší mezi kondenzátorem a induktorem, což vede k oscilacím. Proud vybitý z kondenzátoru protéká induktorem; když se kondenzátor zcela vybije, klesající magnetické pole induktoru udržuje tok proudu. Poté se kondenzátor nabije s opačnou polaritou, a když se magnetické pole zcela zhroutí, kondenzátor se vybije, což má za následek tok proudu v opačném směru, než byl původní proud. Tento cyklus pokračuje.

Induktor výše uvedeného obvodu nádrže tvoří detektor detektoru kovů (velká cívka drátu). Když se kovový materiál přiblíží ke středu induktoru (cívky detektoru), vstoupí do magnetického pole vytvořeného induktorem. Tím se změní magnetická permeabilita jádra induktoru, což způsobí změnu indukčnosti. Změna indukčnosti zase mění frekvenci kmitání obvodu nádrže.

Pokud by byly součástky ideální, obvod nádrže by kmital neomezeně dlouho bez vnějšího zdroje energie. V praxi však součástky ideální nejsou. Nežádoucí odpor součástek vnese do obvodu ztrátu energie, což způsobí, že se kmitající proud zužuje až zastaví. Proti tomu se používá jednostupňový invertující zesilovač BJT, který průběžně přidává zesílení do obvodu nádrže.

Colpittsův oscilátor

Protože kmitání v uzlech před a za induktorem jsou navzájem o 180° mimo fázi, jeden z uzlů bude přivádět kmitání do báze tranzistoru, zesílí a invertuje signál na kolektoru a pak jej vrátí ve fázi do druhého uzlu obvodu nádrže. Celý tento obvod se nazývá Colpittsův oscilátor.

Výše uvedený Colpittsův oscilátor poskytuje ustálené kmitání s frekvencí v rozsahu 100 kHz. Kovy z domácích předmětů měnící permeabilitu jádra induktoru způsobí kolísání této frekvence kolem 10kHz. Protože tento frekvenční rozsah je mimo lidské zvukové spektrum (20Hz až 20kHz), budeme muset oscilace převést na slyšitelný tón.

Tradiční detektory kovů BFO (beat-frequency oscillator) tento problém překonávají začleněním dalšího obvodu nádrže s pevnou frekvencí rovnou frekvenci obvodu nádrže detektoru bez vlivu jakýchkoli kovů. Potom sejmutím rozdílu těchto dvou frekvencí se izolují kolísavé frekvence obvodu detektoru a sníží se na slyšitelnou úroveň.

Pro tento projekt detektoru kovů budeme místo kompenzace oscilací pomocí druhého tankového obvodu používat ke zpracování oscilačního signálu počítač Arduino. Arduino bude ukládat pevnou frekvenci a průběžně porovnávat příchozí frekvenci obvodu detektoru s uloženou frekvencí (více o programu Arduino níže).

Materiál pro váš DIY detektor kovů

Pro tento projekt byl vybrán hračkový vytrhávač plevele, do kterého se vejdou všechny komponenty. Obsahuje následující funkce:

  • tlačítko spouště, které budeme znovu využívat ke spouštění reproduktoru
  • boční tlačítko, které budeme používat k nastavení pevné frekvence
  • prostor pro baterie (3xAA baterie) s vypínačem
  • reproduktor, přes který budeme přehrávat tón
  • motorek s připojenými LED diodami, které se nám aktivují, když rozdíl frekvencí překročí určitou mez
  • kruhovou hlavici, do které vložíme cívku drátu pro induktor obvodu nádrže

Přidáme také potenciometr (stříbrný), aby bylo možné nastavit citlivost změny tónu.

Cívka induktoru je vyrobena z přibližně 50 závitů drátu 26 AWG kolem cívky o průměru 5,5 palce.

Uvnitř pouzdra nahradíme původní desku plošných spojů vlastním obvodem a všechny periferie připojíme k obvodu pomocí kolíkových hlaviček.

Schémata obvodů detekce kovů

Pro programování jsem použil Arduino UNO s DIP ATMega328. Poté jsem ATMega328 vyjmul z vývojové desky a osadil do perfboardu spolu se zbytkem obvodu.

Colpittsův oscilátor, na schématu vlevo dole, přivádí oscilace do čítače 1 (pin T1) čipu (na Arduinu UNO označen jako digitální pin 5), kde neustále počítá frekvenci oscilací.

Na horní úrovni schématu je napájecí zdroj 4. generace.5 V (3xAA baterie, s bypassovými kondenzátory) se používá k napájení ATmega328, oscilátoru, reproduktoru a motoru (s LED diodami).

Pro udržení odběru proudu z digitálních pinů mikrokontroléru na bezpečné úrovni (maximálně 40 mA na pin pro ATmega328) se k napájení reproduktoru používá tranzistor NPN (C2878) a k napájení motoru N-kanálový MOSFET (SUB45N03).

Přepínače spouštění a resetování (nastavuje pevnou frekvenci) jsou připojeny k digitálním pinům pomocí interní konfigurace pull-up. Pro odladění spínačů jsou paralelně přidány malé kondenzátory.

Potenciometr citlivosti je nastaven jako dělič napětí a dělení je snímáno pomocí analogového pinu.

Procházka kódem

Úplný zdrojový kód tohoto projektu naleznete zde:

  • https://github.com/evankale/ArduinoMetalDetector

Níže je podrobná procházka kódem.

Nastavení funkce

Abychom mohli sledovat frekvenci oscilací detektoru prostřednictvím čítače časovače 1, musíme nejprve nakonfigurovat registry řadiče časovače/čítače (TCCR). K těmto registrům TCCR se přistupuje prostřednictvím tří celých čísel: TTCR1A, TTCR1B a TTCR1C.

TCCR1A = 0b00000000;TCCR1B = 0b00000111;

Musíme nastavit generování křivky na normální režim nastavením příznaků WGM TCCR1A a TCCR1B na 0 a nastavit režim volby rychlosti hodin na externí zdroj hodin nastavením příznaků CS TCCR1B na režim 3 (externí hodiny na náběžné hraně). V této konfiguraci bude registr OCR1A dekrementovat o 1 pokaždé, když bude detekována vzestupná hrana z oscilace.

TIMSK1 |= (1 << OCIE1A);

Dále budeme muset povolit přerušení časovače/počítače A nastavením příznaku OCIE1A v registru TIMSK1. To umožní, aby se funkce přerušení SIGNAL(TIMER1_COMPA_vect) zavolala vždy, když registr OCR1A dosáhne hodnoty 0.

OCR1A = 1;

Nyní inicializujte OCR1A na hodnotu 1, aby se funkce přerušení zavolala, jakmile bude detekována první vzestupná hrana.

Funkce přerušení

Toto je funkce SIGNAL(TIMER1_COMPA_vect). Je volána, když registr OCR1A dosáhne hodnoty 0. V této funkci chceme sledovat počet mikrosekund, které uplynuly od posledního volání funkce. Tato časová delta je uložena jako signalTimeDelta.

uloženTimeDelta je časová delta „pevné frekvence“, se kterou je signalTimeDelta porovnáván v hlavní smyčce. storedTimeDelta je nastaven na signalTimeDelta, když je storedTimeDelta vynulován (při zavádění systému a při stisknutí přepínače reset).

OCR1A += CYCLES_PER_SIGNAL;

Po provedení operací přerušení je třeba OCR1A vynulovat inkrementací naší předdefinované konstanty CYCLES_PER_SIGNAL (počet cyklů, než dojde k dalšímu přerušení).

Funkce smyčky

Ve funkci smyčky kontrolujeme, zda je stisknuta spoušť. Pokud ano, pak přečteme analogovou hodnotu potenciometru citlivosti a lineárně interpolujeme analogovou hodnotu (0 až 1023) na snadněji použitelnou stupnici (0,5 až 10,0).

int storedTimeDeltaDifference = (storedTimeDelta - signalTimeDelta) * sensitivity;

Vypočítá se rozdíl mezi pevnou frekvencí (uloženýTimeDelta) a měřenou frekvencí (signálTimeDelta) a vynásobí se hodnotou citlivosti.

tone(SPEAKER_PIN, BASE_TONE_FREQUENCY + storedTimeDeltaDifference);

Tato hodnota se pak sečte se slyšitelnou frekvencí základního tónu, BASE_TONE_FREQUENCY, a přehraje se z reproduktoru pomocí funkce Arduino tone().

Pokud rozdíl překročí prahovou hodnotu definovanou parametrem SPINNER_THRESHOLD, aktivuje se motor.

Pokud je spoušť uvolněna, pak je tón reproduktoru zastaven (voláním funkce noTone()) a motor je deaktivován.

Pokud bylo stisknuto tlačítko reset, vynuluje se uloženýTimeDelta, což umožní dalšímu volání přerušení nastavit novou hodnotu.

Jak funkční je náš detektor kovů založený na Arduinu?

Při nastavení nejnižší citlivosti dokáže detektor kovů zachytit velké předměty, jako jsou plechovky od limonády, mobilní telefony a železné nástroje, ve vzdálenosti několika centimetrů od cívky. Při nastavení nejvyšší citlivosti lze ve stejné blízkosti detekovat i menší předměty, jako jsou ocelové kroužky, šrouby a mince. Ukázku naleznete na videu v horní části článku!

Chceme-li rozšířit dosah detektoru, můžeme zvětšit plochu magnetického pole vytvářeného induktorem. Toho lze dosáhnout zvýšením průtoku proudu induktorem (zvýšením vstupního napětí do oscilátoru, což umožní větší zesílení zesilovače) nebo zvýšením počtu závitů drátu v cívce induktoru.

S detektorem kovů na bázi Arduina můžeme dělat další zajímavé věci, které nelze dělat s tradičními BFO detektory kovů. Zůstaňte naladěni na budoucí projekty, jak můžeme tento mechanismus detektoru kovů využít k jiným účelům!

ArduinoMetalDetector-master.zip

Vyzkoušejte si tento projekt sami! Získejte kusovník.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.