PulseQrpArge

dedektörler => VLF BFO DEDEKTORLER ŞEMALAR => Konuyu başlatan: TA3BBK - Mar 29, 2026, 12:05 ÖÖ

Başlık: VLF DEDEKTÖR YAPIMI Tasarımı
Gönderen: TA3BBK - Mar 29, 2026, 12:05 ÖÖ
VLF (VERY LONG FREQUENCY)dedektör yazılımı geliştirmek ,hem sinyal işleme hem de donanım kontroluı gerektiren oldukça teknik bir süreçtir.
Bu tür cihazlar gegenellikle 3khz ile 30 khz arasındaki frekanslarda çalışır ve faz kayması (phase shift)prensibiyle  metal ayrımı yaparlar.
bir VLF dedektör yazılımının bileşenlerini şu şekilde özetleyebiliriz;
1-Sinyal üretimi(transmitter-tx)
PWM kullanımı,mikro denetleyicinin PWM (darbe genişlik modülasyonu)birimi kullanılarak belirli frekansta bir sinyal üretilir.
Frekans kararlılığı;Yazılım çevresel parazitlerden etkilenmemek içim bu frekansı çok hassas şekilde sabit tutmalıdır.
2-Sinyal okuma  ve örnekleme (receiver -RX)
Hızlı örnekleme sinyalin fazını yakalamak için saniyede binlerce örnek alınması gerekir.
senkron demodulasyon ;gelen sinyal gönderilen sinyal ile karşılaşrılır bu aşama metalin cincini belirleyen faz kaytması nın hesaplandığı kritik noktadır.
3-DİJİTAL SİNYAL İŞLEME ;Filitrileme;toprakminerallerinden kaynaklanan gürültüyü(ground noise)temizlemek için high pass;ve low pass filitreler uygulanır.
VDI (visual discrimination  hesaplama metalin iletkenliğine göre bir değer atanır.örneğin altın demir ve gümüşün faz kaymaları farklıdır .
Eşik değeri Threshold Yazılım  sadece belirli şiddet in üzerindeki sinyalleri metal olarak kabul edecek şekilde programlanır.
kulllanıcı arayüzü ;Ses sentezleme sinyal şiddetine göre değişen frekansta  VCO ses üretilir.Ekran  kontrolü VDI değerinin  ve pil durumunun LCD /OLED  VB. EKRANA YANSITILMASIDIR.
Konuya algoritma ve akış şeması ile devam edeceğiz.
Başlık: Ynt: VLF DEDEKTÖR YAPIMI Tasarımı
Gönderen: TA3BBK - Mar 29, 2026, 12:24 ÖÖ
merhaba ;
Basit bir Algoritma şeması ile başlayalım ;
1-TX_Pin :10 khz sinyal gönder;
2-RX _Pin :ADC ile gelen veriyi oku
3-Faz farkı:giden sinyal ile gelen sinyal arasındaki gecikmeyi hesapla
4-Ayrım;faz farkı düşük ise_Demir (Ferrous)  Faz farkı yüksek ise Değerli Metal (non Ferrous)
5-Ses; sinyal genliği(amplitude)yüksek ise hoporleri aktif et.
Çalıştığımız diller C Veya C++ hız ve düşük sinyal seviyeleri için şarttır
platform yani işlemci seçimin de ise STM serisi dsp kütüphaneleri ve hızlı adc birimleri ile Arduinodan çok daha verimlidir .
bu yazılımın  en zor kısmı ise toprak ayarı GROUN BALANCE kodlamasıdır çüünkü toprak metal gibi davranarak cihazı yanıltabilir  yazılımın bu sabit toprak etkisini matematiksel olarak sinyalden çıkarması gerekmektedir aksi takdirde hiç susmayan bir dedektörümüz olur.bir sonraki konumuzda yazılımı işleyeleyeceğiz,
Başlık: Ynt: VLF DEDEKTÖR YAPIMI Tasarımı
Gönderen: TA3BBK - Mar 29, 2026, 01:28 ÖÖ
*ARDUINO VLF METAL DEDECTOR- FULL SYSTEM
*Hedef:10 khz sinyal üretimi ve faz Analizi
*/
const int rxpin=A0;
const int speakerpin =8;
const int ledpin =13;
int  threshold =30;
int ground value =0;
void setup(){
   Serial.begin(115200);
    pinMode(speakerPin, OUTPUT);
    pinMode (ledpin ,OUTPUT);

   //TIMER1 Ayarı:Pin 9 üzerinden 10khz karedalga üretimi
      pinMode(9, OUTPUT);
      TCCR1A= _BV(COM1A0);
      TCCCR1B=BV(WGM12) | _BV(CS10);
      OCR1A =799;

     //ADC Hızını artırma (prescler 16 ya çekilerek örnekleme hızlandırlır)
          ADCSRA&= -(0X07)
          ADCSRA  |=(1<<ADSP2);
       Serial.print(''SistemHazır.Kalibrasyon baslıyor...'');
}

 voidloop() {
        long sum 0;
       //Sinyal ortalaması alarak gürültüyü azaltma
        for(int i=0; i<50; i++){
        sum += analogread(rxPin);
   }
      int currentVal =sum / 50;
      int diff = currentVal - ground value;
     
      if (abs(diff) > threshold) {
       digitalwrite(ledPin;HIGH);
       int pitch =map(abs(diff), 0, 400,200, 2500);
        tone(spekaerPin, pitch),

      //seriport üzerinden izleme 
       Serial.print(''Sinyal:'');
        Serial.print(diff);
        if(diff>50)Serial.printIn('' _>DEGERLI'');
        else Serial.printIn('' ->DEMIR'');
      }else{
        digitalWrite(ledPin, LOW);
        noTone(speakerPin);
      }
}
void calibrate() {
     long cSum = 0;
     for(int i=0; i<200; i++) {
    cSum += analogRead(rxPin);
    delay(2);
}
     groundValue = cSum / 200;
    Serial.Print(Kalibrasyon Tamam.Esik Degeri : '');
     Serial.PrintIn(groundValue);
}

dosya IDE üzerind serial monitörden izleyebilirsiniz ,yazılımımızın basitleştirilmiş bir hali oldu ,
daha kapsamlı bir yazılım hazırlayacağim devre şeması ile birlikte paylaşalım ,umarım sizlere bir fikir verir  ,
Başlık: Ynt: VLF DEDEKTÖR YAPIMI Tasarımı
Gönderen: Yörük - Mar 29, 2026, 01:22 ÖS
Selam
Güzel akşam komple 0.96 oled ve hassasiyet ekleyelim analog şemayı çizelim
Başlık: Ynt: VLF DEDEKTÖR YAPIMI Tasarımı
Gönderen: Yörük - Nis 04, 2026, 12:05 ÖS
Merhaba
Genel olarak arduino veya stm yada normal bir atmega8 kullandıpımızı var sayalım işlemcinin 
Gönderdiği tx sinyali bobin çıkış mosfetini sürmek için düşük gelebilir bunun için sinyalimizi transistör
Ler ile güçlendirip gate pin voltajını ayarlamamız gerekir ,sinyal diot larımız 1n60 olmalı.
Rx alıcı katında ise ultralow noise kaliteli bir opamp seçmek iyi olacaktır .gelen sinyali gürültüden çevresel faktörlerden etkilenmeden işleyip Adc ye ulaştırmamız gerekecektir .konuya devam edeceğiz ..
Başlık: Ynt: VLF DEDEKTÖR YAPIMI Tasarımı
Gönderen: Yörük - Nis 08, 2026, 12:06 ÖÖ
/*
* ARDUINO VLF PRO - ADVANCED ADC & OLED DISPLAY
* Özellikler: Hızlı ADC (1MHz clock), 10kHz TX, OLED Görselleştirme
*/
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
// OLED Tanımlamaları
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
// Pinler
const int rxPin = A0;
const int speakerPin = 8;
// Değişkenler
int groundValue = 0;
int threshold = 25;
char* metalType = "Taniyor...";
void setup() {
  Serial.begin(115200);
  // 1. OLED Başlatma
  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    Serial.println(F("OLED hatasi!"));
    for(;;);
  }
  display.clearDisplay();
  display.setTextColor(WHITE);
  display.setTextSize(1);
  display.setCursor(0,0);
  display.println("VLF PRO BASLIYOR...");
  display.display();
  // 2. TIMER1: 10kHz Kare Dalga (D9 Pin)
  pinMode(9, OUTPUT);
  TCCR1A = _BV(COM1A0);
  TCCR1B = _BV(WGM12) | _BV(CS10);
  OCR1A = 799;
  // 3. İLERİ SEVİYE ADC AYARI (Prescaler 16)
  // Standart 128 olan böleni 16'ya düşürerek ADC'yi 8 kat hızlandırıyoruz.
  ADCSRA &= ~(0x07); // Temizle
  ADCSRA |= (1 << ADPS2); // Sadece ADPS2'yi 1 yaparak 16 bölenini seç (1MHz ADC Clock)
  delay(1000);
  calibrate();
}
void loop() {
  long sum = 0;
  const int samples = 60; // Hızlı ADC sayesinde daha çok örnek alabiliyoruz
 
  for(int i=0; i < samples; i++) {
    sum += analogRead(rxPin);
  }
 
  int currentVal = sum / samples;
  int diff = currentVal - groundValue;
  updateDisplay(diff);
  handleAudio(diff);
 
  delay(20); // Ekran tazeleme hızı için uygun bekleme
}
void calibrate() {
  long cSum = 0;
  for(int i=0; i<300; i++) {
    cSum += analogRead(rxPin);
  }
  groundValue = cSum / 300;
}
void handleAudio(int val) {
  if (abs(val) > threshold) {
    int p = map(abs(val), 0, 512, 100, 3000);
    tone(speakerPin, p);
  } else {
    noTone(speakerPin);
  }
}
void updateDisplay(int val) {
  display.clearDisplay();
 
  // Başlık ve Sinyal Çubuğu
  display.setTextSize(1);
  display.setCursor(0, 0);
  display.print("SINYAL GUCU:");
 
  // Görsel Bar
  int barWidth = map(constrain(abs(val), 0, 500), 0, 500, 0, 128);
  display.fillRect(0, 12, barWidth, 10, WHITE);
 
  // Ayrım Bilgisi
  display.setCursor(0, 30);
  display.setTextSize(2);
  if (abs(val) < threshold) {
    display.print("TEMIZ");
  } else if (val > 40) {
    display.print("DEGERLI"); // Pozitif faz kayması (Altın, Gümüş, Bakır)
  } else {
    display.print("DEMIR");   // Negatif/Düşük faz kayması (Çivi, Atık)
  }
  // Değer Gösterimi
  display.setTextSize(1);
  display.setCursor(0, 55);
  display.print("VDI: ");
  display.print(val);
 
  display.display();
}

