Raspberry Piと温度センサモジュールを使って温度を測定してみる

スポンサーリンク

今回はRaspberry PiのI2C通信と温度検知のモジュールを使って温度を測定してみます。

はじめる前に

今回の機能を実装するに際して下記のパーツを用意しました。

・Raspberry Pi(Rassberry Pi B+)
・ブレッドボード
・ジャンプワイヤー(オス-メスとオス-オス)
・温度センサモジュール(ADT7410)
・はんだごて
・はんだ

Raspberry Pi
IMG_3841

ブレッドボード
IMG_3874

ジャンプワイヤー(オス-メス)
IMG_3875

ジャンプワイヤー(オス-オス)
FullSizeRender

温度センサモジュール
IMG_3963

はんだごて
IMG_3967

はんだ
IMG_3968


I2C通信を使う準備

I2C通信を使うために幾つかのパッケージをRaspberry Piにインストールします。

python-smbusをインストール

sudo apt-get install python-smbus

i2c-toolsをインストール

sudo apt-get install i2c-tools

この2つのパッケージをインストールしたら準備は完了です。

温度センサモジュールを組み立てる

温度センサモジュールと付属のピンヘッダをくっつけてブレッドボードに挿し込めるようにしましょう。ここで「はんだごて」と「はんだ」を使います。

はんだしやすいように付属のピンヘッダと温度センサモジュールとを接続して、下記のようにコインか何かで支えておきます。
IMG_3964

隣同士はんだでくっつかないように注意しながらはんだ付けしていきます。

IMG_3969

これで温度センサモジュールを使う準備ができました。

Raspberry Piとブレッドボードを接続する

完成回路図は下記。

ping-pongv1_ブレッドボード

前回の電圧測定の回路と比べると、すごく単純な回路図です。
Raspberry Pi(マスター)と、温度センサモジュールであるADT7410(スレーブ)を接続します。2本の信号線SCL(Serial Clock)とSDA(Serial Data)によって近い場所にあるデバイス間(今回の場合 Raspberry Pi と温度センサモジュール)の情報伝達を行います。これをI2C通信といいます。

Pythonを使って測定した温度を出力する

# coding: utf-8
import smbus
import time

def read():
    datas = bus.read_i2c_block_data(address7410, register7410, 2)
    data = datas[0] << 8
    data = data | datas[1]
    data = data >> 3
    
    data = data/16
    return data

bus = smbus.SMBus(1)
address7410 = 0x48
register7410 = 0x00

try:
    while True:
        value = read()
        print(value)
        time.sleep(0.2)
except KeyboardInterrupt:
    pass

実際に取得した値を温度として表示できるように変換していきます。ちょっと複雑ですが見てきます。

変換処理は5行目からはじまるreadメソッドで処理しています。
6行目の bus.read_i2c_block_dataメソッドで実際の測定温度を取得します。第1引数に温度センサモジュールの番地、第2引数に先頭レジスタのアドレス、第3引数に取得したバイト数を指定します。ここでは2バイト取得します。

しかし、ADT7410の場合、必要となるバイト数は13バイトです(詳しくは仕様書で)。なので 16ビット(2バイト)-3ビット を取り除いた13バイトの値を取得する必要があります。これは後ほど。

温度センサモジュールで取得した値を6行目のdatas変数に代入します。
私の場合は下記のような値が返ってきました。

[13, 136]
[13, 136]
[13, 136]
[13, 136]
[13, 136]
[13, 136]
[13, 144]
[13, 144]
[13, 144]
[13, 136]
[13, 136]

7行目で data[0] つまり、13を取得します。そして取得した値を左に8バイトシフトします。

8バイト左にシフトする考え方です。
まず、13という数字を2進数に変換します。

0000 0000 0000 1101

これを左に8バイトシフトすると、

0000 1101 0000 0000

となります。

変換したデータを返すと、

3328

という数字が返ってくるはずです(※13の場合)。

続いて、8行目でを返ってきた値にビットorを使ってセットします。
ビットorはどちらかの値が1になっている場合は「1」を、それ以外は「0」とします。
つまり、、

①0000 1101 0000 0000
②0000 0000 1000 1000
※(注意)
①8バイトシフトした値
②下位ビットを2進数に変換した値(ここでは136と仮定します)

ビットorの処理を考慮すると、下記ビットが生成されます。

0000 1101 1000 1000

さらにこれを前述したように、右に3ビット取り除きます。

000 0000 1101 1000 1

これで出来上がり。
実際に10進数に変換すると、

433

になります。

あとは仕様書に従って16で割ると温度が出ます。

433/16 = 27.0625

バッチリでました。

この流れを19行目のwhileで永久ループして繰り返し現在のリアルタイムな温度を算出・出力しています。

温度の測定結果を出力

実際に測定した温度を出力したものが下記。
IMG_3970

ばっちり値がとれました。27°って結構部屋の中が暖かいと計測して気付きました。

I2C通信でよく起きるエラー

bus = smbus.SMBus(1) が IOError: [Errno 2] No such file or directory エラーが出る場合

下記、3点を確認してみてください。
・python-smbusをインストール
・i2c-toolsをインストール
・raspi-configでI2Cをenableに設定

IOError: [Errno 5] Input/output error エラーが出る場合

下記、2点を確認してみてください。
・/boot/config.txt内の一番下にbaudrateを設定する(※NOOBSのバージョンが1.3.11以降の場合)。設定値は下記。

dtparam=i2c_baudrate=10000

・デバイスアドレスの確認。下記コマンドで温度センサモジュールがちゃんと認識しているかどうか確認してみてください。

sudo /usr/sbin/i2cdetect -y 1

下記画面の場合、温度センサモジュールは認識されていません。
IMG_3965

下記画面の場合は、温度センサモジュールが認識されています。
IMG_3966
上記のようにI2Cアドレスの0x48にデバイスの認識結果が出たら大丈夫です。

参考文献

・Raspberry Piで学ぶ電子工作(金丸隆志 著)
I2Cとは?
最近の Raspberry Pi で I2C を有効化
ADT7410仕様書
I2Cセンサー取扱いのコツ
2進数、8進数、10進数、16進数相互変換ツール

スポンサーリンク
スポンサーリンク
スポンサーリンク

フォローする

スポンサーリンク
スポンサーリンク