www.micro-examples.com : PicoDetector

Views
From www.micro-examples.com
(Difference between revisions)
Jump to: navigation, search
 
 
(41 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>
 +
/*
 +
*******************************************************************************
 +
* 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++ ;
 +
              }
 +
        }
 +
</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]]

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