LSM303DLHC 3軸地磁気+3軸加速度センサのスケッチについて

Arduino に関するご質問などはこちらへ。

LSM303DLHC 3軸地磁気+3軸加速度センサのスケッチについて

投稿記事by zogzog » 2013年9月26日(木) 15:21

arduino初心者です。研究でarduinoを使っています。よろしければアドバイスお願いします。
ArduinoでLSM303DLHCを使って加速度を得るスケッチを作成したのですが上手くいきません。
I2Cインタフェースなので、既存のWireライブラリと
http://www.ccad.sist.chukyo-u.ac.jp/~mito/ss/Embedded/Arduino/temp/index.htm
上記HPで使用されているI2Cライブラリの二種類で試したのですが、どちらも同じ様にうまくいきません。
コンパイルもでき、値(正常ではないですが)も返ってきているので、原因が自分では分かりませんでした。

I2Cライブラリを使用したスケッチ
コード: 全て選択
#include <I2C.h>

int address = 0x19;  // 加速度センサのスレーブアドレス

byte x1 = 0;        // 受信データを入れる
byte x2 = 0;
byte y1 = 0;
byte y2 = 0;
byte z1 = 0;
byte z2 = 0;


void setup(){
 
  I2c.begin();
  Serial.begin(9600);
  delay(10);
}

void loop(){
 
  I2c.write(address,0x20,0x27);


  I2c.read(address,0x28,1);
  x1 = I2c.receive();  //delay(500);
 
  I2c.read(address,0x29,1);
  x2 = I2c.receive();  //delay(500);

  I2c.read(address,0x2a,1);
  y1 = I2c.receive();  //delay(500);

  I2c.read(address,0x2b,1); 
  y2 = I2c.receive();  //delay(500);

  I2c.read(address,0x2c,1);
  z1 = I2c.receive();  //delay(500);

  I2c.read(address,0x2d,1);
  z2 = I2c.receive();  //delay(500);
   
  Serial.print("x = ");
      Serial.print(x1,HEX);
    Serial.print(" ");
    Serial.println(x2,HEX);
  Serial.print("y = ");
    Serial.print(y1,HEX);
    Serial.print(" ");
    Serial.println(y2,HEX);
  Serial.print("z = ");
    Serial.print(z1,HEX);
    Serial.print(" ");
    Serial.println(z2,HEX);
   


購入したストロベリーリナックスさんの説明書には
「とりあえず動作させるには、内部レジスタ0x20に0x27を書き込む。
内部レジスタ0x28からの連続6バイトがXYZの加速度データです」と書かれています。
単純に書き込み命令で0x20に0x27を書き込んだ後、0x28から読み出し命令を処理するように書きました。

実行結果は
コード: 全て選択
x = 40 FF
y = 0 0
z = 80 39
ok
x = 80 FF
y = 40 0
z = 80 39
ok
x = 40 FF
y = 0 0
z = C0 39
ok
x = 80 FF
y = 40 0
z = 0 3A
:      :

のようにある一定の数値がランダム(?)に返ってきます。
モジュールを動かさない状態でも、動かしても同じような結果となります。

Wireライブラリでもほぼ同じ流れのスケッチを作成しましたが、結果は同じようになってしまします。
スケッチのどこに問題があるのでしょうか?
回路は先生にも一応見ていただいて、値も返ってきているので問題ないと思うのですが...
すみませんが解決方法が分かる方、回答お願いします。
zogzog
 
記事: 4
登録日時: 2013年9月25日(水) 15:03

Re: LSM303DLHC 3軸地磁気+3軸加速度センサのスケッチについて

投稿記事by yamaguch » 2013年9月27日(金) 21:45

zogzog さん、こんにちは。

Arduino は、何を使っていますか?
回路は問題ないということですが、どのような回路でしょうか。

山口
yamaguch
 
記事: 482
登録日時: 2010年7月06日(火) 17:37

Re: LSM303DLHC 3軸地磁気+3軸加速度センサのスケッチについて

投稿記事by zogzog » 2013年10月01日(火) 23:38

返信ありがとうございます。遅くなってしまいすみません。
使用しているのはArduino Unoです。
動作確認のために使用しており、確認ができたらMEGAで使用する予定です。
回路は以下のページの画像のように作成しました。手書きですみません。
http://www.ps-gets.com/koyama/IMG_5720.jpg
何か間違いがあれば、ご指摘お願いします。
zogzog
 
記事: 4
登録日時: 2013年9月25日(水) 15:03

Re: LSM303DLHC 3軸地磁気+3軸加速度センサのスケッチについて

投稿記事by yamaguch » 2013年10月02日(水) 10:29

zogzog さん、

回路は問題なさそうですね。
スケッチも大丈夫そうだしと思って出力結果をもう一度見てみると

x = 40 FF
y = 0 0
z = 80 39

これを short に直すと
x => −192
y => 0
z => 14720

4G モードとすると
x => -0.012 g
y => 0.0 g
z => 0.898 g

なんとなく正しそうな気がします。

山口
yamaguch
 
記事: 482
登録日時: 2010年7月06日(火) 17:37

Re: LSM303DLHC 3軸地磁気+3軸加速度センサのスケッチについて

投稿記事by zogzog » 2013年10月03日(木) 17:13

正しい値が返ってきているのですね!ありがとうございます。
よく分からない値が出力されていたので、間違っているものだとばかり思っていました。

出力値が正しい値かもしれないという理由は理解したのですが、
恥ずかしながら、short型への変換方法が分かりません。
出力値(16進数)の最上位ビット以外を10進数に変換して、最上位ビットが0のときプラスで1のときにマイナスだと
思ったのですが、違いますよね?

4gモードへの変換についても、分かっていません。
よろしければどのような計算をすれば変換できるのか教えていただけませんか?
zogzog
 
記事: 4
登録日時: 2013年9月25日(水) 15:03

Re: LSM303DLHC 3軸地磁気+3軸加速度センサのスケッチについて

投稿記事by yamaguch » 2013年10月11日(金) 14:49

short型への変換方法が分かりません。

x1 に LOW バイト、x2 に HIGH バイトが入っている時に、HIGH バイトを左に 8 ビットシフトしたものと LOW バイトのビットごとの和をとって 16 ビットにしたものを short でキャストすればいいでしょう。16 ビットのデータを 2 の補数表示で解釈したものが short 型になります。
コード: 全て選択
byte x1 = ...
byte x2 = ...
short x = (short) (x2 << 8 | x1);

4G モードにするためには、LSM303DLHC が 4G モードで動くように設定する必要があります。詳しくは LSM303DLHC のデータシートの
 Chapter 7 Register description
を見てください。

山口
yamaguch
 
記事: 482
登録日時: 2010年7月06日(火) 17:37

Re: LSM303DLHC 3軸地磁気+3軸加速度センサのスケッチについて

投稿記事by zogzog » 2013年10月18日(金) 16:02

無事にshort型にも変換できて、加速度データを得ることができました!ありがとうございます。
データシートを読んだら、2gモードに設定されていたようです。
本当に助かりました。ありがとうございました。
zogzog
 
記事: 4
登録日時: 2013年9月25日(水) 15:03


Return to Arduino 質問箱

cron