始めに
前回はラズパイにアナログ出力の温度センサーを接続しようとしたがGPIOにアナログIOがなかったため、やむなくLEDの点滅を行う回路を作成しました。
今度こそは温度を!
といっても、温度にそこまで言うほどのこだわりを持っているわけではないのですが、まあ一種意地です。(^^ゞ
デジタル温度センサー
というわけで新たにデジタル温度センサーとしてAM2320なるものを入手しました。
これは、実際には温湿度センサーで温度と湿度を同時に測定できる優れものです。
温度、湿度ともにデータ長は16ビットで温度は0.1℃、湿度は0.1%RHの分解能だそうです。
ラズベリーパイとのインターフェースにI2Cを使用できます。
I2C
今回入手したAM2320はフィリップス社が開発したI2Cというシリアル通信を使用して外部とインターフェースします。I2CはIICあるいはI2Cとも表記するようです。この記事では記述しやすいI2Cとしています。
ラズベリーパイでもこのI2Cに対応しています。ですが使わないことも多いため、デフォルトでは無効になっている様です。まずはラズベリーパイのI2Cを有効化します。
I2C有効化
コマンドラインからラズパイのコンフィグを起動します。
$sudo raspi-config
すると下の様にraspi-configのメニューが開きます。
メニューから「5 Interfacing Options ...」を選択します。
インターフェースに関するメニューが開きます。
次にこのメニューから「P5 I2C」を選択します。
I2Cを有効化(to be enabled)するかを聞かれています。はいを選択して有効化します。
回路設計
AM2320のインターフェースはこの様になっています。
1:VDD (電源 3.1V-5.5V)
2:SDA (シリアルデータ)
3:GND (接地)
4:SCL (シリアルクロック入力ポート)
この情報をもとに回路を構築しました。
まずはブレッドボード図
次に回路図
そして実際の接続の様子です。
今回はセンサーの入力だけですので、前回のLEDテスト回路と比べてややシンプルです。
I2C機能テスト
I2Cのテストツールをapt-getします。
私が使っているバージョンでは、デフォルトでインストールされていたようです。
コンソールからI2C経由でのセンサー接続を確認します。
$i2cdetect -y 1
と、ここでわたくし一度はまってしまいました。
アドレス5cが表示されるはずだったのですが、出てきません。
立ち戻って回路の接続を原資料ベースで確認。I2C機能が有効化されているか再確認、システム再起動、色々試したのですが結果は変わりませんでした。一度腰を上げて歩きながらチョー悩む。無関係に大谷選手の記録を眺める。。。マジありえない!すご過ぎっス大谷選手!などと思いながら。
あれれ?出たりでなかったり。どうやら2回に1回検出される様子。
ではあるがそうでもない時もあり・・・?
まあ一応検出できなくはない!!
ということで次に行きます!
(ここ、何かご存知の方があれば教えてくださいm(_ _)m)
プログラム
今回は、プログラムも前回と比べるとシンプルです。
何せセンサーの情報を入力するだけですから。
#!/usr/bin/python
# coding: utf-8
# timeモジュールと補助モジュールをimport
import time
import smbus
print ("AM2320 test Start!")
i2c = smbus.SMBus(1)
# i2cdetect で確認したアドレスを指定
address = 0x5c
# I2C初期化
i2c.write_i2c_block_data(address, 0x00,[])
i2c.write_i2c_block_data(address, 0x03,[0x00, 0x04])
time.sleep(0.05)
# 温湿度情報読み出し
block = i2c.read_i2c_block_data(address, 0, 6)
# リトルエンディアン対応
hum = block[2] << 8 | block[3]
temp = block[4] << 8 | block[5]
print('hum : ' + format( hum/10) + ' %Rh')
print('temp: ' + format(temp/10) + ' digC')
print ("AM2320 test End!")
リトルエンディアン
コンピュータによっては2バイト長以上のデータの配列(バイトオーダー)が逆転するものがあります。
そのような場合、ここで行っている様に上下のバイトを逆転させて処理させる必要が出てきます。
テスト
この様に、どうにかそれっぽく温度と湿度の情報を取得できました。
あとはループで回すなり、Linuxのcronを使って定期的に記録する様なシステムを組むなりするとグラフ表示などにも展開できるかな?と思います。
まとめ
実はpythonも、ラズパイも初心者の私ですが、どちらもわりとスムースにここまでこれたように思います。
この記事を読んでいただいた方も、ぜひチャレンジしてみてください。
関連リンク
ラズベリーパイこと始め1 -セットアップ編-
ラズベリーパイこと始め2 -LED制御編-
追記
i2cdetectが不安定だった件、こちらもアドバイスをいただきましてバスリピータを使用しては?とのこと。こちらもいずれ試してみたいと思います。