コルピッツ発振器とArduinoを使って金属探知機を作る方法。

金属探知機の仕組み

The tank circuit

上の回路では、直列コンデンサとコイルはタンク回路を形成しています。 タンク回路ではコンデンサとインダクタの間でエネルギー移動が繰り返され、発振します。 コンデンサから放電された電流はインダクタを流れ、コンデンサが完全に放電されるとインダクタの減少する磁界によって電流の流れが維持される。 その後、コンデンサは逆極性で充電し、磁界が完全に崩壊するとコンデンサは放電し、元の電流と逆向きの電流が流れるようになる。 このサイクルが続きます。

上記のタンク回路のインダクタは、金属探知機の検出部(大きなコイル状の線)を形成しています。 金属材料がインダクタ(検出コイル)の中心に近づくと、インダクタが作る磁界の中に入っていきます。 すると、インダクタのコアの透磁率が変化し、インダクタンスが変化する。 このインダクタンスの変化により、タンク回路の発振周波数が変化します。 しかし、実際には、部品は理想的ではありません。 部品の不要な抵抗がエネルギーロスとなり、発振電流が先細りになって停止してしまいます。 このため、BJTの反転増幅器を1段使い、タンク回路に連続的にゲインを加えています。

コルピッツ発振器

コイルの前後のノードでの発振は互いに位相が180度ずれているので、一方のノードから発振をトランジスタベースに供給して、コレクタで信号を増幅・反転し、同相でタンク回路のもう一方のノードに返します。 この回路全体をコルピッツ発振器と呼びます。

上記のコルピッツ発振器では、100kHz台の周波数で安定した発振が得られます。 家庭用品の金属がインダクタコアの透磁率を変化させると、この周波数が10kHz程度に変動します。 この周波数帯は人間の音声スペクトル(20Hz~20kHz)の範囲外なので、発振を可聴音に変換する必要があります。

従来のBFO(ビート周波数発振器)金属検出器は、金属の影響を受けない検出器のタンク回路の周波数と同じ固定周波数の別のタンク回路を組み込むことによってこの問題を克服しています。

今回の金属探知機のプロジェクトでは、2つ目のタンク回路で発振を相殺する代わりに、Arduinoを使って発振信号を処理することにします。 Arduinoは固定された周波数を記憶し、検出回路の入力周波数と記憶された周波数を連続的に比較します(Arduinoのプログラムについては後述)。

DIY金属探知機の材料

このプロジェクトでは、すべての部品を収容するためにおもちゃの草刈り機が選ばれています。 以下のような特徴があります。

  • トリガーボタン(スピーカーを起動するために再利用)
  • サイドボタン(固定周波数を設定するために使用)
  • 電池ボックス(3xAA電池)、ON/OFFスイッチ
  • スピーカー
  • があります。 7881>
  • LEDを取り付けたモーター(周波数差がある閾値を超えると点灯)
  • 円形の頭部(タンク回路のインダクタ用にコイル線をはめ込む)

ポテンショメーター(銀)も付けて、音の変化の感度を調整する予定です。

インダクタ・コイルは、直径5.5インチのスプールに26AWGワイヤーを約50回巻いて作ります。

ハウジングの内部では、オリジナルの回路基板を独自の回路に置き換え、すべての周辺回路をピン ヘッダーで取り付けます。

金属検出回路の回路図

DIP ATMega328をプログラムするのにArduino UNOを使用しました。 図の左下にあるコルピッツ発振器は、発振をチップのカウンタ1(T1ピン)(Arduino UNOではデジタルピン5と表示)に送り、そこで発振周波数を常にカウントしています。5V(3xAA電池、バイパスコンデンサ付き)を使用して、ATmega328、発振器、スピーカー、モーター(LED付き)に電源を供給します。

マイコンのデジタルピンの消費電流を安全レベル(ATmega328ではピンごとに最大40mA)に保つために、スピーカー駆動にNPNトランジスタ(C2878)、モーター駆動にNチャネルMOSFET(SUB45N03)が使用されています。

