เครื่องตรวจจับโลหะ Arduino แบบทำเอง

แม้ว่าจะดูเรียบง่าย แต่ความไวต่อการตอบสนองค่อนข้างดี และมีเสถียรภาพที่สมบูรณ์แบบระหว่างการใช้งาน

เครื่องตรวจจับโลหะ Arduino แบบทำเอง

ลองจินตนาการถึงความตื่นเต้นในการค้นพบสมบัติที่ซ่อนอยู่ ความสุขในการสร้างอุปกรณ์ที่มีประโยชน์ด้วยมือของคุณเอง และความสนุกสนานในการทดลองกับวงจรอิเล็กทรอนิกส์ ตอนนี้มารวมทั้งหมดนี้ให้เป็นโปรเจ็กต์สนุกๆ กัน: สร้างเครื่องตรวจจับโลหะของคุณเองโดยใช้ Arduino!

ลืมอุปกรณ์สำเร็จรูปราคาแพงไปได้เลย – เรากำลังเข้าสู่โลกของนักประดิษฐ์ ที่ซึ่งด้วยส่วนประกอบเพียงไม่กี่ชิ้นที่หาได้ง่ายและพลังของ Arduino คุณก็สามารถกลายเป็นนักล่าขุมทรัพย์ตัวจริงได้ แต่โครงการนี้เป็นมากกว่าแค่การค้นหาเหรียญที่สูญหายในทรายเท่านั้น นอกจากนี้ยังเป็นโอกาสที่จะได้สำรวจระบบฝังตัว ทำความเข้าใจหลักการของสนามแม่เหล็กไฟฟ้า และเพลิดเพลินไปกับความตื่นเต้นในการเปลี่ยนแนวคิดให้กลายเป็นความจริง

หยิบหัวแร้งของคุณขึ้นมา เปิด Arduino IDE และเตรียมพร้อมที่จะออกเดินทางสู่การเดินทางแห่งความคิดสร้างสรรค์ โดยที่ทุกสัญญาณที่ส่งออกจากอุปกรณ์ของคุณอาจนำไปสู่การค้นพบที่ไม่คาดคิด!

มาเริ่มกันเลย!

เรื่องราว

วันนี้ ฉันจะมาแนะนำวิธีการสร้างเครื่องตรวจจับโลหะที่เรียบง่ายสุดๆ แต่ยังคงมีประสิทธิภาพที่น่าประทับใจ แม้ว่าอุปกรณ์นี้จะมีการออกแบบที่เรียบง่าย แต่ยังคงมีความไวค่อนข้างสูงและการทำงานที่เสถียร โดยไม่จำเป็นต้องปรับเทียบแม้จะใช้งานเป็นเวลานานก็ตาม โดยเฉพาะอย่างยิ่ง ขนาดและความเหนี่ยวนำของขดลวดโพรบไม่สำคัญมากนัก สิ่งที่สำคัญที่สุดก็คือหลังจากการประกอบแล้ว เครื่องจะทำงานทันที ดังนั้นจึงเป็นตัวเลือกที่เหมาะสำหรับผู้ที่เพิ่งเริ่มต้นในโลกแห่งการผลิตอุปกรณ์อิเล็กทรอนิกส์

โครงการนี้ได้รับแรงบันดาลใจจาก บล็อก Silicon Junction แต่ฉันได้เพิ่มตัวบ่งชี้เสียงเพื่อช่วยควบคุมกระบวนการตรวจจับโลหะได้ดีขึ้น แกนหลักของระบบคือออสซิลเลเตอร์ Colpitts แบบเรียบง่าย โดยวงจรเรโซแนนซ์ประกอบด้วย C2, C3 และคอยล์โพรบ ( SEARCH_COIL ) ออสซิลเลเตอร์นี้ทำงานที่ความถี่ประมาณ 260kHz ช่วยให้เครื่องสามารถตรวจจับโลหะได้อย่างมีประสิทธิภาพ

