Detector de Metales por Inducción de Pulso con Arduino Nano – Kit y Guía DIY
Componentes y materiales
| Componente | Cantidad |
|---|---|
| Arduino Nano R3 | 1 |
| Módulo Bluetooth HC-05 | 1 |
| Transistor PNP uso general | 1 |
| Transistor NPN uso general | 1 |
| MOSFET N-Channel de potencia | 1 |
| Amplificador operacional + comparador + referencia (ej. TL084 / LM324) | 1 |
| Diodo 1N4148 (conmutación rápida) | 2 |
| Condensador 10 µF | 1 |
| Condensador 1 µF | 1 |
| Potenciómetro monovuelta 100 kΩ | 1 |
| Potenciómetro monovuelta 47 kΩ | 1 |
| Kit 12 resistencias varios valores | 1 |
Herramientas necesarias
- Soldador (genérico)
Sobre el proyecto
Los detectores de Inducción de Pulso (PI) usan una sola bobina como transmisor y receptor. Envían pulsos cortos y potentes de corriente por la bobina; cada pulso genera un campo magnético breve. Al cortar la corriente, el campo colapsa bruscamente produciendo un pico eléctrico (pulso reflejado) de ~30 µs. Si hay metal cerca, la amplitud y fase del pulso reflejado cambian, permitiendo detectar tamaño, distancia y tipo (ferroso/no ferroso).
Basado en el diseño PIRAT de N.E.C.O. proyectos. Comunicación con smartphone Android vía app "Spirit PI" (Play Store, versión gratuita y Pro) y módulo HC-05 a 115200 baudios.
Modificaciones respecto al original
- Trimmer 47 kΩ en lugar de R 150 Ω: regula corriente de bobina → ajuste de sensibilidad.
- Trimmer 100 kΩ en lugar de R 62 kΩ: ajusta ~4.5V en entrada A0 del Arduino (compensa variaciones de amplificadores/voltajes).
- Alimentación: 4 baterías Li-ion en serie (>15V). Regulador 7805 + disipador en pin +5V del Arduino (máx 12V en Vin).
Bobina
- Hilo de cobre esmaltado Ø 0.4 mm.
- 25 vueltas, diámetro 19 cm, circular.
- Fijar con pegamento, sin tornillos ni piezas metálicas cerca.
Rendimiento
- Moneda pequeña: 10-15 cm.
- Objeto grande: 30-40 cm o más.
- Resultados excelentes para la simplicidad del montaje.
Código
Sketch para Arduino Nano. Guarda duty cycle y frecuencia en EEPROM. Comandos serie/Bluetooth: n/m (duty ±1), j/k (freq ±10), +/- (balance), p (reset defaults). Envía trama <valor/freq/duty/vin> a la app.
#include <EEPROM.h>
#define pulsePin 2
int timer = 200;
const int button1 = 12;
int buttonState1 = 0;
char data;
// EEPROM
int addr_duty = 0, addr_freq = 1;
int stored_value, duty_cycle, duty_cycle_temp, freq, freq_temp;
int duty_def_value = 10, freq_def_value = 60;
// Balance
int value_count = 0, value_count_def = 100;
int balance_value = 0, balance_value_temp = 0;
// Timing
unsigned long startMillis, currentMillis;
long period = 100000; // µs
// Batería
float resistencia1 = 101000, resistencia2 = 10000;
float const arefVolt = 4.8f;
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.0f; voutv = 0.0f;
for (int i = 0; i < 100; i++) {
voutv = (analogRead(A7) * arefVolt) / 1023.0;
vinv += voutv / (resistencia2 / (resistencia1 + resistencia2));
if (vinv < 0.9) vinv = 0.0f;
}
vinv /= 100;
}
void sendData() {
String data = "<";
data += sensorValue; data += "/";
data += freq; data += "/";
data += duty_cycle; data += "/";
data += vinv; data += ">";
Serial.println(data);
}
Esquemático

App Android: Spirit PI (configurar Bluetooth a 115200 baudios).
Proceso de manufactura
- Construye un Voltímetro Inteligente con Arduino y Smartphone – Proyecto DIY Fácil
- Pixie: Reloj de pulsera NeoPixel basado en Arduino – Elegante reloj LED DIY
- Detector de frecuencia de audio con Arduino – Mide los picos de sonido más intensos
- Construye un Skateboard VR Casero con Arduino, Google Cardboard y Bluetooth
- Autómatas Celulares en Tiempo Real con Arduino y Pantalla OLED 128x64
- Construye un dispositivo de tratamiento radiónico EMR con Arduino DIY
- Simulador de Carreras 2D DIY con Arduino Nano y Servos SG90
- Construye un Detector de Distancia Ultrasónico con Arduino UNO y Sensor SR04
- Sistema de seguridad Arduino: Detección de movimiento inteligente y alerta
- Detector de Rayos Económico con Arduino Uno
- Construye un Cerco RFID Portátil con Arduino – Guía Paso a Paso