Dowiedz się, jak zbudować wykrywacz metalu przy użyciu oscylatora Colpittsa i Arduino.

Jak działają wykrywacze metalu?

Obwód zbiornikowy

W powyższym obwodzie kondensator szeregowy i cewka indukcyjna tworzą obwód zbiornikowy. W obwodzie zbiornikowym energia jest przekazywana wielokrotnie pomiędzy kondensatorem a cewką indukcyjną, co powoduje oscylacje. Prąd wyładowywany z kondensatora przepływa przez cewkę indukcyjną; kiedy kondensator jest całkowicie rozładowany, malejące pole magnetyczne cewki indukcyjnej podtrzymuje przepływ prądu. Następnie kondensator naładuje się z przeciwną polaryzacją, a kiedy pole magnetyczne całkowicie się załamie, kondensator rozładuje się, co spowoduje przepływ prądu w kierunku przeciwnym do kierunku prądu pierwotnego. Cykl ten jest kontynuowany.

Cewka indukcyjna powyższego obwodu zbiornika tworzy detektor wykrywacza metalu (duży zwój drutu). Kiedy materiał metaliczny zbliża się do środka induktora (cewki detektora), wchodzi on w pole magnetyczne wytworzone przez induktor. Zmienia to przenikalność magnetyczną rdzenia wzbudnika, powodując zmianę indukcyjności. Zmiana induktancji, z kolei, zmienia częstotliwość oscylacji obwodu zbiornika.

Gdyby podzespoły były idealne, obwód zbiornika oscylowałby w nieskończoność bez zewnętrznego źródła zasilania. Ale w praktyce, komponenty nie są idealne. Niepożądana oporność podzespołów wprowadzi straty energii, powodując że prąd oscylacyjny będzie się zwężał aż do zatrzymania. Aby temu przeciwdziałać, stosuje się jednostopniowy wzmacniacz odwracający BJT, który w sposób ciągły dodaje wzmocnienie do obwodu zbiornika.

Oscylator Colpittsa

Ponieważ oscylacje w węzłach przed i za cewką indukcyjną są względem siebie w fazie o 180°, jeden z węzłów będzie dostarczał oscylację do bazy tranzystora, wzmacniał i odwracał sygnał na kolektorze, a następnie zwracał go w fazie do drugiego węzła obwodu zbiornika. Cały ten obwód nazywany jest oscylatorem Colpittsa.

Oscylator Colpittsa powyżej zapewnia stałą oscylację o częstotliwości w zakresie 100kHz. Metale z przedmiotów gospodarstwa domowego zmieniające przenikalność rdzenia cewki indukcyjnej będą fluktuować tę częstotliwość w okolicach 10kHz. Ponieważ ten zakres częstotliwości jest poza ludzkim spektrum audio (20Hz do 20kHz), będziemy musieli przetłumaczyć oscylację na słyszalny ton.

Tradycyjne detektory metali BFO (beat-frequency oscillator) pokonują ten problem poprzez włączenie innego obwodu zbiornika o stałej częstotliwości równej częstotliwości obwodu zbiornika detektora bez wpływu jakichkolwiek metali. Następnie, biorąc pod uwagę różnicę pomiędzy tymi dwoma częstotliwościami, wyizolujemy zmienne częstotliwości obwodu detektora i sprowadzimy je do słyszalnego zakresu.

W tym projekcie detektora metalu, będziemy używać Arduino do przetwarzania sygnału oscylacji zamiast kompensowania oscylacji za pomocą drugiego obwodu zbiornika. Arduino będzie przechowywało stałą częstotliwość i stale porównywało częstotliwość przychodzącą do obwodu wykrywacza z przechowywaną częstotliwością (więcej o programie Arduino poniżej).

Materiały dla Twojego DIY wykrywacza metalu

