Raspberry PiのUbuntu環境で温湿度・気圧センサーBME280を動かす方法

Raspberry PiのUbuntu環境で温湿度・気圧センサーBME280を動かす方法
Page content

本記事は次の記事の続編です。

1. はじめに

前回の記事では、手元で遊んでいる、キーボード一体型のRaspberry Pi 400に温湿度・気圧センサーのBME280を初めて接続して、これらの接続方法を確立した。

今回はその接続方法を、自宅サーバをやっている、箱型のRaspberry Pi 4 Model Bに対して適用し、念願の「室内温度・湿度・気圧のグラフ化」を実現する準備を進める。

材料

BME280搭載 温湿度・気圧センサモジュール ピンヘッダ実装済

BME280搭載 温湿度・気圧センサモジュール ピンヘッダ実装済

スイッチサイエンス(Switch Science)

サンハヤト テストワイヤー メス-メス(5色、10本入り) TTW-202

サンハヤト テストワイヤー メス-メス(5色、10本入り) TTW-202

サンハヤト

【国内正規代理店品】Raspberry Pi4 ModelB 4GB ラズベリーパイ4 技適対応品【RS・OKdo版】

【国内正規代理店品】Raspberry Pi4 ModelB 4GB ラズベリーパイ4 技適対応品【RS・OKdo版】

Raspberry Pi RS・OKdo

waves Raspberry Pi4 ヒートシンク 一体型 アルミケース (ゴールド)

waves Raspberry Pi4 ヒートシンク 一体型 アルミケース (ゴールド)

waves(ウェイブス)

2. OS側準備と接続確認まで

前回の記事で温湿度・気圧センサーBME280との接続を確立したRaspberry Pi 400の、OSはラズパイ界標準のRaspberry Pi OSであった。これは標準OSであるためにウェブ上に接続方法の知見が多く、迷うところはほとんどなかったが、今回のRaspberry Pi 4はOSがUbuntuだ。

PC用途導入OS
Raspberry Pi 400未定Raspberry Pi OS
Raspberry Pi 4 Model B自宅サーバUbuntu 20.04.1 LTS (Focal)

とりあえずのスタンスでUbuntuにてBME280を動かした方法を以下に述べるが、不慣れなため本来は不要な操作も、無駄に行ってしまっている可能性があります。あらかじめご了承ください。

ラズパイのI2C通信の機能を有効にする

最初にraspi-configコマンドを導入する。

コマンド導入: 失敗編

ラズパイ上のUbuntuで、ラズパイ/Raspberry Pi OS固有のコマンドを使えるようになるのかもしれない、次のPPAを発見した。

しかしながら、これはRaspberry Pi 4とUbuntu 20.04 (Focal) の組み合わせ向けではないようで、このPPAリポジトリを加えてsudo apt updateかけたあと、sudo apt install raspi-configではパッケージがないと言われた。

コマンド導入: 成功編

次のブログで紹介されている手順をやってみる。ラズパイのDebianのリポジトリを参照させる方法だ。

ちなみに、UbuntuとDebianの各バージョンの名称の対象表は、次のページにある。

Debianの名称は、実際のラズパイのUbuntu環境でも確認ができ、

$ cat /etc/debian_version
bullseye/sid

Ubuntu 20.04に対応するDebianは「bullseye」とわかるが、ブログの手順にそのまま当てはめると http://archive.raspberrypi.org/debian bullseye Release 部分で404 Not Foundになるので、適当にひとつ古い「buster」へ変えている。

以上をまとめると、ブログの手順を部分的に変更した次の手順で、ラズパイのUbuntu 20.04環境にraspi-configコマンドが導入できた。

$ echo 'deb http://archive.raspberrypi.org/debian/ buster main' | sudo tee /etc/apt/sources.list.d/raspberrypi-debian.list
$ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 7FA3303E
$ sudo apt update
$ sudo apt install raspi-config

そして次のコマンドで、ラズパイのI2C通信の機能を有効にして、本体とOS側の準備を整える。

$ sudo raspi-config # CUI画面が起動する
$ sudo apt install i2c-tools

sudo raspi-configでCUI画面が起動するので、[3 Interface Options]→[P5 I2C]→「Would you like the ARM I2C interface to be enabled?」→[Yes]→「The ARM I2C interface is enabled」と進んでいけば良いはず。

追記 [2021-01-18]

Raspberry Pi用のUbuntu 20.04.1 LTSにおいては、raspi-configの導入と、上で次のように書いた設定変更は不要だと判明した。

