Détecteur de métaux à induction par impulsions DIY à base d'Arduino
Composants et fournitures
| | × | 1 | |
| | × | 1 | |
| Transistor à usage général PNP | | × | 1 | |
| Transistor à usage général NPN | | × | 1 | |
| | × | 1 | |
| Amplificateur opérationnel, Op Amp + Comparateur + Référence | | × | 1 | |
| 1N4148 – Commutation rapide à usage général | | × | 2 | |
| | × | 1 | |
| | × | 1 | |
| Potentiomètre à un tour - 100k ohms | | × | 1 | |
| Potentiomètre à un tour-47k | | × | 1 | |
| 12 résistances avec des valeurs différentes | | × | 1 | |
À propos de ce projet
Les systèmes à induction pulsée (PI) utilisent une seule bobine comme émetteur et récepteur. Cette technologie envoie de puissantes et courtes rafales (impulsions) de courant à travers une bobine de fil. Chaque impulsion génère un bref champ magnétique. Lorsque l'impulsion se termine, le champ magnétique inverse la polarité et s'effondre très soudainement, ce qui entraîne une forte pointe électrique. Ce pic dure quelques microsecondes et provoque le passage d'un autre courant dans la bobine. Ce courant est appelé impulsion réfléchie et est extrêmement court, ne durant qu'environ 30 microsecondes. Une autre impulsion est alors envoyée et le processus se répète. Si un morceau de métal se trouve à l'intérieur de la plage des lignes de champ magnétique, la bobine de réception peut détecter un changement d'amplitude et de phase du signal reçu. La quantité de changement d'amplitude et de changement de phase est une indication de la taille et de la distance du métal, et peut également être utilisée pour faire la distinction entre les métaux ferreux et non ferreux.
J'ai trouvé un bon exemple de détecteur PI sur le site du N.E.C.O. projets. Ce détecteur de métaux est une symbiose d'Arduino et d'Android. Sur le Play Store, vous pouvez télécharger la version gratuite de l'application "Spirit PI", qui est entièrement fonctionnelle, mais vous pouvez également acheter une version pro qui propose plusieurs options intéressantes. La communication entre le smartphone et l'arduino se fait avec le module bluetooth HC 05, mais vous pouvez utiliser n'importe quel adaptateur bluetooth sur lequel vous devez tourner le débit en bauds à 115200. Le schéma est donné dans la figure ci-dessous. J'ai apporté plusieurs modifications mineures au schéma d'origine afin d'améliorer les fonctionnalités de l'appareil. Vous pouvez trouver le schéma original sur le site Web de N.E.C.O. :
https://neco-desarrollo.es/pirat-wireless-metal-detector
A la place d'une résistance de 150 ohms, j'ai mis un potentiomètre trimère d'une valeur de 47 Kohms. Ce trimère régule le courant à travers la bobine. En augmentant sa valeur, le courant traversant la bobine augmente et la sensibilité de l'appareil augmente. La deuxième modification est le potentiomètre 100kOhm au lieu de la résistance 62k d'origine. Avec ce trimère, nous avons réglé la tension d'environ 4,5V à l'entrée A0 sur Arduino, car j'ai remarqué que pour des amplificateurs opérationnels et des tensions de fonctionnement différents, la valeur de cette résistance devrait être différente.
Dans ce cas particulier, pour alimenter l'appareil, j'utilise une batterie lithium-ion 4 connectée en série afin que la tension soit supérieure à 15v. Parce que Arduino accepte une tension d'entrée maximale de 12V, j'ai mis un stabilisateur pour 5V (7805) monté sur le petit dissipateur thermique pour alimenter l'Arduino directement sur la broche +5v.
La bobine est constituée de fil de cuivre isolé d'un diamètre de 0,4 mm et contient 25 enroulements en forme de cercle d'un diamètre de 19 centimètres. Dans la finition finale, il est nécessaire de s'assurer qu'il n'y a aucun objet métallique à proximité du bobine (les éléments sont à coller avec de la colle, et cela sans vis)
Comme vous pouvez le voir sur la vidéo, une petite pièce de métal peut être détectée à une distance de 10 à 15 centimètres, tandis qu'un objet métallique plus gros de 30 à 40 centimètres et plus. Ce sont d'excellents résultats, compte tenu du fait que la fabrication et le réglage de l'appareil sont relativement simples.
Code
codeArduino
#include //#include //int bluetoothTx =5;//int bluetoothRx =6;//module bluetooth terminal RX//SoftwareSerial bluetooth(bluetoothTx, bluetoothRx);# define pulsePine 2int timer =200;const int button1 =12;int buttonState1 =0;char data;//EEPROM variablesint addr_duty =0;int addr_freq =1;int storage_value;int duty_cycle;int duty_cycle_temp;int freq;int freq_temp;int duty_def_value =10;int freq_def_value =60;//Variables de soldeint value_count =0;int value_count_def =100;int balance_value =0;int balance_value_temp =0;//****unsigned long startMillis; courant long non signéMillis ; période longue =100 000 ; //la valeur est un nombre de microsecondes//Mesure du niveau de la batteryfloat resistencia1 =101000; //Resistencia de 100K para medir la tencion (Voltios)/Resistance of 100k for test voltsfloat resistencia2 =10000; //Resistencia de 10k para medir la tencion (Voltios)/Resistance 10k for test voltsfloat const arefVolt=4.8f; //pin "4.9v" FIXER LA VALEUR EXACTE ICIfloat voutv;float vinv;non signé long startMillisVolts; courant long non signéMillisVolts ;Volts de longue période =2000 ; //la valeur est un nombre de microsecondesint sensorValue;void setup() { //analogReference(INTERNAL); Serial.begin(115200); readFromStorage(addr_duty); duty_cycle =valeur_stockée ; readFromStorage(addr_freq); freq =valeur_stockée ; if(duty_cycle ==0 || duty_cycle ==255){ writeToStorage(duty_def_value,addr_duty); readFromStorage(addr_duty); duty_cycle =valeur_stockée ; } if(freq ==0 || freq ==255 ){ writeToStorage(freq_def_value,addr_freq); readFromStorage(addr_freq); freq =valeur_stockée ; } pinMode(pulsePine, SORTIE); }boucle vide() { currentMillis =micros(); currentMillisVolts =millis(); if(Serial.available()>0) { data =Serial.read(); setDutyAndFreq (données); } if (currentMillis - startMillis>=period) { period =1000000 / freq; // Serial.println(période); digitalWrite(pulsePine, HIGH); duty_cycle_temp =duty_cycle * 10 ; delayMicroseconds(duty_cycle_temp); digitalWrite(pulsePine, LOW); //sensorValue =analogRead(A0) ; for(int i =0;i <3; i++){ sensorValue =analogRead(A0);}delayMicroseconds(10);sensorValue =analogRead(A0);sensorValue =sensorValue / 5; envoyer des données(); 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) { storage_value =EEPROM.read(addr); renvoyer la valeur_stockée ; } 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 //"+" valeur pour augmenter la balance //"-" valeur pour réduire la balance if(valeur =='n') { // Serial.println("n Recived"); readFromStorage(addr_duty); duty_cycle =valeur_stockée ; duty_cycle =duty_cycle + 1 ; writeToStorage(duty_cycle,addr_duty); } else if(valor =='m') { // Serial.println("m Recived"); readFromStorage(addr_duty); duty_cycle =valeur_stockée ; duty_cycle =duty_cycle - 1 ; writeToStorage(duty_cycle,addr_duty); } else if(valor =='j') { // Serial.println("j Recived"); readFromStorage(addr_freq); freq =valeur_stockée ; freq =freq + 10; writeToStorage(freq,addr_freq); } else if(valor =='k') { // Serial.println("k Reçu"); readFromStorage(addr_freq); freq =valeur_stockée ; freq =freq - 10; writeToStorage(freq,addr_freq); } else if(valor =='p') { // Serial.println("m reçu"); 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)); //Formule du diviseur résistif pour la tension finale 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 ="<"; data +=sensorValue; données +="/" ; data +=freq; données +="/" ; données +=cycle_de_service ; données +="/" ; données +=vinv; données +=">" ; /* 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(data); }
Schémas