อุปกรณ์ครบชุดประกอบด้วยส่วนประกอบต่อไปนี้:

  • ไมโครคอนโทรลเลอร์ Arduino Nano
  • ทรานซิสเตอร์ NPN BC337 หรือเทียบเท่า
  • ตัวต้านทานบางชนิด
  • ตัวเก็บประจุห้าตัว
  • ไดโอดซีเนอร์
  • และคอยล์หัววัด

ไดโอดซีเนอร์ D1 ใช้เพื่อจำกัดแรงดันไฟฟ้าบนพิน Arduino ให้เหลือ 4.3V ที่ปลอดภัย ตัวเก็บประจุ C5 และตัวต้านทาน R4 ช่วยให้แน่ใจว่าเอาต์พุตของออสซิลเลเตอร์อ้างอิงกับกราวด์

คอยล์ใดๆ ที่มีค่าเหนี่ยวนำประมาณ 200-400µH น่าจะทำงานได้ดี และคุณควรพยายามรักษาความต้านทานของคอยล์ให้อยู่ในระดับต่ำ เพื่อประสิทธิภาพที่ดีที่สุด สิ่งนี้ช่วยสร้างความถี่การแกว่งในช่วง 200-400 kHz ซึ่งเหมาะกับความสามารถในการประมวลผลของ Arduino ในการทดสอบ ฉันใช้ขดลวดขนาดเส้นผ่านศูนย์กลาง 20 ซม. พร้อมลวด 25 รอบ นอกจากนี้ เครื่องตรวจจับยังทำงานได้อย่างแม่นยำกับขดลวดสองขดที่มีเส้นผ่านศูนย์กลาง 12 ซม. และ 23 ซม. โดยทั้งสองขดมี 25 รอบและเชื่อมต่อแบบอนุกรม

โปรแกรม Arduino จะนับจำนวนพัลส์ที่เกิดขึ้นในแต่ละช่วงเวลา 100 มิลลิวินาทีและจัดเก็บค่านี้เป็นค่าพื้นฐาน ในลูปหลัก มันจะนับจำนวนพัลส์ต่อในอีก 100 มิลลิวินาทีถัดไป และบันทึกผลลัพธ์นี้เป็นจำนวนปัจจุบัน หากการนับเปลี่ยนจากค่าพื้นฐาน ไฟ LED จะสว่างขึ้น และสัญญาณเตือนจะดังขึ้น ซึ่งหมายความว่าเครื่องตรวจจับจะปรับเทียบตัวเองอย่างต่อเนื่องโดยอัตโนมัติทุกๆ 100 มิลลิวินาที

ด้วย ไลบรารีFreqCount (ดาวน์โหลดได้จากลิงก์ที่ให้มา) ทำให้โค้ดโปรแกรมกลายเป็นเรื่องง่ายและนำไปใช้งานได้ง่าย ข้อดีที่สำคัญอย่างหนึ่งของวิธีนี้คือสามารถใช้งานอุปกรณ์ได้ทันทีโดยไม่จำเป็นต้องปรับแต่งหรือสอบเทียบด้วยตนเอง อย่างไรก็ตามข้อเสียคือ การจะตรวจจับวัตถุโลหะ จำเป็นต้องมีการเคลื่อนไหวสัมพันธ์กันระหว่างวัตถุและขดลวดตรวจจับ

แผนภาพ

แผนผังวงจรออสซิลเลเตอร์

แผนผัง (ส่วน Arduino)

รหัส

#include <FreqCount.h>

//the baseline frequency of the main search coil
unsigned long baseLine = 0;

//Pins red, green and blue LEDs are attached to.
const int bluePin = A2;
const int greenPin = A4;
const int redPin = A5;
const int buzzerPin = 12;


