PY-one es el pinpointer que desarrollamos entre PicBenc y yo, es de inducción de pulsos y compatible con la carcasa del detector chino GP-pointer, el cual suele fallar a las pocas horas de uso.
Éste pinpointer es muy estable, de reacción muy rápida y fácil de armar. tiene un botón pulsador que sirve para apagarlo y encenderlo y está controlado con un attiny85 el cual se programa a través de arduino uno con la IDE de arduino.
Así mismo para la bobina emplea la misma ferrita y el mismo alambre que trae el GP pointer, pero hay que rebobinarlo ya que PY-one solamente necesita 45 vueltas de alambre de cobre.
caso que no dispongas de in GP pointer roto para aprovechar estos componentes es viable usar una barra de ferrita mas fina (reciclada de una vieja radio AM por ejemplo), o se puede hacer una bobina circular plana sin núcleo, en este caso sería útil para detectar monedas a corta distancia, pero perdería sensibilidad a objetos menores. sería útil para otras aplicaciones como buscar clavos en la madera.
precauciones:
Es necesario usar los condensadores mas pequeños posible para que quepan en la carcasa.
La batería ha de desconectarse cuando no se usa, ya que hay una pequeña corriente de fuga que la terminaría vaciando en unas semanas.
Está configurado el apagado automático 2 minutos después de la ultima pulsación del botón, así pulsación corta pone a 0 el contador del apagado automático y pulsación larga apaga. luego se enciende con otra pulsación.
El sofware está sujeto a mejoras así que agradecería sugerencias de funcionamiento.
Para cargar el código al attiny85 hay que hacerlo a través de un arduino uno y arduino IDE preferentemente usando las instrucciones que se detallan en este video: https://youtu.be/Ym22jfWXSeoHay que usar el oscilador interno de 8Mhz y habilitar micros().
Links:
El proyecto en easyeda: https://oshwlab.com/Hectorin/pi-lotus-gp
Archivos 3D para la carcasa: https://www.thingiverse.com/thing:5359310
descarga del codigo aquí.
código:
////Pi-one v1.2.2by Yeti-lab versión Dinámica////
////En esta versión añadí cambios de tono segun la distancia y aumenté la velocidad del estabilizado.
///// Sketch implementado por Hector Santos Yeti-lab////
//// Ultima actualización 21/12/2023////
////https://yeti-lab.blogspot.com/////
uint8_t timeOut=10; // Minutos para que se apague automaticamente
int sCont=0; //Contador de segundos
int lCont=1; //contador de vueltas
int tono=500; //el sonido de detección
int base=512;
bool timeOver=false;
uint8_t pulso=100; //funciona bien con 50
int sens=100; //Lectura estabilizada
uint8_t retardo=30; //funciona bien con 25
int referencia; // referencia de lectura
uint8_t limite=8; //Sensibilidad
int LA; // Lectura Analogica
uint8_t Frecuencia=150; // Frecuencia en Hz
uint8_t contSleep=0;
unsigned long tiempoPerdido=0;
const uint8_t Buzzer=0; // Pin Buzzer pasivo
const uint8_t pinOff=1; // Pin Transistor opamp
const uint8_t pinPulso=4; //Pin salidad de pulsos
const uint8_t AnalogIn=A3; // Pin de entrada analogica
const uint8_t boton=2;
const uint8_t Reset=5;
void setup() {
bitWrite(ACSR,ACD,1);//deshabilito el comparador para ahorrar energía
pinMode(boton,INPUT_PULLUP);
pinMode(Reset,INPUT_PULLUP);
pinMode(pinOff,OUTPUT);
pinMode(Buzzer,OUTPUT);
pinMode(pinPulso,OUTPUT);
digitalWrite(pinPulso,LOW);
tiempoPerdido=micros();
}
void loop() {
a_dormir();
int p=0;
digitalWrite(pinOff,HIGH);
while(1){
tiempoPerdido=micros(); ///Inicia el contador para ajustar la frecuencia
if (lCont==Frecuencia){
lCont=1;
sCont++;
}else lCont++;
if(sCont > timeOut*60)timeOver=true;
if(timeOver){
timeOver=false;
sCont=0;
a_dormir();
}
if(!digitalRead(boton)){
contSleep++;
if(sCont>1){
noTone();
tone(Buzzer,1500,50);
sCont=0;
}
if(contSleep>Frecuencia/2 ){ //La Frecuencia corresponde al nº de vuentas que da el loop por segundo
contSleep=0;
a_dormir();
}
}else contSleep=0;
bitWrite(PORTB,pinPulso,HIGH);
delayMicroseconds(pulso);
bitWrite(PORTB,pinPulso,LOW);
delayMicroseconds(retardo); //Espera para la lectura
LA=analogRead(AnalogIn);
LA=LA+analogRead(AnalogIn);
if(LA>sens){
if(LA>sens-Frecuencia/2)sens=sens+5;//Acelera la estabilización
else sens++; // estabilización lectura analogica
}
else if(LA<sens){
if (LA<sens-Frecuencia/2)sens=sens-5;
else sens--;
}
int diferencia=0;
int sonido;
if (sCont<2)base=referencia; // establece el tono lejano
else{
diferencia=base-sens;
diferencia=constrain(diferencia,0,600);
sonido=diferencia;
}
p++;
if(p>3){
p=0;
if(sens<referencia-limite){
if(!contSleep) tone(Buzzer,tono+sonido,100); //Genera tono
referencia=sens+2; // Balance dinamico
}
if(sens>referencia+limite)referencia=sens-2; // Balance dinamico
}
delayMicroseconds((1000000/Frecuencia)-(micros()-tiempoPerdido)); // 1.000.000/Frecuencia=Periodo en microsegundos
}
}
void interrupcion(){
return 0;
}
void a_dormir(){
digitalWrite(pinOff,LOW);
tone(Buzzer,1000,500);
delay(2000);
marca1:;
pinMode(pinOff,INPUT); /// pingo pines en modo alta impedancia
pinMode(Buzzer,INPUT);
pinMode(pinPulso,INPUT);
byte adcsra = ADCSRA; //se guarda la configuración de estos registros
byte mcucr = MCUCR;
byte prr = PRR;
bitWrite(ADCSRA,ADEN,0); //Deshabilita el ADC
PRR= B00001111; ///apaga timers,adc y detector de baja tención
MCUCR=B00110000;//Habilita la durmia y define el tipo
attachInterrupt(0,interrupcion,LOW);//Habilita interrupción externa
//Instrucciones de ensamblador en linea
asm( "sei" );//habilita interrupciones
asm("sleep");//pone a dormir
////////DESPIERTA///////
PRR=prr;///enciende timers,adc y detector de baja tención
MCUCR=mcucr;//Deshabilita la durmia
ADCSRA=adcsra; //Habilita el ADC
detachInterrupt(0); //Deshabilita la interrupción externa
analogRead(AnalogIn);//Lectura fallida
digitalWrite(pinOff,HIGH);
timeOver=false;
sCont=0;
pinMode(pinOff,OUTPUT);
pinMode(Buzzer,OUTPUT);
pinMode(pinPulso,OUTPUT);
delay(20);
if(digitalRead(boton))goto marca1;
tone(Buzzer,1000,500);
delay(1000);
}
////////FIN de la versión dinámica////////
Excelente Hector! Voy a empezar a hacerlo cuanto antes, gracias por compartirlo. Saludos desde Argentina!
ResponderEliminardonde se puede descargar los archivo gerver para realizar el proyecto, ya que los enlaces de yuotube no funcionan.. gran trabajo
ResponderEliminarsaludos desde madrid
El enlace está en el blog, es éste: https://oshwlab.com/Hectorin/pi-lotus-gp
EliminarTienes que entrar en el editor y ahí te dejará generar el gerber
podrias aclararme , perdona mi inorancia, tienes el lotus y el one son iguales , o que diferencia hay , ya que me descargado el gerber de one y los archivos son del lotus ,, no entiendo ,, son proyectos distintos, o el one es actualizacion del lotus...
Eliminargracias y perdona las molestias.
Disculpa el lío, inicié el proyecto llamándolo pi-lotus porque tenía intención de hacer un pinpointer con plato sumergible, pero más tarde lo llamé One y cambié un poco de rumbo.
EliminarEs posible que se me quedó el nombre de Lotus en algún sitio pero es el mismo proyecto
gracias por contestar y aclarar , me regiré sobre el blog del one, y tus publicaciones de YouTube que seguiré, haber si lo consigo hacer funcionar..
Eliminarun saludo
por cierto se puede hablar con tigo por privado movil ,correo , para consultar y aclararme cosas.. si lo necesitara..
Por supuesto, yo encantado de ayudar a la gente a hacer los proyectos siempre que disponga de tiempo. Puedes encontrarme en Telegram @el_yeti
Eliminar