雷竞技注册
项目

用Arduino打造你自己的金属探测器

2016年10月03日经过埃文甘蓝

用科尔皮茨振荡器和Arduino做一个金属探测器。

了解如何使用Colpitts振荡器和Arduino构建金属探测器。

金属探测器是如何工作的?

振荡回路

坦克电路

在上述电路中,该系列电容器和电感器形式A.坦克电路。在槽电路中,能量在电容和电感之间反复传递,导致振荡。所述电容释放的电流流过所述电感器;当电容完全放电时,电感减小的磁场保持电流流动。电容器就会以相反的极性充电,当磁场完全崩溃时,电容器就会放电,导致电流流向与原始电流相反的方向。这个循环继续。

上述罐电路的电感形成金属检测器的检测器(大线圈)。当金属材料接近电感器的中心(检测器线圈)时,它进入由电感器产生的磁场。这改变了电感器核心的磁导率,导致电感改变。电感的变化反过来改变了罐电路的振荡频率。

如果组件是理想的,则罐电路将无限地振荡,而无需外部电源。但是,在实践中,组件是非理想的。部件的不需要电阻将引入能量损失,从而导致振荡电流逐渐变细。为了衡量这个,一个阶段BJT反相放大器用于连续增加进入罐电路。

Colpitts振荡器

Colpitts振荡器

由于电感前和之后的节点处于彼此的相位之前和之后的节点处,因此节点之一将向晶体管基座提供振荡,放大并反转收集器处的信号,然后将其返回到阶段罐电路的另一个节点。整个电路称为Colpitts振荡器。

上面的Colpitts振荡器提供稳定的振荡,其频率在100kHz范围内。来自家庭物品的金属改变电感器核心的渗透率将在10kHz左右波动此频率。由于这种频率范围位于人类音频频谱之外(20Hz至20kHz),因此我们需要将振荡转换为可听音调。

传统的BFO(BEAT频率振荡器)金属探测器通过在没有任何金属的影响而不会产生具有等于探测器罐电路的频率的固定频率的另一罐电路来克服该问题。然后,取代两个频率之间的差异将隔离检测器电路的波动频率并将其降低到可听范围。

对于这个金属探测器项目,我们将使用Arduino来处理振荡信号,而不是用第二个槽电路来抵消振荡。Arduino会存储固定的频率,并不断地将探测器电路的输入频率与存储的频率进行比较(更多的Arduino程序在下面)。

用于您DIY金属探测器的材料

杂草码头玩具

对于这个项目,一个玩具除草机被选择来容纳所有的组件。它包括以下特点:

  • 一个触发按钮,我们将用它来触发扬声器
  • 我们将使用的侧面按钮设置固定频率
  • 带开/关开关的电池盒(3xAA电池)
  • 一个扬声器,我们将通过
  • 安装有LED的电机,当频率差超过某个阈值时,我们将被激活。
  • 圆形头,我们将适合罐式电路的电感线圈

我们还将添加电位器(银色)以使音调变化的灵敏度可调。

探测器线圈

电感线圈由直径为5.5英寸的线轴大约50个26个AWG线制成。

在住房里面

在外壳内部,我们将用自己的电路更换原始电路板,并将所有外围设备连接到带有销标题的电路。

金属检测电路原理图

完整的原理图

我使用Arduino UNO编程DIP ATMega328。然后我将ATMega328从开发板中移除,并将其与其他电路一起嵌入到一个perfboard中。

Colpitts振荡器,在图的左下方,将振荡输入芯片的计数器1(引脚T1)(在Arduino UNO上标记为数字引脚5),在那里它不断计算振荡的频率。

在图的顶部,一个4.5V的电源(3xAA电池,旁路电容)被用来为ATmega328、振荡器、扬声器和电机(用led)供电。

To keep the current draw of the microcontroller’s digital pins at a safe level (40 mA per pin maximum for the ATmega328), an NPN transistor (C2878) is used to drive the speaker, and an N-channel MOSFET (SUB45N03) to drive the motor.

触发和复位(设置固定频率)开关都使用内部上拉配置连接到数字引脚。小电容器并行添加以取消开关。

灵敏度电位器设置为分压器,使用模拟引脚读取该划分。

代码演练

此项目的完整源代码可在此处找到:

下面是代码的详细演练。