void setup() {
  //set our LED pins as outputs
  pinMode(redPin,OUTPUT);
  pinMode(greenPin,OUTPUT);
  pinMode(bluePin,OUTPUT);
  pinMode(buzzerPin,OUTPUT);
  //Flash a sequence to test the LEDs and show we are starting up  
  digitalWrite(redPin,HIGH);
  delay(200);
  silence();
  digitalWrite(greenPin,HIGH);
  delay(200);
  silence();
  digitalWrite(bluePin,HIGH);
  delay(200);
  silence();

  //Read out baseline frequency count, 100ms intervals
  FreqCount.begin(100);
  while(!FreqCount.available())
  {
    delay(10);
  }
  baseLine = FreqCount.read();

  if(baseLine > 10000)
  {
    //Green, we started up OK
    digitalWrite(greenPin,HIGH);  
  }
  else
  {
    //Red, something went wrong, we didn't get a sensible count
    digitalWrite(redPin,HIGH);
  }
  delay(1000);

  silence();
}


void loop() {
  //no sample ready yet, exit.
  if (!FreqCount.available()) {
    return;
  }
  //Read how many pulses in 100 milliseconds
  unsigned long count = FreqCount.read();
  
  long difference =  baseLine - count;
  difference = abs(difference);
  
  //Difference is large, turn on the RED led
  if(difference > 5)
  {
    digitalWrite(greenPin,LOW);
    digitalWrite(bluePin,LOW);
    digitalWrite(redPin,HIGH);
    digitalWrite(buzzerPin,HIGH);
  }
  else if(difference > 2)  //medium difference, green
  {
    digitalWrite(greenPin,HIGH);
    digitalWrite(bluePin,LOW);
    digitalWrite(redPin,LOW);
    digitalWrite(buzzerPin,HIGH);
  }
  else if(difference > 1) //small difference, blue.
  {
    digitalWrite(greenPin,LOW);
    digitalWrite(bluePin,HIGH);
    digitalWrite(redPin,LOW);
    digitalWrite(buzzerPin,HIGH);
  }
  else
  {
    silence(); //no difference, turn off all LEDs
    digitalWrite(buzzerPin,LOW);
  }

  //Auto-adjust our baseline
  if(count > baseLine)
  {
    baseLine +=1;
  }
  else if (count < baseLine)
  {
     baseLine -= 1;
  }
}

  //Turn off all output pins
  void silence()
  {
    digitalWrite(redPin,LOW);
    digitalWrite(greenPin,LOW);
    digitalWrite(bluePin,LOW);
  }
    
  

เครื่องตรวจจับโลหะ Arduino แบบทำเอง

แม้ว่าจะดูเรียบง่าย แต่ความไวต่อการตอบสนองค่อนข้างดี และมีเสถียรภาพที่สมบูรณ์แบบระหว่างการใช้งาน

นักเขียนบทความ
by 
นักเขียนบทความ
เครื่องตรวจจับโลหะ Arduino แบบทำเอง

เครื่องตรวจจับโลหะ Arduino แบบทำเอง

แม้ว่าจะดูเรียบง่าย แต่ความไวต่อการตอบสนองค่อนข้างดี และมีเสถียรภาพที่สมบูรณ์แบบระหว่างการใช้งาน

ลองจินตนาการถึงความตื่นเต้นในการค้นพบสมบัติที่ซ่อนอยู่ ความสุขในการสร้างอุปกรณ์ที่มีประโยชน์ด้วยมือของคุณเอง และความสนุกสนานในการทดลองกับวงจรอิเล็กทรอนิกส์ ตอนนี้มารวมทั้งหมดนี้ให้เป็นโปรเจ็กต์สนุกๆ กัน: สร้างเครื่องตรวจจับโลหะของคุณเองโดยใช้ Arduino!