Do tego projektu wybrano zabawkową glebogryzarkę do chwastów, która pomieści wszystkie komponenty. Zawiera on następujące funkcje:

  • przycisk spustowy, który ponownie wykorzystamy do uruchomienia głośnika
  • przycisk boczny, który wykorzystamy do ustawienia stałej częstotliwości
  • komorę na baterie (baterie 3xAA) z przełącznikiem ON/OFF
  • głośnik, przez który będziemy odtwarzać ton
  • silniczek z dołączonymi diodami LED, które będziemy aktywować, gdy różnica częstotliwości przekroczy pewien próg
  • okrągła głowica, w której zamontujemy zwoje drutu na cewkę indukcyjną obwodu zbiornika

Dodamy również potencjometr (srebrny), aby można było regulować czułość zmian tonu.

Cewka induktora wykonana jest z około 50 owinięć drutu 26 AWG wokół szpuli o średnicy 5,5 cala.

Wewnątrz obudowy, zastąpimy oryginalną płytkę drukowaną naszym własnym układem i dołączymy wszystkie peryferia do układu za pomocą głowic szpilkowych.

Schemat obwodu wykrywania metalu

Użyłem Arduino UNO do zaprogramowania DIP ATMega328. Następnie usunąłem ATMega328 z płytki rozwojowej i osadziłem w perfboardzie wraz z resztą układu.

Oscylator Colpittsa, na dole po lewej stronie na schemacie, podaje oscylację do licznika 1 (pin T1) układu (oznaczony jako pin cyfrowy 5 na Arduino UNO), gdzie stale zlicza częstotliwość oscylacji.

Na górnym poziomie schematu, zasilanie 4.5V (baterie 3xAA, z kondensatorami bocznikującymi) jest użyte do zasilania ATmega328, oscylatora, głośnika i silnika (z diodami LED).

Aby utrzymać pobór prądu przez piny cyfrowe mikrokontrolera na bezpiecznym poziomie (maksymalnie 40 mA na pin dla ATmega328), tranzystor NPN (C2878) jest użyty do wysterowania głośnika, a N-kanałowy MOSFET (SUB45N03) do wysterowania silnika.

Przełączniki wyzwalania i resetowania (ustawia stałą częstotliwość) są podłączone do pinów cyfrowych z wykorzystaniem konfiguracji wewnętrznego podciągania. Małe kondensatory są dodane równolegle, aby odbić przełączniki.

Potencjometr czułości jest ustawiony jako dzielnik napięcia, a podział jest odczytywany za pomocą pinu analogowego.

Przebieg kodu

Pełny kod źródłowy dla tego projektu można znaleźć tutaj:

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

Poniżej znajduje się szczegółowy przebieg kodu.

Funkcja Setup

Aby śledzić częstotliwość oscylacji detektora poprzez licznik czasu 1, musimy najpierw skonfigurować rejestry kontrolera timera/licznika (TCCR). Dostęp do tych rejestrów TCCR uzyskuje się poprzez trzy liczby całkowite: TTCR1A, TTCR1B, i TTCR1C.

TCCR1A = 0b00000000;TCCR1B = 0b00000111;

Będziemy musieli ustawić generowanie przebiegów w tryb normalny, ustawiając flagi WGM rejestrów TCCR1A i TCCR1B na 0, oraz ustawić tryb wyboru prędkości zegara na zewnętrzne źródło zegara, ustawiając flagi CS rejestru TCCR1B na tryb 3 (external clock on rising edge). W tej konfiguracji rejestr OCR1A będzie dekrementował o 1 za każdym razem, gdy zostanie wykryte zbocze narastające z oscylacji.

TIMSK1 |= (1 << OCIE1A);

Następnie musimy włączyć przerwanie A timera/licznika poprzez ustawienie flagi OCIE1A w rejestrze TIMSK1. Umożliwi to wywołanie funkcji przerwania SIGNAL(TIMER1_COMPA_vect) za każdym razem, gdy rejestr OCR1A osiągnie wartość 0.

OCR1A = 1;

