| (40 intermediate revisions by one user not shown) | |||
| Line 1: | Line 1: | ||
| + | [[File:PicoDetector.jpg|thumb|PicoDetector running on a bread board]] | ||
| + | How to detect metal with a PIC and a few components ? | ||
| + | |||
| + | ==PicoDetector : a PIC-based simple and cheap metal detector== | ||
| + | A short video clip is sometimes better than a long explanation : | ||
| + | {{#ev:youtube|usPjDbKQkRw}} | ||
| + | |||
| + | 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 [[wikipedia:Metal detector|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== | ||
[[File:PicDetector-metal-detector-circuit-schematic.png]] | [[File:PicDetector-metal-detector-circuit-schematic.png]] | ||
| − | + | * 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== | ||
| + | <pre> | ||
/* | /* | ||
******************************************************************************* | ******************************************************************************* | ||
| Line 144: | Line 164: | ||
} | } | ||
} | } | ||
| + | </pre> | ||
| + | ==Download project== | ||
| + | Download picoDetector_project.ZIP file for mikroC : [[File:PicoDetector-project.zip]] | ||
| + | |||
| + | Includes : | ||
| + | * [[mikroC PRO]] project files for [[PIC12F683]], should work also with most of PIC | ||
| + | * picoDetector C source code | ||
| + | * picoDetector .HEX files | ||
| − | </ | + | ==Discussion and comments== |
| + | {{#w4grb_rate:}} | ||
| + | <discussion /> | ||
| + | [[Category:Projects]] | ||
| + | [[Category:PIC12]] | ||
How to detect metal with a PIC and a few components ?
Contents |
A short video clip is sometimes better than a long explanation :
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.
/*
*******************************************************************************
* 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 picoDetector_project.ZIP file for mikroC : File:PicoDetector-project.zip
Includes :
Current user rating: 79/100 (142 votes)
| powered by commenterra | Recent comments |