ลืมอุปกรณ์สำเร็จรูปราคาแพงไปได้เลย – เรากำลังเข้าสู่โลกของนักประดิษฐ์ ที่ซึ่งด้วยส่วนประกอบเพียงไม่กี่ชิ้นที่หาได้ง่ายและพลังของ Arduino คุณก็สามารถกลายเป็นนักล่าขุมทรัพย์ตัวจริงได้ แต่โครงการนี้เป็นมากกว่าแค่การค้นหาเหรียญที่สูญหายในทรายเท่านั้น นอกจากนี้ยังเป็นโอกาสที่จะได้สำรวจระบบฝังตัว ทำความเข้าใจหลักการของสนามแม่เหล็กไฟฟ้า และเพลิดเพลินไปกับความตื่นเต้นในการเปลี่ยนแนวคิดให้กลายเป็นความจริง

หยิบหัวแร้งของคุณขึ้นมา เปิด Arduino IDE และเตรียมพร้อมที่จะออกเดินทางสู่การเดินทางแห่งความคิดสร้างสรรค์ โดยที่ทุกสัญญาณที่ส่งออกจากอุปกรณ์ของคุณอาจนำไปสู่การค้นพบที่ไม่คาดคิด!

มาเริ่มกันเลย!

เรื่องราว

วันนี้ ฉันจะมาแนะนำวิธีการสร้างเครื่องตรวจจับโลหะที่เรียบง่ายสุดๆ แต่ยังคงมีประสิทธิภาพที่น่าประทับใจ แม้ว่าอุปกรณ์นี้จะมีการออกแบบที่เรียบง่าย แต่ยังคงมีความไวค่อนข้างสูงและการทำงานที่เสถียร โดยไม่จำเป็นต้องปรับเทียบแม้จะใช้งานเป็นเวลานานก็ตาม โดยเฉพาะอย่างยิ่ง ขนาดและความเหนี่ยวนำของขดลวดโพรบไม่สำคัญมากนัก สิ่งที่สำคัญที่สุดก็คือหลังจากการประกอบแล้ว เครื่องจะทำงานทันที ดังนั้นจึงเป็นตัวเลือกที่เหมาะสำหรับผู้ที่เพิ่งเริ่มต้นในโลกแห่งการผลิตอุปกรณ์อิเล็กทรอนิกส์

โครงการนี้ได้รับแรงบันดาลใจจาก บล็อก Silicon Junction แต่ฉันได้เพิ่มตัวบ่งชี้เสียงเพื่อช่วยควบคุมกระบวนการตรวจจับโลหะได้ดีขึ้น แกนหลักของระบบคือออสซิลเลเตอร์ Colpitts แบบเรียบง่าย โดยวงจรเรโซแนนซ์ประกอบด้วย C2, C3 และคอยล์โพรบ ( SEARCH_COIL ) ออสซิลเลเตอร์นี้ทำงานที่ความถี่ประมาณ 260kHz ช่วยให้เครื่องสามารถตรวจจับโลหะได้อย่างมีประสิทธิภาพ

อุปกรณ์ครบชุดประกอบด้วยส่วนประกอบต่อไปนี้:

  • ไมโครคอนโทรลเลอร์ Arduino Nano
  • ทรานซิสเตอร์ NPN BC337 หรือเทียบเท่า
  • ตัวต้านทานบางชนิด
  • ตัวเก็บประจุห้าตัว
  • ไดโอดซีเนอร์
  • และคอยล์หัววัด

ไดโอดซีเนอร์ D1 ใช้เพื่อจำกัดแรงดันไฟฟ้าบนพิน Arduino ให้เหลือ 4.3V ที่ปลอดภัย ตัวเก็บประจุ C5 และตัวต้านทาน R4 ช่วยให้แน่ใจว่าเอาต์พุตของออสซิลเลเตอร์อ้างอิงกับกราวด์

