加速度センサと応用

  1. 加速度センサ

    1. 加速度センサとは

      このセンサは2方向の加速度に応じた出力を出します。重力などの静的な加速度も検出します。このセンサの良く利用される応用は重力を利用した傾きセンサです。ばらつきが大きいので、もうひとつ上のランクのセンサを利用するほうが良いかもしれません。
       計測可能な最大の加速度は2g(gは重力加速度)です。


    2. ADXL202

       XOUT,YOUT 端子に加速度に応じた幅のパルスは出してくれますが、パルス幅を値に直すのが手間ですから、ここではアナログ出力を利用します。パルス幅も変動が見えますから、「パルス幅を利用すると出力が安定する」こともなさそうです。このばらつきは、仕様書にも明記されています。下は、電圧3Vで利用した場合で、0GのときにX軸の電圧が出力される割合を示しています。正規分布をしていますから、何回か測定して平均をとれば、ばらつきを抑えることはできそうです。


    3. KXM52

      KXM52 は3軸の加速度センサーです。秋月電子からこれをDIPに搭載したモジュールが販売されています。PSD はHレベルに接続します。4,5ピンは接続不要です。出力は、電源電圧の半分が加速度0で、加速度の値に従い、出力電圧が出ます。



      上方向がZで重力の加速度も検知しますから、重力の傾きを検出することも出来ます。出力はばらつきますから、平均を取ることが必要です。


  2. 設計


    1. 回路図

      センサの抵抗やコンデンサの値は測定間隔などでチューニングする必要があります。ここでの値は適当です。AD変換する前にバッファアンプを入れると、ばらつきが収まるかもしれません。AD変換する場合、PICのVCCとGND間にコンデンサ(ノイズ対策)が必須です。(図のピン番号はADXL202)

      図には、RS232Cの接続部分は省略しています。ここを参照してください。

    2. プログラム


      #include <16F873.h>
      //加速度センサ
      
      #device ADC=10
      #fuses HS,NOWDT,NOLVP,NOPROTECT,NOBROWNOUT
      #use delay(clock = 20000000)
      #use RS232(BAUD=9600,xmit=PIN_C6,rcv=PIN_C7)
      //#byte port_b=6
      
      
      long vd,sum,max,min;
      int i;
      
      void main(){
        set_tris_b(0);
        set_tris_a(0xF);
        
        setup_adc_ports(AN0);
        setup_adc(ADC_clock_div_32);
        
        set_adc_channel(0);
      
      
        while(1){
           output_bit(PIN_B0,1);
           delay_ms(100);
           set_adc_channel(0);
           sum=0;
           max=0;
           min=1000;
           delay_ms(2);
           for(i=0;i<5;i++){
                  vd=read_adc();
                  delay_ms(10);
                  sum=sum+vd;
                  if(max<vd) max=vd;
                  if(min>vd) min=vd;
               }
              printf("\r\nADX:%ld:%ld:%ld",sum/5,max,min);
              
           set_adc_channel(1);
           sum=0;
           max=0;
           min=1000;
           delay_ms(2);
           for(i=0;i<5;i++){
                  vd=read_adc();
                  delay_ms(10);
                  sum=sum+vd;
                  if(max<vd) max=vd;
                  if(min>vd) min=vd;
               }
              printf("\r\nADY:%ld:%ld:%ld\r\n",sum/5,max,min);
      
              output_bit(PIN_B0,0);
           delay_ms(2000);
        }
      
      }
    3. ADXLセンサのノイズ

       ADXLは読み取り値に1割(20)程度のノイズが入ります。5回の平均をしても5程度ばらつきます。1g(重力加速度)での変化範囲は±60ですから、なんとか、利用できそうです。AD変換に固定電圧を入れると、ばらつきは1以内に収まりますから、PIC側の問題ではなさそうです。センサ出力にバッファアンプを入れると少し落ち着くかもしれません。

    4. 電池駆動の注意

      PICは2V、加速センサは3Vから動作しますから、乾電池2本で実行可能です。ただし、低電圧で実行するにはPICのFuse設定で、NOBROWNOUT の指定が必要です。PICも3Vの場合保証は4MHzクロックですが、多くの20MHzでも動作するようです。AMD3202(RC232C)コンバータは保証電圧は5Vですが、電池でも通信可能でした。
    5. 課題

      データを配列に保存する
      PCに送りデータを可視化する
      LCDやバーLEDで加速度の値を表示する

  3. 参考文献

    川西:PICマイコンによるメカトロニクス入門  CQ出版