Arduino Nanoパルス誘導式金属探知機:DIYキット&ガイド
必要な部品と材料
| Arduino Nano R3 | ×1 |
| HC-05 Bluetoothモジュール | ×1 |
| 汎用PNPトランジスタ | ×1 |
| 汎用NPNトランジスタ | ×1 |
| パワーMOSFET Nチャネル | ×1 |
| オペアンプ(コンパレーター+リファレンス内蔵) | ×1 |
| 1N4148 高速スイッチングダイオード | ×2 |
| コンデンサー 10μF | ×1 |
| コンデンサー 1μF | ×1 |
| 単回転ポテンショメーター 100kΩ | ×1 |
| 単回転ポテンショメーター 47kΩ | ×1 |
| 各種抵抗12本(異なる値) | ×1セット |
必要な工具と機械
- はんだごて
プロジェクト概要
パルス誘導(PI)方式は、単一コイルを送信兼受信として使用します。コイルに強力な短パルス電流を流し、一瞬の磁場を生成。パルス終了時に磁場が逆極性で急激に崩壊し、鋭い電気スパイク(反射パルス、約30μs)が発生。このサイクルを繰り返します。金属が磁場範囲内に入ると、受信信号の振幅と位相に変化が生じ、金属の大きさ・距離・鉄/非鉄の判別が可能です。
N.E.C.O. projectsのPI探知機を参考にしました。ArduinoとAndroidの融合システムで、Play Storeの無料アプリ「Spirit PI」(プロ版もあり)で操作。BluetoothモジュールHC-05で通信(ボーレート115200)。オリジナル回路図:N.E.C.O.サイト
オリジナルからの改良点:
- 150Ω抵抗の代わりに47kΩトリマーを配置。コイル電流を調整し、値を大きくすると感度アップ
- 62kΩ抵抗の代わりに100kΩトリマーを配置。Arduino A0入力電圧を約4.5Vに設定(オペアンプや動作電圧によって最適値が異なるため)
- 電源はリチウムイオン電池4直列(15V超)。Arduinoは最大12V入力のため、7805レギュレーター(小型ヒートシンク付き)で5Vに降圧し、Arduinoの5Vピンに直接供給
コイル:0.4mm絶縁銅線、25巻き、直径19cmの円形。最終組み立てではコイル近くに金属物がないよう注意(ネジも使わず接着剤で固定)。
動画の通り、小さなコインで10-15cm、大きな金属物で30-40cm以上の検知が可能。製作・調整が比較的簡単で優秀な結果です。
コード
#include <EEPROM.h> //#include <SoftwareSerial.h> //int bluetoothTx = 5; //int bluetoothRx = 6;//blutoth module terminal RX //SoftwareSerial bluetooth(bluetoothTx, bluetoothRx); #define pulsePine 2 int timer = 200; const int button1 = 12; int buttonState1 = 0; char data; //EEPROM variables 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; //Balance variables 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; //the value is a number of microseconds //Measuring of level of the battery float resistencia1 = 101000; //Resistencia de 100K para medir la tencion (Voltios)/Resistance of 100k for test volts float resistencia2 = 10000; //Resistencia de 10k para medir la tencion (Voltios)/Resistance 10k for test volts float const arefVolt=4.8f; //pin "4.9v" SET EXACT VALUE HERE float voutv; float vinv; unsigned long startMillisVolts; unsigned long currentMillisVolts; long periodVolts = 2000; //the value is a number of microseconds int sensorValue ; 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 (data); } 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; 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 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); } } //Volt function void 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)); //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 = "<"; data +=sensorValue; data +="/"; data +=freq; data +="/"; data +=duty_cycle; data +="/"; data +=vinv; data +=">"; /* 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); }
回路図

製造プロセス
- Arduinoとスマホで作るスマート電圧計 – 簡単DIYプロジェクト
- Pixie: Arduino Pro Miniで作るNeoPixel腕時計 - アナログとデジタル融合のDIY光る時計
- Arduinoオーディオ周波数検出器 – 高感度サウンドモジュールで最大音量ピークの周波数を測定
- Arduino、Google Cardboard、Bluetoothで作るDIY VRスケートボード
- Arduino Nanoと128x64 OLEDで実行するセルラーオートマトン「ライフゲーム」
- DIY ArduinoラジオニクスEMR治療デバイスの構築
- Arduino NanoとSG90サーボで作るDIY 2軸モーションレーシングシミュレータ
- Arduino UNOとSR04超音波センサーで作る距離測定器 – 入門ガイド
- Arduinoで作るセキュリティシステム:超音波センサーとサーボで広範囲監視・アラート
- Arduino Unoで作る低コスト落雷検知器
- Arduinoで作るポータブルRFIDドアロック - ステップバイステップガイド