加速度センサー

加速度のより、力がかかることを利用すると加速度を計測できます。このセンサーの原理、利用法、重力の加速度を利用した傾きの計測法を紹介します。


  1. 加速度センサー

     加速度センサーは加速度を計測し出力します。ただし、直接加速度(秒当たりの速度変化)を計測するのではなく、加速度により働く物体への力を計測します。下図はその一例です。
     中央の柱に加速度が働くと、可動部の水平の板が上下に移動します。この板の上下には、逆位相のクロック信号A,Bが接続された極板があり、中央の可動極板に電圧を誘起します(中央の極板が中央にあれば平均0電圧ですが、上に移動すると。クロックAの成分が強くなります)。この変化を増幅し、直流に整流して出力します。

        加速度センサーの原理図(AD社 ANJ-0005_jp.pdfより)

  2. ADXL345の概要と接続

    下は、AD社のADXL345のモジュールで、I2C または SPI で接続可能です。ここでは I2C で接続します。
       
       ADXL345

    以下は ADXL345 の概略です。
     電圧 3.3V
     消費電流 40μA
     I2Cアドレス 0x1D
     計測範囲 2g、4g、8g、16g 選択可能
     分解能 10bit
      (16g 計測のときは13bit)
    加速度の方向は、ボードの左方向がX,下方向がY、上方向がZ になります。

  3. モジュールの端子、接続

    モジュールの端子は上の図で左下を1ピンとします(端子のラベルは上下逆転しています)

     1:VDD、2:GND、3:VS、4;CS
     5:INT1,6:INT2、7:SD0, 8:SDA,9:SCL

    1,2 端子は電源で、VDD、GNDに 3.3V 電源を接続します。Vs の接続は不要です。CS ピンは内部でプルアップされており、このとき I2Cモード になります。SDO が HIGH のとき I2Cアドレスは 0x1D、L のとき 0x3A になります。SDA,SCL は I2C の端子で モジュール内部で 10kΩ でプルアップ されています。SD0 も接続不要です。

  4. I2Cのレジスタ

     レジスタ 0x32 から、2バイト単位でX,Y,Z 方向の加速度の値が入ります(Low,Highの順)。 2の補数表現で、読み取るときに、連続する2バイトを合成して読む必要があります。レジスタ 0x2C は rate (読みとり速度の設定)で、0xF 3200Hz, 0XE 1600Hz, 0XD:800Hz , 0XC 400Hz,  0XB  200Hz , 0XA 100Hz となります。
     0X2D は Power(電力)の設定で D3:measure  D2:Sleep  D1,D0 Wakeup 測定を開始するにはSleep(第2ビット)を0、measure(第3ビット) を1にする必要があります。
      0X31は Format の指定で測定範囲を設定できます。 0のとき 2G、 1のとき 4G 2 のとき8G 、3のとき 16G です。ここでは 2G を設定します。

  5. 傾きの検出

    地球上の物体(質量:M)には、引力に基づく重力:G が働きます。力:Fと加速度:A の間には
      F = M・ A
    の関係があります。重力の力をFとしたとき、重力に基づく加速度を G と表記します。
      F= M G  Fは重力
    加速度センサーを水平に置くと、センサーは Z 方向に G の加速度を検出します。Y方向に角度 θ だけ回転させると、Z方向の加速度は G・cos(θ)、Y 方向の加速度は G・sin(θ) になります。

          センサーをY方向に回転

  6. 加速度センサーライブラリ

     以下は、レンジ 2g、での測定プログラムです。
    モジュールを水平におくと、z方向に -g が働きます。モジュールを x軸または y軸方向に傾けると、加速度成分が x軸またはy軸 に現れ、x,y,z の合力が g になることが確認できます。
    #include <Wire.h>
    #define ADXL 0x1D
    
    #define XDATAL 0x32
    #define RATE 0x2C
    #define POWERA 0x2D
    #define FORMAT 0x31
    #define ACCXL 0x32
    
    void adxl_init(){  
      Wire.begin();
    
      Wire.beginTransmission(ADXL);
      Wire.write(RATE);
      Wire.write(0xc);
      Wire.endTransmission();
      
     //I2c.write(ADXL, RATE, 0xc);//400Hz
      //I2c.write(ADXL, POWERA, 0x8);//  
      Wire.beginTransmission(ADXL);
      Wire.write(POWERA);
      Wire.write(0x8);
      Wire.endTransmission();
    
      //I2c.write(ADXL, FORMAT, 0x0);//range 2G,10bit
      Wire.beginTransmission(ADXL);
      Wire.write(FORMAT);
      Wire.write(0x0);
      Wire.endTransmission();
    }
    
    int adxl_read(int val[3]){
    //符号なしで送る
        int STATUS=0x2F;
        byte vH,vL,st;
        st= 1;
      
      Wire.beginTransmission(ADXL);
      Wire.write(ACCXL);
      Wire.endTransmission();
      Wire.requestFrom(ADXL, 6);
      Wire.endTransmission();
      
       //I2c.read(ADXL,0x32,2);
        vL = Wire.read();
        vH = Wire.read();
        val[0]=(int)(word(vH,vL))+512;
      
        //I2c.read(ADXL,0x34,2);
        vL = Wire.read();
        vH = Wire.read();
        val[1]=(int)(word(vH,vL))+512;
      
        //I2c.read(ADXL,0x36,2);
        vL = Wire.read();
        vH = Wire.read();
        val[2]=(int)(word(vH,vL))+512;
    
       return st; //1:dataready, 0:not ready
    }

  7. 加速度表示プログラム

    ADXL のライブラリーを利用して、加速度の値を LCD とシリアルモニターに表示します。ADXL と LCD のライブラリーと、タブ機能を利用して組み込みます。
    void setup() {
      int id;
      Serial.begin(9600);
      //Serial.println("setup");
      adxl_init();
      lcd_begin();
    }
    
     void loop(){
      int val[3];
      char buff[15];
      adxl_read(val);
    
      sprintf(buff,"acc:%d",val[2]);
      lcd_setCursor(0,0);
      lcd_print(buff);
      
      sprintf(buff,"%d,%d",val[0],val[1]);
      lcd_setCursor(0,1);
      lcd_print(buff);
      
      sprintf(buff,"%d,%d,%d",val[0],val[1],val[2]);
      Serial.println(buff);
      delay(500);   
     }

    シリアルモニターの値(センサーをゆっくり傾けたとき)
    496,499,739
    492,501,739
    495,500,741
    496,499,740
    493,500,738
    505,512,747
    497,550,742
    495,610,720
    491,548,741
    

    LCD の画面、上段がz軸、下段が x、y 軸 の値を表示。


  8. 発展

    1. どんなところに利用できますか?

      加速度センサーを利用すると、PCの落下の検出ができます。通常、PCには 重力による加速度が働いていますが、落下が始まると重力方向の加速度が0に近づきます。この加速度変化を検出して、ハードディスクのヘッドの緊急待避を行い、ハードディスクの磁気面の損傷を軽減できます。
    2. 身体の動きの計測できますか?

       加速度は動きを検出しますから、適当な解析プログラムを作成すれば、歩行や上下の動きを検出できます。