Aquí está la nueva versión del pinpointer YFM. Se trata del YFM2, es un cambio completo del código de la versión anterior, la cual medía la frecuencia con la biblioteca FreqCount.h, Esta nueva versión lo hace mediante interrupciones externas lo cual lo hace compatible con todos los mictrocontroladores compatibles con éste tipo de interrupciones, y a su vez compatibles con la IDE de arduino como son los Atmega, Attiny, ESP, TSM....






En éste caso lo he hecho con un Attiny85 a 20MHz, por lo demás el circuito es cas igual a la versión anterior, solo cambia que ahora estoy usando un regulador de 3.3v y eso acarrea una serie de pequeñas modificaciones: 

    Le he puesto un transistor para amplificar el sonido del buzzer, pesto que a 3.3v suena muy poco.

    Le he bajado a 1K el valor de la resistencia de la base del transistor que amplifica la señal del oscilador.

Si vas ha hacerlo con Attiny85 igual que yo es IMPORTANTE que uses el mismo AttinyCore que recomendé en el video en el que enseño ha programar el Attiny85:



Esta versión se puede cargar en un arduino perfectamente, solo hay que cambiar el pin del buzzer por el que quieras y colocar la salida del oscilador en el pin digital 2 de Arduino (de hecho si pones un puente entre el pin 2 y el 5 funcionan las dos versiones).

Ésta versión necesita calibrar una variable del código para que pueda medir la frecuencia con la maxima precisión. Esta variable la encontrarás en el código como:

    const int L=510;//numero de ciclos que mide

La variable "L" de forma predeterminada está asignada con el valor 2500. Esto significa que el micro lee 2500 ciclos de la frecuencia cada vez que mide frecuencia. Cuanto mas alto sea el valor de L mas precisa será la lectura y mas sensibilidad tendrá el detector, pero también será mas lento y mas sensible a los cambios de temperatura.


Pdeis descargar el archivo gerber de la placa en proyectos compartidos de PCBWAY: https://www.pcbway.com/project/shareproject/YFM2_pinpointer_detector_de_metales.html

 Podeis encontrar los archivos para imprimir en 3D aquí: https://www.thingiverse.com/thing:4671629


//////////CODIGO debugeado en 5/11/2020 /////////

// Última actualización 12/12/2020 Consumo reducido


// Funciona con arduino y con attiny85 a 16/20MHZ con cristal y con el gestor de dispositivos ATTinyCore de https://github.com/SpenceKonde/ATTinyCore

//Detector de metales YFM Pinpointer 2 tonos

// Hardware y software implementados por Hector Santos ("El yeti" en youtube) 

// https://yeti-lab.blogspot.com/

//YFM v2.1 interrupt 24/8/2020

// Entrada D2, Buzzer D12



bool start=true;

volatile int buff=0;

unsigned long frq=0;

int resta=0;

int sens=3; // sensibilidad     *** cuanto mayor el nmero menor sensibilidad

int autoBalance=0;

bool AB=true;

volatile long frecuencia;

int contador=0;

long unsigned long T;

const int L=2000;//numero de ciclos que mide    **** cuanto mayor inductancia mentor el numero

volatile int intensidad=0;

volatile bool Fe=false;

bool Max=false;

volatile bool balanceInicial=true;

const int tonoFe = 500; 

