アットウィキロゴ

センサーモジュールとの通信

I2Cバス番号について

26ピン外部端子上に出ているI2Cのバス番号はRev. 2のRaspberry Piでは1となっているらしい(Rev 1なら0らしい)。実際には、もう一つのバス番号0もあるそうだが、26ピン外部端子には対応付けられていないそうだ。その証拠に、
% ls /dev/i2c-*
とすると、
/dev/i2c-0  /dev/i2c-1
2つのデバイスファイルが見つかる。以下のI2Cデバイスとの通信に関係してバス番号を指定するときは、1を使うことになる。

スレーブアドレスの確認

i2cdetectコマンドを使ってデバイスが認識されるか確認する。
% sudo i2cdetect -y 1
スレーブアドレスが帰ってくることは帰ってくるのだが、
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 1e --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
となったり、
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- 19 -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
となったりして、出力結果が安定しない。。。一抹の不安を覚えたが、マスターとスレーブの間の通信のタイミングによって、こうした問題が起こるのだろうと勝手に納得して先にすすんだ。しかし、やはりこの状態ではスレーブデバイスからデータを得ることができなかった。

調査の結果、「RaspberryPiのI2Cポートはプルアップ済み」であるという情報を得た(例えばここ)。MLSM303DLHCのジャンパーJ1, J2をショートして、モジュール上のプルアップ抵抗を有効にしていたことが問題を引き起こしていた原因と考えられる。はんだを吸い取って、再度試してみると、出力は安定し、常に0x19と0x1eを認識できるようになった。
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- 19 -- -- -- -- 1e --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
スレーブアドレスは、0x19と0x1eであることが分かる。0x19は加速度センサーで、0x1eは磁気センサーになる。データシートのTable 14とTable 16の「7-bit slave address is 0011001b」および「7-bit slave address is 0011110b」という記述にも一致している。

デバイスのレジスタ値を読み取る

スレーブデバイスの内部レジスタ値をダンプしてみる。
% sudo i2cdump -y 1 0x1e
しかし、出力がどうもおかしい。。。。
No size specified (using byte-data access)
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef
00: XX XX XX XX XX XX XX 00 00 02 48 34 33 00 00 3c    XXXXXXX..?H43..<
10: 00 00 01 XX XX 00 00 00 00 00 00 XX 00 00 e8 10    ..?XX......X..??
20: 00 00 00 00 00 00 00 XX XX 00 00 00 00 00 00 00    .......XX.......
30: 00 00 00 00 XX XX 00 00 00 00 00 00 00 00 00 00    ....XX..........
40: 00 01 XX XX 00 00 00 00 00 00 00 00 00 00 00 00    .?XX............
50: XX 00 00 00 00 00 00 00 00 00 00 00 00 XX XX 00    X............XX.
60: 00 00 00 00 00 00 00 00 00 00 00 XX XX 00 00 00    ...........XX...
70: 00 00 00 XX 00 00 00 00 00 00 00 00 00 00 00 00    ...X............
80: XX 20 01 00 00 00 00 00 00 02 48 34 33 XX XX 3c    X ?......?H43XX<
90: 00 00 00 00 00 00 00 00 00 00 1f XX 00 00 e8 10    ..........?X..??
a0: 00 00 00 00 00 00 00 7f XX 00 00 00 XX XX 00 00    .......?X...XX..
b0: 00 00 00 00 00 00 00 00 00 00 XX 00 00 00 00 00    ..........X.....
c0: 00 00 00 00 00 00 00 XX 00 00 00 00 00 00 00 00    .......X........
d0: 00 00 00 00 XX 00 00 00 00 00 00 XX 00 00 00 00    ....X......X....
e0: 00 00 00 00 00 00 00 XX 00 00 00 XX XX 00 00 00    .......X...XX...
f0: 00 00 00 XX 00 00 00 00 00 00 XX 00 00 00 00 00    ...X......X.....
XXって、レジスタに値が入っていないってことだよな。。。

かなり悩んだが、上記のようにパーツ上のショートさせていたジャンパーを無くしてみたところ、
% sudo i2cdump -y 1 0x1e
No size specified (using byte-data access)
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef
00: 10 20 03 fe 84 fe b6 00 9a 03 48 34 33 00 00 3c    ? ?????.??H43..<
10: 00 00 00 00 00 00 00 00 00 00 00 c4 14 03 e8 10    ...........?????
20: 00 00 00 00 00 00 00 00 10 00 00 00 00 00 00 00    ........?.......
30: 00 00 00 1c 83 58 76 00 a0 00 07 00 00 00 00 00    ...??Xv.?.?.....
40: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
50: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
60: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
70: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
80: 10 20 03 fe 84 fe b6 00 9a 03 48 34 33 00 00 3c    ? ?????.??H43..<
90: 00 00 00 00 00 00 00 00 00 00 00 c4 14 03 e8 10    ...........?????
a0: 00 00 00 00 00 00 00 00 10 00 00 00 00 00 00 00    ........?.......
b0: 00 00 00 1c 83 58 76 00 a0 00 07 00 00 00 00 00    ...??Xv.?.?.....
c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
のように、正常そうな値を読み取ることができた。

デバイスにレジスタ値を書き込む

i2c-toolsを使って、レジスタ値を操作してみる。バス番号1につながっている地磁気センサー(スレーブアドレス=0x1e)の中の0x00というアドレスを持つレジスタに0x90という数値を書き込む。0x00というアドレスは、CRA_REG_Mという名前がついていて、地磁気センサーに内蔵されている温度センサーを有効にするかどうかやデータ出力のレートを指定するためのレジスタである。0x90は、温度センサーを有効にして、出力レートを15 Hzに指定する値である。
% sudo i2cset -y 1 0x1e 0x00 0x90
しかし、最初はジャンパー設定の不具合により、
Error: Write failed
というエラーメッセージが帰ってくるだけであった。

その後、ジャンパーの半田を吸い取ったところ、
% sudo i2cset -y 1 0x1e 0x00 0x90
% sudo i2cset -y 1 0x1e 0x01 0x20
% sudo i2cset -y 1 0x1e 0x02 0x00
というように、素直にレジスタ値を設定してくれるようになった。
% sudo i2cdump -y 1 0x1e
No size specified (using byte-data access)
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef
00: 90 20 00 00 ee fe b3 00 d1 03 48 34 33 00 00 3c    ? ?.???.??H43..<
10: 00 00 00 00 00 00 00 00 00 00 00 c4 14 03 e8 10    ...........?????
20: 00 00 00 00 00 00 00 00 10 00 00 00 00 00 00 00    ........?.......
30: 00 00 00 1c 83 58 76 00 a0 00 07 00 00 00 00 00    ...??Xv.?.?.....
40: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
50: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
60: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
70: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
80: 90 20 03 00 ee fe b3 00 d1 03 48 34 33 00 00 3c    ? ?.???.??H43..<
90: 00 00 00 00 00 00 00 00 00 00 00 c4 14 03 e8 10    ...........?????
a0: 00 00 00 00 00 00 00 00 10 00 00 00 00 00 00 00    ........?.......
b0: 00 00 00 1c 83 58 76 00 a0 00 07 00 00 00 00 00    ...??Xv.?.?.....
c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
ダンプしてみると、きちんと書きこまれているのが分かる。





















最終更新:2014年06月09日 23:33