2024年6月
            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30            

カテゴリー

ブログパーツ

無料ブログはココログ

« 慣性センサXG1300Lの実力を探る(その2) | トップページ | 慣性センサXG1300Lの実力を探る(おしまい) »

2012年6月 3日 (日)

慣性センサXG1300Lの実力を探る(その3)

花岡ちゃんのウィークエンド:

今回の投稿は実験に使ったPICプログラムの説明です。プログラムは毎度おなじみのCCSCで作成しました。

先ずはデバイスのI2Cアドレスを確認しておきます。XG1300LのI2Cアドレス(デバイスアドレス)は0x02です。これはアドレスバイトが0x02ということで、このバイトの最下位ビットは読み書きフラグですので、書き込みのときは0x02、読み出しのときはフラグを立てて0x03ということになります。

XG1300Lは使用前にリセットする必要があります。マニュアルによるとリセット後1秒間はセンサを動かしてはいけません。この間にジャイロなどのセットアップをしているようです。
リセットはこのように行います。

void resetGyro(void){
//まずアドレスのセット
i2c_start();
i2c_write(0x2); //XG1300LのI2Cアドレスと書き込みビット0
i2c_write(0x60); //リセットレジスタのアドレス
i2c_write(0x0); //ダミー書き出しデータ
i2c_stop();
}

リセットするにはレジスタ0x60に書き込みを行うだけです。書き込みデータは何でもいいようです。

旋回角度を読み出す関数はこれです。シリアルフラッシュメモリの読み込みと基本的に同じです。

long readGyro(void){
unsigned long xx,yy;
//アドレスのセット
i2c_start();
i2c_write(0x2); //XG1300LのI2Cアドレスと最下位ビット0(書き込みコマンド)
i2c_write(0x42); //旋回角レジスタのアドレス
//2バイトの連続読み出し(LSB,MSBの順)
i2c_start();
i2c_write(0x3); //XG1300LのI2Cアドレスと最下位ビット1(読み出しコマンド)
yy=i2c_read();  //LSB(下位バイト)
xx=i2c_read(0); //MSB(上位バイト)ー読み込み後ACKを返さない
i2c_stop();
return((xx<<8) + yy); //2バイト
}

ccscではlongは16ビットの変数です。今回は旋回角のレジスタだけ読み込みましたが、グローバル配列に全ての情報をいっぺんに読み込んでもよいでしょう。

プログラムをスタートするとターミナルにOKと表示し、1.5秒後から旋回角を300ms周期でタイプアウトします。システムが旋回角の送信を始めるまではXG1300Lを動かしてはいけません。そのまま触らなければ0をタイプアウトし続けるはずです。

この状態で、XG1300Lをゆっくり滑らせるように左右に回転させると数字がかわるのが確認できます。

Photo

最初の状態から右に90度ほど回転させると、数値は9000くらいになると思います。旋回角は1/100度単位で計測されています。つまり、読み出し値を100で割ると旋回角が直読できます。
こうなれば正常に動作しています。

詳しくはソースコードのmain.cを見てもらえばわかりやすいと思います。(なお、MPLABとccscを使っている方はcドライブの直下にプロジェクトフォルダをおけばビルドできると思います。)
プロジェクトフォルダ「XG1300L.zip」をダウンロード

次回は評価結果です。

« 慣性センサXG1300Lの実力を探る(その2) | トップページ | 慣性センサXG1300Lの実力を探る(おしまい) »

花岡ちゃんのウィークエンド」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

トラックバック


この記事へのトラックバック一覧です: 慣性センサXG1300Lの実力を探る(その3):

« 慣性センサXG1300Lの実力を探る(その2) | トップページ | 慣性センサXG1300Lの実力を探る(おしまい) »