Detector de metales arduino 2020

 

Metal Detector es un dispositivo de seguridad que se utiliza para detectar metales que pueden ser dañinos, en varios lugares como aeropuertos, centros comerciales, cines, etc. Anteriormente hemos fabricado un detector de metales muy simple sin un microcontrolador, ahora estamos construyendo el detector de metales utilizando Arduino

En este proyecto, vamos a utilizar una bobina y un condensador que serán responsables de la detección de metales. Aquí hemos usado un Arduino Nano para construir este proyecto de detector de metales . Este es un proyecto muy interesante para todos los amantes de la electrónica. Donde sea que este detector detecte cualquier metal cerca de él, el zumbador comienza a sonar muy rápidamente.

Componentes requeridos:

  1. Arduino (cualquiera)
  2. Bobina
  3. Condensador 10nF
  4. Zumbador
  5. La resistencia de 1k
  6. Resistencia de 330 ohmios
  7. LED
  8. Diodo 1N4148
  9. Placa de pruebas o PCB
  10. Cable de puente de conexión
  11. Batería de 9v
  12. Concepto de trabajo:

    Cada vez que una corriente pasa a través de la bobina, genera un campo magnético a su alrededor. Y el cambio en el campo magnético genera un campo eléctrico. Ahora, de acuerdo con la ley de Faraday, debido a este campo eléctrico, se desarrolla un voltaje a través de la bobina que se opone al cambio en el campo magnético y así es como Coil desarrolla la inductancia , significa que el voltaje generado se opone al aumento de la corriente. La unidad de Inductancia es Henry y la fórmula para medir la Inductancia es:

L = (μ ο * N 2 * A) / l

Dónde,
L- Inductancia en Henries
μο- Permeabilidad, es 4π * 10 -7 para aire
N- Número de vueltas
A- Área del núcleo interno (πr 2 ) en m 2 
l- Longitud de la bobina en metros

Cuando cualquier metal se acerca a la bobina, la bobina cambia su inductancia. Este cambio en la inductancia depende del tipo de metal. Disminuye para el metal no magnético y aumenta para materiales ferromagnéticos como el hierro.

Dependiendo del núcleo de la bobina, el valor de inductancia cambia drásticamente. En la figura a continuación puede ver los inductores con núcleo de aire, en estos inductores, no habrá núcleo sólido . Básicamente son bobinas que quedan en el aire. El medio de flujo del campo magnético generado por el inductor es nada o aire. Estos inductores tienen inductancias de muy poco valor.

Estos inductores se utilizan cuando se necesitan valores de pocos microHenry. Para valores superiores a pocos milliHenry, estos no son adecuados. En la figura siguiente puede ver un inductor con núcleo de ferrita. Este inductor de núcleo de ferrita tiene un valor de inductancia muy grande.

Recuerde que la bobina enrollada aquí es con núcleo de aire, por lo que cuando una pieza de metal se acerca a la bobina, la pieza de metal actúa como un núcleo para el inductor con núcleo de aire. Al actuar este metal como núcleo, la inductancia de la bobina cambia o aumenta considerablemente. Con este aumento repentino en la inductancia de la bobina, la reactancia o impedancia general del circuito LC cambia en una cantidad considerable cuando se compara sin la pieza de metal.  

Entonces, aquí en este Proyecto de detector de metales Arduino, tenemos que encontrar la inductancia de la bobina para detectar metales. Para hacer esto, hemos utilizado el circuito LR (circuito de resistencia-inductor) que ya mencionamos. Aquí en este circuito, hemos utilizado una bobina que tiene alrededor de 20 vueltas o un devanado con un diámetro de 10 cm. Hemos usado un rollo de cinta vacío y enrollamos el alambre a su alrededor para hacer la bobina.

Diagrama de circuito:

Hemos utilizado un Arduino Nano para controlar todo este proyecto de detector de metales . Se utilizan un LED y un zumbador como indicador de detección de metales. Una bobina y un condensador se utilizan para la detección de metales. También se usa un diodo de señal para reducir el voltaje. Y una resistencia para limitar la corriente al pin Arduino.

 

Explicación de trabajo:

El funcionamiento de este detector de metales Arduino es un poco complicado. Aquí proporcionamos la onda de bloque o pulso, generado por Arduino, al filtro de paso alto LR. Debido a esto, la bobina generará picos cortos en cada transición. La longitud del pulso de los picos generados es proporcional a la inductancia de la bobina. Entonces, con la ayuda de estos pulsos Spike, podemos medir la inductancia de la bobina. Pero aquí es difícil medir la inductancia precisamente con esos picos porque esos picos son de muy corta duración (aproximadamente 0,5 microsegundos) y eso es muy difícil de medir por Arduino.