トリガとリセット(固定周波数を設定)のスイッチは、いずれも内部プルアップ構成でデジタル端子に配線されています。

感度ポテンショメーターは分圧器として設定され、分圧はアナログ ピンを使用して読み取られます。

コードのチュートリアル

このプロジェクトの全ソース コードは、次の場所でご覧になれます。

セットアップ関数

タイマカウンタ1を通して検出器の発振周波数を把握するために、まずタイマ/カウンタコントローラレジスタ(TCCR)を設定する必要があります。 これらのTCCRは、3つの整数を介してアクセスされます。 TTCR1A, TTCR1B, TTCR1C。

TCCR1A = 0b00000000;TCCR1B = 0b00000111;

TCCR1AとTCCR1BのWGMフラグを0にして波形生成をノーマルモードに設定し、TCCR1BのCSフラグをモード3(外部クロックオンライズ)に設定してクロック速度選択モードを外部クロックソースに設定する必要があります。 この構成では、発振の立ち上がりを検出するたびにレジスタOCR1Aが1ずつデクリメントされます。

TIMSK1 |= (1 << OCIE1A);

次に、TIMSK1レジスタのOCIE1Aフラグをセットしてタイマ/カウント割り込みAを有効にする必要があります。

OCR1A = 1;

ここでOCR1Aを1に初期化し、最初の立ち上がりエッジが検出されるとすぐに割り込み関数が呼ばれるようにします。

割り込み関数

これはSIGNAL(TIMER1_COMPA_VECT)関数です。 OCR1Aレジスタが0になったときに呼ばれます。 この関数では、前回呼ばれたときから、何マイクロ秒経過したかを記録しておきたいと思います。 この時間デルタはsignalTimeDeltaとして保存されます。

storedTimeDelta は、メインループで signalTimeDelta と比較される「固定周波数」の時間デルタです。 storedTimeDelta は(起動時およびリセットスイッチが押された時) storedTimeDelta をゼロにすると signalTimeDelta に設定されます。

OCR1A += CYCLES_PER_SIGNAL;

割り込み動作を実行した後、OCR1Aはあらかじめ定義された定数CYCLES_PER_SIGNAL(次の割り込みが起こるまでのサイクル数)で増分することによってリセットする必要があります。

int storedTimeDeltaDifference = (storedTimeDelta - signalTimeDelta) * sensitivity;

固定周波数(storedTimeDelta)と測定周波数(signalTimeDelta)の差を計算し、感度値で乗算します。

tone(SPEAKER_PIN, BASE_TONE_FREQUENCY + storedTimeDeltaDifference);

この値をベーストーンBASE_TONE_FREQUENCYと合計し、Arduinoのtone()関数でスピーカーから再生します。

もし差がSPINNER_THRESHOLDで定義した閾値を超えるとモータが起動されることになります。

トリガが解除されると、スピーカトーンは停止し、モータは停止します。

リセットボタンが押された場合、storedTimeDeltaをゼロにし、次の割り込み呼び出しで新しい値を設定できるようにします。

How Functional is Our Arduino-Based Metal Detector?

最も低い感度設定で、金属探知機はコイルから数インチ以内でソーダ缶、携帯電話、鉄製の工具などの大きなアイテムを拾うことができます。 また、最高感度設定では、同じ近さにある鉄のリング、ネジ、コインなどの小物も検出できます。 デモは記事上部のビデオをご覧ください!

検出器の範囲を広げるには、インダクタが作る磁界の面積を増やせばよいのです。 これは、インダクタに流れる電流を増やすか(発振器への電圧入力を増やし、増幅器の利得を大きくする)、インダクタ・コイルの巻き数を増やすことで実現できます。

Arduinoベースの金属検出器では、従来のBFO金属検出器ではできなかった、他の興味深いことを行うことが可能です。 この金属探知機の仕組みをどのように他の目的に活用するか、今後のプロジェクトにご期待ください!

ArduinoMetalDetector-master.zip

このプロジェクトにぜひ挑戦してください!

ArduinoMetalDetector-master.zip

ArduinoMetalDetector-master.zip。

コメントを残す

メールアドレスが公開されることはありません。