Buradaki kodumuz bir öncekinden biraz daha kapsamlı olup bunu biraz daha geliştireceğiz
Dikkat ederseniz henüz bir menümüz yok 
Menü içerisine threshold sensivity hasdaslık ve ground balance yani toprak ayarı ses açma kapama gibi özellikler ekleyeceğiz buna batarya kontrolünüde dahil edebiliriz .
Sorularınız için konu üzerinden yada pulseqrparge@gmail.com mail ilede paylaşabilirsiniz.
İlerleyen günlerde STM 32 Tabanlı arduino yada direkt STM32 ile vlf konusuna devam edeceğiz
Başlık: Ynt: VLF DEDEKTÖR YAPIMI Tasarımı
Gönderen: Yörük - Nis 08, 2026, 01:04 ÖÖ
Bu Kodda Neler Değişti?İnceleyelim;
Önemli Bir Hatırlatma: Analog Katman
Bu kodun çalışması için alıcı (RX) bobininden gelen sinyalin şu aşamalardan geçmesi gerekir:
Başlık: Ynt: VLF DEDEKTÖR YAPIMI Tasarımı
Gönderen: Yörük - Nis 09, 2026, 12:12 ÖÖ
Merhaba
V03 pro vlf. Olarak adlandıralım
Menü ve pil seviyesi ölçme ekledik,
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
// Pin Tanımlamaları
const int rxPin = A0;      // RX sinyali (Op-amp çıkışı)
const int batPin = A1;    // Pil voltaj okuma (Direnç bölücü ile)
const int speakerPin = 8;
const int btnMENU = 2;
const int btnUP = 3;
const int btnDOWN = 4;
const int btnOK = 5;
const int btnVOL_UP = 6;
const int btnVOL_DOWN = 7;
// Değişkenler
int threshold = 35;
int groundValue = 512;
int volume = 6;
int menuIndex = 0;
bool inMenu = false;
bool isMuted = false;
void setup() {
  Serial.begin(115200);
 
  // Pin Modları
  pinMode(btnMENU, INPUT_PULLUP);
  pinMode(btnUP, INPUT_PULLUP);
  pinMode(btnDOWN, INPUT_PULLUP);
  pinMode(btnOK, INPUT_PULLUP);
  pinMode(btnVOL_UP, INPUT_PULLUP);
  pinMode(btnVOL_DOWN, INPUT_PULLUP);
 
  // 10kHz TX Sinyal Üretimi (D9)
  pinMode(9, OUTPUT);
  TCCR1A = _BV(COM1A0);
  TCCR1B = _BV(WGM12) | _BV(CS10);
  OCR1A = 799;
  // ADC Hızlandırma (Prescaler 16)
  ADCSRA &= ~(0x07);
  ADCSRA |= (1 << ADPS2);
  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) for(;;);
 
  showWelcomeScreen();
  calibrateGround();
}
void loop() {
  handleButtons();
  if (inMenu) {
    drawMenu();
  } else {
    runDetection();
  }
}
// Ana Ekran ve Algılama
void runDetection() {
  long sum = 0;
  for(int i=0; i<50; i++) sum += analogRead(rxPin);
  int currentVal = sum / 50;
  int diff = currentVal - groundValue;
  display.clearDisplay();
 
  // 1. Üst Bar: Pil ve Durum
  drawBattery();
  display.setCursor(0, 0);
  display.print("VLF PRO");
  display.drawLine(0, 10, 128, 10, WHITE);
  // 2. VDI ve Sinyal Barı
  int barWidth = map(constrain(abs(diff), 0, 500), 0, 500, 0, 128);
  display.drawRect(0, 15, 128, 12, WHITE);
  display.fillRect(2, 17, barWidth, 8, WHITE);
  // 3. Metal Ayrım Alanı
  display.setCursor(0, 35);
  display.setTextSize(2);
  if (abs(diff) > threshold) {
    if (diff > 45) {
      display.print("DEGERLI"); // Altın, Gümüş, Bakır (Pozitif Kayma)
    } else {
      display.print("DEMIR");  // Çivi, Paslı Metal (Negatif Kayma)
    }
    if(!isMuted) tone(speakerPin, map(abs(diff), 0, 600, 150, 1800 + (volume * 80)));
  } else {
    display.print("BEKLEMEDE");
    noTone(speakerPin);
  }
  // 4. Alt Bilgi
  display.setTextSize(1);
  display.setCursor(0, 56);
  display.print("T:"); display.print(threshold);
  display.print(" V:"); display.print(volume);
  display.print(" S:"); display.print(diff);
 
  display.display();
}
void drawBattery() {
  int batRaw = analogRead(batPin);
  // 2:1 direnç bölücü ile (7.4V -> 3.7V Arduino'ya)
  int batLevel = map(batRaw, 600, 850, 0, 18);
  display.drawRect(105, 0, 20, 8, WHITE);
  display.drawRect(125, 2, 2, 4, WHITE);
  display.fillRect(106, 1, constrain(batLevel, 0, 18), 6, WHITE);
}
void handleButtons() {
  if (digitalRead(btnMENU) == LOW) { delay(250); inMenu = !inMenu; }
 
  if (inMenu) {
    if (digitalRead(btnUP) == LOW) { delay(200); menuIndex--; if(menuIndex < 0) menuIndex = 2; }
    if (digitalRead(btnDOWN) == LOW) { delay(200); menuIndex++; if(menuIndex > 2) menuIndex = 0; }
    if (digitalRead(btnOK) == LOW) {
      delay(250);
      if(menuIndex == 0) calibrateGround();
      if(menuIndex == 1) { threshold += 5; if(threshold > 100) threshold = 10; }
      if(menuIndex == 2) isMuted = !isMuted;
    }
  } else {
    if (digitalRead(btnVOL_UP) == LOW) { volume++; if(volume > 10) volume = 10; delay(150); }
    if (digitalRead(btnVOL_DOWN) == LOW) { volume--; if(volume < 0) volume = 0; delay(150); }
  }
}
void drawMenu() {
  display.clearDisplay();
  display.setTextSize(1);
  display.setCursor(35, 0); display.println("AYARLAR");
  display.drawLine(0, 10, 128, 10, WHITE);
  char* opts[] = {"Zemin Kalibrasyonu", "Esik (Hassasiyet)", "Sessiz Mod"};
  for(int i=0; i<3; i++) {
    display.setCursor(0, 15 + (i * 12));
    if(i == menuIndex) display.print("> "); else display.print("  ");
    display.println(opts);
  }
  display.display();
}
void calibrateGround() {
  display.clearDisplay();
  display.setCursor(20, 25); display.print("KALIBRASYON...");
  display.display();
  long c = 0;
  for(int i=0; i<300; i++) c += analogRead(rxPin);
  groundValue = c / 300;
  inMenu = false;
}
void showWelcomeScreen() {
  display.clearDisplay();
  display.setTextSize(2);
  display.setCursor(15, 20); display.println("VLF PRO");
  display.setTextSize(1);
  display.setCursor(25, 45); display.println("Sistem Yukleniyor");
  display.display();
  delay(2000);
}
Başlık: Ynt: VLF DEDEKTÖR YAPIMI Tasarımı
Gönderen: Yörük - Nis 09, 2026, 12:20 ÖÖ
Konuya devam edelim.
Yazılımımıza Pil Seviyesi (Battery Indicator), VDI Çizelgesi (Sinyal Barı altında) ve daha profesyonel bir Arayüz Tasarımı ekliyoruz.

