www.micro-examples.com : PicoDetector

Views
From www.micro-examples.com
(Difference between revisions)
Jump to: navigation, search
 
(6 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 ?
 
How to detect metal with a PIC and a few components ?
  
 
==PicoDetector : a PIC-based simple and cheap metal detector==
 
==PicoDetector : a PIC-based simple and cheap metal detector==
Let me introduce PicoDetector to you with this short video clip :
+
A short video clip is sometimes better than a long explanation :
 
{{#ev:youtube|usPjDbKQkRw}}
 
{{#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 depends on presence of metal near the coil, just like in a classic metal detector.
+
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.
 
To detect changes of main oscillator frequency, we use the PIC watchdog as internal time reference.
Line 16: Line 17:
 
[[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.
 
* 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 LED, replace with two classic LEDs if you don't have one.
+
* D1 is a dual color LED, replace with two classic LEDs if you don't have one.
  
 
==C Source code==
 
==C Source code==
Line 174: Line 175:
  
 
==Discussion and comments==
 
==Discussion and comments==
 +
{{#w4grb_rate:}}
 
<discussion />
 
<discussion />
 
[[Category:Projects]]
 
[[Category:Projects]]
 
[[Category:PIC12]]
 
[[Category:PIC12]]

Latest revision as of 21:44, 12 February 2012

PicoDetector running on a bread board

How to detect metal with a PIC and a few components ?

Contents

PicoDetector : a PIC-based simple and cheap metal detector

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.

Circuit Schematic

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

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

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

Current user rating: 79/100 (142 votes)

 You need to enable JavaScript to vote

You need JavaScript enabled for viewing comments

Navigation
Others
Donation
You can help :
with Paypal
Share
Personal tools
www.micro-examples.com Electronic circuits with micro-controllers, projects with source code examples