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);
}
}
Genioo! Gracias por tus aportes!! Saludos desde Argentina
ResponderEliminarExcelentes tus proyectos y tus videos gracias desde México.
ResponderEliminarExcelente 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.
ResponderEliminarPerdón por no responder antes.
EliminarNo se puede. Los detectores BFO no hay forma que distingan más metales. Lo siento
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?
ResponderEliminarWould it be possible to see a photo of your version so I can see where everything is installed? Thanks
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.
Eliminari 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 😅
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!
EliminarHi El-Yeti. I have been adapting your work into an SMD version so that it can be produced with all the components in place.
ResponderEliminarhttps://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