Металлоискатель на Arduino

Металлоискатель на Arduino


Металлоискатель на Arduino

Датский инженер Dzl, вместе со своим сыном собрали себе металлоискатель на базе контроллера Arduino.
Схема:
Металлоискатель на Arduino

Частота работы генератора на транзисторе 2n222 зависит от индуктивности поисковой катушки и в отсутствии металла равна ~160кГц (это при авторских параметрах схемы — ёмкость конденсаторов у катушки по 22н и катуша диаметром 15см в 30 витков).
При приближении металлических предметов(особенно железа), индуктивность катушки меняется, меняется и частота генератора, за которой на pin 5 следит программа на Arduino.
Начальное нажатие NULL SW (pin 12) записывает эталонную частоту(начальная калибровка в отсутствии металла вблизи катушки).
При изменении частоты, пьезоизлучатель (pin 13) издаёт «щелчки», которые тем чаще, чем ближе металл.

Скетч:
// Arduino based metal detector
// (C)Dzl july 2013
// http://dzlsevilgeniuslair.blogspot.dk/

// Connect search coil oscillator (20-200kHz) to pin 5
// Connect piezo between pin 13 and GND
// Connect NULL button between pin 12 anf GND

// REMEMBER TO PRESS NULL BUTTON AFTER POWER UP!!


#define SET(x,y) (x |=(1<<y))                   //-Bit set/clear macros
#define CLR(x,y) (x &= (~(1<<y)))               // |
#define CHK(x,y) (x & (1<<y))                   // |
#define TOG(x,y) (x^=(1<<y))                    //-+

unsigned long t0=0;         //-Last time
int t=0;                    //-time between ints
unsigned char tflag=0;      //-Measurement ready flag

float SENSITIVITY= 1000.0;  //-Guess what

//-Generate interrupt every 1000 oscillations of the search coil
SIGNAL(TIMER1_COMPA_vect)
{
  OCR1A+=1000;
  t=micros()-t0;
  t0+=t;
  tflag=1;
}

void setup()
{
  pinMode(13,OUTPUT);    //-piezo pin
  digitalWrite(12,HIGH); //-NULL SW. pull up
  //-Set up counter1 to count at pin 5
  TCCR1A=0;
  TCCR1B=0x07;
  SET(TIMSK1,OCF1A);
}
//-Float ABS
float absf(float f)
{
  if(f<0.0)
    return -f;
  else
    return f;
}

int   v0=0;  //-NULL value
float f=0;   //-Measurement value
unsigned int FTW=0;    //-Click generator rate
unsigned int PCW=0;    //-Click generator phase
unsigned long timer=0; //-Click timer
void loop()
{
  if(tflag)
  {
    if(digitalRead(12)==LOW)  //-Check NULL SW.
      v0=t;                   //-Sample new null value
    f=f*0.9+absf(t-v0)*0.1;   //-Running average over 10 samples
    tflag=0;                  //-Reset flag

    float clf=f*SENSITIVITY;  //-Convert measurement to click frequency
    if(clf>10000)            
      clf=10000;
    FTW=clf;
  }
  
  //-Click generator
  if(millis()>timer)
  {
    timer+=10;
    PCW+=FTW;
    if(PCW&0x8000)
    {
      digitalWrite(13,HIGH);
      PCW&=0x7fff; 
    }
    else
      digitalWrite(13,LOW);
  }
}

+ +4 -
  • admin
  • 0
  • 6 616

VK:

Добавить комментарий

  • Яндекс.Метрика