이 프로젝트 정보
펄스 유도(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옴 값의 삼량체 전위차계를 넣었습니다. 이 트리머는 코일을 통한 전류를 조절합니다. 값을 높이면 코일을 통과하는 전류가 증가하고 장치의 감도가 증가합니다. 두 번째 수정은 원래의 저항 62k 대신 트리머 포트 100kOhm입니다. 이 트리머를 사용하여 Arduino의 A0 입력에 대해 약 4.5V의 전압을 설정했습니다. 다른 연산 증폭기와 작동 전압의 경우 이 저항의 값이 달라야 한다는 것을 알았기 때문입니다.
이 특별한 경우 장치에 전원을 공급하기 위해 직렬로 연결된 4개의 리튬 이온 배터리를 사용하므로 전압은 15v보다 높습니다. 아두이노는 최대 12V 입력 전압을 수용하기 때문에 +5v 핀에 직접 아두이노에 전원을 공급하기 위해 작은 방열판에 5V(7805)용 스태빌라이저를 장착했습니다.
코일은 직경 0.4mm의 절연 구리선으로 만들어지며 직경 19cm의 원 모양으로 25개의 권선이 포함되어 있습니다. 코일(요소는 접착제로 접착되어야 하며 나사는 없음)
비디오에서 볼 수 있듯이 작은 금속 동전은 10-15cm의 거리에서 감지할 수 있으며 더 큰 금속 물체는 30-40cm 이상의 거리에서 감지할 수 있습니다. 기기의 제작과 설정이 비교적 간단하다는 점을 감안하면 훌륭한 결과입니다.
섹션> <섹션 클래스="섹션 컨테이너 섹션 축소 가능" id="코드"> 코드
<울> 코드
코드Arduino
#include //#include //int bluetoothTx =5;//int bluetoothRx =6;//blutoth 모듈 터미널 RX//SoftwareSerial 블루투스(bluetoothTx, bluetoothRx);# pulsePine 2 정의 타이머 =200; const int button1 =12; int buttonState1 =0;char 데이터;//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 la Tencion (Voltios)/테스트 voltsfloat resistance2 =10000에 대한 100k의 저항; //Resistencia de 10k para medir la tencion (Voltios)/Resistance 10k for test voltsfloat const arefVolt=4.8f; //핀 "4.9v" SET 정확한 값 HEREfloat voutv;float vinv;unsigned long startMillisVolts; unsigned long currentMillisVolts;long periodVolts =2000; //값은 마이크로초 단위입니다.sint 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(주파수 ==0 || 주파수 ==255 ){ writeToStorage(freq_def_value,addr_freq); readFromStorage(addr_freq); 주파수 =저장된 값; } 핀모드(펄스파인, 출력); } 무효 루프() { currentMillis =micros(); 현재MillisVolts =밀리(); if(Serial.available()>0) { 데이터 =Serial.read(); setDutyAndFreq(데이터); } if (currentMillis - startMillis>=period) { period =1000000 / freq; // Serial.println(마침표); digitalWrite(펄스파인, 높음); 듀티 사이클_템프 =듀티 사이클 * 10; 지연마이크로초(duty_cycle_temp); digitalWrite(펄스파인, LOW); //센서값 =analogRead(A0); for(int i =0;i <3; i++){ sensorValue =analogRead(A0);}delayMicroseconds(10);sensorValue =analogRead(A0);sensorValue =sensorValue / 5; 센드데이터(); startMillis =현재Millis; } // Lectura voltios if (currentMillisVolts - startMillisVolts>=periodVolts) {lecturaVoltios();//Serial.println("Lectura voltios");startMillisVolts =currentMillisVolts; } } 무효 writeToStorage(int valor,int addr) { EEPROM.write(addr, valor); } int readFromStorage(int addr) { stored_value =EEPROM.read(addr); 저장된 값을 반환합니다. } void setDutyAndFreq (char valor) { //"n" 용기 파라 aumentar 듀티 사이클 //"m" valor para disminuir 듀티 사이클 //"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; writeToStorage(의무_주기, 추가_의무); } else if(valor =='m') { // Serial.println("m Received"); readFromStorage(addr_duty); 듀티 사이클 =저장된 값; 듀티 사이클 =듀티 사이클 - 1; writeToStorage(의무_주기, 추가_의무); } else if(valor =='j') { // Serial.println("j 수신"); readFromStorage(addr_freq); 주파수 =저장된 값; 주파수 =주파수 + 10; writeToStorage(주파수, addr_freq); } else if(valor =='k') { // Serial.println("k 수신"); readFromStorage(addr_freq); 주파수 =저장된 값; 주파수 =주파수 - 10; writeToStorage(주파수, addr_freq); } else if(valor =='p') { // Serial.println("m 수신"); writeToStorage(0, addr_freq); writeToStorage(0, addr_duty); } } //볼트 functionvoid lecturaVoltios(){ vinv=0.0f; voutv=0.0f; for (int i=0;i <100;i++){ voutv =(analogRead(A7) * arefVolt) / 1023; //리 엘 볼타헤 데 엔트라다 vinv +=voutv / (resistencia2 / (resistencia1 + resistance2)); // 저항의 제수 수식 최종 if(vinv <0.9){ vinv=0.0f; } }vinv =vinv/100;}무효 sendData() { /* Serial.print("<"); Serial.print(센서값); Serial.print("/"); Serial.print(주파수); Serial.print("/"); Serial.print(duty_cycle); Serial.print("/"); Serial.print(vinv); Serial.print(">"); Serial.println();*/ 문자열 데이터 ="<"; 데이터 +=센서값; 데이터 +="/"; 데이터 +=주파수; 데이터 +="/"; 데이터 +=duty_cycle; 데이터 +="/"; 데이터 +=vinv; 데이터 +=">"; /* 블루투스.print("<"); 블루투스.프린트(센서값); 블루투스.프린트("/"); 블루투스.프린트(주파수); 블루투스.프린트("/"); 블루투스.프린트(듀티사이클); 블루투스.프린트("/"); 블루투스.프린트(vinv); 블루투스.print(">");*/ Serial.println(데이터); }
섹션> 회로도