亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Manufacturing Technology >> 制造工艺

DIY 基于 Arduino 的脉冲感应金属探测器

组件和用品

Arduino Nano R3
× 1
HC-05 蓝牙模块
× 1
通用晶体管 PNP
× 1
通用晶体管 NPN
× 1
功率 MOSFET N 沟道
× 1
运算放大器、运算放大器 + 比较器 + 参考
× 1
1N4148 – 通用快速切换
× 2
电容 10 µF
× 1
电容 1 µF
× 1
单圈电位器 - 100k ohms
× 1
单圈电位器-47k
× 1
12个不同阻值的电阻
× 1

必要的工具和机器

烙铁(通用)

关于这个项目

脉冲感应 (PI) 系统使用单个线圈作为发射器和接收器。该技术通过线圈发送强大的短脉冲(脉冲)电流。每个脉冲都会产生一个短暂的磁场。当脉冲结束时,磁场会反转极性并突然崩溃,从而产生尖锐的电尖峰。这个尖峰持续几微秒,并导致另一个电流流过线圈。该电流称为反射脉冲,非常短,仅持续约 30 微秒。然后发送另一个脉冲并重复该过程。如果一块金属进入磁场线的范围内,接收线圈可以检测到接收信号的幅度和相位的变化。幅度变化和相位变化的大小是金属大小和距离的指示,也可用于区分黑色金属和有色金属。

我在 N.E.C.O 的网站上找到了一个很好的 PI 检测器示例。项目。这款金属探测器是 Arduino 和 Android 的共生体。在 Play 商店中,您可以下载功能齐全的应用程序“Spirit PI”的免费版本,但您也可以购买具有多种选择的专业版。智能手机和arduino之间的通信是通过蓝牙模块HC 05完成的,但您可以使用任何蓝牙适配器,您必须将波特率设置为115200。方案如下图所示。为了改进设备的功能,我对原始方案做了一些小的修改。您可以在 N.E.C.O.-s 网站上找到原始原理图:

https://neco-desarrollo.es/pirat-wireless-metal-detector

在 150 欧姆电阻器的位置,我放置了一个值为 47 欧姆的微调电位器。该三聚体调节通过线圈的电流。通过增加它的值,通过线圈的电流增加,设备的灵敏度增加。第二个修改是微调电位器 100kOhm 而不是原来的电阻器 62k。有了这个trimer,我们在Arduino的A0输入端设置了大约4.5V的电压,因为我注意到对于不同的运算放大器和工作电压,这个电阻的值应该是不同的。

在这种特殊情况下,我使用串联的 4 节锂离子电池为设备供电,因此电压大于 15v。由于 Arduino 最多接受 12V 输入电压,我在小散热器上安装了一个 5V 稳压器(7805),用于直接为 Arduino 供电至 +5v 引脚。

线圈由直径为0.4mm的隔离铜线制成,包含25个直径为19厘米的圆形绕组。在最后的做工中,需要确保没有金属物体靠近线圈。线圈(元件是用胶水粘合的,没有螺丝)

正如您在视频中看到的那样,可以在 10-15 厘米的距离内检测到一个小的金属硬币,而在 30-40 厘米及以上的距离内可以检测到较大的金属物体。考虑到设备的制作和设置相对简单,这些都是很好的结果。

代码

  • 代码
