PicoDetector
A PIC-based simple and cheap metal detector
How to detect metal with a PIC and a few components?
Overview
A short video clip is sometimes better than a long explanation:
How it works
The idea of this circuit is to hack the PIC oscillator circuit by replacing the crystal with a coil: the frequency of the oscillator then depends on the presence of metal near the coil, just like in a classic metal detector.
To detect changes in the main oscillator frequency, we use the PIC watchdog as an internal time reference.
By comparing the frequencies of both oscillators, we can know if a piece of metal is near the coil, and then light an LED.
It shares the same idea as PicoBat, the ultrasonic bat detector.
Circuit Schematic
- Coil L1 replaces the crystal in the PIC oscillator circuit: try the coils you have to find the best one! If the calibrate LED blinks on power-up, it works.
- D1 is a dual-color LED; replace it with two classic LEDs if you don't have one.
C Source Code
/*
*******************************************************************************
* picoDetector : an ultra simple and cheap metal detector
*******************************************************************************
*
* Author : Bruno Gavand, april 2009
* see more details on http://www.micro-examples.com/
*
* source code for mikroC PRO compiler V1.65
* feel free to use this code at your own risks
*
* target : PIC12, oscillator in HS mode, watchdog enabled
*
* PIC PIN Assignemnt :
*
* GP0 : detect LED indicator
* GP1 : calibrate LED indicator
* GP2 : NC
* GP3 : NC
* GP4, GP5 : inductor
*
*******************************************************************************
*/
#define MAXTRY 15 // number of watchdog restart to calibrate loop counter
unsigned char ctr; // number of loops between two watchdog resets
unsigned char previous; // previous value of ctr
unsigned char calibr; // calibration value when oscillator runs free
unsigned char restarts; // number of watchdog restarts
unsigned char en; // enable flag, allows detection
/*
* main loop
*/
void main()
{
unsigned char i;
/*
* configure GPIO as digital port
*/
CMCON0 = 7;
ANSEL = 0;
TRISIO = 0;
GPIO = 0;
/*
* power up?
*/
if(STATUS.NOT_TO)
{
/*
* yes, init variables
*/
restarts = 0;
calibr = 1;
}
/*
* watchdog reset counter
*/
if(restarts < 255) restarts++;
/*
* if counter differs too much from calibration value
*/
if((previous ^ ctr) > calibr)
{
/*
* turn detect LED on
*/
GPIO.F0 = en;
/*
* if not on power up
*/
if(STATUS.NOT_TO == 0)
{
/*
* while in calibration mode
*/
if(restarts < MAXTRY)
{
/*
* shift calibration value
* and wait a little bit
*/
calibr <<= 1;
Delay_ms(5);
}
}
else
{
/*
* turn detect LED off
*/
GPIO.F0 = 0;
}
}
/*
* save last counter
*/
previous = ctr;
/*
* is calibration over?
*/
if(restarts > MAXTRY)
{
/*
* yes, turn calibrate LED off
* and set enable flag
*/
GPIO.F1 = 0;
en = 1;
}
else
{
/*
* no, turn calibrate LED on
* and clear enable flag
*/
GPIO.F1 = 1;
en = 0;
}
/*
* set watchdog prescaler
*/
OPTION_REG = 0b11111001;
/*
* start counter, to be interrupted by watchdog
*/
ctr = 0;
for(;;)
{
ctr++;
}
}
Download project
PicoDetector project files
Download picoDetector_project.ZIP file for mikroC:
PicoDetector-project.zip (ZIP, 9 KB)
Includes:
- mikroC PRO project files for PIC12F683, should work also with most PIC
- picoDetector C source code
- picoDetector .HEX files