IoTで使うPython入門Step1-I2C LM75Bで温度測定 (7) デバイス・ドライバ
LM75Bは、ラズパイにデバイス・ドライバが用意されています。Linuxのセンサ関連がたくさん集められているiioという産業用のドライバの一つです。最初はアナログ・デバイセズが始めたようですが、今では、テキサス・インスツルメンツなど、複数の会社のセンサが対応しています。
これらの情報は少ない(※)ですが、OSへの登録の方法は/boot/overlay/READMEに書かれています。ただし、使用に関しての丁寧なドキュメントはありません。かといって、iioのドライバのソースも多すぎて、必要なところにたどり着けなかったりします。
該当するREADMEの内容を転載します。
Name: i2c-sensor bme280 Select the Bosch Sensortronic BME280 bmp085 Select the Bosch Sensortronic BMP085 bmp180 Select the Bosch Sensortronic BMP180 bmp280 Select the Bosch Sensortronic BMP280 ds1621 Select the Dallas Semiconductors DS1621 temp hdc100x Select the Texas Instruments HDC100x temp sensor htu21 Select the HTU21 temperature and humidity sensor lm75 Select the Maxim LM75 temperature sensor lm75addr Deprecated - use addr parameter instead sht3x Select the Sensiron SHT3x temperature and si7020 Select the Silicon Labs Si7013/20/21 humidity/ tmp102 Select the Texas Instruments TMP102 temp sensor tsl4531 Select the AMS TSL4531 digital ambient light veml6070 Select the Vishay VEML6070 ultraviolet light |
●/boot/config.txtに記述する
これらのドライバは、OSの立ち上がり時に追加されるように、/boot/config.txtに記入します。そうすることで、必要な人が、必要なドライバだけを利用できるので、OS自体がコンパクトになり、それゆえトラブルも最小限にできます。
ラズパイで/boot/config.txtを変更するにはroot権限が必要です。piユーザはsudoでroot権限で作業ができます。必要なときにだけrootで作業するのが最近の常識のようです。
sudo nano /boot/config.txt |
最下行にカーソルの下向き矢印で移動します。dtoverlay=i2c-sensor,lm75,addr=0x4cを1行追加し、CTRL-Oで上書き、CTRL-Xで抜けます。
rebootすると有効になります。lsmodで状況を表示します。lm75関連のドライバらしきものが入ったようです。
●接続
物理的配線は今までと同じなので、省略します。
i2cdetect -y 1 でデバイスの接続状況を見ます。もともと0x4cにいたLM75Bを使っていました。そこの場所はUUと表示が出ています。
●プログラム
iioのドライバを有効にすると、設定ファイルや読み出した結果などは、/sys/bus/i2c/devices/i2c-1/の下に保存されるようになります。その中の/1-004cというスレーブ・アドレスが名に入ったフォルダのさらに下の/hwmon/hwmon0/に、読み出す値の入ったファイルが入っています。
これらを読み出せばよいわけです。温度データのtemp_inputファイルは、ターミナルでは、
cat /sys/bus/i2c/devices/i2c-1/1-004c/hwmon/hwmon0/temp1_input |
で、温度を1000倍した文字列が表示できます。摂氏の単位にするには1000で割ります。
pythonのプログラムでOSのシェルを扱うにはcommandsやos、subprocessなどのモジュールをimportして使うようですが、ここではcatだけしか使わないので、shというモジュールを入れます。
pip install sh |
これで入りました。利用するときは、
from sh import cat |
です。
cat /sys/bus/i2c/devices/i2c-1/1-004c/hwmon/hwmon0/temp1_inputで読み出したのはテキストに見えたので、数値に変換しようとしたら、文字でないというエラーが出ました。なので、1000で割るのは、一度文字型strに変換し、次に10進数の数値intにしてから1000.0で割るという記述をしました。もっと簡単な方法があるかもしれません。
temp = int(str(temp),10) / 1000.0 |
1000.0で割ったので、tempの型はfloatです。OLEやWebで使うのは文字型へstr()で変換してから使います。
#coding:utf-8
from sh import cat
import time
import oledModule as OLED
# main
print("Tos " ,cat ('/sys/bus/i2c/devices/i2c-1/1-004c/hwmon/hwmon0/temp1_max'))
OLED.disp.clear()
while 1:
OLED.draw.rectangle((0,0,OLED.width,OLED.height), outline=0, fill=0)
temp = cat ('/sys/bus/i2c/devices/i2c-1/1-004c/hwmon/hwmon0/temp1_input')
temp = int(str(temp),10) / 1000.0
print temp
OLED.draw.text((0, OLED.top), u"温度", font=OLED.font, fill=255)
OLED.draw.text((0, OLED.top+18), str(temp) + "C", font=OLED.fontANK, fill=255)
OLED.disp.image(OLED.image) # Display image.
OLED.disp.display()
f = open('index.html','w')
f.write('<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">')
f.write('<meta http-equiv="Refresh" content="1">')
f.write('<span style="font-size:60px;">'"温度" + str(temp) + "℃"'</span>')
f.close()
time.sleep(3)
---
Step1は今回で終了です。センサなどのハンドリングを中心に勉強しました。Step2のテーマはIoTらしくMQTTを予定しています。
(※)iioソースの一部
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/drivers/iio/
(※)iioにかかわることが日本語で読める資料
https://manual.atmark-techno.com/armadillo-iot/armadillo-iotg-std_product_manual_ja-2.0.0/ch08.html
(※)本サイトでiioのドライバを使った記事
5ドル!ラズパイ・ゼロ(Raspberry pi Zero)でIoT (24) ディジタル湿度センサ2 独自形式 DHT11
5ドル!ラズパイ・ゼロ(Raspberry pi Zero)でIoT (25) ディジタル湿度センサ3 I2C BME280