Metal Detector

Published Sep 17, 2022
 24 hours to build
 Advanced

We can detect dark metals underground,Detecting underground caves or electric cables in order to know their path, or design at airport entrances to detect travelers who carry metals, or to detect the path of mineral water pipes.

display image

Components Used

AD623 Instrumentation Amplifiers
Instrumentation Amplifiers PDIP SINGLE SUPPLY RAIL-RAIL L/C IN AMP
1
TL062 Op Amps
Operational Amplifiers - Op Amps Dual Lw Pwr JFET Op
1
HCPL-3120 Optocoupler
Logic Output Opto-couplers 2.0A IGBT Gate Drive
1
CD4094 Counter Shift Register
Counter Shift Registers 8-Bit w/Latch
1
MCP3201 ADC 12-bit SPI
Analog to Digital Converters - ADC 12-bit SPI Sgl Chl
1
CD4051 Multiplexer Switch
Multiplexer Switch ICs 8-Channel Analog
1
IRF740 MOSFET
MOSFET 400V N-CH HEXFET
1
2N3905 Transistor
Bipolar Transistors - BJT PNP Gen Pur SS
1
1N4738A Diode
Zener Diodes 8.2V 1W Zener Diode
1
1N4746A Diode
Zener Diodes 18V 1W ZENER 5%
1
1N4739A Diode
Zener Diodes 9.1V 1W Zener Diode
1
Atmega32
Atmega32
1
555 Timer
555 Timer
1
CD4066 Analog Switch ICs Quad
CD4066 Analog Switch ICs Quad
1
7805 Voltage Regulator
7805 Voltage Regulator
1
ULN2803 Motor Driver
ULN2803A is a Darlington transistor array consisting of 8 NPN Darlington pairs.
1
Description

How I build the project?
1- I drew the circuit .

2- programed the Microcontroller .

/*******************************************************
This program was created by the
CodeWizardAVR V3.14 Advanced
Automatic Program Generator
© Copyright 1998-2014 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com

Project : 
Version : 
Date    : 25/01/2022
Author  : wafik rkab
Company : 
Comments: 


Chip type               : ATmega32A
Program type            : Application
AVR Core Clock frequency: 8.000000 MHz
Memory model            : Small
External RAM size       : 0
Data Stack size         : 512
*******************************************************/

#include <mega32a.h>
#include <iobits.h>
#include <string.h>
#include <stdio.h>
#include <delay.h>
#include <alcd.h>
#include <spi.h>
#include <i2c.h>
#include <math.h>
#include <stdlib.h>
#define TR2 PORTC.3
#define TR3 PORTC.0
#define TR4 PORTC.1
#define TR5 PORTC.2
#define SOUND PORTC.4
#define FREQ PIND.1
#define GB PIND.0
#define csResistor1 PORTB.0
#define csResistor2 PORTB.4
#define csSamp PORTB.1
#define csLevel PORTB.3
#define SDI PORTB.5  
#define CLK PORTB.7
////////////////////////////////////////
#define OUTEN PORTD.4
#define DISPDATA PORTD.5
#define DISPCLK PORTD.6
#define STROBE PORTD.7
unsigned char tmp;
int FreqVal=10000;
int power=160,delay=90,renage=160;
int actDelay,actPower;
char state=1,str[16],index=0,i=0;
unsigned int readSampAdc,readLevelAdc;
long int  sampTotal=0,levelTotal=0,sampAdc=0,levelAdc=0;
unsigned char sampCount=0,levalCount=0,sampHi,sampLow,levelHi,levelLow;

//void writeMCP4921(unsigned int data)
// {       
//    unsigned char l,h; 
//    PORTB.1=1;//CS1=1
//    PORTB.3=1;//LDAC=1 
//    PORTB.4=1;//CS0=1 
//    delay_ms(1);
//    PORTB.4=0;//CS0=0  
//    h=data>>8;
//    h=h|0x70; //0x50 vout=2*ref 0x70 vout=ref
//    l=data;
//    spi(h);
//    spi(l);
//    PORTB.4=1;//CS0=1 
//    PORTB.3=0;//LDAC=0
//    delay_ms(1);  
//    PORTB.3=1;//LDAC=1
// }

