Tentang proyek ini
Sistem Pulse Induction (PI) menggunakan kumparan tunggal sebagai pemancar dan penerima. Teknologi ini mengirimkan arus (pulsa) yang kuat dan pendek melalui gulungan kawat. Setiap pulsa menghasilkan medan magnet singkat. Ketika pulsa berakhir, medan magnet membalikkan polaritas dan runtuh dengan sangat tiba-tiba, menghasilkan lonjakan listrik yang tajam. Lonjakan ini berlangsung beberapa mikrodetik dan menyebabkan arus lain mengalir melalui koil. Arus ini disebut pulsa pantul dan sangat pendek, hanya berlangsung sekitar 30 mikrodetik. Pulsa lain kemudian dikirim dan proses berulang. Jika sepotong logam masuk ke dalam jangkauan garis medan magnet, kumparan penerima dapat mendeteksi perubahan amplitudo dan fase dari sinyal yang diterima. Besarnya perubahan amplitudo dan perubahan fasa merupakan indikasi untuk ukuran dan jarak logam, dan juga dapat digunakan untuk membedakan antara logam besi dan non-besi.
Saya menemukan contoh detektor PI yang bagus di situs N.E.C.O. proyek. Detektor logam ini merupakan simbiosis Arduino dan Android. Di Play Store Anda dapat mengunduh versi gratis aplikasi "Spirit PI", yang berfungsi penuh, tetapi Anda juga dapat membeli versi pro yang memiliki beberapa opsi hebat. Komunikasi antara smartphone dan arduino dilakukan dengan modul bluetooth HC 05, tetapi Anda dapat menggunakan adaptor bluetooth apa pun yang harus Anda gunakan untuk mengubah baud rate menjadi 115200. Skema ini diberikan pada gambar di bawah. Saya membuat beberapa modifikasi kecil pada skema asli untuk meningkatkan fitur perangkat. Anda dapat menemukan skema asli di N.E.C.O.-s web:
https://neco-desarollo.es/pirat-wireless-metal-detector
Di tempat resistor 150 ohm, saya menempatkan potensiometer trimer dengan nilai 47 Kohm. Trimer ini mengatur arus yang melalui kumparan. Dengan meningkatkan nilainya, arus yang melalui kumparan meningkat dan sensitivitas perangkat meningkat. Modifikasi kedua adalah pot pemangkas 100kOhm, bukan resistor 62k pada aslinya. Dengan trimer ini, kami mengatur tegangan sekitar 4.5V ke input A0 pada Arduino, karena saya perhatikan bahwa untuk penguat operasional dan tegangan operasi yang berbeda, nilai resistor ini harus berbeda.
Dalam kasus khusus ini, untuk menyalakan perangkat saya menggunakan baterai lithium ion 4 yang dihubungkan secara seri sehingga tegangannya lebih besar dari 15v. Karena Arduino menerima tegangan input maksimum 12V, saya memasang stabilizer untuk 5V (7805) yang dipasang pada heatsink kecil untuk menyalakan Arduino langsung ke pin +5v.
Kumparan terbuat dari kawat tembaga yang diisolasi dengan diameter 0,4 mm dan berisi 25 belitan berbentuk lingkaran dengan diameter 19 sentimeter. kumparan (elemen harus direkatkan dengan lem, dan tidak ada sekrup)
Seperti yang Anda lihat di video, koin logam kecil dapat dideteksi pada jarak 10-15 sentimeter, sedangkan benda logam yang lebih besar dari 30-40 sentimeter dan lebih. Ini adalah hasil yang sangat baik, mengingat pembuatan dan pengaturan perangkat relatif sederhana.
Kode
kodeArduino
#include //#include //int bluetoothTx =5;//int bluetoothRx =6;//blutoth modul terminal RX//SoftwareSerial bluetooth(bluetoothTx, bluetoothRx);# define pulsePine 2int timer =200;const int button1 =12;int buttonState1 =0;char data;//Variabel EEPROMint 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;//Variabel keseimbanganint value_count =0;int value_count_def =100;int balance_value =0;int balance_value_temp =0;//****unsigned long startMillis; Milis arus panjang yang tidak ditandatangani; periode panjang =100000; //nilainya adalah sejumlah mikrodetik//Pengukuran level dari batteryfloat resistencia1 =101000; //Resistensi 100K para medir la tencion (Voltios)/Resistensi 100k untuk uji voltsfloat resistencia2 =10000; //Resistensi 10k untuk tegangan menengah (Voltios)/Resistensi 10k untuk pengujian voltsfloat const arefVolt=4.8f; //pin "4.9v" SET NILAI PERSIS DI SINIfloat voutv;float vinv;unsigned long startMillisVolts; unsigned long currentMillisVolts;periode panjangVolts =2000; //nilainya adalah jumlah microsecondsint sensorValue;void setup() { //analogReference(INTERNAL); Serial.begin(115200); readFromStorage(addr_duty); duty_cycle =nilai_tersimpan; readFromStorage(addr_freq); freq =nilai_tersimpan; if(duty_cycle ==0 || duty_cycle ==255){ writeToStorage(duty_def_value,addr_duty); readFromStorage(addr_duty); duty_cycle =nilai_tersimpan; } if(freq ==0 || frekuensi ==255 ){ writeToStorage(freq_def_value,addr_freq); readFromStorage(addr_freq); freq =nilai_tersimpan; } pinMode(Pine pulsa, OUTPUT); }void loop() { currentMillis =mikro(); currentMillisVolts =milis(); if(Serial.available()>0) { data =Serial.read(); setDutyAndFreq (data); } if (currentMillis - startMillis>=periode) { periode =1000000 / freq; // Serial.println(titik); digitalWrite(pulsePine, TINGGI); duty_cycle_temp =siklus_tugas * 10; delayMicroseconds(duty_cycle_temp); digitalWrite(Pine pulsa, RENDAH); //sensorValue =analogRead(A0); for(int i =0;i <3; i++){ sensorValue =analogRead(A0);}delayMicroseconds(10);sensorValue =analogRead(A0);sensorValue =sensorValue / 5; kirimData(); startMillis =saatMillis; } // 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) { nilai_tersimpan =EEPROM.read(addr); kembalikan nilai_tersimpan; } 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 Diterima"); readFromStorage(addr_duty); duty_cycle =nilai_tersimpan; duty_cycle =duty_cycle + 1; writeToStorage(duty_cycle,addr_duty); } else if(valor =='m') { // Serial.println("m Diterima"); readFromStorage(addr_duty); duty_cycle =nilai_tersimpan; duty_cycle =duty_cycle - 1; writeToStorage(duty_cycle,addr_duty); } else if(keberanian =='j') { // Serial.println("j Diterima"); readFromStorage(addr_freq); freq =nilai_tersimpan; frekuensi =frekuensi + 10; writeToStorage(frekuensi,addr_freq); } else if(keberanian =='k') { // Serial.println("k Diterima"); readFromStorage(addr_freq); freq =nilai_tersimpan; frekuensi =frekuensi - 10; writeToStorage(frekuensi,addr_freq); } else if(keberanian =='p') { // Serial.println("m Diterima"); writeToStorage(0,addr_freq); writeToStorage(0,addr_duty); } } //Volt functionvoid 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)); //Formula del pembagi resistivo para el voltaje final if(vinv <0.9){ vinv=0.0f; } }vinv =vinv/100;}void sendData() { /* Serial.print("<"); Serial.print(Nilai sensor); Serial.print("/"); Serial.print(frekuensi); Serial.print("/"); Serial.print( duty_cycle); Serial.print("/"); Serial.print(vinv); Serial.print(">"); Serial.println();*/ String data ="<"; data +=nilaisensor; data +="/"; data +=frekuensi; data +="/"; data +=siklus_tugas; data +="/"; data +=vinv; data +=">"; /* bluetooth.print("<"); bluetooth.print (nilai sensor); bluetooth.print("/"); bluetooth.print(frekuensi); bluetooth.print("/"); bluetooth.print( duty_cycle); bluetooth.print("/"); bluetooth.print(vinv); bluetooth.print(">");*/ Serial.println(data); }
Skema