如何使用Arduino Nano构建一个金属探测器

描述

金属探测器是一种安全设备,用于在机场、购物中心、电影院等各个地方检测可能有害的金属。以前我们制作了一个非常简单的金属探测器,没有微控制器,现在我们正在使用 Arduino 构建金属探测器。在这个项目中,我们将使用一个线圈和电容器来检测金属。在这里,我们使用Arduino Nano来构建这个金属探测器项目。对于所有电子爱好者来说,这是一个非常有趣的项目。无论该探测器在哪里检测到附近的任何金属,蜂鸣器都会开始非常迅速地发出哔哔声。

所需组件:

以下是使用 Arduino 构建简单 DIY 金属检测机所需的组件。所有这些组件都应该在您当地的五金店轻松买到。

Arduino (任何)

线圈

10nF 电容器

蜂鸣器

1k 电阻器

330欧姆电阻器

发光二极管

1N4148二极管

面包板或印刷电路板

连接跳线

9v 电池

金属探测器如何工作?

每当一些电流通过线圈时,它就会在其周围产生磁场。磁场的变化会产生电场。现在根据法拉第定律,由于这个电场,线圈上产生一个电压,它反对磁场的变化,这就是线圈产生电感的方式,意味着产生的电压反对电流的增加。电感的单位是亨利,测量电感的公式是:

L = (μο * N2 * A) / l

Where,
L- Inductance in Henries
μο- Permeability, its 4π*10-7 for Air
N- Number of turns
A- Inner Core Area (πr2) in m2
l- Length of the Coil in meters

当任何金属靠近线圈时,线圈会改变其电感。电感的这种变化取决于金属类型。非磁性金属的减少和铁等铁磁性材料的增加。

根据线圈的磁芯,电感值会发生巨大变化。在下图中你可以看到空芯电感器,在这些电感器中,将没有实心磁芯。它们基本上是留在空中的线圈。电感器产生的磁场流动介质是空气。这些电感器的电感值非常低。

这些电感器用于需要几个微亨利值时使用。对于大于几毫亨利的值,这些值不合适。在下图中,您可以看到带有铁氧体磁芯的电感器。这些铁氧体磁芯电感器具有非常大的电感值。

请记住,这里的线圈是空气芯线圈,因此当金属片靠近线圈时,金属片充当空芯电感器的磁芯。通过这种金属作为铁芯,线圈的电感会发生变化或显着增加。随着线圈电感的突然增加,与不使用金属片相比,LC电路的整体电抗或阻抗发生了相当大的变化。

因此,在这个Arduino金属探测器项目中,我们必须找到线圈的电感来检测金属。因此,为此,我们使用了我们已经提到的LR电路(电阻电感电路)。在这个电路中,我们使用了大约 20 圈的线圈或直径为 10 厘米的绕组。我们使用了一个空的胶带卷,并将电线缠绕在其周围以制作线圈。

探测器

电路图:

我们使用Arduino Nano来控制整个金属探测器项目。LED 和蜂鸣器用作金属检测指示器。线圈和电容器用于检测金属。信号二极管也用于降低电压。以及一个用于限制 Arduino 引脚电流的电阻器。

探测器

 

探测器

工作说明:

这个Arduino金属探测器的工作有点棘手。在这里,我们将Arduino产生的块波或脉冲提供给LR高通滤波器。因此,线圈在每次转换中都会产生短尖峰。产生的尖峰的脉冲长度与线圈的电感成正比。因此,借助这些尖峰脉冲,我们可以测量线圈的电感。但是在这里很难用这些尖峰精确测量电感,因为这些尖峰的持续时间非常短(约0.5微秒),而Arduino很难测量。

探测器

因此,我们没有这样做,而是使用由上升脉冲或尖峰充电的电容器。它需要很少的脉冲即可将电容器充电到Arduino模拟引脚A5可以读取其电压的程度。然后Arduino使用ADC读取该电容器的电压。读取电压后,电容器通过使capPin引脚作为输出并将其设置为低电平来快速放电。整个过程大约需要 200 微秒才能完成。为了获得更好的结果,我们重复测量并取平均值。这就是我们如何测量线圈的近似电感。获得结果后,我们将结果传输到LED和蜂鸣器以检测金属的存在。检查本文末尾给出的完整代码以了解其工作原理。

本文末尾给出了完整的Arduino代码。在本项目的编程部分,我们使用了两个Arduino引脚,一个用于产生要馈入线圈的块波,另一个用于读取电容电压的模拟引脚。除了这两个引脚之外,我们还使用了另外两个Arduino引脚来连接LED和蜂鸣器。

/*


Metal Detector Arduino Code


#define capPin A5

#define buz 9

#define pulsePin A4


#define led 10


long sumExpect=0; //running sum of 64 sums 

long ignor=0; //number of ignored sums

long diff=0; //difference between sum and avgsum

long pTime=0;

long buzPeriod=0; 


void setup() 

{

Serial.begin(9600);

pinMode(pulsePin, OUTPUT); 

digitalWrite(pulsePin, LOW);

pinMode(capPin, INPUT); 

pinMode(buz, OUTPUT);

digitalWrite(buz, LOW);

pinMode(led, OUTPUT);

}


void loop() 

{

int minval=1023;

int maxval=0;

long unsigned int sum=0;

for (int i=0; i<256; i++)

{

//reset the capacitor

pinMode(capPin,OUTPUT);

digitalWrite(capPin,LOW);

delayMicroseconds(20);

pinMode(capPin,INPUT);

applyPulses();



//read the charge of capacitor

int val = analogRead(capPin); //takes 13x8=104 microseconds

minval = min(val,minval);

maxval = max(val,maxval);

sum+=val;



long unsigned int cTime=millis();

char buzState=0;

if (cTime>10)

{

sumExpect=sumExpect+sum-avgsum;

ignor=0;



else 

ignor++;

if (ignor>64)



sumExpect=sum<<6;

ignor=0;

}

if (diff==0) 

buzPeriod=1000000;

else 

buzPeriod=avgsum/(2*abs(diff)); 

}


void applyPulses()

{

for (int i=0;i<3;i++) 

{

digitalWrite(pulsePin,HIGH); //take 3.5 uS

delayMicroseconds(3);

digitalWrite(pulsePin,LOW); //take 3.5 uS

delayMicroseconds(3);

}

}

 


 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分