상세 컨텐츠

본문 제목

아두이노 - 금속 탐지기

프로그래밍/Arduino & IoT

by ryujt 2015. 4. 25. 15:29

본문

검색으로 들어오시는 분들이 많아서 링크를 하나 더 올립니다.

아래 링크는 같은 회로에 큰 코일로 테스트 한 것 입니다.

코일만 잘 감으면 감도가 많이 올라갑니다.


http://ryulib.tistory.com/431



첫 번 째 모델의 동작 동영상 입니다.  2N2222 트랜지스터를 이용하여 만들었습니다.  아직 튜닝 및 코딩이 완전하지 않기 때문에 잡음에 불이 들어오거나 탐지 거리가 엉망입니다.






두 번 째 모델의 동작 동영상입니다.  555 타이머를 이용해서 만들었습니다.  아두이노에 붙여서 펄스 카운팅을 하려고 했으나 계속 실패하고 있어서 우선 소리로 구분하는 단계에서 머물러 있습니다.





가장 감도가 좋은 세 번 째 모델입니다.







[그림 1] 두 번 째 모델과 실험 도중 사망한 555 타이머 시체들 ㅠ.ㅠ



감도를 높이기 위해 갖은 시험을 하는 도중, 인터넷에 찾은 사이트에서 코일을 쿠킹 호일로 감싸서 사용하길래 따라서 해보았으나 별로 달라진 것은 없어 보입니다.  코일을 많이 감으면 어떨까 해서 150번까지 감아서 테스트 해보았으나, 신통치 않습니다.  (오히려 감도가 떨어진 것 같아서 원래 코일로 되 돌아 옴)



첫 번 째 모델은 아래의 링크를 참조하여 만들었습니다.

  • http://dzlsevilgeniuslair.blogspot.dk/2013/07/diy-arduino-based-metal-detector.html
  • 콘덴서와 저항 값을 변경하여 테스트 해 본 결과 아두이노를 이용하는 데에는 큰 차이가 없었습니다.  대신 아두이노 5번 연결 대신 부저를 달아서 소리로 구별 할 때에는 562J(5.6nF) 콘덴서와 5 K 부근에서 가장 잘 동작하였습니다.  가변 저항으로 잘 튜닝하시면 소리가 거의 들리지 않다가 금속이 근처에 있으면 들리도록 할 수 있습니다.

두 번 째 모델은 아래의 링크를 참조하여 만들었습니다.
  • http://www.instructables.com/id/Simple-metal-detector/
  • 배선은 [그림 2]와 같이 만들어서 사용했습니다.
    • 555 타이머는 왼쪽 상단이 1번 핀입니다.
    • 콘덴서는 10uF, 저항은 10K 가변 저항을 사용했습니다.  (용량을 이것 저것 테스트하면서 마음에 드는 것을 골랐습니다.  때문에 위에 올린 참고 사이트와는 용량이 다릅니다)

[그림 2] 555 타이머를 이용한 금속 탐지기



세 번 째 모델은 아래의 링크를 참조하여 만들었습니다.  서치 코일은 CD 롬 케이스 뚜껑에 28번 감아서 사용했고, 레퍼런스 코일은 딱풀통에 3.3 cm 감아서 사용했습니다.  한 두 바퀴 차이에도 감도가 예민하니 대충 그 정도에서 풀거나 더 감아서 소리가 멈추는 순간에서 튜닝을 마치시면 됩니다.  애너멜 선은 0.21mm 굵기를 사용하였습니다.



마지막으로 가장 많이 시간을 잡아먹고 해메게 된 펄스 카운터 소스입니다.  첫 번 째 모델의 참고 사이트의 소스가 제대로 동작하지 않아서 갖은 고생 끝에 PinChangeInt 라이브러리를 찾아서 해결하였습니다.  5 번 핀에 전압이 LOW에서 HIGH로 변할 때마다 on_pulse() 함수를 실행시켜줍니다.  이 횟수를 세면서 값이 갑자기 변하면 금속이 있는 것으로 판별하게 됩니다.  (아마도 참고 사이트 소스의 문제보다 제 짧은 지식이 문제일 것 입니다 ^^;)

// TODO: 처리 한 곳은 나중에 평균치 계산이나 데이터 변화를 감지하는 알고리즘으로 변경 할 부분입니다.  지금은 시리얼 모니터의 숫자를 보고 대충 많이 벗어나면 LED가 불이 들어오도록 하였습니다.

PinChangeInt 라이브러리는 아래 주소에서 다운받을 실 수 있습니다.


[소스 1]
#include <pinchangeint.h>

#define pin_led   3
#define pin_pulse 5

volatile int pulse_count = 0;

void setup() 
{
  Serial.begin( 9600 );
  
  pinMode( pin_led, OUTPUT);    

  pinMode( pin_pulse, INPUT );    
  digitalWrite( pin_pulse, HIGH ); 

  PCintPort::attachInterrupt( pin_pulse, on_pulse, RISING ); 
}

unsigned long old_tick = 0;
unsigned long tick = 0;
unsigned long term = 0;

int value = 0;

int interval = 100;

void loop() 
{
  if (old_tick == 0) {
    old_tick = millis();
    return;
  }
  
  tick = millis();
  
  term = term + tick - old_tick;
  
  if (term >= interval) {
    value = pulse_count;
    pulse_count = 0;

    value = value * term / interval;

    term = 0;

    // TODO: 
    if (abs(value - 150) > 100) {
      digitalWrite( pin_led, HIGH );
    } else {
      digitalWrite( pin_led, LOW );
    }
    
    Serial.print( "pulse_count:\t" );
    Serial.println( value, DEC) ;    
  }
  
  old_tick = tick;  
}

void on_pulse()
{
  pulse_count++;
}




'프로그래밍 > Arduino & IoT' 카테고리의 다른 글

아두이노 - 찰리플렉싱 (Charlie Plexing)  (0) 2015.05.10
아두이노 - 만보기 게임  (4) 2015.05.05
아두이노 - 주사위 만들기  (0) 2015.04.19
아두이노 - 뮤직박스  (0) 2015.04.19
SW-420 센서  (0) 2015.04.12

관련글 더보기