PY-one pinpointer casero compatible con la carcasa de GP pointer

 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////////

Comentarios

  1. Excelente Hector! Voy a empezar a hacerlo cuanto antes, gracias por compartirlo. Saludos desde Argentina!

    ResponderEliminar
  2. donde se puede descargar los archivo gerver para realizar el proyecto, ya que los enlaces de yuotube no funcionan.. gran trabajo
    saludos desde madrid

    ResponderEliminar
    Respuestas
    1. El enlace está en el blog, es éste: https://oshwlab.com/Hectorin/pi-lotus-gp
      Tienes que entrar en el editor y ahí te dejará generar el gerber

      Eliminar
    2. 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...
      gracias y perdona las molestias.

      Eliminar
    3. 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.
      Es posible que se me quedó el nombre de Lotus en algún sitio pero es el mismo proyecto

      Eliminar
    4. 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..

      un saludo

      por cierto se puede hablar con tigo por privado movil ,correo , para consultar y aclararme cosas.. si lo necesitara..

      Eliminar
    5. 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

Publicar un comentario