ぽよメモ

レガシーシステム考古学専攻

RasPiで室温を計測する

最近ずっとbotの方にかかりきりでRaspberryPiを放置していた(サーバとしてしか使っていなかった)のですが、先輩が温度センサーとブレッドボード、ジャンパワイヤをお土産でくださったので使ってみることに。 今回用いるのはaitendoのI2C温度センサー、TMP102です。 以下のサイトを参考にしました。 raspberry piで温度計測(TMP102) まずI2Cデバイスを扱えるようにします。 /etc/moduesに以下を追加(後述するがもしかしたら必要ない?

$ sudo vim /etv/modules
i2c-dev

以下のように該当行をコメントアウト

$ sudo vim /etc/modprobe.d/raspi-blacklist.conf
#i2c-bcm2708

しかし僕のRaspberryPi2にはraspi-blacklist.confが存在しませんでした。ググったところこの部分は仕様変更があったようで、次のサイトを参考にしました。→Raspberry PiでI2Cを使う。raspi-blacklist.confが無い時

$ sudo raspi-config

して設定するだけなのでむしろ簡単になったといえるかもしれません。 もしかしたらこれですべて自動で使えるようになって、/etc/modulesに書き込む必要は無かったかもしれませんが、これは検証していません。 なにはともあれここまで終わったら一旦RasPiをシャットダウンし、電源を抜きます。

$ sudo shutdown -h now

RaspberryPiを買った時に初期でついてきたGPIOカードを参考にしてジャンパワイヤを刺していきます。 TMP102の回路図はaitendoのサイトのリンクから見ることができます。 [tmp102] >> [RasPi] V+ >> 3.3V SDA >> GPIO2(I2C_SDA1) SCL >> GPIO3(I2C_SCL1) GND >> GND ADD0 >> GND まぁこんな感じで接続します。 このときADD0をどこにつなぐかで0x48か0x49になるかが決まるらしいです。今回のようにGNDに接続すると0x48になります。 i2c-toolsをインストール。

$ sudo apt-get install i2c-tools
$ sudo i2cdetect 1

すると以下の様な結果を得ます。 もしi2cdetect 1でエラーが返ってくるようならi2cdetect 0で試してみてください。また、ADD0をGND以外につなぐとここで49が表示されます。

$ sudo i2cget -y 1 0x48 0x00 w

として何か値が返ってくるのを確認してください。これでダメだったら温度センサーが死んでるのでは… 次にこれを温度に変えるスクリプトを組みます。僕にもよくわかんないですがこういうことらしいです。tmp102.shとか適当な名前で保存してください。

#!/bin/bash
hexraw=$(sudo i2cget -y 0 0x48 0x00 w)
while [ "$hexraw" == "" ]; do
hexraw=$(sudo i2cget -y 0 0x48 0x00 w)
done
msb=$(echo ${hexraw:4:2})
lsb=$(echo ${hexraw:2:1})
dec=$(printf "%d\n" "0x$msb$lsb")
echo "scale=4; $dec*0.0625" | bc

この計算スクリプトではbcという計算ソフトを利用しているらしいのでこれもインストールシておきます。

$ sudo apt-get install bc

ここまでくれば後は実行するだけです。

$ ./tmp102.sh
22.3125

無事値が帰ってきたら成功です。また、たまにError: Read failedが出ます。原因が不明で困っています。 ついでなのでpythonでもこいつから温度を取得してみたいと思います。

$ sudo apt-get install python-smbus

python-smbusをインストールし、以下の様なスクリプトを組みます。

import smbus
import time
bus = smbus.SMBus(1)
data = bus.read_i2c_block_data(0x48, 0)
msb = data[0]
lsb = data[1]
print (((msb << 8) | lsb) >> 4) * 0.0625

あとは実行するだけです。

$ sudo python tmp102.py
22.375

sudoつけてないとエラーが出ます。また、Read failedの時の例外処理をしてないのでその時もエラーが出ます() また、pyenv環境の人はこのやり方では上手く行きません。次の記事で書きます。