คอยล์ใดๆ ที่มีค่าเหนี่ยวนำประมาณ 200-400µH น่าจะทำงานได้ดี และคุณควรพยายามรักษาความต้านทานของคอยล์ให้อยู่ในระดับต่ำ เพื่อประสิทธิภาพที่ดีที่สุด สิ่งนี้ช่วยสร้างความถี่การแกว่งในช่วง 200-400 kHz ซึ่งเหมาะกับความสามารถในการประมวลผลของ Arduino ในการทดสอบ ฉันใช้ขดลวดขนาดเส้นผ่านศูนย์กลาง 20 ซม. พร้อมลวด 25 รอบ นอกจากนี้ เครื่องตรวจจับยังทำงานได้อย่างแม่นยำกับขดลวดสองขดที่มีเส้นผ่านศูนย์กลาง 12 ซม. และ 23 ซม. โดยทั้งสองขดมี 25 รอบและเชื่อมต่อแบบอนุกรม

โปรแกรม Arduino จะนับจำนวนพัลส์ที่เกิดขึ้นในแต่ละช่วงเวลา 100 มิลลิวินาทีและจัดเก็บค่านี้เป็นค่าพื้นฐาน ในลูปหลัก มันจะนับจำนวนพัลส์ต่อในอีก 100 มิลลิวินาทีถัดไป และบันทึกผลลัพธ์นี้เป็นจำนวนปัจจุบัน หากการนับเปลี่ยนจากค่าพื้นฐาน ไฟ LED จะสว่างขึ้น และสัญญาณเตือนจะดังขึ้น ซึ่งหมายความว่าเครื่องตรวจจับจะปรับเทียบตัวเองอย่างต่อเนื่องโดยอัตโนมัติทุกๆ 100 มิลลิวินาที

ด้วย ไลบรารีFreqCount (ดาวน์โหลดได้จากลิงก์ที่ให้มา) ทำให้โค้ดโปรแกรมกลายเป็นเรื่องง่ายและนำไปใช้งานได้ง่าย ข้อดีที่สำคัญอย่างหนึ่งของวิธีนี้คือสามารถใช้งานอุปกรณ์ได้ทันทีโดยไม่จำเป็นต้องปรับแต่งหรือสอบเทียบด้วยตนเอง อย่างไรก็ตามข้อเสียคือ การจะตรวจจับวัตถุโลหะ จำเป็นต้องมีการเคลื่อนไหวสัมพันธ์กันระหว่างวัตถุและขดลวดตรวจจับ

แผนภาพ

แผนผังวงจรออสซิลเลเตอร์

แผนผัง (ส่วน Arduino)

รหัส

#include <FreqCount.h>

//the baseline frequency of the main search coil
unsigned long baseLine = 0;

//Pins red, green and blue LEDs are attached to.
const int bluePin = A2;
const int greenPin = A4;
const int redPin = A5;
const int buzzerPin = 12;


void setup() {
  //set our LED pins as outputs
  pinMode(redPin,OUTPUT);
  pinMode(greenPin,OUTPUT);
  pinMode(bluePin,OUTPUT);
  pinMode(buzzerPin,OUTPUT);
  //Flash a sequence to test the LEDs and show we are starting up  
  digitalWrite(redPin,HIGH);
  delay(200);
  silence();
  digitalWrite(greenPin,HIGH);
  delay(200);
  silence();
  digitalWrite(bluePin,HIGH);
  delay(200);
  silence();

  //Read out baseline frequency count, 100ms intervals
  FreqCount.begin(100);
  while(!FreqCount.available())
  {
    delay(10);
  }
  baseLine = FreqCount.read();

  if(baseLine > 10000)
  {
    //Green, we started up OK
    digitalWrite(greenPin,HIGH);  
  }
  else
  {
    //Red, something went wrong, we didn't get a sensible count
    digitalWrite(redPin,HIGH);
  }
  delay(1000);

  silence();
}


