13 May 2013

I2C温度センサーLM75ADをRaspberry Piに接続する

Raspberry piにLM75ADを接続して温度データを得る方法

■ Raspberry Pi のI2C機能の有効化

以前の記事『Raspberry piにi2c LCD接続する』の通り機能の有効化をまず行なっておく。

■ 接続回路図

20130513-rpi-lm75.png

Raspberry Pi GPIOポートのピン割付は『RPi Low-level peripherals』に書かれている通り。

なお、今回はLM75ADのI2Cアドレスを0x48として使っている。(A2はグランドに落としている)

20130513-rpi.jpg

■ コマンドシェル(シェルスクリプト)での操作

アドレスの確認。確かに0x48に接続されていることがわかる。

$ sudo i2cdetect -y 1
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
40: -- -- -- -- -- -- -- -- 48 -- -- -- -- -- -- -- 
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
70: -- -- -- -- -- -- -- -- 

生データの表示

$ i2cget -y 1 0x48 0 w
0xa017

換算した温度データの表示

$ i2cget -y 1 0x48 0 w | awk '{print(("0x"substr($1,5,2)substr($1,3,1))*0.0625)}'
23.5

換算方法は『LM75 temperature logger on the Raspberry pi』のスクリプトをそのままコピーしている。

この方法では、「負数」の処理を行っていないため、氷点下の温度の場合に125℃以上と表示される。

■ Perlでの処理

#!/usr/bin/perl
 
use strict;
use warnings;
use Device::I2C;
use Fcntl;
 
my $i2cDev = Device::I2C->new('/dev/i2c-1', O_RDWR);
$i2cDev->selectDevice(0x48);
my $data = $i2cDev->readWordData(0);
 
# 取り出された生データ(16進数)を表示
printf("raw data = %X\n", $data);
 
#取り出されたデータは、LM75 Temperature Registerの割り付けで
# $data = D2 D1 D0 X   X X X X   D10 D9 D8 D7   D6 D5 D4 D3
#となっている
 
# これを、 D10 D9 D8   D7 D6 D5 D4   D3 D2 D1 D0  の並びに変えるため
# ビットシフトの演算を行う。
# 得られた値は、0.125℃単位である。
 
my $temp = ( ( $data & 0xff) << 3 ) | ( ( $data & 0xf000 ) >> 13 );
 
printf("11bit temperature data = %X\n", $temp);
 
# 負数の場合の処理
if($temp & 0x0400){
    $temp = (~$temp & 0x03ff);    # 1の補数
    $temp += 1;                   # 2の補数
    $temp *= -1;
}
 
printf("calculated temperaure = %f\n", $temp * 0.125);

■ 関連記事
I2C温度センサーLM75ADをPIC12F1822で使う
Raspberry piにi2c LCD接続する