DETECTOR DE METALES – Grupo 14
Introducción
El proyecto del grupo 14 consiste en un detector de metales casero realizado con la placa Arduino. El funcionamiento se basa en la ley de inducción de Faraday, un cambio en el campo magnético creado por una corriente eléctrica induce una fuerza electromotriz, basándose en esta ley, la bobina del detector de metales detectará un cambio en la inductancia que registrará el Arduino.
Presupuesto
Para construir este detector de metales se necesitan pocos componentes electrónicos. A continuación se muestra una tabla orientativa del precio y materiales que se han de usar, el precio puede variar según tienda, calidad, país…
| Pieza | Cantidad | Precio (en euros) |
| Placa Elegoo Uno R3 | 1 | 15€ |
| Tupperware | 1 | 2€ |
| Brida | 3 | 0,45€ |
| Cable de cobre | 1 | 3,99€ |
| Transistor 2N2222 | 1 | 0,08€ |
| Led | 3 | 0,18€ |
| Batería portatil | 1 | 19,99€ |
| Zumbador (Buzzer) | 1 | 0,50€ |
| Capacitor cerámico 104 | 1 | 0,10€ |
| Resistencia | 6 | 0,60€ |
| Palo selfie | 1 | 5€ |
| Varios (Cables, material adicional…) | Variable | Variable |
| Total 47,89€ |
Diagrama del circuito
Se incluye un diagrama del circuito para su entendimiento y su implementación, además se presenta un ejemplo de cómo podría quedar el circuito de la forma más compacta posible.



Código
// Configuración de Pines
const int pulsePin = 8;
const int readPin = A0;
const int ledLow = 3; // LED Verde
const int ledMed = 4; // LED Amarillo
const int ledHigh = 5; // LED Rojo
const int buzzerPin = 6; // Zumbador
// VARIABLES DE AJUSTE
int baseline = 0;
// SENSIBILIDAD
int sensitivity = 200;
// MÁXIMO
int maxDetection = 600;
void setup() {
pinMode(pulsePin, OUTPUT);
pinMode(ledLow, OUTPUT);
pinMode(ledMed, OUTPUT);
pinMode(ledHigh, OUTPUT);
pinMode(buzzerPin, OUTPUT);
Serial.begin(9600);
// Calibración
digitalWrite(ledLow, HIGH); delay(100);
digitalWrite(ledMed, HIGH); delay(100);
digitalWrite(ledHigh, HIGH); delay(100);
resetLeds();
while(baseline < 15000){
digitalWrite(ledLow, HIGH);
digitalWrite(ledHigh, HIGH); delay(500);
resetLeds();
digitalWrite(ledMed, HIGH); delay(500);
resetLeds();
long total = 0;
for(int i=0; i<500; i++) {
total += measureCoil();
delay(2);
}
baseline = total / 500;
}
tone(buzzerPin, 2000, 100);
delay(100);
}
void loop() {
int currentVal = measureCoil();
int diff = abs(currentVal - baseline);
resetLeds();
// VERDE: Detección Inicial
if (diff > sensitivity) {
digitalWrite(ledLow, HIGH);
}
// AMARILLO: Detección Media
if (diff > sensitivity + 40) {
digitalWrite(ledMed, HIGH);
}
// ROJO: Detección Muy Cercana
if (diff > sensitivity + 100) {
digitalWrite(ledHigh, HIGH);
}
// SONIDO
if (diff > sensitivity + 20) {
int toneFreq = map(diff, sensitivity, maxDetection, 500, 2000);
toneFreq = constrain(toneFreq, 500, 2000);
tone(buzzerPin, toneFreq);
} else {
noTone(buzzerPin);
}
delay(10);
}
// FUNCIÓN DE LECTURA
int measureCoil() {
int measurement = 0;
for(int i = 0; i < 15; i++) {
digitalWrite(pulsePin, HIGH);
delayMicroseconds(150);
digitalWrite(pulsePin, LOW);
delayMicroseconds(8);
measurement += analogRead(readPin);
}
return measurement;
}
void resetLeds() {
digitalWrite(ledLow, LOW);
digitalWrite(ledMed, LOW);
digitalWrite(ledHigh, LOW);
}
Ejemplo de funcionamiento
Comentarios adicionales
Debido a los limitados recursos con los que se contaba para la realización de este proyecto, se presentó un problema prácticamente imposible de solucionar. En el código el valor baseline debe oscilar 15000 como mínimo y 15250 como máximo, pero debido a que el baseline se calcula cada vez que se enciende el detector haciendo mediciones, como la bobina es de cobre, esta se calienta y se excita eléctricamente, haciendo que ese valor calculado se salga del rango válido, imposibilitado el uso del detector. Una solución sería implementar algún mecanismo que permita enfriar y mantener a una temperatura ideal la bobina de cobre, para que nunca se calcule un baseline fuera del rango.