代码Arduino
#include //#include //int bluetoothTx =5;//int bluetoothRx =6;//蓝牙模块终端RX//SoftwareSerial bluetooth(bluetoothTx, bluetoothRx);#定义pulsePine 2int timer =200;const int button1 =12;int buttonState1 =0;char data;//EEPROM变量int addr_duty =0;int addr_freq =1;int stored_value;int duty_cycle;int duty_cycle_temp;int freq;int freq_temp;int duty_def_value =10;int freq_def_value =60;//余额变量int value_count =0;int value_count_def =100;int balance_value =0;int balance_value_temp =0;//****unsigned long startMillis; unsigned long currentMillis;long period =100000; //该值为微秒数//测量电池浮动电阻的水平1 =101000; //Resistencia de 100K para medir latencion (Voltios)/Resistance of 100k for test voltsfloat restencia2 =10000; //Resistencia de 10k para medir latencion (Voltios)/Resistance 10k for test voltsfloat const arefVolt=4.8f; //pin "4.9v" SET EXACT VALUE HEREfloat voutv;float vinv;unsigned long startMillisVolts; unsigned long currentMillisVolts;long periodVolts =2000; //该值为微秒数int sensorValue;void setup() { //analogReference(INTERNAL); Serial.begin(115200); readFromStorage(addr_duty);占空比 =存储值; readFromStorage(addr_freq);频率 =存储值; if(duty_cycle ==0 || duty_cycle ==255){ writeToStorage(duty_def_value,addr_duty); readFromStorage(addr_duty);占空比 =存储值; } if(freq ==0 || freq ==255 ){ writeToStorage(freq_def_value,addr_freq); readFromStorage(addr_freq);频率 =存储值;引脚模式(脉冲松,输出); }void loop() { currentMillis =micros(); currentMillisVolts =millis(); if(Serial.available()>0) { 数据 =Serial.read(); setDutyAndFreq(数据); } if (currentMillis - startMillis>=period) { period =1000000 / freq; // Serial.println(句号);数字写入(脉冲松,高); duty_cycle_temp =duty_cycle * 10;延迟微秒(duty_cycle_temp);数字写入(脉冲松,低); //sensorValue =analogRead(A0); for(int i =0;i <3; i++){ sensorValue =analogRead(A0);}delayMicroseconds(10);sensorValue =analogRead(A0);sensorValue =sensorValue / 5;发送数据(); startMillis =currentMillis; } // Lectura voltios if (currentMillisVolts - startMillisVolts>=periodVolts) {lecturaVoltios();//Serial.println("Lectura voltios");startMillisVolts =currentMillisVolts; } } void writeToStorage(int valor,int addr) { EEPROM.write(addr, valor); } int readFromStorage(int addr) { stored_value =EEPROM.read(addr);返回存储值; } void setDutyAndFreq (char valor) { //"n" valor para aumentar duty cycle //"m" valor para disminuir duty cycle //"j" valor para aumentar la frequencia //"k" valor para des,inuir la frequencia //"+" valor para aumentar el balance //"-" valor para desminuir el balance if(valor =='n') { // Serial.println("n Recived"); readFromStorage(addr_duty);占空比 =存储值;占空比 =占空比 + 1;写入存储(duty_cycle,addr_duty); } else if(valor =='m') { // Serial.println("m Recived"); readFromStorage(addr_duty);占空比 =存储值;占空比 =占空比 - 1;写入存储(duty_cycle,addr_duty); } else if(valor =='j') { // Serial.println("j Recived"); readFromStorage(addr_freq);频率 =存储值;频率 =频率 + 10; writeToStorage(freq,addr_freq); } else if(valor =='k') { // Serial.println("k Recived"); readFromStorage(addr_freq);频率 =存储值;频率 =频率 - 10; writeToStorage(freq,addr_freq); } else if(valor =='p') { // Serial.println("m Recived"); writeToStorage(0,addr_freq); writeToStorage(0,addr_duty); } } //电压函数void lecturaVoltios(){ vinv=0.0f; voutv=0.0f; for (int i=0;i <100;i++){ voutv =(analogRead(A7) * arefVolt) / 1023; //Lee el voltaje de entrada vinv +=voutv / (resistencia2 / (resistencia1 + resistencia2)); //Fórmula del divisor resistivo para el voltaje final if(vinv <0.9){ vinv=0.0f; } }vinv =vinv/100;}void sendData() { /* Serial.print("<"); Serial.print(sensorValue); Serial.print("/");串行打印(频率); Serial.print("/"); Serial.print(duty_cycle); Serial.print("/"); Serial.print(vinv); Serial.print(">"); Serial.println();*/ String data ="<";数据 +=sensorValue;数据 +="/";数据+=频率;数据 +="/";数据 +=duty_cycle;数据 +="/";数据 +=vinv;数据 +=">"; /* 蓝牙.print("<");蓝牙。打印(传感器值);蓝牙。打印(“/”);蓝牙。打印(频率);蓝牙。打印(“/”);蓝牙。打印(duty_cycle);蓝牙。打印(“/”);蓝牙。打印(vinv); bluetooth.print(">");*/ Serial.println(data); }

示意图


制造工艺

  1. 使用 Arduino 和智能手机的 DIY 电压表
  2. Pixie:基于 Arduino 的 NeoPixel 手表
  3. 音频检测器
  4. DIY 虚拟现实滑板
  5. 基于 Arduino 和 OLED 的元胞自动机
  6. DIY Arduino RADIONICS 治疗MMachine
  7. DIY 2D 运动赛车模拟器
  8. 带 Arduino 的超声波测距仪
  9. 基于 Arduino 的安全系统
  10. Arduino 的闪电探测器
  11. 使用 RFID 的 DIY 创意
  12. DIY 灵敏的 Arduino IB 金属探测器,具有辨别力