IoTで使うPython入門Step1-I2C LM75Bで温度測定 (7) デバイス・ドライバ

 LM75Bは、ラズパイにデバイス・ドライバが用意されています。Linuxのセンサ関連がたくさん集められているiioという産業用のドライバの一つです。最初はアナログ・デバイセズが始めたようですが、今では、テキサス・インスツルメンツなど、複数の会社のセンサが対応しています。

 これらの情報は少ない(※)ですが、OSへの登録の方法は/boot/overlay/READMEに書かれています。ただし、使用に関しての丁寧なドキュメントはありません。かといって、iioのドライバのソースも多すぎて、必要なところにたどり着けなかったりします。

 該当するREADMEの内容を転載します。

Name: i2c-sensor
Info: Adds support for a number of I2C barometric pressure and temperature
sensors on i2c_arm
Load: dtoverlay=i2c-sensor,<param>=<val>
Params: addr Set the address for the BME280, BMP280, DS1621,
HDC100X, LM75, SHT3x or TMP102

bme280 Select the Bosch Sensortronic BME280
Valid addresses 0x76-0x77, default 0x76

bmp085 Select the Bosch Sensortronic BMP085

bmp180 Select the Bosch Sensortronic BMP180

bmp280 Select the Bosch Sensortronic BMP280
Valid addresses 0x76-0x77, default 0x76

ds1621 Select the Dallas Semiconductors DS1621 temp
sensor. Valid addresses 0x48-0x4f, default 0x48

hdc100x Select the Texas Instruments HDC100x temp sensor
Valid addresses 0x40-0x43, default 0x40

htu21 Select the HTU21 temperature and humidity sensor

lm75 Select the Maxim LM75 temperature sensor
Valid addresses 0x48-0x4f, default 0x4f

lm75addr Deprecated - use addr parameter instead

sht3x Select the Sensiron SHT3x temperature and
humidity sensor. Valid addresses 0x44-0x45,
default 0x44

si7020 Select the Silicon Labs Si7013/20/21 humidity/
temperature sensor

tmp102 Select the Texas Instruments TMP102 temp sensor
Valid addresses 0x48-0x4b, default 0x48

tsl4531 Select the AMS TSL4531 digital ambient light
sensor

veml6070 Select the Vishay VEML6070 ultraviolet light
sensor

/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