Aprende a construir un detector de metales utilizando un oscilador Colpitts y un Arduino.
¿Cómo funcionan los detectores de metales?
El circuito tanque
En el circuito anterior, el condensador en serie y el inductor forman un circuito tanque. En un circuito tanque, la energía se transfiere repetidamente entre un condensador y un inductor, dando lugar a una oscilación. La corriente descargada del condensador fluye a través del inductor; cuando el condensador está completamente descargado, el campo magnético decreciente del inductor mantiene el flujo de corriente. A continuación, el condensador se cargará con la polaridad opuesta, y cuando el campo magnético se haya colapsado por completo, el condensador se descargará, dando lugar a un flujo de corriente en la dirección opuesta a la de la corriente original. Este ciclo continúa.
El inductor del circuito del tanque anterior forma el detector del detector de metales (una gran bobina de alambre). Cuando el material metálico se acerca al centro del inductor (la bobina del detector), entra en el campo magnético creado por el inductor. Esto cambia la permeabilidad magnética del núcleo del inductor, haciendo que la inductancia cambie. El cambio en la inductancia, a su vez, cambia la frecuencia de oscilación del circuito del tanque.
Si los componentes fueran ideales, el circuito del tanque oscilaría indefinidamente sin una fuente de energía externa. Pero, en la práctica, los componentes no son ideales. La resistencia no deseada de los componentes introducirá una pérdida de energía, haciendo que la corriente oscilante se detenga. Para contrarrestar esto, se utiliza un amplificador inversor BJT de una sola etapa para añadir continuamente ganancia al circuito tanque.
El oscilador Colpitts
Dado que la oscilación en los nodos antes y después del inductor están desfasados 180° entre sí, uno de los nodos suministrará la oscilación a la base del transistor, amplificará e invertirá la señal en el colector, y luego la devolverá en fase al otro nodo del circuito tanque. Todo este circuito se denomina oscilador de Colpitts.
El oscilador de Colpitts anterior proporciona una oscilación constante con una frecuencia en el rango de 100kHz. Los metales de los artículos domésticos que cambian la permeabilidad del núcleo del inductor harán fluctuar esta frecuencia alrededor de los 10kHz. Dado que este rango de frecuencias está fuera del espectro de audio humano (20Hz a 20kHz), necesitaremos traducir la oscilación en un tono audible.
Los detectores de metales BFO (beat-frequency oscillator) tradicionales superan este problema incorporando otro circuito tanque con una frecuencia fija igual a la frecuencia del circuito tanque del detector sin la influencia de ningún metal. Entonces, tomando la diferencia entre las dos frecuencias se aislarán las frecuencias fluctuantes del circuito detector y se reducirán a un rango audible.
Para este proyecto de detector de metales, utilizaremos un Arduino para procesar la señal de oscilación en lugar de compensar la oscilación con un segundo circuito tanque. El Arduino almacenará la frecuencia fija y comparará continuamente la frecuencia entrante del circuito detector con la frecuencia almacenada (más sobre el programa Arduino más adelante).
Materiales para tu detector de metales DIY
Para este proyecto, se eligió una desbrozadora de juguete para albergar todos los componentes. Incluye las siguientes características:
- un botón de disparo, que reutilizaremos para disparar el altavoz
- un botón lateral, que utilizaremos para ajustar la frecuencia fija
- un compartimento para las pilas (3xAA) con un interruptor ON/OFF
- un altavoz por el que reproduciremos el tono
- un motor con leds acoplados que se nos activará cuando la diferencia de frecuencias supere un determinado umbral
- un cabezal circular en el que encajaremos una bobina de cable para el inductor del circuito del depósito
También añadiremos un potenciómetro (plateado) para hacer ajustable la sensibilidad de los cambios de tono.
La bobina del inductor está hecha de aproximadamente 50 vueltas de cable 26 AWG alrededor de una bobina de 5,5 pulgadas de diámetro.
Dentro de la carcasa, sustituiremos la placa de circuito original por nuestro propio circuito y adjuntaremos todos los periféricos al circuito con cabezales de pines.
Esquemas del circuito de detección de metales
Utilicé un Arduino UNO para programar un DIP ATMega328. Luego retiré el ATMega328 de la placa de desarrollo y lo incrusté en una perfboard junto con el resto del circuito.
El oscilador Colpitts, en la parte inferior izquierda del diagrama, alimenta la oscilación en el contador 1 (pin T1) del chip (marcado como pin digital 5 en el Arduino UNO), donde cuenta constantemente la frecuencia de oscilación.
En el nivel superior del diagrama, una fuente de alimentación de 4.5V (3 pilas AA, con condensadores de derivación) se utiliza para alimentar el ATmega328, el oscilador, el altavoz y el motor (con LEDs).
Para mantener el consumo de corriente de los pines digitales del microcontrolador a un nivel seguro (40 mA por pin como máximo para el ATmega328), se utiliza un transistor NPN (C2878) para conducir el altavoz, y un MOSFET de canal N (SUB45N03) para conducir el motor.
Tanto el interruptor de disparo como el de reinicio (establece la frecuencia fija) están conectados a los pines digitales utilizando una configuración interna de pull-up. Se añaden pequeños condensadores en paralelo para eliminar el rebote de los interruptores.
El potenciómetro de sensibilidad se configura como un divisor de voltaje, y la división se lee utilizando un pin analógico.
Código de avance
El código fuente completo de este proyecto se puede encontrar aquí:
- https://github.com/evankale/ArduinoMetalDetector
A continuación se muestra un recorrido detallado del código.
Función de configuración
Para realizar un seguimiento de la frecuencia de oscilación del detector a través del contador de tiempo 1, primero tenemos que configurar los registros del controlador del temporizador/contador (TCCR). A estos TCCRs se accede a través de los tres enteros: TTCR1A, TTCR1B, y TTCR1C.
TCCR1A = 0b00000000;TCCR1B = 0b00000111;
Necesitaremos configurar la generación de la forma de onda en modo normal poniendo los flags WGM de TCCR1A y TCCR1B a 0, y configurar el modo de selección de la velocidad de reloj a fuente de reloj externa poniendo los flags CS de TCCR1B a modo 3 (reloj externo en flanco ascendente). En esta configuración, el registro OCR1A se decrementará en 1 cada vez que se detecte un flanco ascendente de la oscilación.
TIMSK1 |= (1 << OCIE1A);
A continuación tendremos que habilitar la interrupción del temporizador/conteo A estableciendo la bandera OCIE1A en el registro TIMSK1. Esto permitirá llamar a la función de interrupción SIGNAL(TIMER1_COMPA_vect) cada vez que el registro OCR1A llegue a 0.
OCR1A = 1;
Ahora inicialice OCR1A a 1 para que la función de interrupción sea llamada tan pronto como se detecte el primer flanco ascendente.
Función de interrupción
Esta es la función SIGNAL(TIMER1_COMPA_vect). Se llama cuando el registro OCR1A llega a 0. En esta función queremos llevar la cuenta del número de microsegundos transcurridos desde la última vez que se llamó a la función. Este delta de tiempo se almacena como signalTimeDelta.
storedTimeDelta es el delta de tiempo de «frecuencia fija» con el que se compara signalTimeDelta en el bucle principal. storedTimeDelta se establece en signalTimeDelta cuando storedTimeDelta se pone a cero (en el arranque y cuando se pulsa el interruptor de reinicio).
OCR1A += CYCLES_PER_SIGNAL;
Después de realizar las operaciones de interrupción, OCR1A necesita ser reiniciado incrementándolo con nuestra constante predefinida, CYCLES_PER_SIGNAL (número de ciclos antes de que se produzca la siguiente interrupción).
Función de bucle
En la función de bucle, comprobamos si se pulsa el trigger. Si es así, entonces se lee el valor analógico del potenciómetro de sensibilidad y se interpola linealmente el valor analógico (0 a 1023) a una escala más fácil de usar (0,5 a 10,0).
int storedTimeDeltaDifference = (storedTimeDelta - signalTimeDelta) * sensitivity;
Se calcula la diferencia entre la frecuencia fija (storedTimeDelta) y la frecuencia medida (signalTimeDelta) y se multiplica por el valor de sensibilidad.
tone(SPEAKER_PIN, BASE_TONE_FREQUENCY + storedTimeDeltaDifference);
Este valor se suma con una frecuencia de tono base audible, BASE_TONE_FREQUENCY, y se reproduce por el altavoz utilizando la función Arduino tone().
Si la diferencia supera el umbral definido por SPINNER_THRESHOLD, entonces el motor se activa.
Si se suelta el disparador, entonces el tono del altavoz se detiene (llamando a la función noTone()) y el motor se desactiva.
Si se ha pulsado el botón de reinicio, se pondrá a cero elTimeDelta almacenado, permitiendo que la siguiente llamada de interrupción establezca un nuevo valor.
¿Qué tan funcional es nuestro detector de metales basado en Arduino?
Con la configuración de sensibilidad más baja, el detector de metales puede recoger objetos grandes como latas de refresco, teléfonos móviles y herramientas de hierro a pocos centímetros de la bobina. En la configuración de sensibilidad más alta, también se pueden detectar artículos más pequeños como anillos de acero, tornillos y monedas dentro de la misma proximidad. Ver el vídeo en la parte superior del artículo para una demostración!
Para ampliar el alcance del detector, podemos aumentar el área del campo magnético creado por el inductor. Esto se puede conseguir aumentando el flujo de corriente a través del inductor (aumentando la entrada de voltaje al oscilador, lo que permite una mayor ganancia en el amplificador), o aumentando el número de vueltas de cable en la bobina del inductor.
Con un detector de metales basado en Arduino, podemos hacer otras cosas interesantes que no se pueden hacer con los detectores de metales BFO tradicionales. ¡Permanece atento a futuros proyectos sobre cómo podemos aprovechar este mecanismo de detección de metales para otros fines!
ArduinoMetalDetector-master.zip
¡Prueba este proyecto por ti mismo! Obtenga la lista de materiales.