Ayrıca, donanım tarafında belirttiğiniz IRF740 MOSFET ve BC transistörler ile kuracağınız TX katmanını, OPA27/TL072 RX katmanını ve 1N60 kırpıcı diyotlarını destekleyecek şekilde yazılımın hassasiyetini optimize ettim.
Donanım İçin Kritik Notlar:
Başlık: Ynt: VLF DEDEKTÖR YAPIMI Tasarımı
Gönderen: Yörük - Nis 09, 2026, 12:23 ÖÖ
6 Tüm teknik detayları, donanım mimarisini ve yazdığımız gelişmiş yazılım özelliklerini bir araya getirerek projenin tam bir özetini hazırladım. Bu metni kopyalayıp bir not dosyasına kaydedebilirsin.
🚀 PROJE NOTLARI: Arduino VLF Pro Metal Dedektörü
Proje Amacı: Arduino tabanlı, OLED ekranlı, metal ayrımı yapabilen (VLF - Very Low Frequency) ve saha ayarlarına (Menü) sahip profesyonel bir metal dedektörü geliştirmek.
1. Donanım Mimarisi (Donanım Taslağı)
Projenin fiziksel yapısı üç ana bloktan oluşmaktadır:
A. Verici (Transmitter - TX) Katmanı
B. Alıcı (Receiver - RX) Katmanı
C. Kontrol ve Görselleştirme
2. Yazılım Özellikleri (VLF Pro v3.0)
Yazılım, standart bir dedektörün ötesinde şu gelişmiş fonksiyonları içerir:
3. Buton ve Pin Konfigürasyonu


