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