Linux
Raspberry
BME280
raspberypi
IIO

Raspberry PIでBME280をちょっと簡単に使う

概要

これまでRaspberry PIBME280を使う方法の1つとして,スイッチサイエンス社が公開しているPythonスクリプトが広く知られています.

その一方で,LinuxのIndustrial I/O Subsystem(以後Linux IIO)に準拠したドライバがBME280をサポートするようになりました.カーネルの標準機能として組み込まれており,Pythonが不要なこともあり使い方が簡単で応用もききます.

しかしLinux IIO経由でBME280を使える状態にするまでの,特に日本語の情報が今ひとつ不足しているようなのでここにまとめます.Linux IIOそのものについての情報は割愛します.

手順

BME280をi2cバスに接続している場合の手順について説明します./boot/config.txtの末尾に以下の記述を追加して,リブートします.

dtoverlay=i2c-sensor,bme280

起動したら/sys/bus/iio/devices/iio:device0/namecatしてみてください.

pi@raspberrypi:~ $ cat /sys/bus/iio/devices/iio\:device0/name
bme280

と出てきたら無事にBME280がカーネルに認識されました.

ここまでくればあとは簡単で,同様に/sys/bus/iio/devices/iio:device0/in_temp_inputなどをcatしてみてください.

pi@raspberrypi:~ $ cat /sys/bus/iio/devices/iio\:device0/in_temp_input
31490

これが温度で実際は31.49度です.小数点が無く1,000倍の値が得られます.同ディレクトリにある他ファイルを参照することで湿度,気圧も得られます.まとめると以下のようになります.

測定項目 ファイル名 備考
温度 in_temp_input 1,000倍の値が得られる
湿度 in_humidityrelative_input  
気圧 in_pressure_input 単位はkPa(hPaにするには10倍する)

他にもファイルがいくつかありますが,詳しく調べていません.

注意点

Linux IIOのBME280ドライバを有効にすると,i2cバスを握りっぱなしになるようです.有効にした状態でPythonスクリプトを走らせると,以下のようになります.

pi@raspberrypi:~ $ python ./bme280_sample.py
Traceback (most recent call last):
  File "./bme280_sample.py", line 139, in <module>
    setup()
  File "./bme280_sample.py", line 134, in setup
    writeReg(0xF2,ctrl_hum_reg)
  File "./bme280_sample.py", line 20, in writeReg
    bus.write_byte_data(i2c_address,reg_address,data)
IOError: [Errno 16] Device or resource busy

同バスにBME280以外の他のデバイスも接続している場合は,Linux IIOを有効にしつつ同時利用することは難しいかもしれません.SPIバスのドライバもあるので,BME280をSPIバス接続に変えることを検討してみてください.

ただしこの場合は/boot/config.txtの記述も変えなければいけないはずで,これについては調べていません.

参考文献