const int tonoNoFe = 900;

  

 void interrupcion(){

  contador++;

  if(contador==1)T=micros();

  else if(contador>=L){ //numero de ciclos que mide    **** cuanto mayor inductancia mentor el numero

    contador=0;

    frq=T-micros();

    if(start){frecuencia=frq;

      start=false;

    }  

    else if(frq <(frecuencia-1)){frecuencia=frecuencia-1; // Esto hace la lectura mucho mas estable pero tiene mucha inercia

          if(Max && !balanceInicial)frecuencia=frecuencia-(intensidad/3); // elimina la inercia

    }

    else if(frq >(frecuencia+1)){frecuencia=frecuencia+1;

          if(Max && !balanceInicial)frecuencia=frecuencia+(intensidad/3);

    }

    

//////////////////////////////////////////////////////////////////////////////////////////////////////

 

 

  resta=buff-frecuencia; 

  

  if(resta>=0){               // Metales ferrosos

    intensidad=resta;      //la variable "intensidad" es para el loop

    Fe=true;               //la variable "Fe" es para el loop

    if(intensidad>3)Max=true;

    else Max=false;


  }

  

  else if(resta< 0){        // Metales no-ferrosos

    intensidad=-resta;

    Fe=false;

    if(intensidad>3)Max=true;

    else Max=false;

  }


  }

  }


  

void setup() {

  bitWrite(ACSR,ACD,1); //Deshabilita el comparador

  bitWrite(ADCSRA,ADEN,0); // Deshabilita el ADC para ahorrar enetgía

   // Habilita interrupciones

  attachInterrupt(digitalPinToInterrupt(2),interrupcion,FALLING);//flanco de bajada FALLING, flanco de subida RISING

  delay(100);

  pinMode (0,OUTPUT);                      // Balance

  for(int i=0;i<2;i++){

   tone(0,500,40);

   delay(60);

    if(frecuencia != buff){i=0; buff=frecuencia;}

    }

   tone(0,1000,40);

   delay(40);

   balanceInicial=false;

 }


void loop() {

  AB=true;

  if(intensidad>sens && Fe){   //Metales ferrosos

   tone(0,tonoFe,40);

   delay(40);

   delay(40-(constrain(intensidad,10,40)));

   AB=false; //para resetear el autobalance

  }

  else if(intensidad>sens && !Fe){    //Metales no ferrosos

    tone(0,tonoNoFe,40);

    delay(40);

    delay(40-(constrain(intensidad,10,40))); 

    AB=false; //para resetear el autobalance

  }

  

if(true){                     // auto Balance

  

  if(AB && intensidad !=0){   

    if(autoBalance>1000){autoBalance=0; buff=frecuencia;}

    autoBalance++;

    }else autoBalance=0;

    delay(1);

}


}

Comentarios

  1. Genioo! Gracias por tus aportes!! Saludos desde Argentina

    ResponderEliminar
  2. Excelentes tus proyectos y tus videos gracias desde México.

    ResponderEliminar
  3. Excelente proyecto yeti felicitaciones desde chile, consulta, es posible agregar un tercer tono?, es decir uno para metales ferrosos (chatarra), un segundo para metales de conductividad media y un tercero para metales de conductividad alta.estuve jugando con el codigo anterior pero no tuve resultados.

    ResponderEliminar
    Respuestas
    1. Perdón por no responder antes.
      No se puede. Los detectores BFO no hay forma que distingan más metales. Lo siento

      Eliminar
  4. Hello, I have a question. On the back of the PCB there is AMS117 and HT7333 - but I can't see where the HT7333 should be installed?

    Would it be possible to see a photo of your version so I can see where everything is installed? Thanks

    ResponderEliminar
    Respuestas
    1. I made a version of the pcb with both regulators, the ams117 and the ht7333, the idea was to place only one of them and I published that version leaving only the ams117.
      i think the ht7333 is better but i haven't tried it. I don't know where you got the PCB from, maybe that version leaked or I forgot to erase it 😅

      Eliminar
    2. That makes sense, thank you very much for all of your hard work - I will try the ht7333 as an experiment and see if its good!

      Eliminar
  5. Hi El-Yeti. I have been adapting your work into an SMD version so that it can be produced with all the components in place.

    https://oshwlab.com/psp-links/yfm2_copy

    I'm fairly confident I have made no mistakes in adapting your work, but (if it's not too much to ask) wondered if you could quickly advise me to if anything is wrong?

    Thanks again

    ResponderEliminar

Publicar un comentario