jueves, 7 de marzo de 2019

Creacción de un detector de metales

Como proyecto práctico en la clase de tecnología industrial de 2º de Bachillerato se nos planteó inicialmente el diseño y la construcción de un detector de metales utilizando Arduino uno, el cual habíamos utilizado en algunas prácticas anteriores para familiarizarnos con su funcionamiento y montaje. Me pareció un reto muy interesante a pesar de su dificultad, pero con la ayuda de nuestro profesor no ha resultado tener tanta dificultad como imaginaba. El código y el esquema de montaje le he sacado de un video que encontré en YouTube (dejaré el enlace al final del párrafo) y hemos tenido algunos problemas a la hora de encontrar los componentes porque no disponíamos de ellos en el taller de tecnología del instituto y tuvimos que sacarlos de un ordenador que no funcionaba. Con el circuito montado los problemas que tuvimos fueron con la bobina, al principio probamos una bobina grande que no era muy sensible, después fabricamos otra de menor tamaño pero su funcionamiento no era muy convincente. Decidimos fabricar otra bobina del tamaño de la primera con un número superior de espiras, pero seguía sin ser 100% efectiva, por eso decidimos finalmente fabricar otra del tamaño de la segunda, aumentando el número de espiras para aumentar el campo eléctrico y su funcionamiento no es el mas perfecto, pero para nosotros es suficiente.
Link video: https://youtu.be/orBxzw-kHtE

miércoles, 6 de marzo de 2019

Código arduino del detector de metales


#define SET(x,y) (x |=(1<<y))            //-Bit set / clear macros 
#define CLR(x,y) (x &= (~(1<<y)))         // | 
#define CHK(x,y) (x & (1<<y))             // | 
#define TOG(x,y) (x^=(1<<y))              //-+ 

unsigned long t0=0;         //-Ultima vez 
int t=0;                    //-Tiempo entre ints 
unsigned char tflag=0;      //-Indicador de medición flag 

float SENSITIVITY= 1000.0;  //-Adivina qué

//-Generar interrupción cada 1000 oscilaciones de la bobina de busqueda 
SIGNAL(TIMER1_COMPA_vect) 
{ 
  OCR1A+=1000; 
  t=micros()-t0; 
  t0+=t; 
  tflag=1; 
} 

void setup() 
{ 
  pinMode(13,OUTPUT);    //-bocina pin 
  digitalWrite(12,HIGH); //-NULL SW. pull up 
  //-Configurar el contador1 para contar en el pin 5 
  TCCR1A=0; 
  TCCR1B=0x07; 
  SET(TIMSK1,OCF1A); 
} 
//-Float ABS 
float absf(float f) 
{ 
  if(f<0.0) 
    return -f; 
  else 
    return f; 
} 

int   v0=0;  //-NULL value 
float f=0;   //-Medición value 
unsigned int FTW=0;    //-Click Tasa de generador 
unsigned int PCW=0;    //-Click Fase del generador 
unsigned long timer=0; //-Click timer 
void loop() 
{ 
   
  if(tflag) 
  { 
    if(digitalRead(12)==LOW)  //-Check NULL SW. 
      v0=t;                   //-Ejemplo de nuevo valor nulo 
    f=f*0.9+absf(t-v0)*0.1;   //-Promedio más de 10 muestras 
    tflag=0;                  //-Reset flag 

    float clf=f*SENSITIVITY;  //-Convertir la medición en frecuencia de clic 
    if(clf>10000)             
      clf=10000; 
    FTW=clf; 
  } 
   
  //-Click generator 
  if(millis()>timer) 
  { 
    timer+=10; 
    PCW+=FTW; 
    if(PCW&0x8000) 
    { 
      digitalWrite(13,HIGH); 
      PCW&=0x7fff; 
    } 
    else 
      digitalWrite(13,LOW); 
  } 
}

muestra de funcionamiento