超音波距離測定

  1. 距離測定


    1. 目的

      超音波を利用して対象物までの音の反射時間をより距離を測定するシステムの紹介です。

    2. 音の速度

       音は 331.0 + 0.6* t (m/S)
      で空気中を伝播します。ここで t は温度です。これは、1cmあたり 58.1μ秒 の速度になります。この程度の時間なら比較的簡単に計測できます。

    3. 超音波振動子とセンサ

       人に聞こえる音を利用すると、受信した音が計測用の音かどうか区別できません。ここでは、40Khz の比較的高い音を出す振動子とセンサを利用します。
       振動子は圧電セラミックを利用しており、40KHzの信号を加えると共振して機械的な振動により音波を発生します。センサーは逆の現象を利用します。

  2. 回路の構造


    1. 超音波の生成

      人に聞こえる音は15kHz程度ですが、超音波はより周波数が高い音波です。ここでは専用のIC(LM555、または、相当品)を利用し40KHzの発振をします。このICは外付けの抵抗とコンデンサーで広い範囲の発振が可能です。



      発振周波数のHレベルの時間は、図の二つの抵抗とTRGに接続するコンデンサの値で定まります。この場合、 
       (15k+1.5k) * 1000p * 0.7
      で計算できます。Lレベルの時間は、15k * 1000p * 0.693 で計算できます。両方の合計で約 25μ秒 で40Khz の発振となります。4番ピンはリセット端子でこれをHレベルにすると発振し、Lにすると発振を停止します。

    2. レベル変換回路

       LM555 の発振信号は電源が5Vのため、5Vのパルス波になります。振動子は最大40Vのパルスが入力可能で、レベルが高いほど強い音波を生成します。電圧を上げるため、RS232Cのレベル変換で利用しているMAX232 を利用します。これは、5Vの電圧から ±12V を生成するインバータを内臓しているため、高いレベルの信号を生成できます。
       MAX232は 0〜5Vの入力端子を2回路装備していますから、T2INに発振信号、T1INにその反転信号を加え、その出力をT2OとT1Oに取り出し、振動子に加えます。これで、逆側の信号が加わるため、振動子には24ボルトのパルス波が入力されます。

    3. PICを含む音波生成回路

       下図はPICを加えた送信回路で、PICのC0端子が1になるとLM555が発振し、MAX232でレベル変換をした後、振動子をドライブします。


       PICのAN0はアナログ比較のための信号となります。受信器(超音波センサ)からの信号は、増幅後直流のレベルに変換されてAN0端子に入力されます。

    4. 受信回路

       受信回路はオペアンプを利用した、高利得の増幅器が必要です。受信器(図ではXTAL)からの信号は40Khzの交流信号ですから、コンデンサーで直流成分を遮断し、交流成分(Vsとします)のみ増幅します。オペアンプは反転増幅回路ですが、交流信号を増幅するため、+側端子に電源電圧(Vcc)の半分の電圧を入力します。すると、入力端子は Vcc/2 ±Vs となります。二つのオペアンプの中央の 12k抵抗 による分圧回路が Vcc/2 を作成しています。増幅器の利得は、1段当り (1+ 470/12) となります。
       2段増幅した後、ダイオード回路で交流信号を直流電圧に変換し、PICのPA0端子にアナログ信号として入力します。



    5. アナログ参照電圧の生成と比較回路

       センサからの受信信号には、超音波の信号だけでなく雑音も含まれます。一定以上のレベルがあれば、超音波信号の到着と考えることにします。このレベル調整は、アナログ電圧の比較回路でも可能ですがここでは、PICの参照電圧生成とアナログ電圧比較機能を利用します。
       PICには16レベルのアナログ電圧を生成する機能があります。
           setup_vref(VREF_LOW |val); 
      で設定しますが、これで、電源電圧をVccとしたとき、VCC*val/24  の電圧を生成できます。valは0〜15 までの16レベルが指定できます。
       生成した参照電圧とAN0端子のアナログ電圧の比較は、
           setup_comparator(A0_VR_A1_VR);
      で設定することができます。PICには比較回路が2回路あり、上記の設定で、A0とA1端子の電圧と参照電圧を比較します。二つの回路の比較結果は、C1OUT,C2OUT として参照できます。参照電圧の方が高いと C1OUT は1になります。

  3. プログラム


    1. 計測の手順

       超音波による距離計測は以下のような手順で行います。

      t1時間超音波を発生します。
      同時にタイマー1による計数を開始します。

      超音波を停止します。
      t2時間待ち、振動子からセンサーに直接到着する信号を無視します。

      センサーからの信号を監視し、一定レベル以上になったときのタイマーの値を読み取ります。
      タイマーの計数値をn、タイマーのクロックが1.6μSのとき、超音波の到着時間は t3 = 1.6*n  μ秒 となります。

      音波の伝播速度は 343.5 m/S ですから、1cmを往復するのに必要とする時間は
       1000*2/343.5 = 58.14 μS
      となります。したがって、 t3 を 58.14 で割れば cm 単位の距離を計算できます。

    2. ソース

      ここでは、表示は、RS232Cを通してPCのハイパータームで行います。
      #include <16F873a.h>
      
      #fuses HS,NOWDT,NOLVP,NOPROTECT
      #use delay(clock = 20000000)
      #use RS232(BAUD=9600,xmit=PIN_C6,rcv=PIN_C7)
      
      unsigned long dtime;
      unsigned long dist;
      unsigned int nc=0;
      
      void main()
      {
       setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);//1.6uS
       setup_vref(VREF_LOW |6); //VCC*val/24 
       setup_comparator(A0_VR_A1_VR);//A0-Vref
       
       while(1){
               
         set_timer1(0);
         output_bit(PIN_C0,1);//Sonic Out
         delay_us(900);
         output_bit(PIN_C0,0);//Sonic Stop
         
         delay_us(300);//wait
         do {
                 
               dtime = get_timer1();
        }
        while (C1OUT==1 && dtime<10000 );//A0がVREF以上になるのを待つ
        
        dist=(long)((float)(dtime)*16.0/581.0);//クロック1.6u,58.14us for 1cm
         
         printf("%d:%lu:%lu\r\n",nc++,dist,dtime);
         if(nc>100) nc=0;
           
         delay_ms(100);
               
       }
      
      }
              

    3. 計測の注意点

       超音波を発生する時間(t1)は長いほど、音波のエネルギーが増すため、センサーからの信号が長くなり、受信回路の信号は最終的にダイオードでコンデンサに蓄積するため(積分効果)で強くなります。このため、長距離の場合、発生時間は長い方が有利です。しかし、長くすると発生している間はセンサーからの信号にノイズが入るため、センサーが利用できません。したがって、短い距離の測定ができません。
       したがって、センサーからの信号が弱いときは t1 を長くし、強いときは t1 を短くすると測定範囲を拡張できます。

  4. 発展


    1. 振動子、センサー仕様

       振動子、センサーの仕様では測定限界が 20cm〜6m です。ただし、この装置では雑音が多く、1.5mくらいが限度でした。

    2. 送信回路

       振動子の限界は40Vですから、生成する音波の強さを上げることができます。また、例の回路では、7404で反転信号を生成していますが、この目的のみで 7404 を利用するのはスペースの無駄なので、トランジスタ回路で反転します。また、NE555の発振は安定ではないので、PICで発振する方がよいでしょう。

    3. 受信回路

       受信回路は雑音との勝負です。雑音が少ないと微弱な信号でもキャッチできますが、雑音が大きいとセンサーからの信号が強くないと判断できません。具体的には、アナログ比較器の参照電圧を高くする必要があります。テスト回路では、参照電圧を低くすると、測定結果に大きなバラツキが出てしまいます。
       また、フィルタ回路を利用し、40KHz以外の信号を抑制すると大きな効果があると思います。

    4. 電源

       電源からの雑音を抑える必要があります。PICでアナログ機能を利用する場合、電源回路は単純なアダプタタイプでなく良質な電源が望まれます。簡単な対策は、PICのVccとVssの間にコンデンサを入れます。30μF程度のタンタルコンデンサと0.1μのセラミックコンデンサを挿入します(20ピンと19ピンの間に挿入できます)。タンタルは極性のあるコンデンサーです。