แม้ว่าจะดูเรียบง่าย แต่ความไวต่อการตอบสนองค่อนข้างดี และมีเสถียรภาพที่สมบูรณ์แบบระหว่างการใช้งาน
ลองจินตนาการถึงความตื่นเต้นในการค้นพบสมบัติที่ซ่อนอยู่ ความสุขในการสร้างอุปกรณ์ที่มีประโยชน์ด้วยมือของคุณเอง และความสนุกสนานในการทดลองกับวงจรอิเล็กทรอนิกส์ ตอนนี้มารวมทั้งหมดนี้ให้เป็นโปรเจ็กต์สนุกๆ กัน: สร้างเครื่องตรวจจับโลหะของคุณเองโดยใช้ Arduino!
ลืมอุปกรณ์สำเร็จรูปราคาแพงไปได้เลย – เรากำลังเข้าสู่โลกของนักประดิษฐ์ ที่ซึ่งด้วยส่วนประกอบเพียงไม่กี่ชิ้นที่หาได้ง่ายและพลังของ Arduino คุณก็สามารถกลายเป็นนักล่าขุมทรัพย์ตัวจริงได้ แต่โครงการนี้เป็นมากกว่าแค่การค้นหาเหรียญที่สูญหายในทรายเท่านั้น นอกจากนี้ยังเป็นโอกาสที่จะได้สำรวจระบบฝังตัว ทำความเข้าใจหลักการของสนามแม่เหล็กไฟฟ้า และเพลิดเพลินไปกับความตื่นเต้นในการเปลี่ยนแนวคิดให้กลายเป็นความจริง
หยิบหัวแร้งของคุณขึ้นมา เปิด Arduino IDE และเตรียมพร้อมที่จะออกเดินทางสู่การเดินทางแห่งความคิดสร้างสรรค์ โดยที่ทุกสัญญาณที่ส่งออกจากอุปกรณ์ของคุณอาจนำไปสู่การค้นพบที่ไม่คาดคิด!
มาเริ่มกันเลย!
วันนี้ ฉันจะมาแนะนำวิธีการสร้างเครื่องตรวจจับโลหะที่เรียบง่ายสุดๆ แต่ยังคงมีประสิทธิภาพที่น่าประทับใจ แม้ว่าอุปกรณ์นี้จะมีการออกแบบที่เรียบง่าย แต่ยังคงมีความไวค่อนข้างสูงและการทำงานที่เสถียร โดยไม่จำเป็นต้องปรับเทียบแม้จะใช้งานเป็นเวลานานก็ตาม โดยเฉพาะอย่างยิ่ง ขนาดและความเหนี่ยวนำของขดลวดโพรบไม่สำคัญมากนัก สิ่งที่สำคัญที่สุดก็คือหลังจากการประกอบแล้ว เครื่องจะทำงานทันที ดังนั้นจึงเป็นตัวเลือกที่เหมาะสำหรับผู้ที่เพิ่งเริ่มต้นในโลกแห่งการผลิตอุปกรณ์อิเล็กทรอนิกส์
โครงการนี้ได้รับแรงบันดาลใจจาก บล็อก Silicon Junction แต่ฉันได้เพิ่มตัวบ่งชี้เสียงเพื่อช่วยควบคุมกระบวนการตรวจจับโลหะได้ดีขึ้น แกนหลักของระบบคือออสซิลเลเตอร์ Colpitts แบบเรียบง่าย โดยวงจรเรโซแนนซ์ประกอบด้วย C2, C3 และคอยล์โพรบ ( SEARCH_COIL ) ออสซิลเลเตอร์นี้ทำงานที่ความถี่ประมาณ 260kHz ช่วยให้เครื่องสามารถตรวจจับโลหะได้อย่างมีประสิทธิภาพ
ไดโอดซีเนอร์ 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);
}