最近ずっと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環境の人はこのやり方では上手く行きません。次の記事で書きます。