sudo raspi-configでCUI画面が起動するので、[3 Interface Options]→[P5 I2C]→「Would you like the ARM I2C interface to be enabled?」→[Yes]→「The ARM I2C interface is enabled」

変更が不要な理由としては、ラズパイ用Ubuntuのデフォルト設定にenable_uart=1が書かれていて、I2C通信がすでに有効化されているから、らしい。

$ grep enable_uart /boot/firmware/*.txt
/boot/firmware/config.txt:enable_uart=1
/boot/firmware/syscfg.txt:enable_uart=1

センサーを配線して電源ON

ラズパイをshutdown (電源OFF) して、ラズパイのGPIOとセンサーBME280との配線を、前回の記事の接続手順と同様に実施する。その後にラズパイを電源ONする。

OS起動後に次のコマンドを実行し、「76」が現れたら、センサーとの通信はうまく行っている状態と思われる。

$ sudo i2cdetect -y 1
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
70: -- -- -- -- -- -- 76 --                         

3. サンプルスクリプトのpython3対応

前回同様、次のページで公開されているサンプルのPythonスクリプトで、センサーの動作を確認する。

ただし、このPythonスクリプトはPython 2.7環境で動かすことが前提の内容。前回のRaspberry Pi 400 (Raspberry Pi OS) ではセンサーの接続方法の確立と動作確認だけが目的だったため、Pythonのバージョンは適当に2系で済ませたが、自宅サーバの環境ではPython 3系を基本にしているので、サンプルスクリプトをPython 3で動作するよう改造する。

しかしPython 3でエラーとなるのは、サンプルスクリプト内の3つのprint文の部分だけで、ほんのちょっとの手直しで済む。手元にダウンロードしたbme280_sample.pyと、Python 3用の手直し版との差分は次の通り。print以降を丸括弧でくくったのみだ。

$ diff ./bme280_sample.py ./bme280_sample_python3.py 
95c95
< 	print "pressure : %7.2f hPa" % (pressure/100)
---
> 	print("pressure : %7.2f hPa" % (pressure/100))
103c103
< 	print "temp : %-6.2f ℃" % (temperature) 
---
> 	print("temp : %-6.2f ℃" % (temperature))
117c117
< 	print "hum : %6.2f %" % (var_h)
---
> 	print("hum : %6.2f %" % (var_h))

4. センサーから値を取得できることを確認

ラズパイのPython 3環境にsmbus2モジュールを追加したあと、サンプルスクリプトを実行する。気温・気圧・湿度それぞれで、室内環境に応じた現実的な値が表示されれば、動作確認OKである。

$ sudo pip3 install smbus2
$ sudo python3 bme280_sample_python3.py 
temp : 25.03  ℃
pressure : 1022.40 hPa
hum :  50.65 %

5. 一般権限で/dev/i2c-1へアクセスする

ちなみにsudoしない場合、サンプルスクリプトの実行は次のようにエラーとなる。

$ python3 bme280_sample_python3.py 
Traceback (most recent call last):
  File "bme280_sample_python3.py", line 9, in <module>
    bus = SMBus(bus_number)
  File "/usr/local/lib/python3.8/dist-packages/smbus2/smbus2.py", line 279, in __init__
    self.open(bus)
  File "/usr/local/lib/python3.8/dist-packages/smbus2/smbus2.py", line 308, in open
    self.fd = os.open(filepath, os.O_RDWR)
PermissionError: [Errno 13] Permission denied: '/dev/i2c-1'

エラーの原因は、エラーメッセージに表示されているように/dev/i2c-1へのアクセス権限が無いためであり、ls -alでも見て取れる。

$ ls -al /dev/i2c-*
crw-rw---- 1 root i2c 89, 1 Apr  2  2020 /dev/i2c-1

そこで次のコマンドで、スクリプトを実行するユーザ (一般権限) をi2cというグループに追加すればこの問題は解消する。

$ sudo gpasswd -a $(whoami) i2c

グループ追加後はログオフして (SSH master connectionも切って)、再ログインを行う。以降は、サンプルスクリプトをユーザ自身の権限で動かすことができる。

$ python3 bme280_sample_python3.py 
temp : 25.05  ℃
pressure : 1022.25 hPa
hum :  51.13 %

6. To be continued.

今回はここまで。一気に測定値 (気温・気圧・湿度) のグラフ化まで行いたかったが、力尽きました。

次回以降の記事で、自宅サーバRaspberry Pi 4に接続したセンサーBME280の測定値を、ThingSpeakでグラフ化する内容をやってみたいと思います。

追記 [2020-12-20]

続編できました。