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

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

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

1. はじめに

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

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

材料

テストワイヤ

テストワイヤ

サンハヤト(Sanhayat)

【国内正規代理店品】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]

続編できました。