DIYArduinoベースのパルス誘導金属探知機
コンポーネントと消耗品
> | | × | 1 | |
| | × | 1 | |
| | × | 1 | |
| | × | 1 | |
| | × | 1 | |
| オペアンプ、オペアンプ+コンパレータ+リファレンス | | × | 1 | |
| | × | 2 | |
| | × | 1 | |
| | × | 1 | |
| | × | 1 | |
| | × | 1 | |
| | × | 1 | |
このプロジェクトについて
パルス誘導(PI)システムは、送信機と受信機の両方として単一のコイルを使用します。この技術は、ワイヤーのコイルを介して電流の強力で短いバースト(パルス)を送信します。各パルスは短い磁場を生成します。パルスが終了すると、磁場は極性を反転させ、非常に突然崩壊し、鋭い電気スパイクをもたらします。このスパイクは数マイクロ秒続き、コイルに別の電流が流れます。この電流は反射パルスと呼ばれ、非常に短く、約30マイクロ秒しか持続しません。次に、別のパルスが送信され、プロセスが繰り返されます。金属片が磁力線の範囲内に入ると、受信コイルは受信信号の振幅と位相の両方の変化を検出できます。振幅変化と相変化の量は、金属のサイズと距離の指標であり、鉄金属と非鉄金属を区別するためにも使用できます。
N.E.C.O.のサイトでPI検出器の良い例を見つけました。プロジェクト。この金属探知機は、ArduinoとAndroidの共生です。 Playストアでは、完全に機能するアプリケーション「Spirit PI」の無料バージョンをダウンロードできますが、いくつかの優れたオプションを備えたプロバージョンを購入することもできます。スマートフォンとarduinoの間の通信は、BluetoothモジュールHC 05を使用して行われますが、ボーレートを115200に変更する必要がある任意のBluetoothアダプターを使用できます。スキームを次の図に示します。デバイスの機能を改善するために、元のスキームにいくつかの小さな変更を加えました。元の回路図面はN.E.C.O.-sのWebサイトで見つけることができます:
https://neco-desarrollo.es/pirat-wireless-metal-detector
150オームの抵抗器の代わりに、47Kohmsの値の三量体ポテンショメータを置きました。この三量体は、コイルを流れる電流を調整します。その値を増やすことにより、コイルを流れる電流が増加し、デバイスの感度が向上します.2番目の変更は、元の抵抗62kの代わりにトリマポット100kOhmです。この三量体では、ArduinoのA0入力に約4.5Vの電圧を設定しました。これは、オペアンプと動作電圧が異なると、この抵抗の値が異なるはずであることに気付いたためです。
この特定のケースでは、電源装置に直列に接続された4リチウムイオン電池を使用するため、電圧は15vを超えます。 Arduinoは最大12Vの入力電圧を受け入れるため、Arduinoに直接+ 5vピンに電力を供給するために、小さなヒートシンクに取り付けられた5V(7805)用のスタビライザーを配置しました。
コイルは直径0.4mmの孤立した銅線でできており、直径19cmの円の形をした25本の巻線が含まれています。最終的な仕上がりでは、金属の近くに金属物がないことを確認する必要があります。コイル(要素は接着剤で接着され、ネジは使用されません)
ビデオで見ることができるように、小さな金属のコインは10〜15センチメートルの距離で検出できますが、大きな金属の物体は30〜40センチメートル以上の距離で検出できます。デバイスの作成と設定が比較的簡単であることを考慮すると、これらは優れた結果です。
コード
コード Arduino
#include //#include // int bluetoothTx =5; // int bluetoothRx =6; // blutothモジュール端末RX // SoftwareSerial bluetooth(bluetoothTx、bluetoothRx);#定義pulsePine2int timer =200; const int button1 =12; int buttonState1 =0; char data; // EEPROM変数intaddr_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; //バランス変数intvalue_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; //値はマイクロ秒数です//バッテリーフロートのレベルの測定resistencia1 =101000; // Resistencia de 100K para medir la tencion(Voltios)/テストボルトの抵抗100kフロートresistencia2 =10000; // Resistencia de 10k para medir la tencion(Voltios)/テストボルトの抵抗10kfloat const arefVolt =4.8f; // pin "4.9v" SET EXACT VALUE HEREfloat voutv; float vinv; unsigned long startMillisVolts; unsigned long currentMillisVolts; long periodVolts =2000; //値はマイクロ秒数ですintsensorValue; void setup(){// analogReference(INTERNAL); Serial.begin(115200); readFromStorage(addr_duty); Duty_cycle =Stored_value; readFromStorage(addr_freq); freq =Stored_value; 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 =Stored_value; } pinMode(pulsePine、OUTPUT); } void loop(){currentMillis =micros(); currentMillisVolts =millis(); if(Serial.available()> 0){data =Serial.read(); setDutyAndFreq(データ); } if(currentMillis --startMillis> =period){period =1000000 / freq; // Serial.println(period); 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;データを送る(); 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); Stored_valueを返します。 } void setDutyAndFreq(char valor){// "n" valor paraaumentarデューティサイクル// "m" valor paradisminuirデューティサイクル// "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); Duty_cycle =Stored_value; Duty_cycle =Duty_cycle + 1; writeToStorage(duty_cycle、addr_duty); } else if(valor =='m'){// Serial.println( "m Recived"); readFromStorage(addr_duty); Duty_cycle =Stored_value; Duty_cycle =Duty_cycle-1; writeToStorage(duty_cycle、addr_duty); } else if(valor =='j'){// Serial.println( "j Recived"); readFromStorage(addr_freq); freq =Stored_value; freq =freq + 10; writeToStorage(freq、addr_freq); } else if(valor =='k'){// Serial.println( "k Recived"); readFromStorage(addr_freq); freq =Stored_value; freq =freq-10; writeToStorage(freq、addr_freq); } else if(valor =='p'){// Serial.println( "m Recived"); writeToStorage(0、addr_freq); writeToStorage(0、addr_duty); }} //ボルト関数voidlecturaVoltios(){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órmuladeldivisorresistivopara 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(); * /文字列データ="<";データ+ =SensorValue;データ+ ="/";データ+ =頻度;データ+ ="/";データ+ =Duty_cycle;データ+ ="/";データ+ =vinv;データ+ =">"; / * 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); }
回路図