自制高灵敏度 Arduino 金属探测器:铁/非铁金属识别
项目亮点
- 基于 VLF (极低频) 感应平衡 原理,双线圈设计(发射/接收各 64 匝)
- 可区分 铁磁性 (铁/钢) 与 非铁磁性 (铜/铝/金/银) 金属
- 16×2 LCD 显示金属类型、信号强度条形图、相位角度
- 蜂鸣器音调随信号强度变化,提供听觉反馈
- 一键校准消除线圈不平衡,单节 7.4V 锂电供电,功耗 < 20mA
- 探测深度:15cm 硬币,30cm+ 盖子大小物体,40-50cm 大型金属
核心原理:感应平衡 (Induction Balance)
发射线圈驱动 7.64 kHz 方波,产生交变磁场。接收线圈置于零耦合位置(几何抵消)。金属靠近改变磁场耦合,接收线圈感应出微弱信号,经运放 (TL081/LT1677) 放大后送 Arduino ADC 采样。通过四相位灵敏检波 (0°/45°/90°/135°) 计算幅度与相位:
- 相位 < -20° → 非铁磁性金属 (铜、铝等)
- 相位 ≈ 0° 或略正 → 铁磁性金属 (铁、钢)
硬件清单 (BOM)
| 元件 | 规格/型号 | 数量 | 备注 |
|---|---|---|---|
| Arduino Nano R3 | ATmega328P 16MHz | 1 | 核心控制器 |
| 运算放大器 | TL081 / LT1677 / 741 | 1 | 接收线圈信号放大 |
| LCD 显示模块 | 1602 字符屏 (HD44780) | 1 | 显示类型、强度条、数值 |
| 扬声器 | 0.25W 8Ω | 1 | 音调指示信号强度 |
| NPN 三极管 | 2N2222 / BC547 等 | 1 | 驱动扬声器 |
| 搜索线圈 | 自制,11cm 直径,64 匝 0.5mm² 漆包线,D 型 | 2 | 发射/接收各一,铝箔屏蔽留缝 |
| 电阻/电容套件 | 按原理图选值 | 1 套 | 含谐振电容、偏置、滤波等 |
| 电位器 | 10kΩ 多圈 | 1 | 相位平衡微调 (90° 分量归零) |
| 拨码开关/按钮 | 3 个 | 3 | 校准、灵敏度、电源控制 |
| 电池 | 2 节 18650 串联 (7.4V) | 1 组 | 接 Arduino Vin,续航极长 |
| PCB / 万用板 | 建议 PCB | 1 | 项目赞助商 PCBgogo 提供制板 |
线圈制作关键点
- 骨架:11cm 直径 PVC 管或 3D 打印 D 型骨架
- 绕线:64 匝,0.5mm² 漆包线,整齐紧密
- 屏蔽:铝箔包裹线圈外侧,用镀锡铜线绑定,**必须留 2-3mm 缝隙**防止短路匝
- 固定:扎带将两线圈平行固定在塑料板上,中心距可调以微调耦合
软件核心算法
定时器与 ADC 同步采样
- Timer1 产生 62.5kHz 方波 (ICR1 = 249/259 微调)
- Timer0 分频 8 → 7.8125kHz 驱动发射线圈 (Pin 5)
- ADC 自动触发于 Timer1 溢出,1MHz 采样时钟,8 位分辨率,每周期 8 个采样点
- ISR 中累加 4 相位箱,每 1024 次采样平均一次
相位敏感检波与谐波抵消
// 四相位累加器 bins[0..3] 对应 0°, 45°, 90°, 135°
// 消除三次谐波:
bin0 = (avg[0] + √2/2*(avg[1]-avg[3])) / 200
bin1 = (avg[1] + √2/2*(avg[0]+avg[2])) / 200
bin2 = (avg[2] + √2/2*(avg[1]+avg[3])) / 200
bin3 = (avg[3] + √2/2*(avg[2]-avg[0])) / 200
amp1 = sqrt(bin0² + bin2²) // 0°/90° 分量幅度
amp2 = sqrt(bin1² + bin3²) // 45°/135° 分量幅度
ampAvg = (amp1 + amp2) / 2
phase1 = atan2(bin0, bin2) * 180/π + 45
phase2 = atan2(bin1, bin3) * 180/π
phaseAvg = (phase1 + phase2)/2 - phaseAdjust // 修正采样相位延迟
金属类型判决
if (ampAvg > threshold) {
if (phaseAvg < -20.0) -> "Non-ferrous" (非铁)
else -> "Ferrous" (铁)
// 音调映射:幅度 10~200 → 频率 100~1500Hz
tone(3, map(ampAvg, 10, 200, 100, 1500), 120);
}
Arduino 完整代码结构
代码已整理为单文件,包含:
- 硬件引脚定义 (LCD、按钮、线圈驱动、ADC、音调)
- Timer1/Timer0/ADC/中断初始化
- ISR (TIMER1_OVF_vect) 相位累加与平均
- 主循环:校准按钮检测 → PID 计算 → 电机控制 → LCD 刷新 → 串口调试输出
- 依赖库:
LiquidCrystal.h(官方)、LcdBarGraph.h(条形图库)
完整代码下载: 参见项目 Code 栏附件 .ino 文件。
调试与校准流程
- 上传代码,上电,LCD 显示初始化画面。
- 远离金属,按住 校准按钮 (Pin 2) 3 秒,LCD 显示 "Calibrating...",串口输出四路校准基线值。
- 松开按钮,设备进入检测模式。LCD 第一行显示类型 (Ferrous/NonFerous/空白),第二行显示强度条形图。
- 用铁块、铜管、铝罐、硬币分别测试,观察相位与音调变化。
- 若零点漂移,重新按校准键;若灵敏度不足,调节电位器微调 90° 分量,或在代码中降低
threshold(默认 5.0)。
进阶改进方向
- 在发射线圈驱动端加入 功率 MOSFET (IRF540 等) 推挽驱动,提升场强 3-5 倍
- 接收端增加 带通滤波器 (7.64kHz 中心) 抑制环境噪声
- 引入 温度补偿:电容漂移导致谐振频率偏移,可用热敏电阻监测并软件修正 Timer1 TOP 值
- 增加 GPS/蓝牙模块 记录探测位置,生成热力图
- 制作手持式人体工学手柄,集成电池、开关、LCD、蜂鸣器一体化
原理图与 PCB
项目附件包含原理图 (Eagle/KiCad 格式) 与 PCB 布局,已通过 PCBgogo 制板验证。关键点:
- 模拟地/数字地单点汇流,运放电源去耦 100nF+10μF
- 线圈驱动走线粗短,远离敏感接收走线
- LCD 背光由 Pin 8 控制,可 PWM 调光省电
致谢
本项目基于 David Crocker 2013 年 Arduino 论坛开源代码改进,感谢 PCBgogo 赞助 PCB 制造。完整构建过程见作者 YouTube 视频。
制造工艺
- 树莓派低成本婴儿啼哭检测器 DIY 指南:Prota OS + Philips Hue + Volumio
- 复古 Numitron 管时钟:Arduino Nano 驱动,低温可靠省电
- Arduino Nano 与 MPU-6050 构建实时陀螺仪游戏
- DIY ADXL335 地震检测仪 — 低功耗三轴加速度计项目
- Arduino DIY 电压表:Nokia 5110 屏幕显示,手把手教学
- MobBob:3D 打印智能机器人,Android 手机无缝控制,语音视觉一体
- 自制高精度测距轮:Arduino Nano + 旋转编码器 + 1602 LCD
- 基于 Arduino、Yaler 与 IFTTT 构建 Web 化 IoT 仪表盘
- 高精度空气质量监测仪:Sharp GP2Y1010AU0F 粉尘传感器 + Arduino Nano
- Arduino Nano 手持盖革计数器:DIY 核辐射检测仪
- Arduino Nano 与 WS2812 灯带打造 1D 乒乓球游戏——分步 DIY 教程
- 基于 Arduino 与 DSM501A 传感器的空气质量监测仪