void loop() {
  //no sample ready yet, exit.
  if (!FreqCount.available()) {
    return;
  }
  //Read how many pulses in 100 milliseconds
  unsigned long count = FreqCount.read();
  
  long difference =  baseLine - count;
  difference = abs(difference);
  
  //Difference is large, turn on the RED led
  if(difference > 5)
  {
    digitalWrite(greenPin,LOW);
    digitalWrite(bluePin,LOW);
    digitalWrite(redPin,HIGH);
    digitalWrite(buzzerPin,HIGH);
  }
  else if(difference > 2)  //medium difference, green
  {
    digitalWrite(greenPin,HIGH);
    digitalWrite(bluePin,LOW);
    digitalWrite(redPin,LOW);
    digitalWrite(buzzerPin,HIGH);
  }
  else if(difference > 1) //small difference, blue.
  {
    digitalWrite(greenPin,LOW);
    digitalWrite(bluePin,HIGH);
    digitalWrite(redPin,LOW);
    digitalWrite(buzzerPin,HIGH);
  }
  else
  {
    silence(); //no difference, turn off all LEDs
    digitalWrite(buzzerPin,LOW);
  }

  //Auto-adjust our baseline
  if(count > baseLine)
  {
    baseLine +=1;
  }
  else if (count < baseLine)
  {
     baseLine -= 1;
  }
}

  //Turn off all output pins
  void silence()
  {
    digitalWrite(redPin,LOW);
    digitalWrite(greenPin,LOW);
    digitalWrite(bluePin,LOW);
  }
    
  

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse varius enim in eros elementum tristique. Duis cursus, mi quis viverra ornare, eros dolor interdum nulla, ut commodo diam libero vitae erat. Aenean faucibus nibh et justo cursus id rutrum lorem imperdiet. Nunc ut sem vitae risus tristique posuere.

เครื่องตรวจจับโลหะ Arduino แบบทำเอง

เครื่องตรวจจับโลหะ Arduino แบบทำเอง

แม้ว่าจะดูเรียบง่าย แต่ความไวต่อการตอบสนองค่อนข้างดี และมีเสถียรภาพที่สมบูรณ์แบบระหว่างการใช้งาน

Lorem ipsum dolor amet consectetur adipiscing elit tortor massa arcu non.

ลองจินตนาการถึงความตื่นเต้นในการค้นพบสมบัติที่ซ่อนอยู่ ความสุขในการสร้างอุปกรณ์ที่มีประโยชน์ด้วยมือของคุณเอง และความสนุกสนานในการทดลองกับวงจรอิเล็กทรอนิกส์ ตอนนี้มารวมทั้งหมดนี้ให้เป็นโปรเจ็กต์สนุกๆ กัน: สร้างเครื่องตรวจจับโลหะของคุณเองโดยใช้ Arduino!

ลืมอุปกรณ์สำเร็จรูปราคาแพงไปได้เลย – เรากำลังเข้าสู่โลกของนักประดิษฐ์ ที่ซึ่งด้วยส่วนประกอบเพียงไม่กี่ชิ้นที่หาได้ง่ายและพลังของ Arduino คุณก็สามารถกลายเป็นนักล่าขุมทรัพย์ตัวจริงได้ แต่โครงการนี้เป็นมากกว่าแค่การค้นหาเหรียญที่สูญหายในทรายเท่านั้น นอกจากนี้ยังเป็นโอกาสที่จะได้สำรวจระบบฝังตัว ทำความเข้าใจหลักการของสนามแม่เหล็กไฟฟ้า และเพลิดเพลินไปกับความตื่นเต้นในการเปลี่ยนแนวคิดให้กลายเป็นความจริง

หยิบหัวแร้งของคุณขึ้นมา เปิด Arduino IDE และเตรียมพร้อมที่จะออกเดินทางสู่การเดินทางแห่งความคิดสร้างสรรค์ โดยที่ทุกสัญญาณที่ส่งออกจากอุปกรณ์ของคุณอาจนำไปสู่การค้นพบที่ไม่คาดคิด!

มาเริ่มกันเลย!

เรื่องราว