Entonces, en lugar de esto, usamos un condensador que se carga por el impulso o pico ascendente. Y requirió pocos pulsos para cargar el condensador hasta el punto donde su voltaje puede ser leído por el pin analógico A5 de Arduino. Entonces Arduino leyó el voltaje de este condensador usando ADC. 

Después de leer el voltaje, el condensador se descargó rápidamente haciendo pin PinPin como salida y ajustándolo a bajo. Todo este proceso tarda unos 200 microsegundos en completarse. Para un mejor resultado, repetimos la medición y tomamos un promedio de los resultados. Así es como podemos medir la inductancia aproximada de la bobina . Después de obtener el resultado, transferimos los resultados al LED y al timbre para detectar la presencia de metal. Consulte el código completo que se encuentra al final de este artículo para comprender el funcionamiento.

El código completo de Arduino se encuentra al final de este artículo. En la programación de parte de este proyecto, hemos utilizado dos pines Arduino, uno para generar ondas de bloque que se alimentarán en la bobina y el segundo pin analógico para leer el voltaje del condensador. Además de estos dos pines, hemos usado dos pines Arduino más para conectar el LED y el zumbador.

Puede consultar el código completo y el video de demostración del detector de metales Arduino a continuación. Puede ver que cada vez que detecta algo de metal, el LED y el zumbador comienzan a parpadear muy rápidamente.

 
Código
#define capPin A5
#define buz 9
#define pulsePin A4

#define led 10

larga sumaExpect = 0; // suma de 64 sumas 
largas ignor = 0; // número de sumas ignoradas
long diff = 0; // diferencia entre sum y avgsum
long pTime = 0;
largo buzPeriod = 0; 

configuración nula () 
{
  Serial.begin (9600);
  pinMode (pulsePin, OUTPUT); 
  digitalWrite (pulsePin, LOW);
  pinMode (capPin, INPUT);  
  pinMode (buz, SALIDA);
  digitalWrite (buz, BAJO);
  pinMode (led, SALIDA);
}

bucle vacío () 
{
  int minval = 1023;
  int maxval = 0;
  largo sin signo int sum = 0;
  for (int i = 0; i <256; i ++)
  {
    // restablecer el modo
    pin del capacitor (capPin, OUTPUT);
    digitalWrite (capPin, LOW);
    delayMicroseconds (20);
    pinMode (capPin, INPUT);
    applyPulses ();
    
    // lee la carga del condensador
    int val = analogRead (capPin); // toma 13x8 = 104 microsegundos
    minval = min (val, minval);
    maxval = max (val, maxval);
    suma + = val;
    
    largo sin signo int cTime = millis ();
    char buzState = 0;
    if (cTime <pTime + 10)
    {
      if (diff> 0)
        buzState = 1;
      más si (diff <0)
        buzState = 2;
    }
    if (cTime> pTime + buzPeriod)
    {
      if (diff> 0)
      buzState = 1;
      más si (diff <0)
      buzState = 2;
      pTime = cTime;   
    }
    if (buzPeriod> 300)
    buzState = 0;

    if (buzState == 0)
    {
      digitalWrite (led, BAJO);
      noTone (buz);
    }  
    else if (buzState == 1)
    {
      tone (buz, 2000);
      digitalWrite (led, ALTO);
    }
    
    else if (buzState == 2)
    {
      tone (buz, 500);
      digitalWrite (led, ALTO);
    }
  }

  // resta el valor mínimo y máximo para eliminar los picos
  sum- = minval; 
  sum- = maxval;
  
  if (sumExpect == 0) 
  sumExpect = sum << 6; // establece sumExpect en el valor esperado
  long int avgsum = (sumExpect + 32) >> 6; 
  diff = sum-avgsum;
  if (abs (diff) <avgsum>> 10)
  {
    sumExpect = sumExpect + sum-avgsum;
    ignor = 0;
  } 
  más 
    ignor ++;
  if (ignor> 64)
  { 
    sumExpect = sum << 6;
    ignor = 0;
  }
  if (diff == 0) 
    buzPeriod = 1000000;
  sino 
  buzPeriod = avgsum / (2 * abs (diff));    
}

vole applyPulses ()
{
    for (int i = 0; i <3; i ++) 
    {
      digitalWrite (pulsePin, HIGH); // tomar 3.5
      usS delayMicroseconds (3);
      digitalWrite (pulsePin, LOW); // tomar 3.5
      usS delayMicroseconds (3);
    }
}