//unsigned int readMCP3201()
//{       
//    PORTB.1=1;//CS1=1
//    PORTB.1=0;//CS1=0
//    PORTB.4=1;//CS0=1 
//    hi = spi(0); 
//    low= spi(0);
//    hi = (hi & 0x0f);
//    adc =hi;
//    adc=adc<<8;
//    adc =adc|low;
//    //	dato = M0 / 16;
//    //	Va = (dato) * 5.0 / 4096.0/2.0;
//    return adc;
//}     

 //get samp.............................  
//interrupt [EXT_INT0] void ext_int0_isr(void)
//{  
// 
//  delay_us(4);
//    csLevel=1;
//    csResistor1=1;
//    csResistor2=1;
//    csSamp=1;//samp
//    csSamp=0;   
//    sampHi = spi(0); 
//    sampLow= spi(0);
//    sampHi = (sampHi & 0x0f);
//    readSampAdc =sampHi;
//    readSampAdc=readSampAdc<<8;
//    readSampAdc =readSampAdc|sampLow;    
//    sampAdc=readSampAdc;
//   // sampTotal=sampTotal+(long int)readSampAdc;
////    if(++sampCount==32)
////    {   
////        sampAdc=sampTotal>>5; 
////        sampCount=0;
////        sampTotal=0;  
////    }        
//}

interrupt [EXT_INT2] void ext_int2_isr(void)
{
   switch(index)
    {
        case 0:delay_us(75);break;
        case 1:delay_us(10);break;
        case 2:delay_us(20);break;
        case 3:delay_us(4);break;  
    } 
    csLevel=1;
    csResistor1=1;
    csResistor2=1;
    csSamp=1;
    csLevel=0;
    levelHi = spi(0); 
    levelLow= spi(0);
    levelHi = (levelHi & 0x0f);
    readLevelAdc =levelHi;
    readLevelAdc=readLevelAdc<<8;
    readLevelAdc =readLevelAdc|levelLow;
       levelAdc=readLevelAdc;
//    levelTotal=levelTotal+(long int)readLevelAdc;
//    if(++levalCount==32)
//    {   
//        levelAdc=levelTotal>>5; 
//        levalCount=0;
//        levelTotal=0;  
//    }      

}

interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{
    switch(state)
    {
       case 1:TR2=0;TR3=0;TR4=1;TR5=1;OCR1A=80; break;
       case 2:TR2=1;TR3=1;TR4=1;TR5=1;OCR1A=power; break; 
       case 3:TR2=1;TR3=0;TR4=1;TR5=1;OCR1A=delay; break;
       case 4:TR2=1;TR3=0;TR4=0;TR5=1;OCR1A=45; break;
       case 5:TR2=1;TR3=0;TR4=1;TR5=1;OCR1A=renage; break;
       case 6:TR2=1;TR3=0;TR4=1;TR5=0;OCR1A=45; break;
       case 7:TR2=1;TR3=0;TR4=1;TR5=1;OCR1A=(FreqVal-(80+power+delay+45+renage+45)); break;
    };
    if(++state==8)state=1;
}
      
//void writeResistor1(unsigned char  data)
//{    
// tmp=0xff; 
//    csSamp=1;  
//    csLevel=1;     
//    csResistor1=0;
//    tmp=data; 
//     tmp=tmp>>2;
//    spi(tmp); 
// csResistor1=1; 
//csResistor1=0;
//     tmp=data; 
//    tmp=tmp<<6;
//    spi(tmp);
//    csResistor1=1;
//}
//void send_data1(unsigned char data)
//{      char i;
//    PORTB.5=0;// sdi 
//    PORTB.4=1;//CS0=1 
//      PORTB.7=0;
//    PORTB.4=0;//CS0=1 
//    delay_ms(1);
//   PORTB.7=0;PORTB.5=0;delay_us(10); PORTB.7=1;  PORTB.7=0;PORTB.5=0;delay_us(10);PORTB.7=1; //clk 
//    for(i=7;i;i--)
//    { 
//       PORTB.7=0;
//         PORTB.5=0;// sdi
//         delay_us(10);
//     if(1<<i)PORTB.5=1;// sdi
//       PORTB.7=1;
//    }  
//    PORTB.5=0;// sdi
//    PORTB.7=0;
//    PORTB.4=1;//CS0=1
//    delay_ms(1); 
//}
//void send_data(int data)
//{
//    PORTB.5=0;// sdi
//    PORTB.4=0;//CS0=1 
//    PORTB.7=0;  PORTB.7=1;  PORTB.7=0;PORTB.7=1; //clk
//    spi(data);
//    PORTB.7=0;
//    PORTB.4=1;//CS0=1 
//}