วันนี้ ฉันจะมาแนะนำวิธีการสร้างเครื่องตรวจจับโลหะที่เรียบง่ายสุดๆ แต่ยังคงมีประสิทธิภาพที่น่าประทับใจ แม้ว่าอุปกรณ์นี้จะมีการออกแบบที่เรียบง่าย แต่ยังคงมีความไวค่อนข้างสูงและการทำงานที่เสถียร โดยไม่จำเป็นต้องปรับเทียบแม้จะใช้งานเป็นเวลานานก็ตาม โดยเฉพาะอย่างยิ่ง ขนาดและความเหนี่ยวนำของขดลวดโพรบไม่สำคัญมากนัก สิ่งที่สำคัญที่สุดก็คือหลังจากการประกอบแล้ว เครื่องจะทำงานทันที ดังนั้นจึงเป็นตัวเลือกที่เหมาะสำหรับผู้ที่เพิ่งเริ่มต้นในโลกแห่งการผลิตอุปกรณ์อิเล็กทรอนิกส์

โครงการนี้ได้รับแรงบันดาลใจจาก บล็อก Silicon Junction แต่ฉันได้เพิ่มตัวบ่งชี้เสียงเพื่อช่วยควบคุมกระบวนการตรวจจับโลหะได้ดีขึ้น แกนหลักของระบบคือออสซิลเลเตอร์ Colpitts แบบเรียบง่าย โดยวงจรเรโซแนนซ์ประกอบด้วย C2, C3 และคอยล์โพรบ ( SEARCH_COIL ) ออสซิลเลเตอร์นี้ทำงานที่ความถี่ประมาณ 260kHz ช่วยให้เครื่องสามารถตรวจจับโลหะได้อย่างมีประสิทธิภาพ

อุปกรณ์ครบชุดประกอบด้วยส่วนประกอบต่อไปนี้:

  • ไมโครคอนโทรลเลอร์ Arduino Nano
  • ทรานซิสเตอร์ NPN BC337 หรือเทียบเท่า
  • ตัวต้านทานบางชนิด
  • ตัวเก็บประจุห้าตัว
  • ไดโอดซีเนอร์
  • และคอยล์หัววัด

ไดโอดซีเนอร์ D1 ใช้เพื่อจำกัดแรงดันไฟฟ้าบนพิน Arduino ให้เหลือ 4.3V ที่ปลอดภัย ตัวเก็บประจุ C5 และตัวต้านทาน R4 ช่วยให้แน่ใจว่าเอาต์พุตของออสซิลเลเตอร์อ้างอิงกับกราวด์

คอยล์ใดๆ ที่มีค่าเหนี่ยวนำประมาณ 200-400µH น่าจะทำงานได้ดี และคุณควรพยายามรักษาความต้านทานของคอยล์ให้อยู่ในระดับต่ำ เพื่อประสิทธิภาพที่ดีที่สุด สิ่งนี้ช่วยสร้างความถี่การแกว่งในช่วง 200-400 kHz ซึ่งเหมาะกับความสามารถในการประมวลผลของ Arduino ในการทดสอบ ฉันใช้ขดลวดขนาดเส้นผ่านศูนย์กลาง 20 ซม. พร้อมลวด 25 รอบ นอกจากนี้ เครื่องตรวจจับยังทำงานได้อย่างแม่นยำกับขดลวดสองขดที่มีเส้นผ่านศูนย์กลาง 12 ซม. และ 23 ซม. โดยทั้งสองขดมี 25 รอบและเชื่อมต่อแบบอนุกรม

โปรแกรม Arduino จะนับจำนวนพัลส์ที่เกิดขึ้นในแต่ละช่วงเวลา 100 มิลลิวินาทีและจัดเก็บค่านี้เป็นค่าพื้นฐาน ในลูปหลัก มันจะนับจำนวนพัลส์ต่อในอีก 100 มิลลิวินาทีถัดไป และบันทึกผลลัพธ์นี้เป็นจำนวนปัจจุบัน หากการนับเปลี่ยนจากค่าพื้นฐาน ไฟ LED จะสว่างขึ้น และสัญญาณเตือนจะดังขึ้น ซึ่งหมายความว่าเครื่องตรวจจับจะปรับเทียบตัวเองอย่างต่อเนื่องโดยอัตโนมัติทุกๆ 100 มิลลิวินาที