设置功能

为了通过定时计数器1跟踪检测器振荡频率1,我们首先需要配置定时器/计数器控制器寄存器(TCCR)。这些TCCR通过三个整数访问:TTCR1A,TTCR1B和TTCR1C。

tccr1a = 0b00000000;TcCr1b = 0b00000111;

我们需要通过将TCCR1A和TCCR1B的WGM标志设置为0,将波形生成设置为正常模式,并通过将TCCR1B的CS标志设置为模式3(上升沿上的外部时钟)将时钟速度选择模式设置为外部时钟源。在这种配置中,每次从振荡检测到上升沿时,寄存器OCR1a将递减1。

timsk1 | =(1 << OCIE1A);

接下来,我们需要通过在TIMSK1寄存器中设置OCIE1A标志来启用定时器/计数中断A.每当OCR1A寄存器达到0时,这将使信号(TIMER1_COMPA_VECT)中断功能被调用。

OCR1A = 1;

现在将OCR1A初始化为1,以便在检测到第一上升沿后立即调用中断功能。

中断功能

这是信号(timer1_compa_vect)函数。当OCR1A寄存器达到0时调用0.在此功能中,我们希望跟踪自上次调用函数以来经过的微秒数。此时间增量作为SignalTimEdelta存储。

StoreDelimedelta是“固定频率”时间Δ,其在主循环中比较了SignalTimedelta。当STOUSTTIMEDELTA为零时,SETTERTIMEDELTA设置为SIGNALTIMEDELTA(在启动时,按下复位开关时)。

OCR1a + = cycles_per_signal;

执行中断操作后,需要通过用预定义的常量递增,Cycles_per_signal(发生在下一个中断之前的周期数)来重置OCR1A。

循环函数

在循环函数中,我们检查是否按下触发器。如果是这样,则读取灵敏度电位器的模拟值,并将模拟值(0到1023)线性地插入模拟值(0到1023),更容易使用比例(0.5到10.0)。

INT STOUNTTIMEDELTADIFFURED =(StorageTimedelta  -  SignalTimedelta)*灵敏度;

固定频率(storedTimeDelta)和测量频率(signalTimeDelta)之间的差值将被计算并乘以灵敏度值。

tone(SPEAKER_PIN, BASE_TONE_FREQUENCY + storedTimeDeltaDifference);

然后使用可听基调频率,base_tone_friquency求和,并使用Arduino音调()函数播放扬声器。

如果差异超过Spinner_Threshold定义的阈值,则激活电机。

如果触发被释放,那么扬声器音被停止(通过调用noTone()函数),电机被停用。

如果已按下重置按钮,则将归零SenseTTimedelta,允许下一个中断调用来设置新值。

我们的Arduino的金属探测器功能如何?

具有最低灵敏度设定,金属探测器可以拾取苏打水罐,手机和距线圈几英寸内的汽水罐,手机和铁工具等大物品。在最高的灵敏度设置上,还可以检测到较小的物品,如钢环,螺钉和相同接近内的硬币。查看文章顶部的视频以获得演示!

为了延长检测器的范围,我们可以增加由电感器产生的磁场区域。这可以通过增加通过电感器的电流(通过将电压增加到振荡器的电压增加,允许放大器中的更大增益)来实现,或者通过增加电感线圈中的线包裹的数量来实现。

通过基于Arduino的金属探测器,我们可以使用传统的BFO金属探测器来完成其他有趣的事情。保持关注未来的项目,了解如何利用这种金属检测机制以获得其他目的!

ArduinometalDetector-master.zip.

为自己提供这个项目!得到bom。

30评论
  • 阿克伦 2016年10月03日

    在1973年,我们在8年级电子课上拍摄金属探测器时,我们没有Arduinos。我们确实可以制作PCB,液卷模具,并将丙烯酸塑料倒入模具雷竞技最新app中的探测器。
    我从未工作过......

    喜欢的。 回复
  • upand_at_them 2016年10月03日

    当电感器的磁场坍塌时,当电流的电流产生流动时,与充电的电流相同。

    喜欢的。 回复
  • 固定 2016年10月8日

    嘿evan!

    您是否有这种金属探测器的性能的规范?(渗透,检测的大小“盒子”)

    此外,我们如何让它更好?
    (更渗透)

    喜欢的。 回复