アットウィキロゴ

センサー出力の読み取り

磁力計の出力読み取り

レジスタマップによれば、磁力計の出力は0x03-0x08の6つのレジスタ、温度計の出力は0x31-0x32の2つのレジスタに入るらしい。また、磁力計のデータが準備できたかどうかの情報がはいるレジスタ(0x09)もあるらしい。

レジスタアドレス0x03-0x08, 0x09 (OUT_X_H_M, OUT_X_L_M, OUT_Z_H_M, OUT_Z_L_M, OUT_Y_H_M, OUT_Y_L_M, SR_REG_M)

まずは、磁力計の出力の説明。
2アドレスを構成する16ビットのうち、下位12ビットで測定値を表している。注意しないといけないのは、
 (1) 12ビットは符号付2進数であること
 (2) アドレスの順に、X, Z, Y軸の計測値となっていること
である。
次は、計測値有効・無効フラグの説明。
こちらは下位2ビットだけを見ることになる。0x01か0x03となっていれば新しいデータとみなしてよいのだろう。

レジスタアドレス0x31-0x32 (TEMP_OUT_H_M, TEMP_OUT_L_M)

温度も12ビットだが、上位から12ビット分を読まないといけない。磁力計のデータの格納の仕方と違うので注意が必要だ。ここには、温度計の分解能も記載されていて、8 LSB/degなので、0.125℃の分解能であることがわかる。

レジスタ値を読み出してみる

レジスタ値を読み取るために、i2ctoolsでは、i2cgetというコマンドが用意されている。上記レジスタの値を読みだしてみる。
% sudo i2cget -y 1 0x1e 0x03
0x01
% sudo i2cget -y 1 0x1e 0x04
0x25
% sudo i2cget -y 1 0x1e 0x05
0xfe
% sudo i2cget -y 1 0x1e 0x06
0x7f
% sudo i2cget -y 1 0x1e 0x07
0xff
% sudo i2cget -y 1 0x1e 0x08
0xf9
% sudo i2cget -y 1 0x1e 0x09
0x03
X軸の計測値は、0x0125なので、1*256+2*16+5=293である。
Z軸の計測値は、0xFE7Fである。符号付12ビット整数であれば、11ビットで最大の数(0x07FF)を超えると負になるので、この計測値は、14(=E)*256+7*16+15(=F)-4096=-385である。
Y軸の計測値は、0xFFF9である。10進数に直すと、15(=F)*256+15(=F)*16+9-4906=-7となった。
最後のレジスタ値は、0x03となっているので、データは新しく計測されたものと判断できる。

磁場の計測値を物理単位に直すと、
 X軸: 293/1100*1E5=26636 (nT)
 Y軸: -7/1100*1E5=-636 (nT)
 Z軸: -385/1100*1E5=-39286 (nT)
と求まった。

次に温度の方を読んでみる。
% sudo i2cget -y 1 0x1e 0x31
0x03
% sudo i2cget -y 1 0x1e 0x32
0x80
計測値は0x0380で、上から12ビットを使うのだから、0*256+3*16+8=56となる。温度に直すには、8で割ればよいので、56/8=7℃。なんかおかしい。夏なんですけど。。。温度センサーはおまけみたいなものだから、使い物にならないのかもしれない。

加速度計の出力読み取り

加速度計の出力は0x28-0x2Dの6つのレジスタに入るらしい。

レジスタアドレス0x28-0x2D (OUT_X_L_A, OUT_X_H_A, OUT_Y_L_A, OUT_Y_h_A, OUT_Z_L_A, OUT_Z_H_A)

磁力計とは、軸の順番、上位・下位バイトの順番が異なるので混乱しそうだ。注意する必要がある。
2アドレスを構成する16ビットのうち、どの12ビットで測定値を表すかについての明確な記述がなく戸惑ったが、Z軸の出力値が1G近くになるようにビットを選ぶことで、上からの12ビットで測定値を表しているという推定ができる。磁力計のデータ格納方法とは異なるので、ここも注意する必要がある。(温度センサーと同じ格納の仕方ではあるが。)

レジスタ値を読み出してみる

磁力計と同じように、i2cgetでレジスタ値を読み取ってみる。
% sudo i2cget -y 1 0x19 0x28
0xf0
% sudo i2cget -y 1 0x19 0x29
0xff
% sudo i2cget -y 1 0x19 0x2a
0x40
% sudo i2cget -y 1 0x19 0x2b
0x02
% sudo i2cget -y 1 0x19 0x2c
0xc0
% sudo i2cget -y 1 0x19 0x2d
0x40
上位バイトと下位バイトが逆順であることと上位12ビットが計測値であることに注意して、
X軸の計測値は、0xFFF0なので、15*256+15*16+15-4096=-1である。
Y軸の計測値は、0x0240なので、0*256+2*16+4=36である。
Z軸の計測値は、0x40C0なので、4*256+0*16+12(=C)=1036である。

加速度の計測値を物理単位に直すと、1 mg/LSBであることを使って、
 X軸: -1/1=-1 (mg)=-0.001 (g)
 Y軸: 36/1=36 (mg)=0.036 (g)
 Z軸: 1036/1=1036 (mg)=1.036 (g)
と求まった。






















最終更新:2014年06月10日 01:30