[th]Pin[/th]
[th]Görev[/th]
[th]Bağlantı Şekli[/th]
D2Menü / GeriButon \rightarrow GND
D3Yukarı (+)Buton \rightarrow GND
D4Aşağı (-)Buton \rightarrow GND
D5Seç (OK)Buton \rightarrow GND
D6Ses ArtırButon \rightarrow GND
D7Ses AzaltButon \rightarrow GND
D8Ses ÇıkışıBuzzer / Amp
D9TX ÇıkışMOSFET Gate Sürücü
A0RX GirişOp-Amp Çıkışı
A1Pil ÖlçümVoltaj Bölücü (10\text{k}/10\text{k})
4. Kritik Yapım Notları (Saha İpuçları)
Not: Bu proje, 2026 yılı güncel Arduino kütüphaneleri ve 10 \text{ kHz} VLF standartları baz alınarak dökümante edilmiştir.
Başlık: Ynt: VLF DEDEKTÖR YAPIMI Tasarımı
Gönderen: Yörük - Nis 09, 2026, 01:21 ÖÖ
/ ... (Kütüphane ve Pin tanımlamaları aynı kalacak)
void showWelcomeScreen() {
  display.clearDisplay();
 
  // Üst Çizgi Tasarımı
  display.drawFastHLine(0, 5, 128, WHITE);
 
  // Marka İsmi (PULSEQRPARGE)
  display.setTextSize(1);
  display.setCursor(25, 15);
  display.println("DESIGNED BY");
 
  display.setTextSize(2); // Büyük font
  display.setCursor(5, 30);
  display.println("PULSEQRP"); // Marka ismi sığması için 2 satıra bölebiliriz
  display.setCursor(45, 48);
  display.println("ARGE");
 
  // Alt Çizgi ve Versiyon
  display.drawFastHLine(0, 60, 128, WHITE);
  display.display();
 
  delay(3000); // Markanın 3 saniye görünmesini sağlar
 
  // Yükleme Animasyonu
  for(int i=0; i<128; i+=4) {
    display.fillRect(0, 58, i, 2, WHITE);
    display.display();
    delay(20);
  }
}
void runDetection() {
  // ... (Sinyal okuma kısımları aynı)
 
  display.clearDisplay();
 
  // Ana ekranda da marka ismini köşeye ekleyelim
  display.setTextSize(1);
  display.setCursor(0, 0);
  display.print("PULSEQRP ARGE"); // Sol üst köşe imzası
 
  drawBattery();
  display.drawLine(0, 10, 128, 10, WHITE);
 
  // ... (Geri kalan gösterge kodları aynı)
}

Evet bazı açılış ayarlarınıda değiştirdik 
Konuya kapsamlı olarak devam edeceğiz.