Teraz zainicjalizuj OCR1A na 1, aby funkcja przerwania była wywoływana natychmiast po wykryciu pierwszego zbocza narastającego.

Funkcja przerwania

To jest funkcja SIGNAL(TIMER1_COMPA_vect). Jest ona wywoływana, gdy rejestr OCR1A osiągnie wartość 0. W tej funkcji chcemy śledzić liczbę mikrosekund, jakie upłynęły od ostatniego wywołania tej funkcji. Ta delta czasu jest przechowywana jako signalTimeDelta.

storedTimeDelta jest deltą czasu o „stałej częstotliwości”, do której porównywana jest signalTimeDelta w pętli głównej. storedTimeDelta jest ustawiana na signalTimeDelta, gdy storedTimeDelta jest zerowana (przy uruchamianiu i po naciśnięciu przełącznika reset).

OCR1A += CYCLES_PER_SIGNAL;

Po wykonaniu operacji przerwania, OCR1A musi zostać zresetowany przez inkrementację naszej predefiniowanej stałej, CYCLES_PER_SIGNAL (liczba cykli przed wystąpieniem następnego przerwania).

Funkcja pętli

W funkcji pętli sprawdzamy, czy wyzwalacz jest wciśnięty. Jeśli tak, to odczytujemy wartość analogową potencjometru czułości i interpolujemy liniowo wartość analogową (0 do 1023) do łatwiejszej w użyciu skali (0,5 do 10,0).

int storedTimeDeltaDifference = (storedTimeDelta - signalTimeDelta) * sensitivity;

Obliczana jest różnica między częstotliwością stałą (storedTimeDelta) a częstotliwością mierzoną (signalTimeDelta) i mnożona przez wartość czułości.

tone(SPEAKER_PIN, BASE_TONE_FREQUENCY + storedTimeDeltaDifference);

Wartość ta jest następnie sumowana z częstotliwością słyszalnego tonu podstawowego, BASE_TONE_FREQUENCY, i odtwarzana przez głośnik za pomocą funkcji Arduino tone().

Jeśli różnica przekracza próg określony przez SPINNER_THRESHOLD, to silnik jest aktywowany.

Jeśli wyzwalacz zostanie zwolniony, to dźwięk głośnika zostanie zatrzymany (przez wywołanie funkcji noTone()) i silnik zostanie wyłączony.

Jeśli przycisk reset został naciśnięty, to wyzeruje on przechowywanyTimeDelta, pozwalając następnemu wywołaniu przerwania ustawić nową wartość.

Jak funkcjonalny jest nasz wykrywacz metalu oparty na Arduino?

Przy najniższym ustawieniu czułości wykrywacz metalu może wyłapać duże przedmioty, takie jak puszki sody, telefony komórkowe i żelazne narzędzia w odległości kilku cali od cewki. Na najwyższym ustawieniu czułości, mniejsze przedmioty, takie jak stalowe pierścienie, śruby i monety w tej samej odległości mogą być również wykryte. Zobacz film na górze artykułu, aby zobaczyć demonstrację!

Aby zwiększyć zasięg detektora, możemy zwiększyć obszar pola magnetycznego wytwarzanego przez cewkę indukcyjną. Można to osiągnąć poprzez zwiększenie przepływu prądu przez cewkę (zwiększając napięcie wejściowe do oscylatora, co pozwala na większe wzmocnienie wzmacniacza), lub poprzez zwiększenie liczby nawinięć drutu w cewce cewki.

Z wykrywaczem metalu opartym na Arduino możemy robić inne ciekawe rzeczy, których nie da się zrobić z tradycyjnymi wykrywaczami metalu BFO. Bądź na bieżąco z przyszłymi projektami, jak możemy wykorzystać ten mechanizm wykrywania metalu do innych celów!

ArduinoMetalDetector-master.zip

Spróbuj ten projekt dla siebie! Pobierz BOM.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.