3軸デジタルジャイロ ITG-3200

InvenSenseのジャイロセンサITG-3200をmbedに接続します。

ストロベリーリナックスさんから購入(SparkFun)

http://www.sparkfun.com/commerce/product_info.php?products_id=9801

 

ADコンバータが内蔵されており、I2C接続で通信することができます。

ITG-3200をmbedのI2C端子に接続して、適当にプルアップ抵抗を接続します。

 

SparkFunにあるATmega328のサンプルプログラムを参考にして、mbed用のプログラムを作成。

  

注意しなきゃいけないのが、受け取った2バイトの値は、short intで受け取らなければいけないことです。

ジャイロセンサの値は8ビットを2回受け取って、16ビットとして、プラスとマイナスの値を表現するので、intだと32ビットで受け取ってしまいます。

あとはジャイロセンサのI2Cアドレスは7ビットですが、後ろに0を追加して無理やり8ビットにして指定してやらないとmbedの場合ダメです。

 

mbed program

#include "mbed.h"

I2C i2c(p9, p10);        // sda, scl
Serial pc(USBTX, USBRX); // tx, rx


const int addr = 0xD2; // define the I2C Address

int main() {

    i2c.frequency(400000); //set frequency to 400 KHz

    pc.baud(115200);
    
    char addr_y[1];
    char read[8];

    short int read_x_2byte=0;
    short int read_y_2byte=0;
    short int read_z_2byte=0;
    short int tempr_2byte=0;

    char PWR_M[2]={0x3E,0x80};
    i2c.write(addr, PWR_M, 2); // Send command string
    char SMPL[2]={0x15,0x00};
    i2c.write(addr, SMPL, 2); // Send command string
    char DLPF[2]={0x16,0x18};
    i2c.write(addr, DLPF, 2); // Send command string
    char INT_C[2]={0x17,0x05};
    i2c.write(addr, INT_C, 2); // Send command string
    char PWR_M2[2]={0x3E,0x00};
    i2c.write(addr, PWR_M2, 2); // Send command string

    wait(1);

    while (1) {
        addr_y[0] = 0x1B;             // pointer to command register
        i2c.write(addr, addr_y, 1);   // Send command string
        i2c.read(addr, read, 8);    // read

        tempr_2byte=(read[0] << 8) + read[1];
        read_x_2byte=(read[2] << 8) + read[3];
        read_y_2byte=(read[4] << 8) + read[5];
        read_z_2byte=(read[6] << 8) + read[7];
        
        pc.printf("%f, %d, %d, %d\n", ((double)tempr_2byte+13200.0)/280.0+35.0, read_x_2byte, read_y_2byte, read_z_2byte);

    }
}

 

ジャイロセンサの実験を行いました。

ステッピングモータに下写真のような装置を取り付け、mbedで操作し、0.01秒のタイマーでI2Cから値を読み取ります。

 

 

オフセット値の平均を差し引きます。

得られた値を14.375で割ると角速度[deg/sec]が出ます。

それを台形積分法で積分すると、角度[deg]が算出できます。

 

モーターを15[deg/sec]で360度回転させたときのグラフが下の図です。

積分した値は374.46度になりました。

誤差は4%になりました。

思ったよりいい精度です。

 


0 comments

You need to log in to post a comment