void ShiftData(unsigned char Data1,unsigned char Data2,char sheft1ON,char sheft2ON)
{
    unsigned char i,Data;
    Data=(Data1)|(Data2<<4);
    Data= Data|0x88;  
    if(sheft1ON==1) Data= Data&0xf7; 
    if(sheft2ON==1) Data= Data&0x7f;
    OUTEN=0;
    STROBE = 0;
    DISPCLK = 0;
    DISPDATA = 0;	
    for(i = 0;i < 8;i++)
    {
        if(Data & 0x80) 
           DISPDATA = 1;
        else 
           DISPDATA = 0;
        DISPCLK = 1;	
        delay_us(4);
        DISPCLK = 0;
        Data = Data << 1;    
    }
    STROBE = 1;
    delay_us(4);
    STROBE = 0;
    OUTEN=1; 
}
void main(void)
{
unsigned int max=0,volt=10;
char ii=0,iii=0;
// Input/Output Ports initialization
// Port A initialization
// Function: Bit7=Out Bit6=Out Bit5=Out Bit4=Out Bit3=Out Bit2=Out Bit1=In Bit0=In 
DDRA=(1<<DDA7) | (1<<DDA6) | (1<<DDA5) | (1<<DDA4) | (1<<DDA3) | (1<<DDA2) | (0<<DDA1) | (1<<DDA0);
// State: Bit7=0 Bit6=0 Bit5=0 Bit4=0 Bit3=0 Bit2=0 Bit1=T Bit0=T 
PORTA=(0<<PORTA7) | (0<<PORTA6) | (0<<PORTA5) | (0<<PORTA4) | (0<<PORTA3) | (0<<PORTA2) | (1<<PORTA1) | (1<<PORTA0);

// Port B initialization
// Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In 
DDRB=(1<<DDB7) | (0<<DDB6) | (1<<DDB5) | (1<<DDB4) | (1<<DDB3) | (0<<DDB2) | (1<<DDB1) | (1<<DDB0);
// State: Bit7=P Bit6=P Bit5=P Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T 
PORTB=(1<<PORTB7) | (1<<PORTB6) | (1<<PORTB5) | (1<<PORTB4) | (1<<PORTB3) | (1<<PORTB2) | (1<<PORTB1) | (1<<PORTB0);

// Port C initialization
// Function: Bit7=Out Bit6=Out Bit5=Out Bit4=Out Bit3=Out Bit2=Out Bit1=Out Bit0=Out 
DDRC=(1<<DDC7) | (1<<DDC6) | (1<<DDC5) | (1<<DDC4) | (1<<DDC3) | (1<<DDC2) | (0<<DDC1) | (1<<DDC0);
// State: Bit7=0 Bit6=0 Bit5=0 Bit4=0 Bit3=0 Bit2=0 Bit1=0 Bit0=0 
PORTC=(0<<PORTC7) | (0<<PORTC6) | (0<<PORTC5) | (1<<PORTC4) | (0<<PORTC3) | (0<<PORTC2) | (1<<PORTC1) | (0<<PORTC0);

// Port D initialization
// Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In 
DDRD=(1<<DDD7) | (1<<DDD6) | (1<<DDD5) | (1<<DDD4) | (0<<DDD3) | (0<<DDD2) | (0<<DDD1) | (0<<DDD0);
// State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T 
PORTD=(0<<PORTD7) | (0<<PORTD6) | (0<<PORTD5) | (0<<PORTD4) | (1<<PORTD3) | (1<<PORTD2) | (1<<PORTD1) | (1<<PORTD0);

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=0xFF
// OC0 output: Disconnected
TCCR0=(0<<WGM00) | (0<<COM01) | (0<<COM00) | (0<<WGM01) | (0<<CS02) | (0<<CS01) | (0<<CS00);
TCNT0=0x00;
OCR0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 2000.000 kHz
// Mode: CTC top=OCR1A
// OC1A output: Disconnected
// OC1B output: Disconnected
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer Period: 0.5 us
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: On
// Compare B Match Interrupt: Off
TCCR1A=(0<<COM1A1) | (0<<COM1A0) | (0<<COM1B1) | (0<<COM1B0) | (0<<WGM11) | (0<<WGM10);
TCCR1B=(0<<ICNC1) | (0<<ICES1) | (0<<WGM13) | (1<<WGM12) | (0<<CS12) | (1<<CS11) | (0<<CS10);
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer2 Stopped
// Mode: Normal top=0xFF
// OC2 output: Disconnected
ASSR=0<<AS2;
TCCR2=(0<<PWM2) | (0<<COM21) | (0<<COM20) | (0<<CTC2) | (0<<CS22) | (0<<CS21) | (0<<CS20);
TCNT2=0x00;
OCR2=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=(0<<OCIE2) | (0<<TOIE2) | (0<<TICIE1) | (1<<OCIE1A) | (0<<OCIE1B) | (0<<TOIE1) | (0<<OCIE0) | (0<<TOIE0);

// External Interrupt(s) initialization
// INT0: On
// INT0 Mode: Falling Edge
// INT1: Off
// INT2: On
// INT2 Mode: Falling Edge
GICR|=(0<<INT1) | (1<<INT0) | (1<<INT2);
MCUCR=(0<<ISC11) | (0<<ISC10) | (1<<ISC01) | (0<<ISC00);
MCUCSR=(0<<ISC2);
GIFR=(0<<INTF1) | (1<<INTF0) | (1<<INTF2);
 // External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// INT2: On
// INT2 Mode: Falling Edge
GICR|=(0<<INT1) | (0<<INT0) | (1<<INT2);
MCUCR=(0<<ISC11) | (0<<ISC10) | (0<<ISC01) | (0<<ISC00);
MCUCSR=(0<<ISC2);
GIFR=(0<<INTF1) | (0<<INTF0) | (1<<INTF2);

// USART initialization
// USART disabled
UCSRB=(0<<RXCIE) | (0<<TXCIE) | (0<<UDRIE) | (0<<RXEN) | (0<<TXEN) | (0<<UCSZ2) | (0<<RXB8) | (0<<TXB8);

// Analog Comparator initialization
// Analog Comparator: Off
// The Analog Comparator's positive input is
// connected to the AIN0 pin
// The Analog Comparator's negative input is
// connected to the AIN1 pin
ACSR=(1<<ACD) | (0<<ACBG) | (0<<ACO) | (0<<ACI) | (0<<ACIE) | (0<<ACIC) | (0<<ACIS1) | (0<<ACIS0);


// ADC initialization
// ADC disabled
ADCSRA=(0<<ADEN) | (0<<ADSC) | (0<<ADATE) | (0<<ADIF) | (0<<ADIE) | (0<<ADPS2) | (0<<ADPS1) | (0<<ADPS0);


// SPI initialization
// SPI Type: Master
// SPI Clock Rate: 2000.000 kHz
// SPI Clock Phase: Cycle Start
// SPI Clock Polarity: Low
// SPI Data Order: MSB First
SPCR=(0<<SPIE) | (1<<SPE) | (0<<DORD) | (1<<MSTR) | (0<<CPOL) | (0<<CPHA) | (0<<SPR1) | (0<<SPR0);
SPSR=(0<<SPI2X);
// TWI initialization
// Mode: TWI Master
// Bit Rate: 100 kHz
TWCR=(0<<TWEA) | (0<<TWSTA) | (0<<TWSTO) | (0<<TWEN) | (0<<TWIE);

lcd_init(20);

// Bit-Banged I2C Bus initialization
// I2C Port: PORTD
// I2C SDA bit: 5
// I2C SCL bit: 6
// Bit Rate: 100 kHz
// Note: I2C settings are specified in the
// Project|Configure|C Compiler|Libraries|I2C menu.
i2c_init();

SOUND=1;
//////lcd initial//////////////////////////////
lcd_gotoxy(0,0);lcd_putsf("_FRQ100 Coil:110X110");               
lcd_gotoxy(0,1);lcd_putsf("METAL");lcd_gotoxy(11,1);lcd_putsf("LEVEL");
lcd_gotoxy(0,3);lcd_putsf(")))))))))))");
//////////////////////////////////////////////
ShiftData(0,0,1,0) ;
#asm("sei")
//writeResistor(0xff);
//writeResistor(50);
//for(ii=0;ii<255;ii++){ShiftData(ii) ; delay_ms(100);}
      
while (1)
  {      
   ShiftData(ii,ii,1,0) ;
   delay_ms(10); 
   ii++;
   if(ii==8)ii=0;
    ltoa(sampAdc,str);
    lcd_gotoxy(5,1);
    lcd_putsf("    ");
    lcd_gotoxy(5,1);
    lcd_puts(str); 
         ltoa(levelAdc,str);
    lcd_gotoxy(16,1);
    lcd_putsf("    ");
    lcd_gotoxy(16,1);
    lcd_puts(str);
delay_ms(50); 
 // ShiftData(7,ii,1,1) ;
 //...........................................
//    if(!GB)
//    {     #asm("sei")
//          max=0;iii=0;writeResistor(150);
//          lcd_clear();
//          for(delay=40;delay<160;delay++)
//          {          
//           // delay_ms(12);  
//            for(power=40;power<160;power++)
//            { 
//              //  delay_ms(12); 
//                if((unsigned int)lastAdc>max)
//                {
//                  max=lastAdc; 
//                  actPower=power;
//                  actDelay=delay;
//                }   
//                itoa(max,str); 
//                lcd_gotoxy(0,1);  
//                lcd_puts(str); 
//            } 
//            if(++ii==8){lcd_gotoxy(iii,0);lcd_putchar('>');iii++;ii=0;}
//          } 
//          power=actPower;
//          delay=actDelay; 
//          while(((4096-(unsigned int)lastAdc)<400)||((4096-(unsigned int)lastAdc)>600))
//          {
//              if((4096-(unsigned int)lastAdc)<400) 
//              {    
//                #asm("cli")
//                 if(--volt<10)volt=10;
//                 writeResistor(volt);  
//                 ltoa(lastAdc,str);
//    lcd_gotoxy(6,1);
//    lcd_putsf("    ");
//    lcd_gotoxy(6,1);
//    lcd_puts(str); 
//                #asm("sei") 
//                delay_ms(12); 
//              }
//              if((4096-(unsigned int)lastAdc)>600)
//              { 
//                #asm("cli")
//                 if(++volt>200)volt=200;
//                 writeResistor(volt);
//                 ltoa(lastAdc,str);
//    lcd_gotoxy(6,1);
//    lcd_putsf("    ");
//    lcd_gotoxy(6,1);
//    lcd_puts(str);   
//                #asm("sei")
//                delay_ms(12); 
//              }  
//          }
//    }
    if(!FREQ)
    {
         if(++index==4)index=0; 
         switch(index)
         {
            case 0:
                FreqVal=10000;
                lcd_gotoxy(0,0);
                lcd_putsf("_FRQ100 Coil:110X110");
            break;
            case 1:
                FreqVal=8333;
         
                lcd_gotoxy(0,0);
                lcd_putsf("_FRQ120 Coil:110X110");
            break;
            case 2:
                FreqVal=5882; 
       
                lcd_gotoxy(0,0);
                lcd_putsf("_FRQ170 Coil:110X110");
            break;
            case 3:
                FreqVal=1818;
          
                lcd_gotoxy(0,0);
                lcd_putsf("_FRQ550 Coil:45X45  ");
            break;
         }     
         while(!FREQ);
    }
  }
}

3- made simulations,edited the program and made sure it was correct

4- I drew a PCB



5- I installed the electronic components

6- I finshed ...

Downloads

Bill Of Materials Gpulse_patren1 Download

Institute / Organization

TECHNICAL COMPUTER COLLAGE TCC
Comments
Ad