ด้วย ไลบรารีFreqCount (ดาวน์โหลดได้จากลิงก์ที่ให้มา) ทำให้โค้ดโปรแกรมกลายเป็นเรื่องง่ายและนำไปใช้งานได้ง่าย ข้อดีที่สำคัญอย่างหนึ่งของวิธีนี้คือสามารถใช้งานอุปกรณ์ได้ทันทีโดยไม่จำเป็นต้องปรับแต่งหรือสอบเทียบด้วยตนเอง อย่างไรก็ตามข้อเสียคือ การจะตรวจจับวัตถุโลหะ จำเป็นต้องมีการเคลื่อนไหวสัมพันธ์กันระหว่างวัตถุและขดลวดตรวจจับ

แผนภาพ

แผนผังวงจรออสซิลเลเตอร์

แผนผัง (ส่วน Arduino)

รหัส

#include <FreqCount.h>

//the baseline frequency of the main search coil
unsigned long baseLine = 0;

//Pins red, green and blue LEDs are attached to.
const int bluePin = A2;
const int greenPin = A4;
const int redPin = A5;
const int buzzerPin = 12;


void setup() {
  //set our LED pins as outputs
  pinMode(redPin,OUTPUT);
  pinMode(greenPin,OUTPUT);
  pinMode(bluePin,OUTPUT);
  pinMode(buzzerPin,OUTPUT);
  //Flash a sequence to test the LEDs and show we are starting up  
  digitalWrite(redPin,HIGH);
  delay(200);
  silence();
  digitalWrite(greenPin,HIGH);
  delay(200);
  silence();
  digitalWrite(bluePin,HIGH);
  delay(200);
  silence();

  //Read out baseline frequency count, 100ms intervals
  FreqCount.begin(100);
  while(!FreqCount.available())
  {
    delay(10);
  }
  baseLine = FreqCount.read();

  if(baseLine > 10000)
  {
    //Green, we started up OK
    digitalWrite(greenPin,HIGH);  
  }
  else
  {
    //Red, something went wrong, we didn't get a sensible count
    digitalWrite(redPin,HIGH);
  }
  delay(1000);

  silence();
}


void loop() {
  //no sample ready yet, exit.
  if (!FreqCount.available()) {
    return;
  }
  //Read how many pulses in 100 milliseconds
  unsigned long count = FreqCount.read();
  
  long difference =  baseLine - count;
  difference = abs(difference);
  
  //Difference is large, turn on the RED led
  if(difference > 5)
  {
    digitalWrite(greenPin,LOW);
    digitalWrite(bluePin,LOW);
    digitalWrite(redPin,HIGH);
    digitalWrite(buzzerPin,HIGH);
  }
  else if(difference > 2)  //medium difference, green
  {
    digitalWrite(greenPin,HIGH);
    digitalWrite(bluePin,LOW);
    digitalWrite(redPin,LOW);
    digitalWrite(buzzerPin,HIGH);
  }
  else if(difference > 1) //small difference, blue.
  {
    digitalWrite(greenPin,LOW);
    digitalWrite(bluePin,HIGH);
    digitalWrite(redPin,LOW);
    digitalWrite(buzzerPin,HIGH);
  }
  else
  {
    silence(); //no difference, turn off all LEDs
    digitalWrite(buzzerPin,LOW);
  }

  //Auto-adjust our baseline
  if(count > baseLine)
  {
    baseLine +=1;
  }
  else if (count < baseLine)
  {
     baseLine -= 1;
  }
}

  //Turn off all output pins
  void silence()
  {
    digitalWrite(redPin,LOW);
    digitalWrite(greenPin,LOW);
    digitalWrite(bluePin,LOW);
  }