Arduino Nano Pulse-Inductie Metaaldetector – DIY Kit & Handleiding
Onderdelen en Benodigdheden
| Arduino Nano R3 | 1 |
| HC-05 Bluetooth Module | 1 |
| PNP Transistor (algemeen) | 1 |
| NPN Transistor (algemeen) | 1 |
| N-kanaal Power MOSFET | 1 |
| Operationele Versterker (OpAmp + Comparator + Referentie) | 1 |
| 1N4148 Snelschakeldiode | 2 |
| Condensator 10 µF | 1 |
| Condensator 1 µF | 1 |
| Trimpotmeter 100kΩ | 1 |
| Trimpotmeter 47kΩ | 1 |
| 12 weerstanden (diverse waarden) | 1 set |
Benodigd Gereedschap
- Solderbout
Over dit Project
Pulse Inductie (PI) gebruikt één spoel als zender en ontvanger. Korte, krachtige stroompulsen creëren een magneetveld. Bij pulseeinde keert het veld om en kollapt, wat een scherpe elektrische piek (gereflecteerde puls) van ~30 µs geeft. Metaal in de buurt verandert amplitude en fase van het ontvangen signaal – dit geeft grootte, diepte en type metaal (ferro/non-ferro) aan.
Basis ontworpen door N.E.C.O. Projects. Communicatie met smartphone via HC-05 Bluetooth (baud 115200). Android-app: Spirit PI (gratis/pro op Play Store).
Wijzigingen t.o.v. Origineel
- 150Ω → 47kΩ trimpot: regelt spoelstroom → gevoeligheid instelbaar.
- 62kΩ → 100kΩ trimpot: stelt ~4.5V op A0 in (compenseert OpAmp/voeding variaties).
- Voeding: 4x Li-ion in serie (>15V). Arduino max 12V → LM7805 (met koelbody) op +5V pin.
Spoel
Geïsoleerde koperdraad 0.4mm, 25 windingen, cirkelvormig, Ø19 cm. Geen metalen schroeven/lijm nabij spoel.
Prestaties
Kleine munt: 10-15 cm. Groter metaal: 30-40+ cm. Uitstekend voor de eenvoud.
Code
#include <EEPROM.h>
#define pulsePin 2
int timer = 200;
const int button1 = 12;
char data;
// EEPROM opslag
int addr_duty = 0, addr_freq = 1;
int stored_value, duty_cycle, freq;
int duty_def_value = 10, freq_def_value = 60;
// Balans
int value_count = 0, value_count_def = 100;
int balance_value = 0, balance_value_temp = 0;
unsigned long startMillis, currentMillis;
long period = 100000; // µs
// Batterijmeting
float resistencia1 = 101000, resistencia2 = 10000;
float const arefVolt = 4.8;
float voutv, vinv;
unsigned long startMillisVolts, currentMillisVolts;
long periodVolts = 2000;
int sensorValue;
void setup() {
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(pulsePin, OUTPUT);
}
void loop() {
currentMillis = micros();
currentMillisVolts = millis();
if (Serial.available() > 0) {
data = Serial.read();
setDutyAndFreq(data);
}
if (currentMillis - startMillis >= period) {
period = 1000000 / freq;
digitalWrite(pulsePin, HIGH);
duty_cycle_temp = duty_cycle * 10;
delayMicroseconds(duty_cycle_temp);
digitalWrite(pulsePin, LOW);
for (int i = 0; i < 3; i++) sensorValue = analogRead(A0);
delayMicroseconds(10);
sensorValue = analogRead(A0) / 5;
sendData();
startMillis = currentMillis;
}
if (currentMillisVolts - startMillisVolts >= periodVolts) {
lecturaVoltios();
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) {
if (valor == 'n') { readFromStorage(addr_duty); duty_cycle = stored_value + 1; writeToStorage(duty_cycle, addr_duty); }
else if (valor == 'm') { readFromStorage(addr_duty); duty_cycle = stored_value - 1; writeToStorage(duty_cycle, addr_duty); }
else if (valor == 'j') { readFromStorage(addr_freq); freq = stored_value + 10; writeToStorage(freq, addr_freq); }
else if (valor == 'k') { readFromStorage(addr_freq); freq = stored_value - 10; writeToStorage(freq, addr_freq); }
else if (valor == 'p') { writeToStorage(0, addr_freq); writeToStorage(0, addr_duty); }
}
void lecturaVoltios() {
vinv = 0;
for (int i = 0; i < 100; i++) {
voutv = (analogRead(A7) * arefVolt) / 1023.0;
vinv += voutv / (resistencia2 / (resistencia1 + resistencia2));
if (vinv < 0.9) vinv = 0;
}
vinv /= 100;
}
void sendData() {
String data = "<";
data += sensorValue; data += "/";
data += freq; data += "/";
data += duty_cycle; data += "/";
data += vinv; data += ">";
Serial.println(data);
// Bluetooth output optioneel
}
Schema
Schema-afbeelding bijgevoegd. Let op: de HC-05 moet op 115200 baud ingesteld staan. De app 'Spirit PI' stuurt commando's (n/m/j/k/p) voor duty/freq/balans.
Productieproces
- Een slimme voltmeter bouwen met Arduino en smartphone – Eenvoudig DIY-project
- Pixie: Een Arduino-gebaseerde NeoPixel-polshorloge – Modern, DIY LED-tijdstuk
- Arduino Audio Frequentie Detector – Meet de luidste geluidspieken met hoge gevoeligheid
- Bouw een DIY VR-skateboard met Arduino, Google Cardboard en Bluetooth
- Bouw Real-Time Cellulaire Automaten op Arduino met 128x64 OLED Display
- Bouw een DIY Arduino Radionica EMR Behandelapparaat
- DIY 2D Motion Racing Simulator met Arduino Nano & SG90 Servo's
- Bouw een Ultrasonische Afstandsdetector met Arduino UNO en SR04-sensor
- Arduino Beveiligingssysteem: Slimme Bewegingsdetectie & Alarm
- Bouw een Kosteneffectieve Bliksemdetector met Arduino Uno
- Bouw een draagbare RFID-deurslot met Arduino – Stap-voor-stap handleiding