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 PIC oscillator circuit, by replacing the crystal by a coil: the frequency of the oscillator then depends on presence of metal near the coil, just like in a classic metal detector.
To detect changes of main oscillator frequency, we use the PIC watchdog as internal time reference.
By comparing both oscillators frequencies, we can know if a piece of metal is near the coil, and then light a LED.
It shares the same idea as PicoBat, the ultrasonic bat detector.
Circuit Schematic
PicoDetector circuit schematic
- Coil L1 replaces crystal in PIC oscillator circuit: try with the coils you have to find the best one! If calibrate LED blinks on power up, it works.
- D1 is a dual color LED, replace with two classic LEDs if you don't have one.
C Source Code
picoDetector.c
/* ******************************************************************************* * 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:
Includes:
- mikroC PRO project files for PIC12F683, should work also with most PIC
- picoDetector C source code
- picoDetector .HEX files