Detector de metal por indução de pulso baseado em DIY Arduino
Componentes e suprimentos
| | × | 1 | |
| | × | 1 | |
| Transistor de uso geral PNP | | × | 1 | |
| Transistor de uso geral NPN | | × | 1 | |
| | × | 1 | |
| Amplificador operacional, Op Amp + Comparador + Referência | | × | 1 | |
| 1N4148 - Troca rápida de uso geral | | × | 2 | |
| | × | 1 | |
| | × | 1 | |
| Potenciômetro de volta única - 100k ohms | | × | 1 | |
| Potenciômetro de volta única-47k | | × | 1 | |
| 12 resistores com valores diferentes | | × | 1 | |
Sobre este projeto
Os sistemas de indução de pulso (PI) usam uma única bobina como transmissor e receptor. Essa tecnologia envia rajadas curtas e poderosas (pulsos) de corrente por meio de uma bobina de fio. Cada pulso gera um breve campo magnético. Quando o pulso termina, o campo magnético inverte a polaridade e entra em colapso repentinamente, resultando em um pico elétrico agudo. Esse pico dura alguns microssegundos e faz com que outra corrente passe pela bobina. Essa corrente é chamada de pulso refletido e é extremamente curta, durando apenas cerca de 30 microssegundos. Outro pulso é então enviado e o processo se repete. Se um pedaço de metal estiver dentro da faixa das linhas do campo magnético, a bobina de recepção pode detectar uma mudança na amplitude e na fase do sinal recebido. A quantidade de mudança de amplitude e mudança de fase é uma indicação do tamanho e distância do metal e também pode ser usada para discriminar entre metais ferrosos e não ferrosos.
Encontrei um bom exemplo de detector de PI no site do N.E.C.O. projetos. Este detector de metais é uma simbiose do Arduino e do Android. Na Play Store você pode baixar a versão gratuita do aplicativo "Spirit PI", que é totalmente funcional, mas você também pode comprar uma versão profissional que tem várias opções excelentes. A comunicação entre o smartphone e o arduino é feita com o módulo bluetooth HC 05, mas você pode usar qualquer adaptador bluetooth no qual tenha que mudar a taxa de transmissão para 115200. O esquema é dado na figura abaixo. Fiz várias pequenas modificações no esquema original para melhorar os recursos do dispositivo. Você pode encontrar o esquema original na web N.E.C.O.-s:
https://neco-desarrollo.es/pirat-wireless-metal-detector
No lugar de um resistor de 150 ohms, coloquei um potenciômetro de trímero com um valor de 47 kohms. Este trímero regula a corrente através da bobina. Ao aumentar seu valor, a corrente através da bobina aumenta e a sensibilidade do dispositivo aumenta. A segunda modificação é trimmer pot 100kOhm em vez do resistor 62k no original. Com este trímero, definimos a tensão de cerca de 4,5 V para a entrada A0 no Arduino, pois percebi que, para amplificadores operacionais e tensões operacionais diferentes, o valor desse resistor deve ser diferente.
Neste caso particular, para alimentar o dispositivo, eu uso uma bateria de íon de lítio 4 conectada em série de forma que a tensão seja algo maior que 15v. Como o Arduino aceita um máximo de tensão de entrada de 12 V, coloquei um estabilizador para 5 V (7805) montado no pequeno dissipador de calor para alimentar o Arduino diretamente no pino de + 5 V.
A bobina é feita de fio de cobre isolado com diâmetro de 0,4 mm e contém 25 enrolamentos em forma de círculo com diâmetro de 19 centímetros. Na obra final, é necessário garantir que não haja objetos metálicos próximos ao bobina (os elementos devem ser colados com cola e sem parafusos)
Como você pode ver no vídeo, uma pequena moeda de metal pode ser detectada a uma distância de 10-15 centímetros, enquanto um objeto de metal maior de 30-40 centímetros e mais. São resultados excelentes, levando-se em consideração que a confecção e o ajuste do dispositivo são relativamente simples.
Código
código Arduino
#include // # include // int bluetoothTx =5; // int bluetoothRx =6; // terminal do módulo blutoth RX // SoftwareSerial bluetooth (bluetoothTx, bluetoothRx); # definir pulsePine 2int timer =200; const int button1 =12; int buttonState1 =0; char data; // EEPROM variablesint 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; // Balancear variáveisint valor_contagem =0; int valor_contagem_def =100; int saldo_valor =0; int saldo_valor_temp =0; // **** sem sinal long startMillis; CurrentMillis longo sem sinal; período longo =100000; // o valor é um número de microssegundos // Medição do nível da bateria flutuante resistencia1 =101000; // Resistencia de 100K para medir la tencion (Voltios) / Resistência de 100k para teste voltsfloat resistencia2 =10000; // Resistencia de 10k para medir la tencion (Voltios) / Resistência 10k para voltsfloat de teste const arefVolt =4.8f; // pin "4.9v" DEFINIR VALOR EXATO AQUIfloat voutv; float vinv; unsigned long startMillisVolts; Unsigned long currentMillisVolts; long periodVolts =2000; // o valor é um número de microssegundos sensorValue; void setup () {// analogReference (INTERNAL); Serial.begin (115200); readFromStorage (addr_duty); duty_cycle =stored_value; readFromStorage (addr_freq); freq =valor_armazenado; if (duty_cycle ==0 || duty_cycle ==255) {writeToStorage (duty_def_value, addr_duty); readFromStorage (addr_duty); duty_cycle =stored_value; } if (freq ==0 || freq ==255) {writeToStorage (freq_def_value, addr_freq); readFromStorage (addr_freq); freq =valor_armazenado; } pinMode (pulsePine, OUTPUT); } void loop () {currentMillis =micros (); currentMillisVolts =millis (); if (Serial.available ()> 0) {data =Serial.read (); setDutyAndFreq (dados); } if (currentMillis - startMillis> =período) {período =1000000 / freq; // Serial.println (período); digitalWrite (pulsePine, HIGH); duty_cycle_temp =duty_cycle * 10; delayMicroseconds (duty_cycle_temp); digitalWrite (pulsePine, LOW); // sensorValue =analogRead (A0); para (int i =0; i <3; i ++) {sensorValue =analogRead (A0);} atrasoMicrosegundos (10); sensorValue =analogRead (A0); sensorValue =sensorValue / 5; sendData (); 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); return stored_value; } 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 o equilíbrio // "-" valor para desminuir o equilíbrio if (valor =='n') {// Serial.println ("n Recebido"); readFromStorage (addr_duty); duty_cycle =stored_value; dever_ciclo =dever_ciclo + 1; writeToStorage (duty_cycle, addr_duty); } else if (valor =='m') {// Serial.println ("m Recebido"); readFromStorage (addr_duty); duty_cycle =stored_value; dever_ciclo =dever_ciclo - 1; writeToStorage (duty_cycle, addr_duty); } else if (valor =='j') {// Serial.println ("j Recebido"); readFromStorage (addr_freq); freq =valor_armazenado; freq =freq + 10; writeToStorage (freq, addr_freq); } else if (valor =='k') {// Serial.println ("k Recebido"); readFromStorage (addr_freq); freq =valor_armazenado; freq =freq - 10; writeToStorage (freq, addr_freq); } else if (valor =='p') {// Serial.println ("m Recebido"); writeToStorage (0, addr_freq); writeToStorage (0, addr_duty); }} // Volt functionvoid lecturaVoltios () {vinv =0.0f; voutv =0,0f; para (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 (freq); Serial.print ("/"); Serial.print (duty_cycle); Serial.print ("/"); Serial.print (vinv); Serial.print (">"); Serial.println (); * / String data ="<"; dados + =sensorValue; dados + ="/"; dados + =freq; dados + ="/"; dados + =dever_ciclo; dados + ="/"; dados + =vinv; dados + =">"; / * bluetooth.print ("<"); bluetooth.print (sensorValue); bluetooth.print ("/"); bluetooth.print (freq); bluetooth.print ("/"); bluetooth.print (duty_cycle); bluetooth.print ("/"); bluetooth.print (vinv); bluetooth.print (">"); * / Serial.println (dados); }
Esquemas